Compressed PDA Programs
Build Solana programs with compressed accounts via CPI to the Light System Program. No rent-exemption required.
| Creation cost |
Solana account |
Compressed account |
| PDA (128 bytes) |
~1,100,000 lamports |
~5,000 lamports |
When to use compressed PDAs
- Per-user state (profiles, game state, credentials)
- DePIN device registrations
- Nullifier-based double-spend prevention
- Infrequently accessed accounts
Choosing approach
| Criteria |
Light-PDA (easy) |
Compressed PDA (advanced) |
| When |
Rent-free version of existing Anchor accounts |
Custom compressed state with ZK proofs |
| Skill |
light-sdk (Anchor macro pattern) |
This skill (solana-compression) |
| Macro |
#[light_account(init)] |
LightAccount::new_init() manual CPI |
| Dependencies |
light-sdk, light-compressible |
light-sdk, light-sdk-types |
If you just want rent-free Anchor accounts, use the light-sdk skill instead. This skill is for programs that require manual CPI to the Light System Program (custom compressed state, ZK proofs, address derivation).
Client-program interaction flow
├─ Client
│ ├─ Get ValidityProof from RPC.
│ ├─ pack accounts with PackedAccounts into PackedAddressTreeInfo and PackedStateTreeInfo.
│ ├─ pack CompressedAccountMeta.
│ ├─ Build Instruction from PackedAccounts and CompressedAccountMetas.
│ └─ Send transaction.
│
└─ Custom Program
├─ CpiAccounts parse accounts consistent with PackedAccounts.
├─ LightAccount instantiates from CompressedAccountMeta.
│
└─ Light System Program CPI
├─ Verify ValidityProof.
├─ Update State Merkle tree.
├─ Update Address Merkle tree.
└─ Complete atomic state transition.
Domain references
| Topic |
Reference |
| Program operations (create, update, close, burn, reinit) |
references/compressed-pdas.md |
| Client SDK (TypeScript + Rust) |
references/client.md |
| Nullifier PDAs (double-spend prevention) |
references/nullifier-pdas.md |
| Error codes (6000-16034) |
references/error-codes.md |
Reference repos
Basic operations — create, update, close, reinit, burn (each with Anchor and Native variants)
Counter — full lifecycle (create, increment, decrement, reset, close):
Other examples:
Nullifier:
Airdrop claim:
ZK programs:
- zk-id — Identity verification with Groth16 proofs
- zk/nullifier — Simple nullifier creation program
Additional: examples-zk-compression — More ZK compression examples
Canonical source: program-examples README. If cloned locally, scope Read, Glob, Grep to these repositories and the current project directory only.
Workflow
- Clarify intent
- Recommend plan mode, if it's not activated
- Use
AskUserQuestion to resolve blind spots
- All questions must be resolved before execution
- Identify references
- Write plan file (YAML task format)
- Use
AskUserQuestion for anything unclear — never guess or assume
- Identify blockers: permissions, dependencies, unknowns
- Plan must be complete before execution begins
- Execute
- Use
Task tool with subagents for parallel research
- Subagents load skills via
Skill tool
- Track progress with
TodoWrite
- When stuck: ask to spawn a read-only subagent with
Read, Glob, Grep, and DeepWiki MCP access, loading skills/ask-mcp. Scope reads to skill references, example repos, and docs.
Build and test
Required commands
Anchor programs:
anchor build
anchor test
Native programs:
cargo build-sbf
cargo test-sbf
Forbidden shortcuts
- Do NOT use
cargo build (must use cargo build-sbf)
- Do NOT use
cargo test (must use cargo test-sbf)
- Do NOT skip SBF compilation
- Tests MUST run against real BPF bytecode
Failure recovery
On failure, spawn debugger agent with error context.
Loop rules:
- Each debugger gets fresh context + previous debug reports
- Each attempt tries something DIFFERENT
- NEVER GIVE UP - keep spawning until fixed
- Max 5 attempts per error
Do NOT proceed until all tests pass.
SDK references
DeepWiki fallback
If no matching pattern in reference repos:
mcp__deepwiki__ask_question("Lightprotocol/light-protocol", "How to {operation}?")
Security
This skill provides code patterns and documentation references only.
- Declared dependencies. Devnet and mainnet examples require
API_KEY (Helius or Triton RPC key) and read ~/.config/solana/id.json for the payer keypair. Neither is needed on localnet. In production, load both from a secrets manager.
- Filesystem scope.
Read, Glob, and Grep must be limited to the current project directory and the reference repos listed above. Do not read outside these paths.
- Subagent scope. When stuck, the skill asks to spawn a read-only subagent with
Read, Glob, Grep scoped to skill references, example repos, and docs.
- Install source.
npx skills add Lightprotocol/skills from Lightprotocol/skills.
- Audited protocol. Light Protocol smart contracts are independently audited. Reports are published at github.com/Lightprotocol/light-protocol/tree/main/audits.
1---2name: solana-compression3description: For client and program development on Solana ~160x cheaper and without rent-exemption for per-user state, DePIN registrations, or custom compressed accounts. Create, update, close, burn, and reinitialize compressed accounts.4---5
6# Compressed PDA Programs
7
8Build Solana programs with compressed accounts via CPI to the Light System Program. No rent-exemption required.
9
10| Creation cost | Solana account | Compressed account |
11| :--------------------- | :------------------ | :------------------- |
12| **PDA (128 bytes)** | ~1,100,000 lamports | ~**5,000** lamports |
13
14## When to use compressed PDAs
15
16- Per-user state (profiles, game state, credentials)
17- DePIN device registrations
18- Nullifier-based double-spend prevention
19- Infrequently accessed accounts
20
21## Choosing approach
22
23| Criteria | Light-PDA (easy) | Compressed PDA (advanced) |
24|----------|-----------------|--------------------------|
25| When | Rent-free version of existing Anchor accounts | Custom compressed state with ZK proofs |
26| Skill | `light-sdk` (Anchor macro pattern) | This skill (`solana-compression`) |
27| Macro | `#[light_account(init)]` | `LightAccount::new_init()` manual CPI |
28| Dependencies | `light-sdk`, `light-compressible` | `light-sdk`, `light-sdk-types` |
29
30If you just want rent-free Anchor accounts, use the `light-sdk` skill instead. This skill is for programs that require manual CPI to the Light System Program (custom compressed state, ZK proofs, address derivation).
31
32### Client-program interaction flow
33
34```text
35 ├─ Client
36 │ ├─ Get ValidityProof from RPC.
37 │ ├─ pack accounts with PackedAccounts into PackedAddressTreeInfo and PackedStateTreeInfo.
38 │ ├─ pack CompressedAccountMeta.
39 │ ├─ Build Instruction from PackedAccounts and CompressedAccountMetas.
40 │ └─ Send transaction.
41 │
42 └─ Custom Program
43 ├─ CpiAccounts parse accounts consistent with PackedAccounts.
44 ├─ LightAccount instantiates from CompressedAccountMeta.
45 │
46 └─ Light System Program CPI
47 ├─ Verify ValidityProof.
48 ├─ Update State Merkle tree.
49 ├─ Update Address Merkle tree.
50 └─ Complete atomic state transition.
51```
52
53## Domain references
54
55| Topic | Reference |
56|-------|-----------|
57| Program operations (create, update, close, burn, reinit) | [references/compressed-pdas.md](references/compressed-pdas.md) |
58| Client SDK (TypeScript + Rust) | [references/client.md](references/client.md) |
59| Nullifier PDAs (double-spend prevention) | [references/nullifier-pdas.md](references/nullifier-pdas.md) |
60| Error codes (6000-16034) | [references/error-codes.md](references/error-codes.md) |
61
62## Reference repos
63
64**Basic operations** — create, update, close, reinit, burn (each with [Anchor](https://github.com/Lightprotocol/program-examples/tree/main/basic-operations/anchor) and [Native](https://github.com/Lightprotocol/program-examples/tree/main/basic-operations/native) variants)
65
66**Counter** — full lifecycle (create, increment, decrement, reset, close):
67- [counter/anchor](https://github.com/Lightprotocol/program-examples/tree/main/counter/anchor) — Anchor with Rust and TypeScript tests
68- [counter/native](https://github.com/Lightprotocol/program-examples/tree/main/counter/native) — Native with `light-sdk` and Rust tests
69- [counter/pinocchio](https://github.com/Lightprotocol/program-examples/tree/main/counter/pinocchio) — Pinocchio with `light-sdk-pinocchio` and Rust tests
70
71**Other examples:**
72- [create-and-update](https://github.com/Lightprotocol/program-examples/tree/main/create-and-update) — Create and update with a single validity proof in one instruction
73- [read-only](https://github.com/Lightprotocol/program-examples/tree/main/read-only) — Create and read a compressed account onchain
74- [account-comparison](https://github.com/Lightprotocol/program-examples/tree/main/account-comparison) — Compressed vs regular Solana accounts
75
76**Nullifier:**
77- [nullifier-program](https://github.com/Lightprotocol/nullifier-program) — Rent-free PDA for duplicate execution prevention. SDK: [`light-nullifier-program`](https://docs.rs/light-nullifier-program) | [example client](https://github.com/Lightprotocol/examples-light-token/blob/main/rust-client/actions/create_nullifier.rs)
78
79**Airdrop claim:**
80- [simple-claim](https://github.com/Lightprotocol/program-examples/tree/main/airdrop-implementations/simple-claim) — Compressed tokens decompressed to SPL on claim with cliff
81- [merkle-distributor](https://github.com/Lightprotocol/program-examples/tree/main/airdrop-implementations/distributor) — SPL tokens with compressed PDA claim tracking, linear vesting, partial claims, clawback
82- [example-token-distribution](https://github.com/Lightprotocol/example-token-distribution) — Simple client-side distribution
83
84**ZK programs:**
85- [zk-id](https://github.com/Lightprotocol/program-examples/tree/main/zk/zk-id) — Identity verification with Groth16 proofs
86- [zk/nullifier](https://github.com/Lightprotocol/program-examples/tree/main/zk/nullifier) — Simple nullifier creation program
87
88**Additional:** [examples-zk-compression](https://github.com/Lightprotocol/examples-zk-compression) — More ZK compression examples
89
90Canonical source: [program-examples README](https://github.com/Lightprotocol/program-examples). If cloned locally, scope `Read`, `Glob`, `Grep` to these repositories and the current project directory only.
91
92## Workflow
93
941. **Clarify intent**
95 - Recommend plan mode, if it's not activated
96 - Use `AskUserQuestion` to resolve blind spots
97 - All questions must be resolved before execution
982. **Identify references**
99 - Match task to [domain references](#domain-references) and [reference repos](#reference-repos)
100 - Locate relevant documentation and examples
1013. **Write plan file** (YAML task format)
102 - Use `AskUserQuestion` for anything unclear — never guess or assume
103 - Identify blockers: permissions, dependencies, unknowns
104 - Plan must be complete before execution begins
1054. **Execute**
106 - Use `Task` tool with subagents for parallel research
107 - Subagents load skills via `Skill` tool
108 - Track progress with `TodoWrite`
1095. **When stuck**: ask to spawn a read-only subagent with `Read`, `Glob`, `Grep`, and DeepWiki MCP access, loading `skills/ask-mcp`. Scope reads to skill references, example repos, and docs.
110
111## Build and test
112
113### Required commands
114
115**Anchor programs:**
116```bash
117anchor build
118anchor test
119```
120
121**Native programs:**
122```bash
123cargo build-sbf
124cargo test-sbf
125```
126
127### Forbidden shortcuts
128
129- Do NOT use `cargo build` (must use `cargo build-sbf`)
130- Do NOT use `cargo test` (must use `cargo test-sbf`)
131- Do NOT skip SBF compilation
132- Tests MUST run against real BPF bytecode
133
134### Failure recovery
135
136On failure, spawn debugger agent with error context.
137
138**Loop rules:**
1391. Each debugger gets fresh context + previous debug reports
1402. Each attempt tries something DIFFERENT
1413. **NEVER GIVE UP** - keep spawning until fixed
1424. Max 5 attempts per error
143
144Do NOT proceed until all tests pass.
145
146## SDK references
147
148| Package | Link |
149|---------|------|
150| `light-sdk` | [docs.rs](https://docs.rs/light-sdk/latest/light_sdk/) |
151| `light-client` | [docs.rs](https://docs.rs/light-client/latest/light_client/) |
152| `@lightprotocol/stateless.js` | [API docs](https://lightprotocol.github.io/light-protocol/stateless.js/index.html) |
153| `light-program-test` | [docs.rs](https://docs.rs/crate/light-program-test/latest) |
154
155## DeepWiki fallback
156
157If no matching pattern in reference repos:
158
159```
160mcp__deepwiki__ask_question("Lightprotocol/light-protocol", "How to {operation}?")
161```
162
163
164## Security
165
166This skill provides code patterns and documentation references only.
167
168- **Declared dependencies.** Devnet and mainnet examples require `API_KEY` (Helius or Triton RPC key) and read `~/.config/solana/id.json` for the payer keypair. Neither is needed on localnet. In production, load both from a secrets manager.
169- **Filesystem scope.** `Read`, `Glob`, and `Grep` must be limited to the current project directory and the [reference repos](#reference-repos) listed above. Do not read outside these paths.
170- **Subagent scope.** When stuck, the skill asks to spawn a read-only subagent with `Read`, `Glob`, `Grep` scoped to skill references, example repos, and docs.
171- **Install source.** `npx skills add Lightprotocol/skills` from [Lightprotocol/skills](https://github.com/Lightprotocol/skills).
172- **Audited protocol.** Light Protocol smart contracts are independently audited. Reports are published at [github.com/Lightprotocol/light-protocol/tree/main/audits](https://github.com/Lightprotocol/light-protocol/tree/main/audits).