Comment on page
Cross-Chain Contract Calls
Cross-Chain Contract Calls: This feature enables contract calls across chains, buy NFTs, stake or donate without needing gas on the destination chain!
Destination calls are currently supported on Polygon, Binance, Optimism, Ethereum, Fantom, Avalanche and Arbitrum.
With this feature, you can make arbitrary contract calls across blockchains. All you need to do is prepare the
callData
for the contract call you want to make on the destination chain (e.g. stake KLIMA in the example below). Pass that callData
along with information about where you want to pay for it to the endpoint. The response contains information on how many tokens must be submitted to pay for all transfer and swap fees.About the contract call:
Parameter | Explaination | Example Data |
---|---|---|
toChain (required) | The chain the contract is deployed on. Can be the chain id or chain key. | 137 or POL |
toToken (required) | The token required to perform the contract interaction (can be something to stake, donate or to be used as payment). | 0x4e78011ce80ee02d2c3e649fb657e45898257815 |
toAmount (required) | The amount of token required by the contract interaction. The LI.FI API will try and generate a quote that guarantees at least that amount on the destination chain. | 300000000 |
toContractAddress
(required) | The address of the contract to interact with. | 0x4D70a031Fc76DA6a9bC0C922101A05FA95c3A227 |
toContractCallData
(required) | The callData to be sent to the contract for the interaction on the destination chain. | 0x7d7a... |
toContractGasLimit
(required) | The estimated gas used by the destination call. If this value is incorrect, the interaction may fail -- choose this carefully! | 900000 |
toApprovalAddress
(optional) | If the approval address is different thant the contract to call, specify that address here. | 0x4D70a031Fc76DA6a9bC0C922101A05FA95c3A227 |
contractOutputsToken
(optional) | Some contract interactions will output a token (e.g. staking), specify the token address to forward the token to the user. Omit this parameter if no token should be returned to the user. | 0xb0c22d8d350c67420f06f48936654f567c73e8c8 |
toFallbackAddress
(optional) | If the call fails, use this address to send the bridged tokens to. If none is specified, the sending address will be used. | 0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0 |
How does the user want to pay:
Parameter | Explaination | Example Data |
---|---|---|
fromChain (required) | The sending chain. Can be the chain id or chain key. | 56 orBSC |
fromToken
(required) | The token that the user pays with. Can be the address or the symbol. | 0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3 |
fromAddress
(required) | The wallet that will send the transaction and contains the starting token. | 0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0 |
Additional options:
Parameter | Explaination | Example Data |
---|---|---|
slippage
(optional) | The maximum allowed slippage for the transaction as a decimal value. 0.05 represents 5%. | 0.02 |
integrator
(optional) | A string containing tracking information about the integrator of the API. | my-dapp |
referrer
(optional) | A string containing tracking information about the referrer of the integrator. | 0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0 |
The example below demonstrates how to stake KLIMA token (KlimaDAO) into sKLIMA (staked KLIMA). The process involves
- sending some
DAI
token from Binance Smart Chain (BSC) to Polygon (POL) - swapping
DAI
forKLIMA
- performing a contract call to the KLIMA staking contract.
The
callData
will be executed by our executer contract, not by the users wallet, so ensure that the contract does not expect the user to be msg.sender
. The staked tokens are sent to the executor which will then forward them to the user if the contractOutputsToken
parameter is set.import axios from 'axios';
import { ethers } from 'ethers';
const endpoint = 'https://li.quest/v1/quote/contractCall';
const DAI_ON_BSC = '0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3';
const KLIMA_ON_POL = '0x4e78011ce80ee02d2c3e649fb657e45898257815';
const SKLIMA_ON_POL = '0xb0c22d8d350c67420f06f48936654f567c73e8c8';
const KLIMA_STAKING_CONTRACT = '0x4D70a031Fc76DA6a9bC0C922101A05FA95c3A227';
// Full ABI on
// https://polygonscan.com/address/0x4D70a031Fc76DA6a9bC0C922101A05FA95c3A227#code
const KLIMA_STAKING_ABI = ['function stake(uint _amount) external'];
const generateKLIMATransaction = async (receivedAmount: string) => {
const stakeKlimaTx = await new ethers.Contract(
KLIMA_STAKING_CONTRACT,
KLIMA_STAKING_ABI
).populateTransaction.stake(receivedAmount);
return stakeKlimaTx;
};
const getQuote = async (): Promise<any> => {
// We would like to stake this amount of KLIMA to get sKLIMA
const stakeAmount = '300000000';
const stakeKlimaTx = await generateKLIMATransaction(stakeAmount);
const quoteRequest = {
fromChain: 'BSC',
fromToken: DAI_ON_BSC,
fromAddress: '0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0',
toChain: 'POL',
toToken: KLIMA_ON_POL,
toAmount: stakeAmount,
toContractAddress: stakeKlimaTx.to,
toContractCallData: stakeKlimaTx.data,
toContractGasLimit: '900000',
contractOutputsToken: SKLIMA_ON_POL,
};
const response = await axios.post(endpoint, quoteRequest);
return response.data;
};
getQuote().then(console.log);
Here you can find links to the sending and receiving transactions for the transfer from DAI on BNB Smart Chain to sKLIMA on Polygon via the custom contract call.
Last modified 1mo ago