🧑💻API Specification
We do not offer API key to individual users at this time, if you are a project please contact mobbie#3450 on Discord
Parameters, input/output format
Basic GET API: https://router.firebird.finance/aggregator/v1/route?chainId=250&from=?&to=&receiver=&source=
Curl sample
curl --location --request GET 'https://router.firebird.finance/aggregator/v1/route?chainId=250&from=0x04068da6c83afcfa0e13ba15a6696662335d5b75&to=0xf24bcf4d1e507740041c9cfd2dddb29585adce1e&amount=10000000&receiver=0x3FD5e7C6A2950691ffbf9358d0C093de30f54432&source=discord_swap_bot'
Request query parameters
GET
URL: https://router.firebird.finance/aggregator/v1/route
Query Parameters
{
"encodedData": {
"router": "0xe0c38b2a8d09aad53f1c67734b9a95e43d5981c0",
"data": "0x7c025200000...00000"
},
"maxReturn": {
"from": "0x04068da6c83afcfa0e13ba15a6696662335d5b75",
"to": "0xf24bcf4d1e507740041c9cfd2dddb29585adce1e",
"totalFrom": "9995000",
"totalTo": "32174797224842296002",
"totalGas": 473000,
"gasPrice": "237540600000",
"paths": [
{
"amountFrom": "9995000",
"amountTo": "32174797224842296002",
"gas": 348000,
"swaps": [
{
"from": "0x04068da6c83afcfa0e13ba15a6696662335d5b75",
"to": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"amountFrom": "9995000",
"amountTo": "10008022331763463568",
"pool": "0xbcab7d083cf6a01e0dda9ed7f8a02b47d125e682",
"swapFee": 0.0001,
"dex": "solidly"
},
{
"from": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"to": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"amountFrom": "10008022331763463568",
"amountTo": "10117447804656825522",
"pool": "0x8c3c964c2d08679d3d09866cf62c5b14a5346479000100000000000000000207",
"swapFee": 0.01,
"dex": "beethovenx",
"meta": {
"vaultAddress": "0x20dd72ed959b6147912c2e529f0a0c651c33c9ce"
}
},
{
"from": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"to": "0xf24bcf4d1e507740041c9cfd2dddb29585adce1e",
"amountFrom": "10117447804656825522",
"amountTo": "32174797224842296002",
"pool": "0x2d6de488fc701eb5ac687de9ad06f58fcbae45db",
"swapFee": 0.003,
"dex": "spiritswap"
}
]
}
],
"tokens": {
"0x04068da6c83afcfa0e13ba15a6696662335d5b75": {
"address": "0x04068da6c83afcfa0e13ba15a6696662335d5b75",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"price": 1
},
"0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83": {
"address": "0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83",
"symbol": "FTM",
"name": "Wrapped Fantom",
"decimals": 18,
"price": 0.9889604661220429
},
"0x82f0b8b456c1a451378467398982d4834b6829c1": {
"address": "0x82f0b8b456c1a451378467398982d4834b6829c1",
"symbol": "MIM",
"name": "Magic Internet Money",
"decimals": 18,
"price": 1
},
"0xf24bcf4d1e507740041c9cfd2dddb29585adce1e": {
"address": "0xf24bcf4d1e507740041c9cfd2dddb29585adce1e",
"symbol": "BEETS",
"name": "BeethovenxToken",
"decimals": 18,
"price": 0.3122953983828485
}
}
}
}
Response payload
Example API Code
https://github.com/firebird-prod/firebird_api_examples
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://router.firebird.finance/aggregator/v1/route'
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: '0x6c021ae822bea943b2e66552bde1d2696a53fbb7',
to: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
amount: '1000000',
receiver: account.address,
source: 'sample'
})
Last updated