💻MicroSwap API Specification
Step 1: Query Swap Route
Basic GET API:
https://api.microswap.org/aggregator/v2/quote?chainId=250&from=?&to=&receiver=&source=
Curl sample
curl --location --request GET ‘https://api.microswap.org/aggregator/v2/quote?chainId=250&from=0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&amount=1000000000000000000&slippage=0.003&to=0x28a92dde19d9989f39a49905d7c9c2fac7799bdf&source=microswap&receiver=0x19369328B9d837F5E5248FaE4c30b9a6A5C18a7C’
Request query parameters
GET
URL: https://api.microswap.org/aggregator/v2/quote
Query Parameters
chainId*
integer
Currently, we support Fantom ( 250)
The list with expand as usage increase
from*
string
ERC20 token contract address to sell
to*
string
ERC20 token contract address to buy
amount*
integer
buy amount of ERC20 tokens in wei
slippage
float
Default = 0.005 (equal 0.5%)
deadline
integer
Unix timestamp, transaction will fail if it's not executed before this deadline
receiver
string
Destination receiver wallet address
!Important: it's allowed to be empty for quote-query only
Receiver can't be empty if you intent to use encoded data to perform swap
source*
string
Referrer , this is to attribute volume to traffic source. We use this info to build up referral program at later stages.
Response sample:
{
"chainId": 250,
"from": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"amount": "1000000000000000000",
"slippage": 0.003,
"deadline": 0,
"dexes": "",
"excludedDexes": "hashflow",
"receiver": "0x19369328B9d837F5E5248FaE4c30b9a6A5C18a7C",
"source": "microswap",
"hash": "AYQQl8sIYFdR87YvikXDwei7jXQupd0mMyhqY5Uc6a0=",
"quoteData": {
"maxReturn": {
"from": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"totalFrom": "1000000000000000000",
"totalTo": "682199",
"totalGas": 341000,
"gasPrice": "17422876294",
"paths": [
{
"amountFrom": "999500000000000000",
"amountTo": "682199",
"gas": 216000,
"swaps": [
{
"from": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"to": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"amountFrom": "999500000000000000",
"amountTo": "687920673532895045",
"pool": "0xa7c86fc1b87830b8abfa623571405e03560a8326",
"swapFee": 0.005,
"dex": "tombswap"
},
{
"from": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"to": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"amountFrom": "687920673532895045",
"amountTo": "681850",
"pool": "0x327a8676af1bd079031a46fc2b594a238660bf55",
"swapFee": 0.0003,
"dex": "equalizer"
},
{
"from": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"amountFrom": "681850",
"amountTo": "682199",
"pool": "0xdb0f33978b5366191c42bb9a7b7d886cb714df65",
"swapFee": 0.0003,
"dex": "velocimeter"
}
]
}
],
"tokens": {
"0x1b6382dbdea11d97f24495c9a90b7c88469134a4": {
"address": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"symbol": "axlUSDC",
"name": "Axelar Wrapped USDC",
"decimals": 6,
"price": 1.0005309029879415
},
"0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83": {
"address": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"symbol": "FTM",
"name": "Wrapped Fantom",
"decimals": 18,
"price": 0.676683782068614
},
"0x28a92dde19d9989f39a49905d7c9c2fac7799bdf": {
"address": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"symbol": "USDC",
"name": "LayerZero USD Coin",
"decimals": 6,
"price": 1
},
"0x82f0b8b456c1a451378467398982d4834b6829c1": {
"address": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"symbol": "MIM",
"name": "Magic Internet Money",
"decimals": 18,
"price": 0.9883771772891552
}
}
},
"encodedData": {}
}
}
Step 2: Encode Preferred Swap Route
Basic API:
POST
URL: https://api.microswap.org/aggregator/v2/quote
Param sample:
{
"chainId": 250,
"from": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"amount": "1000000000000000000",
"slippage": 0.003,
"deadline": 0,
"excludedDexes": "hashflow",
"receiver": "0x7c841c5e304aed36339f54b54edc04f89ef4ab0f",
"source": "microswap",
"hash": "T17x8zPchSRDf9JfVQ49Sk5l5I+calZCbZXJZS2nwHM=",
"quoteData": {
"maxReturn": {
"from": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"totalFrom": "1000000000000000000",
"totalTo": "680752",
"totalGas": 383000,
"gasPrice": "17086951841",
"paths": [
{
"amountFrom": "999500000000000000",
"amountTo": "680752",
"gas": 258000,
"swaps": [
{
"from": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"to": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"amountFrom": "999500000000000000",
"amountTo": "686713816143087027",
"pool": "0xa7c86fc1b87830b8abfa623571405e03560a8326",
"swapFee": 0.005,
"dex": "tombswap"
},
{
"from": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"to": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"amountFrom": "686713816143087027",
"amountTo": "680406",
"pool": "0x327a8676af1bd079031a46fc2b594a238660bf55",
"swapFee": 0.0003,
"dex": "equalizer"
},
{
"from": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"amountFrom": "680406",
"amountTo": "680752",
"pool": "0x121ce0321de5e245fc49efdbb6444bcb4b42fc6f",
"dex": "e3dex",
"meta": {
"version": 1
}
}
]
}
],
"tokens": {
"0x1b6382dbdea11d97f24495c9a90b7c88469134a4": {
"address": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"symbol": "axlUSDC",
"name": "Axelar Wrapped USDC",
"decimals": 6,
"price": 0.9986927193173001
},
"0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83": {
"address": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"symbol": "FTM",
"name": "Wrapped Fantom",
"decimals": 18,
"price": 0.67970138892444
},
"0x28a92dde19d9989f39a49905d7c9c2fac7799bdf": {
"address": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"symbol": "USDC",
"name": "LayerZero USD Coin",
"decimals": 6,
"price": 1
},
"0x82f0b8b456c1a451378467398982d4834b6829c1": {
"address": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"symbol": "MIM",
"name": "Magic Internet Money",
"decimals": 18,
"price": 0.9910073135236579
}
}
},
"encodedData": {}
}
}
Response sample:
{
"maxReturn": {
"from": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"totalFrom": "1000000000000000000",
"totalTo": "680752",
"totalGas": 383000,
"gasPrice": "17086951841",
"paths": [
{
"amountFrom": "999500000000000000",
"amountTo": "680752",
"gas": 258000,
"swaps": [
{
"from": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"to": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"amountFrom": "999500000000000000",
"amountTo": "686713816143087027",
"pool": "0xa7c86fc1b87830b8abfa623571405e03560a8326",
"swapFee": 0.005,
"dex": "tombswap"
},
{
"from": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"to": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"amountFrom": "686713816143087027",
"amountTo": "680406",
"pool": "0x327a8676af1bd079031a46fc2b594a238660bf55",
"swapFee": 0.0003,
"dex": "equalizer"
},
{
"from": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"to": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"amountFrom": "680406",
"amountTo": "680752",
"pool": "0x121ce0321de5e245fc49efdbb6444bcb4b42fc6f",
"dex": "e3dex",
"meta": {
"version": 1
}
}
]
}
],
"tokens": {
"0x1b6382dbdea11d97f24495c9a90b7c88469134a4": {
"address": "0x1b6382dbdea11d97f24495c9a90b7c88469134a4",
"symbol": "axlUSDC",
"name": "Axelar Wrapped USDC",
"decimals": 6,
"price": 0.9986927193173001
},
"0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83": {
"address": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"symbol": "FTM",
"name": "Wrapped Fantom",
"decimals": 18,
"price": 0.67970138892444
},
"0x28a92dde19d9989f39a49905d7c9c2fac7799bdf": {
"address": "0x28a92dde19d9989f39a49905d7c9c2fac7799bdf",
"symbol": "USDC",
"name": "LayerZero USD Coin",
"decimals": 6,
"price": 1
},
"0x82f0b8b456c1a451378467398982d4834b6829c1": {
"address": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"symbol": "MIM",
"name": "Magic Internet Money",
"decimals": 18,
"price": 0.9910073135236579
}
}
},
"encodedData": {
"router": "0xc9147959bab2ceeac49692e03f8b132fdd62196c",
"data": "0x7c025200000000000000000000000000def68e73155e706b0ad34d6875abdf4c207446e700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf000000000000000000000000def68e73155e706b0ad34d6875abdf4c207446e70000000000000000000000007c841c5e304aed36339f54b54edc04f89ef4ab0f0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000a5b36000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf00000000000000000000000000000000000000000000000000000000000a5b360000000000000000000000000000000000000000000000000000000000000004ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000007c841c5e304aed36339f54b54edc04f89ef4ab0f00000000000000000000000000000000000000000000000000000000661f4fd100000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000a7c86fc1b87830b8abfa623571405e03560a832600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8300000000000000000000000082f0b8b456c1a451378467398982d4834b6829c10000000000000000000000000000000000000000000000000ddeeff45500c00000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000327a8676af1bd079031a46fc2b594a238660bf5500000000000000000000000082f0b8b456c1a451378467398982d4834b6829c10000000000000000000000001b6382dbdea11d97f24495c9a90b7c88469134a40000000000000000000000000000000000000000000000000987b293d18fc5b300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000121ce0321de5e245fc49efdbb6444bcb4b42fc6f0000000000000000000000001b6382dbdea11d97f24495c9a90b7c88469134a400000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf00000000000000000000000000000000000000000000000000000000000a61d60000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000167b22736f75726365223a226d6963726f73776170227d00000000000000000000"
}
}
Response payload
encodedData
json object
router
string
MicroSwap Router smart contract address
The address is returned here because it's frequently updated
data
string
Data encoded for given quote. Client just need to submit this data to given provided contract address returned at "router"
maxReturn
json object
from
string
ERC20 token contract address to sell
to
string
ERC20 token contract address to buy
totalFrom
string
buy amount of ERC20 tokens in wei
totalTo
numeric string
best sell amount of ERC20 tokens in wei
totalGas
number
gasPrice
numeric string
paths
array of object
swap paths, for display purpose
Step 3: Execute Swap Transaction On-Chain
Integration example:
const Web3 = require('web3')
const axios = require('axios')
const { BN } = Web3.utils
const MAX_UINT = '115792089237316195423570985008687907853269984665640564039457584007913129639935'
const PRIVATE_KEY = '' // TODO: config your private key
const ROUTER_API = 'https://api.microswap.org/aggregator/v2/encode'
const RPC_URL = 'https://rpc.ftm.tools/'
const ERC20_ABI = [
{
"constant": true,
"inputs": [{ "name": "_owner", "type": "address" }, { "name": "_spender", "type": "address" }],
"name": "allowance",
"outputs": [{ "name": "remaining", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [{ "name": "_spender", "type": "address" }, { "name": "_value", "type": "uint256" }],
"name": "approve",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
]
const web3 = new Web3(new Web3.providers.HttpProvider(RPC_URL))
// PRIVATE_KEY variable defined
const account = web3.eth.accounts.privateKeyToAccount(PRIVATE_KEY)
function sendTransaction(tx) {
const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY)
return new Promise((resolve, reject) => {
signPromise.then((signedTx) => {
// raw transaction string may be available in .raw or
// .rawTransaction depending on which signTransaction
// function was called
const sentTx = web3.eth.sendSignedTransaction(signedTx.raw || signedTx.rawTransaction)
sentTx.on("receipt", receipt => {
// do something when receipt comes back
resolve(receipt)
})
sentTx.on("error", err => {
// do something on transaction error
reject(err)
})
}).catch((err) => {
// do something when promise fails
reject(err)
})
})
}
async function swap(params) {
// fetch encoded swap transaction data
const { data: { encodedData } } = await axios.get(ROUTER_API, {
headers: { 'Content-Type': 'application/json' },
params
})
const tokenIn = params.from
const routerContract = encodedData.router // router contract address
const currencyAIsEth = tokenIn.toLowerCase() === '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'
const amountIn = params.amount
if (!currencyAIsEth) {
// check approval
const contract = new web3.eth.Contract(ERC20_ABI, tokenIn, {
from: account.address
})
const allowance = await contract.methods.allowance(account.address, routerContract).call()
if (new BN(allowance).lt(new BN(amountIn))) {
console.log('# APPROVING...')
const approvalData = contract.methods.approve(routerContract, MAX_UINT).encodeABI()
const tx = {
from: account.address,
to: tokenIn,
gas: '1000000',
data: approvalData,
}
const approvalReceipt = await sendTransaction(tx, PRIVATE_KEY).catch()
console.log('# APPROVED TXN:', approvalReceipt.transactionHash)
}
}
const tx = {
from: account.address, // signer address
to: routerContract,
gas: '1000000',
data: encodedData.data, // encoded contract data
value: currencyAIsEth ? amountIn : undefined,
}
console.log('# SWAPPING...')
sendTransaction(tx)
.then((receipt) => {
console.log('# SWAP SUCCESSFULLY:')
// do something when receipt comes back
console.log(receipt)
})
.catch((err) => {
console.log('# SWAP FAILED:')
// do something on transaction error
console.error(err)
})
}
// swap USDC to FTM
swap({
chainId: 250,
from: '0x28a92dde19d9989f39a49905d7c9c2fac7799bdf',
to: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
amount: '1000000',
receiver: account.address,
source: 'sample'
})
Last updated