Comment on page
On-Chain Order/Swap
This document describes how to place an order directly through the smart contract
The current Orderly architecture has an off-chain order book, and the orders are placed through an off-chain RESTful API.
Users might want to perform a swap/trade without interacting with off-chain components. We have created on-chain order support, where orders can be placed directly through the smart contract rather than the RESTful API.
The on-chain swap includes three steps under a single smart contract call: deposit, trade, and withdraw.
The on-chain order includes two steps under a single smart contract call: trade and withdraw.
Please note, all quotes and trades are against USDC as the quote currency
Before placing an order, a user first has to announce Orderly and Trading Key and make a storage deposit, more info here.
After the required steps are completed, the following smart contract function can be called to initiate an order:
create_onchain_order
Parameters:
struct OnchainOrderInfo {
symbol: String,
client_order_id: Option<String>,
order_type: OrderTypeEnum, // MARKET/IOC/FOK
order_price: Option<String>, // If order_type is MARKET, then is not required, otherwise this parameter is required.
order_quantity: Option<String>, // For MARKET order, if order_amount is given, it is not required.
order_amount: Option<String>,
visible_quantity: Option<String>, // The order quantity shown on orderbook. (default: equal to order_quantity)
side: SideEnum, // SELL/BUY
broker_id: Option<String>, // for broker use, the id corresponding to the broker
signature: Option<String>, // trading signature
}
pub fn create_onchain_order(&mut self,
order_info: OnchainOrderInfo,
orderly_key: Option<String>, // If orderly_key=null, orderly_key from env::signer_account_pk() will be used
)
near call asset-manager.orderly-dev.testnet create_onchain_order '{"order_info": {"symbol": "SPOT_NEAR_USDC", "side":"SELL","order_type":"MARKET","order_quantity":"3", "signature": "43833e76a0d881f0b435e933688025eab5a6b11c647ba5058b51057cf6d41ea61479ce7fdd8a770c0b99cf86c261c19573472af0678afb6844514818296a00f001"},"orderly_key": "ed25519:EDUzpbNh9j1U3gfpRjGbHEXRgTtE3omd394ZnopvUTuO"}' --accountId example.testnet --amount 3.1
Storage has to be paid for each token being swapped from and to, otherwise, tokens may fail to withdraw with the error message "
Smart contract panicked: panicked at 'The account is not registered'
" Check here for more details on storage deposit.ft_transfer_call
Parameters:
pub fn ft_transfer_call (&mut self,
receiver_id: AccountId, //Orderly asset manager contract address
amount: U128,
memo: Option<String>,
msg: String, //FtOnTransferMessage::OnChainFtSwapInfo
)
pub enum FtOnTransferMessage {
OnChainFtSwapInfo(OnchainFtSwapInfo)
}
pub struct OnchainFtSwapInfo {
pub order_info: OnchainOrderInfo,
pub orderly_key: Option<String>,
}
pub struct OnchainOrderInfo {
pub symbol: String,
pub client_order_id: Option<String>,
pub order_type: OrderType,
pub order_price: Option<String>,
pub order_quantity: Option<String>,
pub order_amount: Option<String>,
pub visible_quantity: Option<String>,
pub side: PurchaseSide,
pub broker_id: Option<String>,
pub signature: String,
}
near call usdc.orderly-dev.testnet ft_transfer_call '{"receiver_id":"asset-manager.orderly-dev.testnet","amount":"10001000","msg":"{\"OnchainFtSwapInfo\":{\"order_info\":{\"symbol\":\"SPOT_NEAR_USDC\",\"order_type\":\"MARKET\",\"order_amount\": \"10\",\"side\":\"BUY\", \"signature\": \"f99d41a857f13fefbc2991d76ececab05f7579d23b9d22afc20662508113130a21aa7a5ac29e1f6a645c01ffdfb9e6f0f0c118ca6f9fd8854ee137f6947dbd0501\"},\"orderly_key\":\"ed25519:EKUzpbNh9j1T3gfpRjGbDEXRgTtE3omd394ZnopvUTuO\"}}"}' --accountId example.testnet --depositYocto 1 --gas 90000000000000
deposit_and_create_order
Parameters:
pub fn deposit_and_create_order (&mut self,
order_info: OnchainOrderInfo,
orderly_key: Option<String>
)
pub struct OnchainOrderInfo {
pub symbol: String,
pub client_order_id: Option<String>,
pub order_type: OrderType,
pub order_price: Option<String>,
pub order_quantity: Option<String>,
pub order_amount: Option<String>,
pub visible_quantity: Option<String>,
pub side: PurchaseSide,
pub broker_id: Option<String>,
pub signature: String,
}
near call asset-manager.orderly-dev.testnet deposit_and_create_order '{"order_info": {"symbol": "SPOT_NEAR_USDC", "side":"SELL","order_type":"MARKET","order_quantity":"3", "signature": "43833e76a0d881f0b435e933688025eab5a6b11c647ba5058b51057cf6d41ea61479ce7fdd8a770c0b99cf86c261c19573472af0678afb6844514818296a00f001"},"orderly_key": "ed25519:EKUzpbNh9j1T3gfpRjGbDEXRgTtE3omd394ZnopvUTuO"}' --accountId example.testnet --amount 3.1
get_onchain_order_fee
Parameters:
args: {
token: accountId,
}
Returns the fee needed to create an on-chain order in Yocto NEAR amount.
When placing an order, an amount of NEAR equivalent to the result from this function has to be attached to the contract call.
mainnet near view asset-manager.orderly-network.near get_onchain_order_fee '{"token": "near"}'
View call: asset-manager.orderly-network.near.get_onchain_order_fee({"token": "near"})
'5000000000000000000000'
Last modified 3mo ago