light-protocol

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Light Protocol Development Guide

Light Protocol 开发指南

Build scalable, cost-efficient applications on Solana with Light Protocol - the infrastructure platform enabling rent-free tokens and accounts with L1 performance and security.
借助Light Protocol在Solana上构建可扩展、高成本效益的应用程序——这是一个支持免租金代币和账户的基础设施平台,兼具L1的性能与安全性。

Overview

概述

Light Protocol provides two complementary technologies:
  • ZK Compression: Create rent-free compressed tokens and PDAs using zero-knowledge proofs. Uses Merkle trees and validity proofs to store state efficiently.
  • Light Token Program: A high-performance token standard that reduces mint and token account costs by 200x compared to SPL tokens.
Light Protocol提供两种互补技术:
  • ZK Compression:使用零知识证明创建免租金的压缩代币和PDA。利用默克尔树和有效性证明高效存储状态。
  • Light Token Program:一种高性能代币标准,与SPL代币相比,可将铸造和代币账户成本降低200倍。

Key Benefits

核心优势

BenefitDescription
200x Cost ReductionCompressed token accounts cost ~5,000 lamports vs ~2,000,000 for SPL
Rent-Free AccountsNo upfront rent-exemption required for tokens or PDAs
L1 SecurityAll execution and state remains on Solana mainnet
Full ComposabilityWorks with existing Solana programs and wallets (Phantom, Backpack)
优势描述
成本降低200倍压缩代币账户成本约为5000 lamports,而SPL账户约为2,000,000 lamports
免租金账户代币或PDA无需预先支付租金豁免费用
L1级安全性所有执行和状态均保留在Solana主网
完全可组合性可与现有Solana程序和钱包(Phantom、Backpack)兼容

Program IDs

程序ID

ProgramAddressDescription
Light System Program
SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7
Core system program
Light Token Program
cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m
Compressed token operations
Account Compression
compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq
Account compression program
程序地址描述
Light System Program
SySTEM1eSU2p4BGQfQpimFEWWSC1XDFeun3Nqzz3rT7
核心系统程序
Light Token Program
cTokenmWW8bLPjZEBAUgYy3zKxQZW6VKi7bqNFEVv3m
压缩代币操作程序
Account Compression
compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq
账户压缩程序

Quick Start

快速开始

Installation

安装

bash
undefined
bash
undefined

Install TypeScript SDKs

安装TypeScript SDK

npm install @lightprotocol/stateless.js @lightprotocol/compressed-token
npm install @lightprotocol/stateless.js @lightprotocol/compressed-token

Install CLI for local development

安装用于本地开发的CLI

npm install -g @lightprotocol/zk-compression-cli
undefined
npm install -g @lightprotocol/zk-compression-cli
undefined

RPC Setup

RPC设置

Light Protocol requires a ZK Compression-enabled RPC. Use Helius:
typescript
import { Rpc, createRpc } from "@lightprotocol/stateless.js";

// Mainnet
const rpc = createRpc(
  "https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>",
  "https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>"
);

// Devnet
const devnetRpc = createRpc(
  "https://devnet.helius-rpc.com?api-key=<YOUR_API_KEY>",
  "https://devnet.helius-rpc.com?api-key=<YOUR_API_KEY>"
);
Light Protocol需要支持ZK Compression的RPC,可使用Helius:
typescript
import { Rpc, createRpc } from "@lightprotocol/stateless.js";

// 主网
const rpc = createRpc(
  "https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>",
  "https://mainnet.helius-rpc.com?api-key=<YOUR_API_KEY>"
);

// 测试网
const devnetRpc = createRpc(
  "https://devnet.helius-rpc.com?api-key=<YOUR_API_KEY>",
  "https://devnet.helius-rpc.com?api-key=<YOUR_API_KEY>"
);

Basic Setup

基础设置

typescript
import { Rpc, createRpc } from "@lightprotocol/stateless.js";
import {
  createMint,
  mintTo,
  transfer,
} from "@lightprotocol/compressed-token";
import { Keypair, PublicKey } from "@solana/web3.js";

// Initialize RPC connection
const rpc = createRpc(process.env.RPC_ENDPOINT!, process.env.RPC_ENDPOINT!);

