Use this file to discover all available pages before exploring further.
A Decentralized Exchange (DEX) is an application that allows users to trade tokens (native & fungible tokens) through smart contracts.In brief, DEXs work by having pools of token pairs (e.g. NEAR-USDC) that users can deposit tokens into.The ratio of the tokens in the pool determines the exchange rate for a swap. Indeed, swapping is adding tokens to one side of the pool while removing tokens from the other side of the pool.
This docs refer to Ref Finance, a community built DEX in NEAR.Please check their docs for more information.
In order to use the contract, make sure to register your account in the DEX by paying for the storage you will use in order to keep track of your balances.
🖥️ CLI
Lantstool
near call v2.ref-finance.near storage_deposit '' --useAccount <account> --amount 0.1
Do NOT transfer NEAR tokens to Ref Finance. Instead, call near_deposit in the wrap.near contract, attaching the amount of NEAR you want to swap.This will mint wrap.near for you, which you can then transfer to Ref Finance.
#[near(serializers = [json])]pub struct PoolInfo { /// Pool kind. pub pool_kind: String, /// List of tokens in the pool. pub token_account_ids: Vec<AccountId>, /// How much NEAR this contract has. pub amounts: Vec<U128>, /// Fee charged for swap. pub total_fee: u32, /// Total number of shares. pub shares_total_supply: U128, pub amp: u64,}// Validator interface, for cross-contract calls#[ext_contract(ext_amm_contract)]trait ExternalAmmContract { fn get_pools(&self, from_index: u64, limit: u64) -> Promise;}// Implement the contract structure#[near]impl Contract { #[private] // Public - but only callable by env::current_account_id() pub fn external_get_pools_callback(&self, #[callback_result] call_result: Result<Vec<PoolInfo>, PromiseError>) -> Option<Vec<PoolInfo>> { // Check if the promise succeeded if call_result.is_err() { log!("There was an error contacting external contract"); return None; } // Return the pools data let pools_data = call_result.unwrap(); return Some(pools_data); } pub fn get_amm_pools(&self, from_index: u64, limit: u64) -> Promise { let promise = ext_amm_contract::ext(self.amm_contract.clone()) .get_pools(from_index, limit); return promise.then( // Create a promise to callback query_greeting_callback Self::ext(env::current_account_id()) .external_get_pools_callback() ) }}
#[near(serializers = [json])]pub struct SwapAction { /// Pool which should be used for swapping. pub pool_id: u64, /// Token to swap from. pub token_in: AccountId, /// Amount to exchange. /// If amount_in is None, it will take amount_out from previous step. /// Will fail if amount_in is None on the first step. pub amount_in: Option<U128>, /// Token to swap into. pub token_out: AccountId, /// Required minimum amount of token_out. pub min_amount_out: U128,}// Validator interface, for cross-contract calls#[ext_contract(ext_amm_contract)]trait ExternalAmmContract { fn swap(&self, actions: Vec<SwapAction>) -> Promise;}// Implement the contract structure#[near]impl Contract { #[private] // Public - but only callable by env::current_account_id() pub fn external_call_callback(&self, #[callback_result] call_result: Result<String, PromiseError>) { // Check if the promise succeeded if call_result.is_err() { log!("There was an error contacting external contract"); } } #[payable] pub fn swap_tokens(&mut self, pool_id: u64, token_in: AccountId, token_out: AccountId, amount_in: U128, min_amount_out: U128) -> Promise { assert_eq!(env::attached_deposit(), 1, "Requires attached deposit of exactly 1 yoctoNEAR"); let swap_action = SwapAction { pool_id, token_in, token_out, amount_in: Some(amount_in), min_amount_out }; let mut actions = Vec::new(); actions.push(swap_action); let promise = ext_amm_contract::ext(self.amm_contract.clone()) .with_static_gas(Gas(150*TGAS)) .with_attached_deposit(YOCTO_NEAR) .swap(actions); return promise.then( // Create a promise to callback query_greeting_callback Self::ext(env::current_account_id()) .with_static_gas(Gas(100*TGAS)) .external_call_callback() ) }}