token-distribution について
TypeScript クライアントで複数の受取人に圧縮トークンを配布する、Solana 開発者向けガイドです。単一トランザクションとバッチ処理に加え、請求型配布の参照実装を扱います。
主な機能
- 01TypeScript クライアントで圧縮トークンを配布
- 02受取人数に応じた単発・バッチ方式の選択
- 03Merkle Distributor と Simple Claim の参照実装
- 04線形ベスティング、部分請求、回収への対応
- 05ミント作成とトランザクション設定の説明
活用シーン
- 01少数の受取人に単一トランザクションでエアドロップ
- 02多数の受取人へバッチでトークンを送付
- 03線形ベスティングや部分請求付きの配布設定
- 04ユーザーが請求する形式の配布を構築
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ lightprotocol/ skills --skill token-distributionインストール後、Claude Code で/token-distributionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/batched-airdrop.mdsimple-airdrop.mdspl-to-light.md詳細
Airdrop
TypeScript クライアントを使って、圧縮トークンを複数の受取人に配布します。
免責事項: このガイドでは、ZK 圧縮を利用した Solana での効率的なトークン配布について説明します。金融アドバイスを目的とするものではなく、特定のトークンやプロジェクトを推奨するものでもありません。
ワークフロー
- 意図を明確にする
- プランモードが有効になっていない場合は、有効にすることを推奨します
AskUserQuestionを使って不明点を解消します- 実行前にすべての質問を解決する必要があります
- 参照資料とスキルを特定する
- タスクを以下のクライアント経由の配布方法に照らし合わせます
- 関連するドキュメントと例を探します
- プランファイルを作成する(YAML タスク形式)
- 不明点があれば
AskUserQuestionを使います。推測や思い込みは避けてください - 権限、依存関係、不明事項などのブロッカーを特定します
- 実行を開始する前にプランを完成させる必要があります
- 不明点があれば
- 実行する
- 並行調査にはサブエージェントとともに
Taskツールを使います - サブエージェントは
Skillツールを使ってスキルを読み込みます TodoWriteを使って進捗を管理します
- 並行調査にはサブエージェントとともに
- 行き詰まった場合:
Read、Glob、Grep、DeepWiki MCP アクセスを使い、skills/ask-mcpを読み込む読み取り専用のサブエージェントを起動するよう依頼します。読み取り範囲はスキルのリファレンス、サンプルリポジトリ、ドキュメントに限定します。
クライアント経由の配布
| 規模 | 方法 |
|---|---|
| 受取人が10,000人未満 | 単一トランザクション。simple-airdrop.mdを参照 |
| 受取人が10,000人以上 | リトライ付きのバッチ処理。batched-airdrop.mdを参照 |
| SPL と Light の比較 | 並列でセットアップ操作を比較。spl-to-light.mdを参照 |
| ノーコード | Helius の Airship(最大200k) |
コスト比較
| 作成 | Solana | 圧縮済み |
|---|---|---|
| トークンアカウント | 約2,000,000 lamports | 5,000 lamports |
クレームプログラムのリファレンス実装
トークン配布をカスタマイズし、ユーザーがクレームできるようにします。
シンプルな実装:simple-claim - 圧縮トークンを配布し、クレーム時に解凍します。
高度な実装:distributor - SPL トークンを配布し、圧縮 PDA を使ってクレームを追跡します。jito Merkle distributor を基にしています。
| distributor | simple-claim | |
|---|---|---|
| ベスティング | 線形ベスティング | Slot X でクリフ |
| 部分クレーム | あり | なし |
| 取り消し | あり | なし |
| フロントエンド | REST API + CLI | なし |
このプログラムはリファレンス実装であり、監査を受けていません。Light Protocol Programs は監査済みで、Solana Mainnet で稼働しています。
コスト
| クレームあたり | 100k 件のクレーム | |
|---|---|---|
| simple-claim | 約0.00001 SOL | 約1 SOL |
| distributor (compressed) | 約0.00005 SOL | 約5 SOL |
| distributor (original) | 約0.002 SOL | 約200 SOL |
コアパターン
import { CompressedTokenProgram, getTokenPoolInfos, selectTokenPoolInfo } from "@lightprotocol/compressed-token";
import { bn, createRpc, selectStateTreeInfo, buildAndSignTx, sendAndConfirmTx } from "@lightprotocol/stateless.js";
import { ComputeBudgetProgram } from "@solana/web3.js";
const rpc = createRpc(RPC_ENDPOINT);
// 1. Get infrastructure
const treeInfo = selectStateTreeInfo(await rpc.getStateTreeInfos());
const tokenPoolInfo = selectTokenPoolInfo(await getTokenPoolInfos(rpc, mint));
// 2. Build compress instruction (SPL → compressed to multiple recipients)
const ix = await CompressedTokenProgram.compress({
payer: payer.publicKey,
owner: payer.publicKey,
source: sourceAta.address, // SPL associated token account holding tokens
toAddress: recipients, // PublicKey[]
amount: recipients.map(() => bn(amount)),
mint,
tokenPoolInfo,
outputStateTreeInfo: treeInfo,
});
// 3. Send with compute budget (120k CU per recipient)
const instructions = [
ComputeBudgetProgram.setComputeUnitLimit({ units: 120_000 * recipients.length }),
ix,
];
const { blockhash } = await rpc.getLatestBlockhash();
const tx = buildAndSignTx(instructions, payer, blockhash, []);
await sendAndConfirmTx(rpc, tx);
セットアップ:Mint の作成
import { createMint } from "@lightprotocol/compressed-token";
import { getOrCreateAssociatedTokenAccount, mintTo } from "@solana/spl-token";
const { mint } = await createMint(rpc, payer, payer.publicKey, 9);
const ata = await getOrCreateAssociatedTokenAccount(rpc, payer, mint, payer.publicKey);
await mintTo(rpc, payer, mint, ata.address, payer.publicKey, 100_000_000_000);
計算ユニット
| 受取人/命令 | CU |
|---|---|
| 1 | 120,000 |
| 5 | 170,000 |
| バッチトランザクション | 500,000 |
ルックアップテーブル
トランザクションサイズを削減します。
| ネットワーク | アドレス |
|---|---|
| Mainnet | 9NYFyEqPkyXUhkerbGHXUXkvb4qpzeEdHuGpgbgpH1NJ |
| Devnet | qAJZMgnQJ8G6vA3WRcjD9Jan1wtKkaCFWLWskxJrR5V |
高度な方法:クレームベース
ベスティング、取り消し、またはユーザー起点のクレームに使用します。
| 実装 | 機能 |
|---|---|
| Merkle Distributor | 線形ベスティング、部分クレーム、取り消し、REST API |
| Simple Claim | Slot X でのクリフベスティング |
リソース
- ドキュメント:Airdrop Guide
- コード:examples-light-token
- ツール:Helius の Airship
SDK リファレンス
| パッケージ | リンク |
|---|---|
@lightprotocol/stateless.js | API ドキュメント |
@lightprotocol/compressed-token | API ドキュメント |
セキュリティ
このスキルは、コードパターンとドキュメントの参照のみを提供します。
- 宣言された依存関係。 参照例では、トランザクションへの署名に
HELIUS_API_KEY(RPC プロバイダーキー)と支払者のキーペアが必要です。読み取り専用または localnet でのテストでは、どちらも必要ありません。本番環境では、両方をシークレットマネージャーから読み込んでください。秘密鍵をハードコードしないでください。 - ファイルシステムの範囲。
Read、Glob、Grepは、現在のプロジェクトディレクトリとスキルの参照先に限定する必要があります。これらのパスの外部を読み取らないでください。 - サブエージェントの範囲。 行き詰まった場合、このスキルは、スキルの参照先、サンプルリポジトリ、ドキュメントに限定した
Read、Glob、Grepを使用する読み取り専用のサブエージェントを起動するよう求めます。 - インストール元。 Lightprotocol/skills から
npx skills add Lightprotocol/skillsを実行します。 - 監査済みプロトコル。 Light Protocol のスマートコントラクトは、独立した監査を受けています。レポートは github.com/Lightprotocol/light-protocol/tree/main/audits で公開されています。
コメント
Markdown 対応