// Load wallet
const payer = Keypair.fromSecretKey(
  Uint8Array.from(JSON.parse(process.env.PRIVATE_KEY!))
);

console.log("Connected to Light Protocol");
console.log("Wallet:", payer.publicKey.toBase58());

typescript
import { Rpc, createRpc } from "@lightprotocol/stateless.js";
import {
  createMint,
  mintTo,
  transfer,
} from "@lightprotocol/compressed-token";
import { Keypair, PublicKey } from "@solana/web3.js";

// 初始化RPC连接
const rpc = createRpc(process.env.RPC_ENDPOINT!, process.env.RPC_ENDPOINT!);

// 加载钱包
const payer = Keypair.fromSecretKey(
  Uint8Array.from(JSON.parse(process.env.PRIVATE_KEY!))
);

console.log("已连接到Light Protocol");
console.log("钱包:", payer.publicKey.toBase58());

ZK Compression

ZK Compression

ZK Compression enables rent-free compressed tokens using zero-knowledge proofs. Compressed accounts are stored in Merkle trees and verified using validity proofs.
ZK Compression借助零知识证明实现免租金的压缩代币。压缩账户存储在默克尔树中,并通过有效性证明进行验证。

Create Compressed Token Mint

创建压缩代币铸造账户

typescript
import { createMint } from "@lightprotocol/compressed-token";
import { Keypair } from "@solana/web3.js";

const payer = Keypair.generate();
const mintAuthority = payer;

// Create mint with token pool for compression
const { mint, transactionSignature } = await createMint(
  rpc,
  payer,           // Fee payer
  mintAuthority.publicKey,  // Mint authority
  9,               // Decimals
);

console.log("Mint created:", mint.toBase58());
console.log("Transaction:", transactionSignature);
typescript
import { createMint } from "@lightprotocol/compressed-token";
import { Keypair } from "@solana/web3.js";

const payer = Keypair.generate();
const mintAuthority = payer;

// 创建带有代币池的铸造账户以支持压缩
const { mint, transactionSignature } = await createMint(
  rpc,
  payer,           // 费用支付方
  mintAuthority.publicKey,  // 铸造权限
  9,               // 小数位数
);

console.log("铸造账户已创建:", mint.toBase58());
console.log("交易签名:", transactionSignature);

Mint Compressed Tokens

铸造压缩代币

typescript
import { mintTo } from "@lightprotocol/compressed-token";

const recipient = new PublicKey("...");
const amount = 1_000_000_000; // 1 token with 9 decimals

const transactionSignature = await mintTo(
  rpc,
  payer,           // Fee payer
  mint,            // Mint with token pool
  recipient,       // Recipient address
  mintAuthority,   // Mint authority (signer)
  amount,          // Amount to mint
);

console.log("Minted:", transactionSignature);
typescript
import { mintTo } from "@lightprotocol/compressed-token";

const recipient = new PublicKey("...");
const amount = 1_000_000_000; // 1个代币,小数位数为9

const transactionSignature = await mintTo(
  rpc,
  payer,           // 费用支付方
  mint,            // 带有代币池的铸造账户
  recipient,       // 接收方地址
  mintAuthority,   // 铸造权限(签名方)
  amount,          // 铸造数量
);

console.log("铸造完成:", transactionSignature);

Mint to Multiple Recipients

批量铸造给多个接收方

typescript
const recipients = [
  new PublicKey("recipient1..."),
  new PublicKey("recipient2..."),
  new PublicKey("recipient3..."),
];

const amounts = [
  1_000_000_000,
  2_000_000_000,
  3_000_000_000,
];

const transactionSignature = await mintTo(
  rpc,
  payer,
  mint,
  recipients,      // Array of recipients
  mintAuthority,
  amounts,         // Array of amounts (must match recipients length)
);
typescript
const recipients = [
  new PublicKey("recipient1..."),
  new PublicKey("recipient2..."),
  new PublicKey("recipient3..."),
];

const amounts = [
  1_000_000_000,
  2_000_000_000,
  3_000_000_000,
];

const transactionSignature = await mintTo(
  rpc,
  payer,
  mint,
  recipients,      // 接收方数组
  mintAuthority,
  amounts,         // 数量数组(长度必须与接收方数组一致)
);

