Wormholescan 有目标交易仍未到账:核对NTT消息、队列和释放
链小知 · 进阶 · 核验 · 依官方文档整理
用已有operations与NTT事件分开源发消息、Guardian VAA、目标接收和mint/unlock,避免直接复制示例Completed标签或将NTT当Portal WTT。
开始前准备
- 已有脱敏operations响应及原参数、源/目标交易或NTT事件记录;没有时按官方字段说明列出缺口。
- 明确该资产使用NTT及对应manager/transceiver;WTT/Portal转移参考其独立流程,不套本篇NTT队列规则。
- 保存环境、chain ID、emitter/sequence、token地址和采集日期;不运行官方demo、不发API/兑换或队列完成交易。
1. 明确查询范围与NTT产品身份
/api/v1/operations为跨链活动列表;已有记录中的address、txHash、sourceChain/targetChain/includesChain、appId/exclusiveAppId与addressType都保留。规范address描述emitter,而addressType给from/to;未取得更详细匹配规则时不要称该查询覆盖某钱包所有资产。
NTT由manager及transceiver管理原生token锁/烧、mint/unlock,可有多个transceiver及阈值。普通Core消息、WTT包装资产、CCTP或其他payload不能仅因为有VAA就套NTT字段;根据已有payload/appIds与manager配置辨别,未知产品标待核。
检查结果:记录明确是何种操作/产品及筛选范围,NTT身份不足时不推队列或资产释放。
2. 按当前规范识别列表和金额结构
当前GET operations的200规范是OperationResponse数组,官方SDK3.x指南却用response.operations。先判已有响应为数组还是对象,保留路径差异;null/缺字段不能硬转成空operations。
content.standarizedProperties按规范保留原拼写,不自行改为standardizedProperties。sourceChain、targetChain、vaa与content未全部声明required,读取每项前检查存在性;指南强类型和示例payload结构不保证所有跨链产品返回同样内容。
检查结果:解析路径、原JSON形状与实际有无字段明确;类型断言不会制造一个假目标记录。
3. 拆开源活动、VAA和目标记录
按id及emitterChain/emitterAddress/sequence串联sourceChain.transaction.txHash、vaa、targetChain.transaction.txHash,同时保存各自status和时间。当前status是字符串未给完整成功枚举,沿用原值,不把任意非空值映射成完成。
官方getOperationStatus helper仅检查targetChain存在就Completed,否则vaa存在就Emitted。这是演示标签,不能当到账判定;目标记录可能是消息接收/队列动作。VAA存在也只是另一阶段,目标hash必须属于正确目标链并与同消息对应。
检查结果:源交易、证明和目标关联分别列证据;示例Completed标签与可证执行结果没有混合。
4. 用NTT事件定位尚未释放的阶段
EVM上的ReceiveRelayedMessage与MessageAttestedTo描述消息接收/attestation;目标threshold未满足或inbound capacity受限时仍可能等待/队列。完成mint/unlock后才有TransferRedeemed;已有日志中的InboundTransferQueued或StillQueued错误不能作已释放。
Solana ReceiveMessage/Redeem也不同于ReleaseInboundMint/ReleaseInboundUnlock;官方特别说明revert_on_delay=false时交易可成功但mint/unlock未发生。因此目标交易成功仍不足,需对应释放日志/结果及同一收款token证据。queue delay由具体配置决定,不给固定到账分钟数,也不发complete/release交易。
检查结果:排错分支能指向验证阈值、目标队列或实际释放;链特定的交易成功与资产动作分开。
5. 保留精确金额、token和费用口径
已有NTT payload可有nttMessage.trimmedAmount.amount/decimals,规范标准化层还有amount/normalizedDecimals、tokenChain/tokenAddress与from/to。保留各层原字符串和精度,别将两个amount当同一尺度或统一乘除18/8;换算需对应NTT版本和目标token decimals证据。
源/目标fee、feeUSD、gasTokenNotional与标准化fee/feeChain/feeAddress是不同层;schema没有为所有字段给单位/时刻保证,币种未知时不补USD或native金额。token名字、链native token与桥接表示不同,目标收款证据需匹配目标token地址与接收人。
检查结果:金额保留原精度与字段层级,费用币种和目标资产身份未知项可见,不给实时估值或到账金额承诺。
6. 检查分页、时间与索引缺口后出结论
operations支持page/pageSize及from/to,但本次方法规范未定义页起点/最大页/该时间格式;不要套VAA列表RFC3339两周默认规则或旧源码pageSize100。固定原查询条件,保存每页原id与采集时间,跨页重复先保留后标记,不能称全链历史。
400/500、空数组、字段缺失与未知索引状态分别记录。最终结论可为“仅有VAA”“有目标接收/队列,未取得释放证据”“有对应释放且已有目标token收款证据”,后者仍注明独立链最终性是否已核实;缺targetChain不直接等于链上没执行。
检查结果:结论限定已有记录的产品、范围和时刻,索引、目标执行、实际收款与最终性各自有依据或未知。
怎样确认完成
- 形成同一消息的源交易、VAA、目标活动、NTT阶段与已有收款证据表。
- 正文明确分页/索引/单位/最终性及版本缺口;没有业务API实测、运行demo或触发资金操作。
常见错误与边界
- 复制官方演示helper的Completed标签,省略目标status/队列/释放检查。
- 将NTT的manager/transceiver/队列流程自动套Portal WTT或任意Core消息。
- 把规范数组响应与指南operations外壳冲突静默修补,或把拼写standarizedProperties改掉。
- 把目标tx成功当已mint/unlock,忽略Solana revert_on_delay=false;将不同金额/费用层统一当18位native币。