ccip について
ccipは、HederaでChainlink CCIPによるクロスチェーントークンとメッセージを実装するスキルです。バーン・ミントの構成、トークン登録、双方向レーン設定、送信に加え、HTSトークンと登録するラッパーの違いも扱います。
主な機能
- 01バーン・ミント型トークンとプールのデプロイ
- 02トークン登録と双方向レーンの設定
- 03ネイティブガス料金でのメッセージ送信
- 04HTSラッパー統合の要件説明
活用シーン
- 01Hederaと他チェーン間のトークン転送構築
- 02CCIPトークンプールとリモートレーンの設定
- 03HTSトークンのクロスチェーン送信の確認
インストール
コマンドをコピーしてターミナルで実行します。
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 を双方向に |
| 手数料 | ネイティブガス (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 → リモート送信には2 つの承認が必要: HTS → ラッパー、ラッパー → Router
- 受信アカウントは、インバウンドミントの前にネイティブ HTS トークンをアソシエイトする必要がある
- ミント/バーン/転送額は HTS の
int64に収まる必要がある
Axelar や LayerZero のトークンアドレスを CCIP の env/config に混在させないでください。
送信フロー (ネイティブ手数料)
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 — セレクター vs チェーン ID、router/registry の入手先
- CCIP directory
- CCIP burn-and-mint CCT
- CCIP Explorer