exchange.IO("bridge.*", ...)
跨链桥(经LI.FI聚合的Across、Stargate、CCTP等):查询支持的链与代币、报价、模拟,把代币从本交易所对象的链转到另一条EVM链或Solana,并查询到账进度。
exchange.IO(k)
exchange.IO(k, chain)
exchange.IO(k, params)
exchange.IO(k, params, stateOverride)
exchange.IO(k, txHash, options)
exchange.IO(k, key)示例
-
报价并模拟:把0.01个ETH从本链跨到Arbitrum(只读,不花钱)。
javascriptfunction main() { var params = {toChain: "arb", fromToken: "ETH", toToken: "ETH", amount: 0.01} var q = exchange.IO("bridge.quote", params) if (!q) { Log("报价失败:", GetLastError()) return } Log("经", q.toolName, "到", q.toChainName, "预计到账", q.toAmount, "至少", q.toAmountMin, "耗时约", q.executionDuration, "秒") q.feeCosts.forEach(function (f) { Log("费用:", f.name, f.amount, f.token, f.included ? "已含在报价里" : "另付") }) // 钱包余额不够时,给钱包临时补100个ETH再模拟 var ov = {} ov[exchange.IO("address")] = {balance: "0x56bc75e2d63100000"} var s = exchange.IO("bridge.simulate", q, ov) Log(s ? "模拟通过,调用合约 " + s.to : "模拟失败: " + GetLastError()) } -
完整流程:报价 → 模拟 → 发送 → 每20秒查询进度直到到账。
javascriptfunction main() { // 把本链的20 USDC转到Arbitrum上的本钱包 var params = {toChain: "arb", fromToken: "USDC", toToken: "USDC", amount: 20} var q = exchange.IO("bridge.quote", params) if (!q || !exchange.IO("bridge.simulate", q)) { Log("报价或模拟失败:", GetLastError()) return } var r = exchange.IO("bridge.send", q) if (!r) { Log("发送失败:", GetLastError()) return } Log("源链交易", r.txHash, "经", r.tool) while (true) { Sleep(20000) var st = exchange.IO("bridge.status", r.txHash, {toChain: "arb", bridge: r.tool}) if (!st) { continue } Log(st.status, st.substatus || "") if (st.status == "DONE") { Log("到账", st.receiving.amount, st.receiving.token.symbol, st.receiving.txLink) break } if (st.status == "FAILED" || st.status == "INVALID") { Log("跨链失败:", st.substatusMessage) break } } } -
列出支持的链,报价跨到Solana。
javascriptfunction main() { var chains = exchange.IO("bridge.chains") Log("支持", chains.length, "条链,如", chains[0].name, chains[0].key) // 跨到Solana必须写toAddress(Solana地址) var q = exchange.IO("bridge.quote", {toChain: "Solana", fromToken: "USDC", toToken: "USDC", amount: 50, toAddress: "你的Solana地址", order: "CHEAPEST"}) Log(q ? [q.toolName, q.toAmount, q.toAmountMin] : GetLastError()) }
返回值
| 类型 | 描述 |
object / array / bool / 空值 | 随指令而定: |
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 指令名: |
chain | string / number | 否 |
|
params | object | 否 |
|
stateOverride | object | 否 |
|
txHash | string | 否 |
|
options | object | 否 |
|
key | string | 否 |
|
参考
Uniswap / PancakeSwap Aerodrome / Velodrome KyberSwap 1inch exchange.IO exchange.IO("receipt") exchange.IO("approve") exchange.IO("slippage") exchange.IO("gasMultiplier")
备注
各指令:
| 指令 | 参数 | 说明与返回 |
|---|---|---|
bridge.chains | 无 | LI.FI支持的链(EVM链与Solana),缓存1小时:{id, key, name, chainType, nativeToken}数组,chainType为EVM或SVM |
bridge.tokens | [chain] | LI.FI认识的某条链上的代币(缺省为本链),缓存1小时:{symbol, address, decimals, name, priceUSD}数组 |
bridge.quote | params | 跨链报价(只读),字段见下 |
bridge.simulate | params或报价结果[, stateOverride] | 重新报价并用eth_call执行LI.FI给出的交易,不签名、不广播 |
bridge.send | params或报价结果 | 重新报价、授权、模拟后签名广播;只等源链交易广播,不等到账 |
bridge.status | txHash[, {toChain, bridge}] | 跨链进度 |
bridge.apiKey | [key] | 设置LI.FI的API Key(只对本交易所对象生效,不回显),传""清除,不传只查询;返回是否已设置Key |
params的各项(不认识的键报错):
| 键 | 说明 |
|---|---|
toChain | 目标链:链ID(如42161)、LI.FI的链key(如arb)或链名(如Arbitrum、Solana) |
fromToken | 本链代币:代币表里的名字(如USDC、ETH)或合约地址 |
toToken | 目标链代币:名字或地址,由LI.FI解析为它的标准代币(如Arbitrum上的USDC是原生USDC,不是USDC.e) |
amount | fromToken的数量(代币单位),超出代币精度的位舍去 |
toAddress | 收款地址;目标为EVM链时缺省为本钱包,目标为Solana时必须传Solana地址 |
slippage | 滑点,缺省为exchange.IO("slippage")的值 |
order | CHEAPEST或FASTEST |
allowBridges、denyBridges | 只用、不用哪些桥(LI.FI的桥名,数组或逗号分隔) |
报价结果{tool, toolName, fromChain, toChain, toChainName, fromToken, toToken, fromAmount, toAmount, toAmountMin, fromAmountRaw, toAmountRaw, toAmountMinRaw, fromAmountUSD, toAmountUSD, slippage, toAddress, feeCosts, gasCosts, executionDuration, approvalAddress, steps, transactionId, request}:tool为选中的桥;数量为代币单位(*Raw为最小单位原值);toAmountMin为扣除滑点后保证到手的数量;feeCosts为[{name, amount, token, amountUSD, percentage, included}](included为false的费用另付);gasCosts为源链gas估算;executionDuration为预计耗时(秒);approvalAddress为需要授权的合约(原生币为null);steps为各步骤(cross为跨链,swap为兑换);request为参数原样回显。bridge.simulate的结果另有simulated(true)、to、value、walletBalance,补过授权时有allowanceOverride。
bridge.simulate:代币授权不够时自动用state override补成无限额度(同exchange.IO("simulate", ...));余额不会自动补,用原生币跨链时在stateOverride里给钱包补balance即可。余额不够导致失败时报错里给出钱包余额。
bridge.send的步骤:重新报价 → 检查余额 → 代币对LI.FI的approvalAddress授权不够时先授权(按exchange.IO("approve")的exact/max,USDT这类先清零,等授权上链;授权后再报价一次)→ eth_call模拟 → 签名广播。gasLimit取估算×gasMultiplier与LI.FI建议值中较大的一个。返回{txHash, tool, fromChain, toChain, toChainName, fromToken, toToken, fromAmount, toAmount, toAmountMin, toAddress, value, transactionId},txHash为源链交易,可用exchange.IO("receipt", ...)查回执。传报价结果时按其中的request重新报价,实际成交以新报价为准,toAmountMin由交易在链上保证。
bridge.status返回{status, substatus, substatusMessage, tool, sending, receiving, fromAddress, toAddress, explorer, bridgeExplorer}:status为NOT_FOUND、INVALID、PENDING、DONE、FAILED;DONE时substatus为COMPLETED(按报价到账)、PARTIAL(收到的是别的代币)或REFUNDED(已退回源链);sending、receiving为{txHash, txLink, chainId, amount, amountRaw, token, timestamp},receiving为实际到账。刚广播时LI.FI可能还没收录,返回NOT_FOUND,继续轮询即可(建议间隔10~30秒);options的toChain、bridge(发送结果的tool)可以加快查找。
跨链是异步的,到账要几秒到几十分钟(见executionDuration),必须轮询bridge.status确认;跨虚拟机(EVM↔Solana)必须传toAddress,地址写错的资金无法找回;目标链需要有gas才能继续使用到账的代币。没有API Key时LI.FI按出口IP限频(/quote两小时75次,bridge.quote、bridge.simulate、bridge.send各用一次),同一托管者上的策略共用额度,设置Key后每分钟100次。先用小额测试。