exchange.IO("bridge.*", ...)
经LI.FI聚合的跨链桥把代币从Solana转到EVM链:查询链与代币、报价、模拟、发送与查询进度。
exchange.IO(k)
exchange.IO(k, chain)
exchange.IO(k, params)
exchange.IO(k, signature)
exchange.IO(k, signature, options)
exchange.IO(k, key)示例
-
列出支持的链,查找Arbitrum上的USDC(只读)。
javascriptfunction main() { var chains = exchange.IO("bridge.chains") if (!chains) { Log("查询失败:", GetLastError()) return } Log("共", chains.length, "条链:", chains.slice(0, 8).map(function(c) { return c.key }).join(",")) var tokens = exchange.IO("bridge.tokens", "arb") || [] var usdc = tokens.filter(function(t) { return t.symbol == "USDC" })[0] Log("Arbitrum上的USDC:", usdc ? usdc.address : "没找到") } -
报价把50 USDC桥到Arbitrum,并模拟(只读)。
javascriptvar TO = "" // 填你在Arbitrum上的收款地址(0x开头) function main() { if (!TO) { Log("请先把TO设为你在目标链上的地址") return } var q = exchange.IO("bridge.quote", {toChain: "arb", fromToken: "USDC", toToken: "USDC", amount: 50, toAddress: TO}) if (!q) { Log("报价失败:", GetLastError()) return } Log("经", q.toolName, "到账", q.toAmount, "最少", q.toAmountMin, "预计", q.executionDuration, "秒") q.feeCosts.forEach(function(f) { Log("费用", f.name, f.amount, f.token, f.included ? "已含" : "另付") }) var sim = exchange.IO("bridge.simulate", q) Log("模拟:", sim ? "通过,计算单元 " + sim.unitsConsumed : GetLastError()) } -
完整流程:报价 → 模拟 → 发送 → 轮询进度。
javascriptvar TO = "" // 填你在Base上的收款地址(0x开头) function main() { if (!TO) { Log("请先把TO设为你在目标链上的地址") return } var params = {toChain: "base", fromToken: "USDC", toToken: "USDC", amount: 20, toAddress: TO} 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.toAmount, "USDC") while (true) { Sleep(20 * 1000) var s = exchange.IO("bridge.status", r.txHash, {toChain: "base", bridge: r.tool}) if (!s) { continue } LogStatus(_D(), s.status, s.substatus || "") if (s.status == "DONE" || s.status == "FAILED" || s.status == "INVALID") { Log("结果", s.status, s.substatus, "到账", s.receiving ? s.receiving.amount : "-") break } } }
返回值
| 类型 | 描述 |
array / object / bool / 空值 |
|
参数
| 名称 | 类型 | 必填 | 描述 |
k | string | 是 | 指令名: |
chain | string / number | 否 |
|
params | object | 否 |
|
signature | string | 否 |
|
options | object | 否 |
|
key | string | 否 |
|
参考
Jupiter exchange.IO exchange.IO("receipt") exchange.IO("slippage") exchange.IO("token") exchange.CreateOrder
备注
流程
bridge.quote看报价 → bridge.simulate模拟 → bridge.send发出 → 每10~30秒bridge.status直到DONE或FAILED。
报价与交易由LI.FI给出(聚合Across、Stargate、CCTP、deBridge、Mayan、Relay、NEAR Intents等桥),LI.FI返回序列化的Solana交易,由托管者用本钱包签名(本钱包不是签名者时报错)、模拟后经Solana节点广播。请求带集成方标识integrator=fmz,不另收费;报价里的LIFI Fixed Fee等是LI.FI与桥自己的费用,已计入toAmount。
跨链参数
| 键 | 必填 | 说明 |
|---|---|---|
toChain | 是 | 目标链:链ID、LI.FI的链key(如arb)或链名(如Arbitrum、Base,不区分大小写)。不能是Solana(本链,同链兑换用exchange.CreateOrder()) |
fromToken | 是 | Solana上的代币:代币表里的名字或mint地址 |
toToken | 是 | 目标链上的代币:名字或地址,由LI.FI解析为它的标准代币(如Arbitrum上的USDC是原生USDC,不是USDC.e) |
amount | 是 | fromToken的数量,按代币单位,超出代币精度的位舍去 |
toAddress | 是 | 目标链上的收款地址(0x地址,格式不对报错);目标链都是EVM链,本钱包在那里没有地址,所以必须给出 |
slippage | 否 | 滑点比例,[0, 0.5),缺省为exchange.IO("slippage")的值 |
order | 否 | CHEAPEST或FASTEST |
allowBridges、denyBridges | 否 | 只用、不用这些桥(LI.FI的桥名,数组或逗号分隔) |
不认识的键报错。传bridge.quote的结果时按其中的request(参数原样)重新报价。
返回值
bridge.chains:[{id, key, name, chainType, nativeToken}],chainType为EVM或SVM,缓存1小时。bridge.tokens:[{symbol, address, decimals, name, priceUSD}],缓存1小时。bridge.quote:{tool, toolName, fromChain, toChain, toChainName, fromToken, toToken, fromAmount, toAmount, toAmountMin, fromAmountRaw, toAmountRaw, toAmountMinRaw, fromAmountUSD, toAmountUSD, slippage, toAddress, feeCosts, gasCosts, executionDuration, approvalAddress, steps, transactionId, request}:数量为代币单位(*Raw为最小单位的原值);toAmountMin为扣除滑点后保证到手的数量;feeCosts为[{name, amount, token, amountUSD, percentage, included}](included为false的费用另付);gasCosts为源链gas估算;executionDuration为预计耗时(秒);approvalAddress在Solana上为null;steps为各步骤(cross为跨链,swap为兑换,protocol为LI.FI收费)。bridge.simulate:重新报价、用本钱包签名后simulateTransaction(核对签名),不广播;返回bridge.quote的结果另加simulated(true)、unitsConsumed、signature。模拟失败时报错:错误信息带原因(AccountNotFound为钱包没有SOL)与钱包余额。bridge.send:重新报价 → 检查余额 → 签名 → 模拟 → 广播,不等确认;返回{txHash, tool, fromChain, toChain, toChainName, fromToken, toToken, fromAmount, toAmount, toAmountMin, toAddress, transactionId},txHash为源链交易签名,可用exchange.IO("receipt")查是否上链。报价随时变化,实际以发送时的新报价为准。bridge.status:LI.FI的/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}。刚广播时LI.FI可能还没收录,返回NOT_FOUND,继续轮询即可。bridge.apiKey:设置LI.FI的API Key(请求头x-lifi-api-key,只对本交易所对象生效,不回显),返回是否已设置(布尔值)。
限频与风险
- 没有API Key时LI.FI按出口IP限频:
/quote两小时75次(bridge.quote、bridge.simulate、bridge.send各用一次),其它接口每分钟100次,同一托管者上的策略共用额度;设置Key后每分钟100次。被限频时报错rate limited (HTTP 429 …)。 - 跨链是异步的:
bridge.send返回时只是源链交易已广播,到账要几秒到几十分钟(见报价的executionDuration),必须轮询bridge.status确认。 - 收款地址写错的资金无法找回;桥合约与跨链消息的安全风险由各桥承担;目标链需要有gas才能继续使用到账的代币。先用小额测试。