Transfer Compressed Tokens

转账压缩代币

typescript
import { transfer } from "@lightprotocol/compressed-token";

const recipient = new PublicKey("...");
const amount = 500_000_000; // 0.5 tokens

const transactionSignature = await transfer(
  rpc,
  payer,           // Fee payer
  mint,            // Mint with token pool
  amount,          // Amount to transfer
  sender,          // Token owner (signer)
  recipient,       // Destination address
);

console.log("Transferred:", transactionSignature);
Note: Compressed token transfers use a consume-and-create model. Input accounts are consumed and new output accounts are created with updated balances.
typescript
import { transfer } from "@lightprotocol/compressed-token";

const recipient = new PublicKey("...");
const amount = 500_000_000; // 0.5个代币

const transactionSignature = await transfer(
  rpc,
  payer,           // 费用支付方
  mint,            // 带有代币池的铸造账户
  amount,          // 转账数量
  sender,          // 代币所有者(签名方)
  recipient,       // 目标地址
);

console.log("转账完成:", transactionSignature);
注意:压缩代币转账采用“消耗-创建”模式。输入账户会被消耗,同时创建更新余额后的新输出账户。

Compress SPL Tokens

压缩SPL代币

Convert existing SPL tokens to compressed format:
typescript
import { compress, compressSplTokenAccount } from "@lightprotocol/compressed-token";

// Compress specific amount to a recipient
const transactionSignature = await compress(
  rpc,
  payer,
  mint,
  amount,
  owner,           // SPL token owner
  recipient,       // Compressed token recipient
  tokenAccount,    // Source SPL token account
);

// Compress entire SPL token account (reclaim rent)
const tx = await compressSplTokenAccount(
  rpc,
  payer,
  mint,
  owner,
  tokenAccount,
  // Optional: amount to keep in SPL format
);
将现有SPL代币转换为压缩格式:
typescript
import { compress, compressSplTokenAccount } from "@lightprotocol/compressed-token";

// 将指定数量的代币压缩后转给接收方
const transactionSignature = await compress(
  rpc,
  payer,
  mint,
  amount,
  owner,           // SPL代币所有者
  recipient,       // 压缩代币接收方
  tokenAccount,    // 源SPL代币账户
);

// 压缩整个SPL代币账户(收回租金)
const tx = await compressSplTokenAccount(
  rpc,
  payer,
  mint,
  owner,
  tokenAccount,
  // 可选:保留为SPL格式的数量
);

Decompress to SPL Tokens

解压缩为SPL代币

Convert compressed tokens back to SPL format:
typescript
import { decompress } from "@lightprotocol/compressed-token";

const transactionSignature = await decompress(
  rpc,
  payer,
  mint,
  amount,
  owner,           // Compressed token owner (signer)
  recipient,       // SPL token recipient
);
将压缩代币转换回SPL格式:
typescript
import { decompress } from "@lightprotocol/compressed-token";

const transactionSignature = await decompress(
  rpc,
  payer,
  mint,
  amount,
  owner,           // 压缩代币所有者(签名方)
  recipient,       // SPL代币接收方
);

Query Compressed Accounts

查询压缩账户

typescript
// Get all compressed token accounts for an owner
const tokenAccounts = await rpc.getCompressedTokenAccountsByOwner(
  owner.publicKey,
  { mint }
);

console.log("Token accounts:", tokenAccounts.items.length);

// Calculate total balance
const totalBalance = tokenAccounts.items.reduce(
  (sum, account) => sum + BigInt(account.parsed.amount),
  BigInt(0)
);
console.log("Total balance:", totalBalance.toString());

// Get compressed account balance
const balance = await rpc.getCompressedTokenAccountBalance(accountHash);

// Get validity proof for transaction
const proof = await rpc.getValidityProof(compressedAccountHashes);
typescript
// 获取所有者的所有压缩代币账户
const tokenAccounts = await rpc.getCompressedTokenAccountsByOwner(
  owner.publicKey,
  { mint }
);

console.log("代币账户数量:", tokenAccounts.items.length);

// 计算总余额
const totalBalance = tokenAccounts.items.reduce(
  (sum, account) => sum + BigInt(account.parsed.amount),
  BigInt(0)
);
console.log("总余额:", totalBalance.toString());

