关于 ccip
ccip 是面向 Hedera 的 Chainlink CCIP 跨链代币与消息集成技能,涵盖 burn-mint 代币部署、注册、链间配置及发送流程。它也说明 HTS 支持路径中包装代币与原生代币的区别。
主要功能
- 01部署 burn-mint 代币和代币池
- 02注册代币并配置双向链路
- 03使用原生 Gas 费用发送消息
- 04说明 HTS 包装代币集成要点
适用场景
- 01构建 Hedera 与其他链间的代币转移
- 02配置 CCIP 代币池及远程链路
- 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。
快速参考
| 组件 | 作用 |
|---|---|
| Router | getFee + 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。
重要:先注册,再配置两个方向的通道
注册表/代币池配置不完整会导致代币无法使用。对每条链:
- 部署代币 + 代币池
- 为代币上的代币池授予铸造/销毁权限
- 调用
registerAdminViaGetCCIPAdmin(token),然后调用acceptAdminRole(token) - 调用
TokenAdminRegistry.setPool(token, pool) - 两条链上的代币和代币池地址都准备好后:在每个代币池上调用
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 配置中复制
参考资料
- references/examples.md — 注册、配置、发送和 HTS 双重授权示例
- references/hedera-ccip.md — 选择器与链 ID 的区别,以及 Router/注册表地址的来源
- CCIP 目录
- CCIP 销毁并铸造 CCT
- CCIP Explorer