跳到正文
← 使用教程

Enso跨链资产到了但仓位没建:核callback与退款位置

链小知 · 进阶 · 核验 · 依官方文档整理

从原桥协议、callback局部输出和执行事件核目的链动作;将bridgeRefundAssets计划返还位置与实际退款分开。

开始前准备

  • 准备已有脱敏route/bundle、源链交易hash、callback数组、桥状态及可选退款材料;保留链ID、代币地址、金额原单位与时间。

1. 确认原桥协议与callback适用范围

对原Route响应找action=bridge的hop及protocol,bridgingEstimates仅为估计;Bundle的protocol由原bridge动作指定。记录源链chainId、destinationChainId、tokenIn、receiver和原交易hash,不用目的交易hash代替源hash查询对象。

Route可自动选桥但不允许手选;自定义目的动作要辨Bundle。CCTP仅USDC且callback只支持经chain 999到HyperCore的[enso:balance,hypercore-spot:deposit];普通swap/vault callback不套此路径。EVM→Solana只送代币,没有目的callback组合。

检查结果:源/目的链、实际桥、请求形状与callback适用性明确。

2. 核目的余额与callback局部输出索引

支持的callback序列先用protocol=enso、action=balance,args.token是目的链实际接收的代币。后续amountIn引用useOutputOfCallAt:0读取这个余额,而非把源amountIn或预期报价写成目的固定金额。

useOutputOfCallAt索引相对于当前callback数组,不相对于外层bundle;某动作多输出时还可有index字段。嵌套回桥的新callback重新核其局部balance和索引,缺原数组或代币对应关系就停止换算。

检查结果:每层callback的目的token、balance及局部输出引用对应原数组。

3. 区分桥限制与所在链原子性

bridge的primaryAddress随协议不同:CCIP Router、CCTP TokenMessengerV2、Relay代币地址、Stargate OFT pool。不能把一条链的池或router当通用目的合约。文档称Bundle单callback序列最多10个串联动作;CCIP约30KB、至少200k gas且最大值依lane,Stargate约9.5KB、300k base,Relay动态计算。

这些上限不证明原payload已合格。源交易和目的callback分开执行,目的动作在该目的交易内一起成功或回滚;已finalized的源桥不能被目的失败撤回。确认原失败位于桥投递还是目的动作,缺原错误就留未知。

检查结果:primaryAddress、payload/gas限制及两链执行阶段分别核。

4. 对桥状态及目的执行事件分别取证

状态方法输入source chainId和source txHash;所有桥状态端点限每key或未认证IP每10秒1次,429是限频错误,不是桥失败。pending、inflight、unknown分别保留,估计送达时间不能代替结果;不同桥表格/示例枚举不同,不扩成统一保证。

Stargate/CCIP/Relay可有ensoSourceEvent与ensoDestinationEvent;null不补false,目的success=false还看error/refundDetails。Stargate多hop保留hops逐段;ready_for_manual_execution可为stored payload,不能直接写资产丢失。

CCTP只有ensoSourceEvent,目的为Circle receiveMessage/forward流程。forward.state、destinationTxHash与实际nonce相关,文档还说暂读不到目的nonce时可保留delivered;因此单个delivered标签不能证明最终业务仓位成功。

检查结果:桥状态、目的动作事件、各hop与CCTP特殊字段分开,缺值留未知。

5. 将退款目的元数据与实际返还分开

成功的route/bundle/nontokenized响应metadata.bridgeRefundAssets,是已选交易的bridge-principal退款目的有序列表。每项protocol、chainId、token、recipient分别核;symbol可选。Relay列源链退款目的,Stargate/CCIP仅有callback data时列目的链项。空列表可为同链或无协议退款路径,不证明已退款或永不返还。

refundReceiver不是通用bridge action参数;不要把route层dust/refund设置混入所有桥args。实际callback失败可有refundDetails的token/amount/recipient/isNative;Relay原结果另有refundChainId/refundTxHash,退款时没有destinationTxHash。

用原实际返还交易与链/token/接收人对计划目的,再分别核目的仓位或剩余资产;只有metadata或一个失败标签,不能断言退款已到账、全额返还或费用已退。

检查结果:计划principal返还位置、实际退款和最终仓位各有记录或明确未知。

怎样确认完成

  • 得到原桥、callback输出、目的执行与返还位置对照;官方方法已核,实际仓位/资产与退款结果依原材料确认。

常见错误与边界

  • callback的输出索引是局部序列,源amountIn和预估amountOut不能替代目的balance。
  • CCTP的目的mint/forward不是一般Enso callback,统一delivered标签不替代目的结果。
  • bridgeRefundAssets不是已退款回执,也不覆盖所有手续费或任意余额。

本教程根据官方资料整理,尚未完成逐步操作验收。界面、支持范围及费用变化时,先核对官方说明。 纯文本版 · 提交纠错依据