// 获取压缩账户余额
const balance = await rpc.getCompressedTokenAccountBalance(accountHash);

// 获取交易的有效性证明
const proof = await rpc.getValidityProof(compressedAccountHashes);

Create Token Pool for Existing Mint

为现有铸造账户添加代币池

Add compression support to an existing SPL mint:
typescript
import { createTokenPool } from "@lightprotocol/compressed-token";

// Add token pool to existing SPL mint
// Note: Does NOT require mint authority
const transactionSignature = await createTokenPool(
  rpc,
  payer,           // Fee payer
  existingMint,    // Existing SPL mint
);

为现有SPL铸造账户添加压缩支持:
typescript
import { createTokenPool } from "@lightprotocol/compressed-token";

// 为现有SPL铸造账户添加代币池
// 注意:不需要铸造权限
const transactionSignature = await createTokenPool(
  rpc,
  payer,           // 费用支付方
  existingMint,    // 现有SPL铸造账户
);

Light Token Program

Light Token Program

The Light Token Program is a separate high-performance token standard that reduces costs without ZK proofs. It's optimized for hot paths and provides wrap/unwrap interoperability with SPL tokens.
Light Token Program是一个独立的高性能代币标准,无需ZK证明即可降低成本。它针对高频路径进行了优化,并提供与SPL代币的包装/解包装互操作性。

Key Differences from ZK Compression

与ZK Compression的核心差异

FeatureZK CompressionLight Token Program
TechnologyZero-knowledge proofsOptimized token standard
Use CaseCompressed tokens/PDAsHigh-performance tokens
Compute UnitsHigher (proof verification)Lower (optimized hot paths)
InteropCompress/decompress SPLWrap/unwrap SPL & Token-2022
特性ZK CompressionLight Token Program
技术零知识证明优化的代币标准
使用场景压缩代币/PDA高性能代币
计算单元较高(证明验证)较低(优化高频路径)
互操作性压缩/解压缩SPL包装/解包装SPL和Token-2022

Create Light Token Mint

创建Light Token铸造账户

typescript
import { createLightMint } from "@lightprotocol/light-token";

const { mint, transactionSignature } = await createLightMint(
  rpc,
  payer,
  mintAuthority.publicKey,
  9,  // decimals
);

console.log("Light mint created:", mint.toBase58());
typescript
import { createLightMint } from "@lightprotocol/light-token";

const { mint, transactionSignature } = await createLightMint(
  rpc,
  payer,
  mintAuthority.publicKey,
  9,  // 小数位数
);

console.log("Light铸造账户已创建:", mint.toBase58());

Mint to Light-ATA

铸造至Light ATA

typescript
import { mintToLightAta } from "@lightprotocol/light-token";

const transactionSignature = await mintToLightAta(
  rpc,
  payer,
  mint,
  recipient,
  mintAuthority,
  amount,
);
typescript
import { mintToLightAta } from "@lightprotocol/light-token";

const transactionSignature = await mintToLightAta(
  rpc,
  payer,
  mint,
  recipient,
  mintAuthority,
  amount,
);

Wrap SPL to Light Token

将SPL代币包装为Light Token

typescript
import { wrapSpl } from "@lightprotocol/light-token";

// Wrap SPL tokens to Light tokens
const transactionSignature = await wrapSpl(
  rpc,
  payer,
  mint,
  amount,
  owner,
  splTokenAccount,
);
typescript
import { wrapSpl } from "@lightprotocol/light-token";

// 将SPL代币包装为Light Token
const transactionSignature = await wrapSpl(
  rpc,
  payer,
  mint,
  amount,
  owner,
  splTokenAccount,
);

Unwrap Light Token to SPL

将Light Token解包装为SPL

typescript
import { unwrapToSpl } from "@lightprotocol/light-token";

// Unwrap Light tokens back to SPL
const transactionSignature = await unwrapToSpl(
  rpc,
  payer,
  mint,
  amount,
  owner,
  recipient,  // SPL token account
);

typescript
import { unwrapToSpl } from "@lightprotocol/light-token";

// 将Light Token解包装回SPL
const transactionSignature = await unwrapToSpl(
  rpc,
  payer,
  mint,
  amount,
  owner,
  recipient,  // SPL代币账户
);

