跳转到主要内容
想要超越交换和桥接吗? 通过 Composer,您可以一次性存入金库、质押和借贷 —— 所有操作都使用下面展示的相同API模式。参见 Composer 快速开始

逐步指南

1

请求报价或路径

const getQuote = async (fromChain, toChain, fromToken, toToken, fromAmount, fromAddress) => {
    const result = await axios.get('https://li.quest/v1/quote', {
        params: {
            fromChain,
            toChain,
            fromToken,
            toToken,
            fromAmount,
            fromAddress,
        }
    });
    return result.data;
}

const fromChain = 42161;
const fromToken = 'USDC';
const toChain = 100;
const toToken = 'USDC';
const fromAmount = '1000000';
const fromAddress = YOUR_WALLET_ADDRESS;

const quote = await getQuote(fromChain, toChain, fromToken, toToken, fromAmount, fromAddress);
2

如果使用了 `/advanced/routes`,选择所需路径并从 `/advanced/stepTransaction` 检索交易数据

仅当使用了 /advanced/routes 端点时才需要此步骤。/quote 已在响应中返回交易数据。/quote/advanced/routes 之间的区别在 这里 描述
3

设置许可

在发送任何交易之前,必须确保用户被允许从钱包发送请求的金额。
const { Contract } = require('ethers');

const ERC20_ABI = [
    {
        "name": "approve",
        "inputs": [
            {
                "internalType": "address",
                "name": "spender",
                "type": "address"
            },
            {
                "internalType": "uint256",
                "name": "amount",
                "type": "uint256"
            }
        ],
        "outputs": [
            {
                "internalType": "bool",
                "name": "",
                "type": "bool"
            }
        ],
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "name": "allowance",
        "inputs": [
            {
                "internalType": "address",
                "name": "owner",
                "type": "address"
            },
            {
                "internalType": "address",
                "name": "spender",
                "type": "address"
            }
        ],
        "outputs": [
            {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }
        ],
        "stateMutability": "view",
        "type": "function"
    }
];

// 获取当前许可并在需要时更新
const checkAndSetAllowance = async (wallet, tokenAddress, approvalAddress, amount) => {
    // 使用原生代币的交易不需要批准
    if (tokenAddress === ethers.constants.AddressZero) {
        return
    }

    const erc20 = new Contract(tokenAddress, ERC20_ABI, wallet);
    const allowance = await erc20.allowance(await wallet.getAddress(), approvalAddress);

    if (allowance.lt(amount)) {
        const approveTx = await erc20.approve(approvalAddress, amount);
        await approveTx.wait();
    }
}

await checkAndSetAllowance(wallet, quote.action.fromToken.address, quote.estimate.approvalAddress, fromAmount);
4

发送交易

收到报价后,必须发送交易以触发转账。首先,必须配置钱包。以下示例将您的钱包连接到 Gnosis Chain。
const provider = new ethers.providers.JsonRpcProvider('https://rpc.xdaichain.com/', 100);
const wallet = ethers.Wallet.fromMnemonic(YOUR_PERSONAL_MNEMONIC).connect(
    provider
);
然后,可以使用之前检索到的报价中的 transactionRequest 发送交易:
const tx = await wallet.sendTransaction(quote.transactionRequest);
await tx.wait();
5

如果适用,执行第二步

如果使用了两步路径,第一步完成后必须执行第二步。像下一步中描述的那样获取第一步的状态,然后从 /advanced/stepTransaction 端点请求 transactionData。
6

获取转账状态

要检查代币是否已成功发送到接收链,可以调用 /status 端点:
const getStatus = async (bridge, fromChain, toChain, txHash) => {
    const result = await axios.get('https://li.quest/v1/status', {
        params: {
            bridge,
            fromChain,
            toChain,
            txHash,
        }
    });
    return result.data;
}

result = await getStatus(quote.tool, fromChain, toChain, tx.hash);

完整示例

const ethers = require('ethers');
const axios = require('axios');

const API_URL = 'https://li.quest/v1';

// 获取您所需转账的报价
const getQuote = async (fromChain, toChain, fromToken, toToken, fromAmount, fromAddress) => {
    const result = await axios.get(`${API_URL}/quote`, {
        params: {
            fromChain,
            toChain,
            fromToken,
            toToken,
            fromAmount,
            fromAddress,
        }
    });
    return result.data;
}

// 检查您的转账状态
const getStatus = async (bridge, fromChain, toChain, txHash) => {
    const result = await axios.get(`${API_URL}/status`, {
        params: {
            bridge,
            fromChain,
            toChain,
            txHash,
        }
    });
    return result.data;
}

const fromChain = 42161;
const fromToken = 'USDC';
const toChain = 100;
const toToken = 'USDC';
const fromAmount = '1000000';
const fromAddress = YOUR_WALLET_ADDRESS;

// 设置您的钱包
const provider = new ethers.providers.JsonRpcProvider('https://rpc.xdaichain.com/', 100);
const wallet = ethers.Wallet.fromMnemonic(YOUR_PERSONAL_MNEMONIC).connect(
    provider
);

const run = async () => {
    const quote = await getQuote(fromChain, toChain, fromToken, toToken, fromAmount, fromAddress);
    const tx = await wallet.sendTransaction(quote.transactionRequest);

    await tx.wait();

    // 仅适用于跨链转账
    if (fromChain !== toChain) {
        let result;
        do {
            result = await getStatus(quote.tool, fromChain, toChain, tx.hash);
        } while (result.status !== 'DONE' && result.status !== 'FAILED')
    }
}

run().then(() => {
    console.log('DONE!')
});