🔃Make cross-chain swap

Performing a cross-chain swap consists of 4 steps:

  1. Routing construction

  2. Estimating cross-chain operations

  3. Forming data for the transaction

  4. Sending the transaction

1. Routing construction

Request routing for the specified tokens and networks

const requestRoutingParams = {
    params: {
         chainIdIn": 1, // Ethereum
         chainIdOut: 250, // Fantom
         tokenIn: "0xdac17f958d2ee523a2206206994597c13d831ec7", // USDT
         tokenOut: "0xe71286fc887189c562410af12ed521c8e58e5fa3", // s3crypto_e
         amountIn: "100000000", // 100 USDT
    },
    slippage: 1, // 1%
}

const response = await fetch('https://api.crosscurve.fi/routing/scan', {
    method: 'POST',
    body: JSON.stringify(requestRoutingParams),
    headers: {
        "Content-Type": "application/json",
    },
})

const routing = await response.json()

2. Making a route estimate

From the obtained array of routes, take the first route (which is the most profitable for swapping) and send it for estimation

const bestRoute = routing[0]

const response = await fetch('https://api.crosscurve.fi/estimate', {
    method: 'POST',
    body: JSON.stringify(bestRoute),
    headers: {
        "Content-Type": "application/json",
    },
})

const estimate = await response.json()

3. Forming data for sending the transaction

const txCreateParams = {
    from: '0x...', // sender
    to: '0x...', // recipient
    routing,
    estimate,
}

const response = await fetch('https://api.crosscurve.fi/tx/create', {
    method: 'POST',
    body: JSON.stringify(txCreateParams),
    headers: {
        "Content-Type": "application/json",
    },
})

const rawTx = await response.json()

4. Sending the transaction

import { Contract, JsonRpcProvider } from 'ethers'
 
const provider = new JsonRpcProvider('RPC_URL_HERE')
const signer = new Wallet(process.env.PRIVATE_KEY, provider)

const router = new Contract(rawTx.to, [rawTx.abi], signer)

const args = [
  rawTx.args[0],
  rawTx.args[1],
  [
    rawTx.args[2].executionPrice,
    rawTx.args[2].deadline,
    rawTx.args[2].v,
    rawTx.args[2].r,
    rawTx.args[2].s,
  ],
]

const value = BigInt(rawTx.value) + BigInt(estimate.executionPrice)

const tx = await router.start(...args, { value })
const receipt = await tx.wait()

Last updated