JSON RPC Methods

JSON RPC方法

Light Protocol provides 21 specialized RPC methods for compressed accounts. Key methods:
MethodDescription
getCompressedAccount
Get compressed account by address or hash
getCompressedAccountsByOwner
Get all compressed accounts for an owner
getCompressedTokenAccountsByOwner
Get compressed token accounts for an owner
getCompressedTokenAccountBalance
Get balance for a token account
getCompressedTokenBalancesByOwner
Get all token balances for an owner
getCompressedMintTokenHolders
Get all holders of a compressed mint
getValidityProof
Get ZK proof for compressed accounts
getMultipleCompressedAccounts
Batch fetch compressed accounts
getTransactionWithCompressionInfo
Get transaction with parsed compression data
getIndexerHealth
Check indexer status
See resources/json-rpc-methods.md for complete documentation.

Light Protocol提供21种专门用于压缩账户的RPC方法。核心方法:
方法描述
getCompressedAccount
通过地址或哈希获取压缩账户
getCompressedAccountsByOwner
获取所有者的所有压缩账户
getCompressedTokenAccountsByOwner
获取所有者的压缩代币账户
getCompressedTokenAccountBalance
获取代币账户余额
getCompressedTokenBalancesByOwner
获取所有者的所有代币余额
getCompressedMintTokenHolders
获取压缩铸造账户的所有持有者
getValidityProof
获取压缩账户的ZK证明
getMultipleCompressedAccounts
批量获取压缩账户
getTransactionWithCompressionInfo
获取包含解析后压缩数据的交易
getIndexerHealth
检查索引器状态
完整文档请查看 resources/json-rpc-methods.md

Best Practices

最佳实践

Transaction Limits

交易限制

  • 4 compressed accounts per transaction: Split large operations into multiple transactions
  • Compute unit budget: Add extra compute units for proof verification
typescript
import { ComputeBudgetProgram } from "@solana/web3.js";

// Add compute budget for complex transactions
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
  units: 300_000,
});
  • 每笔交易最多4个压缩账户:将大型操作拆分为多笔交易
  • 计算单元预算:为证明验证额外添加计算单元
typescript
import { ComputeBudgetProgram } from "@solana/web3.js";

// 为复杂交易添加计算预算
const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
  units: 300_000,
});

Batch Operations

批量操作

typescript
// Process multiple recipients in batches
async function batchMint(
  recipients: PublicKey[],
  amounts: number[],
  batchSize = 4
) {
  const results = [];

  for (let i = 0; i < recipients.length; i += batchSize) {
    const batchRecipients = recipients.slice(i, i + batchSize);
    const batchAmounts = amounts.slice(i, i + batchSize);

    const sig = await mintTo(
      rpc,
      payer,
      mint,
      batchRecipients,
      mintAuthority,
      batchAmounts,
    );

    results.push(sig);
  }

  return results;
}
typescript
// 分批处理多个接收方
async function batchMint(
  recipients: PublicKey[],
  amounts: number[],
  batchSize = 4
) {
  const results = [];

  for (let i = 0; i < recipients.length; i += batchSize) {
    const batchRecipients = recipients.slice(i, i + batchSize);
    const batchAmounts = amounts.slice(i, i + batchSize);

    const sig = await mintTo(
      rpc,
      payer,
      mint,
      batchRecipients,
      mintAuthority,
      batchAmounts,
    );

    results.push(sig);
  }

  return results;
}

Error Handling

错误处理

typescript
try {
  const signature = await transfer(rpc, payer, mint, amount, sender, recipient);
  console.log("Success:", signature);
} catch (error) {
  if (error.message.includes("TokenPool not found")) {
    // Create token pool first
    await createTokenPool(rpc, payer, mint);
  } else if (error.message.includes("Insufficient balance")) {
    // Check balance before transfer
    const accounts = await rpc.getCompressedTokenAccountsByOwner(sender.publicKey, { mint });
    console.log("Available balance:", accounts.items);
  } else {
    throw error;
  }
}
typescript
try {
  const signature = await transfer(rpc, payer, mint, amount, sender, recipient);
  console.log("成功:", signature);
} catch (error) {
  if (error.message.includes("TokenPool not found")) {
    // 先创建代币池
    await createTokenPool(rpc, payer, mint);
  } else if (error.message.includes("Insufficient balance")) {
    // 转账前检查余额
    const accounts = await rpc.getCompressedTokenAccountsByOwner(sender.publicKey, { mint });
    console.log("可用余额:", accounts.items);
  } else {
    throw error;
  }
}

