mcpField
T
token-distribution

token-distribution

github.com/lightprotocol開発736 回インストール20 週間前に更新
リポジトリ

token-distribution について

TypeScript クライアントで複数の受取人に圧縮トークンを配布する、Solana 開発者向けガイドです。単一トランザクションとバッチ処理に加え、請求型配布の参照実装を扱います。

主な機能

  1. 01TypeScript クライアントで圧縮トークンを配布
  2. 02受取人数に応じた単発・バッチ方式の選択
  3. 03Merkle Distributor と Simple Claim の参照実装
  4. 04線形ベスティング、部分請求、回収への対応
  5. 05ミント作成とトランザクション設定の説明

活用シーン

  1. 01少数の受取人に単一トランザクションでエアドロップ
  2. 02多数の受取人へバッチでトークンを送付
  3. 03線形ベスティングや部分請求付きの配布設定
  4. 04ユーザーが請求する形式の配布を構築

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/lightprotocol/skills --skill token-distribution

インストール後、Claude Code で/token-distributionを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
batched-airdrop.md
simple-airdrop.md
spl-to-light.md

詳細

Airdrop

TypeScript クライアントを使って、圧縮トークンを複数の受取人に配布します。

免責事項: このガイドでは、ZK 圧縮を利用した Solana での効率的なトークン配布について説明します。金融アドバイスを目的とするものではなく、特定のトークンやプロジェクトを推奨するものでもありません。

ワークフロー

  1. 意図を明確にする
    • プランモードが有効になっていない場合は、有効にすることを推奨します
    • AskUserQuestion を使って不明点を解消します
    • 実行前にすべての質問を解決する必要があります
  2. 参照資料とスキルを特定する
  3. プランファイルを作成する(YAML タスク形式)
    • 不明点があれば AskUserQuestion を使います。推測や思い込みは避けてください
    • 権限、依存関係、不明事項などのブロッカーを特定します
    • 実行を開始する前にプランを完成させる必要があります
  4. 実行する
    • 並行調査にはサブエージェントとともに Task ツールを使います
    • サブエージェントは Skill ツールを使ってスキルを読み込みます
    • TodoWrite を使って進捗を管理します
  5. 行き詰まった場合: 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 lamports5,000 lamports

クレームプログラムのリファレンス実装

トークン配布をカスタマイズし、ユーザーがクレームできるようにします。

シンプルな実装:simple-claim - 圧縮トークンを配布し、クレーム時に解凍します。

高度な実装:distributor - SPL トークンを配布し、圧縮 PDA を使ってクレームを追跡します。jito Merkle distributor を基にしています。

distributorsimple-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
1120,000
5170,000
バッチトランザクション500,000

ルックアップテーブル

トランザクションサイズを削減します。

ネットワークアドレス
Mainnet9NYFyEqPkyXUhkerbGHXUXkvb4qpzeEdHuGpgbgpH1NJ
DevnetqAJZMgnQJ8G6vA3WRcjD9Jan1wtKkaCFWLWskxJrR5V

高度な方法:クレームベース

ベスティング、取り消し、またはユーザー起点のクレームに使用します。

実装機能
Merkle Distributor線形ベスティング、部分クレーム、取り消し、REST API
Simple ClaimSlot X でのクリフベスティング

リソース

SDK リファレンス

パッケージリンク
@lightprotocol/stateless.jsAPI ドキュメント
@lightprotocol/compressed-tokenAPI ドキュメント

セキュリティ

このスキルは、コードパターンとドキュメントの参照のみを提供します。

  • 宣言された依存関係。 参照例では、トランザクションへの署名に 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 で公開されています。

コメント