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

整理：链小知（AI 辅助）
资料核对日期：2026-10-14
引用地址：https://lianxiaozhi.com/tools/guides/enso-crosschain-callback-output-refund-location-check
难度：进阶
核验方式：官方文档整理，未执行真实账户操作

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

## 使用工具
- [Enso](https://lianxiaozhi.com/tools/enso) · [官方入口](https://enso.build/)

## 前置条件
- 准备已有脱敏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适用性明确。
依据：[Enso：跨链callback、bridge限制与退款目的元数据](https://docs.enso.build/pages/build/get-started/crosschain-routing.md)
依据：[Enso：桥状态、执行事件与实际退款字段](https://docs.enso.build/pages/build/get-started/bridge-status.md)

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

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

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

核对结果：每层callback的目的token、balance及局部输出引用对应原数组。
依据：[Enso：跨链callback、bridge限制与退款目的元数据](https://docs.enso.build/pages/build/get-started/crosschain-routing.md)

## 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限制及两链执行阶段分别核。
依据：[Enso：跨链callback、bridge限制与退款目的元数据](https://docs.enso.build/pages/build/get-started/crosschain-routing.md)

## 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特殊字段分开，缺值留未知。
依据：[Enso：桥状态、执行事件与实际退款字段](https://docs.enso.build/pages/build/get-started/bridge-status.md)

## 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返还位置、实际退款和最终仓位各有记录或明确未知。
依据：[Enso：跨链callback、bridge限制与退款目的元数据](https://docs.enso.build/pages/build/get-started/crosschain-routing.md)
依据：[Enso：桥状态、执行事件与实际退款字段](https://docs.enso.build/pages/build/get-started/bridge-status.md)

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

## 完成检查
- 得到原桥、callback输出、目的执行与返还位置对照；官方方法已核，实际仓位/资产与退款结果依原材料确认。

## 相关知识

## 官方依据
- [Enso：跨链callback、bridge限制与退款目的元数据](https://docs.enso.build/pages/build/get-started/crosschain-routing.md)
- [Enso：桥状态、执行事件与实际退款字段](https://docs.enso.build/pages/build/get-started/bridge-status.md)
