DelayedOrderGateway is covered here; orderGatewayV2 is limited to use by the Perp v3 frontend and API (no external functions for direct contract interaction).
The order gateways have two key roles:
Route orders to the optimal liquidity source
Prevent trades from front-running the oracle using a 3 second delay
Workflow
Call createOrder() to generate an order, including createdAt and executableAt timestamps
Wait for executableAt() timestamp
Call executeOrder() with orderId to execute a trade
Call cancelOrder() with orderID to cancel an unexecuted order
/// @notice Create an order (but do not execute)
function createOrder(
DelayedOrderType orderType,
bytes calldata data
)
emit OrderCreated(
orderId,
delayedOrder.sender,
marketId,
abi.encode(delayedOrder)
);
/// @notice Execute an order (probably first call createOrder)
function executeOrder(
uint256 orderId,
bytes calldata makerData
)
returns (
int256 base,
int256 quote
);
/// @notice Cancel unexecuted order
function cancelOrder(
uint256 orderId
)
emit OrderCanceled(
orderId
);
/// @notice There are many public view functions available
function getCurrentNonce() public view returns (uint256) {
return _getOrderGatewayStorage().nonce;
}
function getOrdersCount() public view returns (uint256) {
return _getOrderGatewayStorage().orderIds.length();
}
function getOrderIds(uint256 start, uint256 end) public view returns (uint256[] memory) {
return _getOrderGatewayStorage().orderIds.valuesAt(start, end);
}
function getUserOrdersCount(address taker) public view returns (uint256) {
return _getOrderGatewayStorage().userOrderIdsMap[taker].length();
}
function getUserOrderIds(address taker, uint256 start, uint256 end) public view returns (uint256[] memory) {
return _getOrderGatewayStorage().userOrderIdsMap[taker].valuesAt(start, end);
}
function getOrder(uint256 orderId) public view returns (DelayedOrder memory) {
return _getOrderGatewayStorage().ordersMap[orderId];
}