高效的跨链代币交换工具 — 基于 Base 链的智能路由优化
此 API 用于获取从输入代币到输出代币的最佳交换路由。它会智能计算多条路径,并返回输出数量最大的路由(通常是第一个)。SwaptoX: 能自动发现最优路径,减少滑点和费用。建议在执行前调用此 API 以获取实时报价。
API 端点: https://api.swaptorx.com/functions/v1/api/base/routes-in
方法: GET
| 参数 | 类型 | 描述 | 示例 |
|---|---|---|---|
| tokenIn | string | 输入代币合约地址 | 0x4200000000000000000000000000000000000006 (WETH) |
| tokenOut | string | 输出代币合约地址 | 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 (YSDC) |
| amountIn | string | 输入数量(Wei 单位) | 1000000000000000000 (1 ETH) |
| tokenInclude | boolean | 是否包含代币列表(可选,默认 false) | true |
响应结构: 返回路由数组和可选代币列表。路由按输出量降序排列,data 字段用于后续交易执行。
{
"routes": [ // 交易路径数组,优先选择第一个(最大输出)
{
"amountIn": "1000000000000000000", // 输入数量
"amountOut": "3979390992", // 输出数量
"data": "0x0000...0007", // 交易 calldata,用于 swap 函数
"blockNumber": "37342251", // 报价区块高度,确保新鲜度
"paths": [ // 路由路径代币地址数组
"0x4200000000000000000000000000000000000006",
"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
]
}
// 更多备选路由...
],
"tokens": [ // 代币元数据(若 tokenInclude=true)
{
"decimals": 18,
"name": "Aerodrome",
"symbol": "AERO",
"address": "0x940181a94a35a4569e4529a3cdfb74e38fd98631",
"logo": "1753779282831.png",
"has_permit": false,
"price_usd": "0.906086" // USD 价格,便于 UI 显示
}
// 更多代币...
]
}
blockNumber 以避免过时报价。amountOut 是精确计算值,可用于 slippage 保护。
如果输入代币是 ERC20(如 WETH),需先批准 SwaptoX 合约花费你的代币。原生 ETH 无需此步。建议: 为安全起见,批准金额应精确匹配 amountIn,避免无限批准。
批准地址: 0xde6A22861fEc6F37Ae10a6A88CF2A645Eb7094Ca
Viem 示例(批准精确金额):
const txHash = await client.writeContract({
address: '0x4200000000000000000000000000000000000006', // ERC20 合约
abi: erc20Abi, // 标准 ERC20 ABI
functionName: 'approve',
args: [
'0xde6A22861fEc6F37Ae10a6A88CF2A645Eb7094Ca', // SwaptoX 合约
1000000000000000000n // 精确金额,避免无限批准
],
account: '0x80A4...C8B9' // 用户钱包
});
调用 SwaptoX 合约的 swap 函数执行交换。理解: 此函数支持多路由优化,amountMinOut 作为滑点保护(建议 0.5-1% 低于 amountOut)。deadline 防止重放攻击。
合约地址: 0xde6A22861fEc6F37Ae10a6A88CF2A645Eb7094Ca
ABI: 查看完整 ABI
Viem 示例(带滑点保护):
const swaptoxAbi = [...]; // 从 Basescan 加载 ABI
const args = [
{
tokenIn: '0x4200000000000000000000000000000000000006', // 输入代币
tokenOut: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913', // 输出代币
amountIn: 1000000000000000000n, // 输入金额
amountMinOut: 3940000000n, // 最小输出(amountOut * 0.99,1% 滑点容忍)
data: '0x0000...0007', // 从 API 1 获取的 calldata
recipient: '0x80A4...C8B9', // 接收地址(可为第三方)
permitData: '', // 若使用 permit,此处填签名数据
slots: true // 启用槽位优化(默认 true,节省 gas)
},
Math.floor(Date.now() / 1000 + 600) // 10 分钟 deadline
];
const swapParameter = {
address: '0xde6A22861fEc6F37Ae10a6A88CF2A645Eb7094Ca',
abi: swaptoxAbi,
functionName: 'swap',
args: args,
account: '0x80A4...C8B9', // 用户钱包
value: 0n // 若输入 ETH,此处填 value
};
const txHash = await client.writeContract(swapParameter);