mcpField
C
ccip

ccip

github.com/hedera-dev开发28463 次安装8 周前更新
代码仓库

关于 ccip

ccip 是面向 Hedera 的 Chainlink CCIP 跨链代币与消息集成技能,涵盖 burn-mint 代币部署、注册、链间配置及发送流程。它也说明 HTS 支持路径中包装代币与原生代币的区别。

主要功能

  1. 01部署 burn-mint 代币和代币池
  2. 02注册代币并配置双向链路
  3. 03使用原生 Gas 费用发送消息
  4. 04说明 HTS 包装代币集成要点

适用场景

  1. 01构建 Hedera 与其他链间的代币转移
  2. 02配置 CCIP 代币池及远程链路
  3. 03审查 HTS 代币的跨链发送流程

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hedera-dev/hedera-skills --skill ccip

安装后在 Claude Code 中输入/ccip确认已加载。

附带文件references/examples.mdreferences/hedera-ccip.md

详细介绍

Chainlink CCIP(Hedera)

CCT 销毁并铸造模式: 在每条链上部署销毁铸造代币和代币池,向 CCIP 注册代币,使用链选择器配置远程池,然后支付原生费用调用 ccipSend。

BurnMint token + TokenPool (source)
        → Router.ccipSend(destSelector, message)
             → TokenPool lockOrBurn / releaseOrMint (dest)

在 Hedera 上,你可以使用普通 ERC-20 CCT 或由 HTS 支持的包装代币。CCIP 始终注册代币池所看到的 ERC-20——对于 HTS,这就是包装代币,而用户持有原生 HTS 代币。

此技能用于跨链代币/消息,不适用于 Chainlink Data Feeds。

快速参考

组件作用
RoutergetFee + ccipSend{value}
链选择器uint64 CCIP ID——不是 EVM 链 ID
代币 + 代币池销毁铸造 ERC-20 + BurnMintTokenPool(或 Hedera HTS 变体)
管理员注册表RegistryModuleOwnerCustom → TokenAdminRegistry.acceptAdminRole → setPool
通道配置两个方向都调用 TokenPool.applyChainUpdates
费用原生 Gas(feeToken = address(0));附加 msg.value
接收方在 EVM2AnyMessage.receiver 中使用 abi.encode(address)

请参阅 references/hedera-ccip.md,了解选择器和注册表地址的来源。请参阅 references/examples.md,查看注册/配置/发送示例。

重要:使用选择器,而非链 ID

ccipSend 和池的 remoteChainSelector 参数需要 CCIP 链选择器。Hedera 测试网(296)和 Sepolia(11155111)的选择器值与其 EVM 链 ID 不同。请在 CCIP 目录中查询;不要将 296 作为选择器传入。

不要在此处复用 Axelar GMP 名称或 LayerZero EID。

重要:先注册,再配置两个方向的通道

注册表/代币池配置不完整会导致代币无法使用。对每条链:

  1. 部署代币 + 代币池
  2. 为代币上的代币池授予铸造/销毁权限
  3. 调用 registerAdminViaGetCCIPAdmin(token),然后调用 acceptAdminRole(token)
  4. 调用 TokenAdminRegistry.setPool(token, pool)
  5. 两条链上的代币和代币池地址都准备好后:在每个代币池上调用 applyChainUpdates(远程选择器、远程代币池、远程代币)

然后发送少量测试金额,并在 CCIP Explorer 上跟踪。

重要:Hedera HTS 支持的 CCT

普通方案:在 Hedera EVM 上使用 BurnMintERC20 + BurnMintTokenPool,与 Sepolia 相同。

HTS 支持的方案:

  • 用户持有通过预编译合约 0x167 创建的原生 HTS 代币
  • CCIP 注册的是包装代币(HtsBurnMintERC20),而非用户在钱包中看到的 HTS 代币 ID/地址
  • 代币池(HtsBurnMintTokenPool)必须关联原生 HTS 代币,并授权包装代币
  • 从 Hedera 向远程链发送需要两次授权:HTS → 包装代币,包装代币 → Router
  • 接收方账户必须先关联原生 HTS 代币,才能接收入站铸造的代币
  • 铸造/销毁/转账金额必须符合 HTS int64 的范围

不要将 Axelar 或 LayerZero 代币地址混入 CCIP 环境变量/配置。

发送流程(原生费用)

Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
    receiver: abi.encode(receiver),
    data: "",
    tokenAmounts: tokenAmounts, // token is the CCIP-registered ERC-20 / wrapper
    feeToken: address(0),
    extraArgs: Client._argsToBytes(
        Client.EVMExtraArgsV2({ gasLimit: 0, allowOutOfOrderExecution: true })
    )
});

uint256 fee = IRouterClient(router).getFee(destinationChainSelector, message);
IERC20(tokenToSend).approve(router, amount);
IRouterClient(router).ccipSend{ value: fee }(destinationChainSelector, message);

检查清单

  • 链选择器来自 CCIP 目录(不是 EVM 链 ID、Axelar 名称或 LZ EID)
  • 两条链上都已注册代币管理员并设置代币池
  • 发送前已通过 applyChainUpdates 配置两个方向
  • 调用 ccipSend 时附加原生费用(feeToken = address(0))
  • HTS 方案:已向 CCIP 注册包装代币;用户持有原生 HTS 代币;完成双重授权 + 关联
  • 涉及 HTS 铸造/销毁时,金额符合 int64 范围
  • CCIP 代币/代币池地址并非从 Axelar/LayerZero 配置中复制

参考资料

评论

支持 Markdown