🧑‍💻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