分步指南
1
请求报价或路由
Copy
Ask AI
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 = 'DAI';
const fromToken = 'USDC';
const toChain = 'POL';
const toToken = 'USDC';
const fromAmount = '1000000';
const fromAddress = YOUR_WALLET_ADDRESS;
const quote = await getQuote(fromChain, toChain, fromToken, toToken, fromAmount, fromAddress);
2
如果使用了 `/routes`,选择所需的路由并从 `/advanced/stepTransaction` 检索交易数据
只有在使用了
/routes
端点时才需要此步骤。/quote
已在响应中返回交易数据。/quote
和 /routes
之间的区别在这里描述3
设置授权额度
在发送任何交易之前,必须确保用户被允许从钱包发送请求的金额。
Copy
Ask AI
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 链。之后,可以使用先前检索到的报价中的
Copy
Ask AI
const provider = new ethers.providers.JsonRpcProvider('https://rpc.xdaichain.com/', 100);
const wallet = ethers.Wallet.fromMnemonic(YOUR_PERSONAL_MNEMONIC).connect(
provider
);
transactionRequest
发送交易:Copy
Ask AI
const tx = await wallet.sendTransaction(quote.transactionRequest);
await tx.wait();
5
如果适用,执行第二步
如果使用了两步路由,则必须在第一步完成后执行第二步。像下一步中描述的那样获取第一步的状态,然后从
/advanced/stepTransaction
端点请求交易数据。6
获取转账状态
要检查代币是否成功发送到接收链,可以调用 /status 端点:
Copy
Ask AI
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);
完整示例
Copy
Ask AI
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 = 'DAI';
const fromToken = 'USDC';
const toChain = 'POL';
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!')
});