Delegation

委托

typescript
import { approve, transferDelegated } from "@lightprotocol/compressed-token";

// Approve delegate
const approveSig = await approve(
  rpc,
  payer,
  mint,
  amount,
  owner,           // Token owner
  delegate,        // Delegate public key
);

// Transfer as delegate
const transferSig = await transferDelegated(
  rpc,
  payer,
  mint,
  amount,
  delegate,        // Delegate (signer)
  recipient,
);

typescript
import { approve, transferDelegated } from "@lightprotocol/compressed-token";

// 授权委托方
const approveSig = await approve(
  rpc,
  payer,
  mint,
  amount,
  owner,           // 代币所有者
  delegate,        // 委托方公钥
);

// 以委托方身份转账
const transferSig = await transferDelegated(
  rpc,
  payer,
  mint,
  amount,
  delegate,        // 委托方(签名方)
  recipient,
);

Resources

资源

Official Documentation

官方文档

GitHub Repositories

GitHub仓库

Community

社区

Wallet Support

钱包支持

  • Phantom - Native compressed token support
  • Backpack - Native compressed token support

  • Phantom - 原生支持压缩代币
  • Backpack - 原生支持压缩代币

Skill Structure

技能结构

light-protocol/
├── SKILL.md                    # This file
├── resources/
│   ├── program-addresses.md    # Program IDs, state trees, RPC endpoints
│   ├── json-rpc-methods.md     # All 21 RPC methods documented
│   ├── sdk-reference.md        # TypeScript SDK reference
│   └── github-repos.md         # Official repositories
├── examples/
│   ├── setup/
│   │   └── example.ts          # Basic setup
│   ├── zk-compression/
│   │   ├── create-mint.ts      # Create compressed mint
│   │   ├── mint-tokens.ts      # Mint compressed tokens
│   │   ├── transfer-tokens.ts  # Transfer compressed tokens
│   │   ├── compress-spl.ts     # Compress SPL tokens
│   │   └── decompress.ts       # Decompress to SPL
│   ├── light-token-program/
│   │   ├── create-light-mint.ts
│   │   ├── mint-light-tokens.ts
│   │   └── wrap-unwrap.ts
│   ├── querying/
│   │   └── fetch-accounts.ts   # Query compressed accounts
│   └── advanced/
│       ├── batch-operations.ts # Multi-recipient operations
│       └── delegation.ts       # Approve and delegate transfers
├── templates/
│   └── setup.ts                # Complete starter template
└── docs/
    └── troubleshooting.md      # Common issues and solutions
light-protocol/
├── SKILL.md                    # 本文档
├── resources/
│   ├── program-addresses.md    # 程序ID、状态树、RPC端点
│   ├── json-rpc-methods.md     # 所有21种RPC方法文档
│   ├── sdk-reference.md        # TypeScript SDK参考
│   └── github-repos.md         # 官方仓库
├── examples/
│   ├── setup/
│   │   └── example.ts          # 基础设置示例
│   ├── zk-compression/
│   │   ├── create-mint.ts      # 创建压缩铸造账户
│   │   ├── mint-tokens.ts      # 铸造压缩代币
│   │   ├── transfer-tokens.ts  # 转账压缩代币
│   │   ├── compress-spl.ts     # 压缩SPL代币
│   │   └── decompress.ts       # 解压缩为SPL
│   ├── light-token-program/
│   │   ├── create-light-mint.ts
│   │   ├── mint-light-tokens.ts
│   │   └── wrap-unwrap.ts
│   ├── querying/
│   │   └── fetch-accounts.ts   # 查询压缩账户
│   └── advanced/
│       ├── batch-operations.ts # 多接收方操作
│       └── delegation.ts       # 授权与委托转账
├── templates/
│   └── setup.ts                # 完整启动模板
└── docs/
    └── troubleshooting.md      # 常见问题与解决方案