运行时依赖
安装命令
点击复制技能文档
使用TypeScript客户端将压缩的代币分发给多个接收者。 免责声明:本指南演示如何在Solana上使用ZK压缩高效分发代币。它不构成财务建议,也不支持任何特定的代币或项目。
工作流程 澄清意图 推荐计划模式,如果尚未激活 使用AskUserQuestion解决盲点 所有问题必须在执行之前解决 识别参考和技能 将任务匹配到以下分发方法 找到相关文档和示例 编写计划文件(YAML任务格式) 对于任何不清楚的内容,请使用AskUserQuestion —— 永远不要猜测或假设 识别阻塞器:权限、依赖、未知数 计划必须在执行开始之前完成 执行 使用带有子代理的Task工具进行并行研究 子代理通过Skill工具加载技能 使用TodoWrite跟踪进度 当卡住时:请求生成一个只读子代理,具有Read、Glob、Grep和DeepWiki MCP访问权限,加载技能/ask-mcp。 范围读取技能参考、示例存储库和文档。
通过客户端分发 规模方法 <10,000个接收者 单个事务 —— 参见simple-airdrop.md 10,000+个接收者 批处理重试 —— 参见batched-airdrop.md 无代码Airship by Helius(最多200k) 成本比较 创建 Solana压缩代币账户 ~2,000,000 lamports 5,000 lamports 索赔程序 参考实现 自定义代币分发并让用户索赔。 简单实现:simple-claim - 分发压缩代币,在索赔时解压缩。 高级实现:distributor - 分发SPL代币,使用压缩PDA跟踪索赔。 基于jito Merkle分发器。 distributor simple-claim 线性解冻 在插槽X处的悬崖 部分索赔 是 否 回收 是 否 前端 REST API + CLI 无 这些程序是参考实现,未经审计。 Light Protocol程序已审计并在Solana主网上运行。 每次索赔成本 10万次索赔 simple-claim ~0.00001 SOL ~1 SOL distributor(压缩)~0.00005 SOL ~5 SOL distributor(原始)~0.002 SOL ~200 SOL
核心模式 导入 { CompressedTokenProgram, getTokenPoolInfos, selectTokenPoolInfo } 从 "@lightprotocol/compressed-token"; 导入 { bn, createRpc, selectStateTreeInfo, buildAndSignTx, sendAndConfirmTx } 从 "@lightprotocol/stateless.js"; 导入 { ComputeBudgetProgram } 从 "@solana/web3.js"; 常数 rpc = createRpc(RPC_ENDPOINT); // 1. 获取基础设施 常数 treeInfo = selectStateTreeInfo(await rpc.getStateTreeInfos()); 常数 tokenPoolInfo = selectTokenPoolInfo(await getTokenPoolInfos(rpc, mint)); // 2. 构建压缩指令(SPL → 压缩到多个接收者) 常数 ix = await CompressedTokenProgram.compress({ 支付者:payer.publicKey, 所有者:payer.publicKey, 源:sourceAta.address,// SPL关联代币账户,持有要分发的代币 toAddress:接收者,// PublicKey[] 金额:接收者.map(() => bn(金额)), mint, tokenPoolInfo, 输出状态树信息:treeInfo, ); // 3. 使用计算预算发送(每个接收者120k CU) 常数 instructions = [ ComputeBudgetProgram.setComputeUnitLimit({ units: 120_000 * recipients.length }), ix, ]; 常数 { blockhash } = await rpc.getLatestBlockhash(); 常数 tx = buildAndSignTx(instructions, payer, blockhash, []); await sendAndConfirmTx(rpc, tx);
设置: 创建Mint 导入 { createMint } 从 "@lightprotocol/compressed-token"; 导入 { getOrCreateAssociatedTokenAccount, mintTo } 从 "@solana/spl-token"; 常数 { mint } = await createMint(rpc, payer, payer.publicKey, 9); 常数 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
查找表 减少事务大小: 网络地址 主网 9NYFyEqPkyXUhkerbGHXUXkvb4qpzeEdHuGpgbgpH1NJ 开发网 qAJZMgnQJ8G6vA3WRcjD9Jan1wtKkaCFWLWskxJrR5V
高级:基于索赔 用于解冻、回收或用户发起的索赔: 实现功能 Merkle分发器 线性解冻、部分索赔、回收、REST API 简单索赔 在插槽X处的悬崖
资源 文档:Airdrop指南 代码:examples-light-token 工具:Airship by Helius SDK参考 包链接 @lightprotocol/stateless.js API文档 @lightprotocol/compressed-token API文档
安全 本技能仅提供代码模式和文档参考。 声明的依赖项。 参考示例需要HELIUS_API_KEY(RPC提供程序密钥)和用于签署事务的payer密钥对。 在生产中,从密钥管理器加载两个密钥 —— 永远不要硬编码私钥。 文件系统范围。 Read、Glob和Grep必须限制在当前项目目录和技能参考中。 不要读取这些路径之外的内容。 子代理范围。 当卡住时,技能会请求生成一个只读子代理,具有Read、Glob、Grep范围,用于技能参考、示例存储库。