Skip to main content
Compressed accounts are permanently burned via CPI to the Light System Program. Burning a compressed account
  • consumes the existing account hash, and
  • produces no output state.
  • A burned account cannot be reinitialized.
Find full code examples at the end for Anchor and native Rust.

Implementation Guide

This guide will cover the components of a Solana program that burns compressed accounts.
Here is the complete flow to burn compressed accounts:
1

Program Setup

DependenciesAdd dependencies to your program.
  • The light-sdk provides macros, wrappers and CPI interface to create and interact with compressed accounts.
  • Add the serialization library (borsh for native Rust, or use AnchorSerialize).
ConstantsSet program address and derive the CPI authority PDA to call the Light System program.
CPISigner is the configuration struct for CPI’s to the Light System Program.
  • CPIs to the Light System program must be signed with a PDA derived by your program with the seed b"authority"
  • derive_light_cpi_signer! derives the CPI signer PDA for you at compile time.
Compressed AccountDefine your compressed account struct.
You derive
  • the standard traits (Clone, Debug, Default),
  • borsh or AnchorSerialize to serialize account data, and
  • LightDiscriminator to implements a unique type ID (8 bytes) to distinguish account types. The default compressed account layout enforces a discriminator in its own field, .
The traits listed above are required for LightAccount. LightAccount wraps MyCompressedAccount in Step 3 to set the discriminator and create the compressed account’s data.
2

Instruction Data

Define the instruction data with the following parameters:
  1. Validity Proof
  • Define proof to include the proof that the account exists in the state tree.
  • Clients fetch a validity proof with getValidityProof() from an RPC provider that supports ZK Compression (Helius, Triton, …).
  1. Specify input state
  • Define account_meta: CompressedAccountMetaBurn to reference the existing account for the Light System Program to nullify permanently:
    • tree_info: PackedStateTreeInfo: References the existing account hash in the state tree.
    • address: The account’s derived address.
Burn does not specify an output state tree. CompressedAccountMetaBurn omits output_state_tree_index because no output state is created.
  1. Current account data
  • Define fields to include the current account data passed by the client.
  • This depends on your program logic. This example includes current_message (or current_account in Native Rust).
3

Burn Compressed Account

Burn the compressed account permanently with LightAccount::new_burn(). No account can be reinitialized at this address in the future.
new_burn()
  1. hashes the current account data as input state and
  2. creates no output state to burn the account permanently.
Pass these parameters to new_burn():
  • &program_id: The program’s ID that owns the compressed account.
  • &account_meta: The CompressedAccountMetaBurn from instruction data (Step 2) that identifies the existing account for the Light System Program to nullify permanently.
    • Anchor: Pass &account_meta directly
    • Native Rust: Pass &instruction_data.account_meta
  • Include the curent account data.
    • Anchor: Build MyCompressedAccount with owner and message.
    • Native Rust: Pass instruction_data.current_account directly.
The SDK creates:
  • A LightAccount wrapper that marks the account as permanently burned with no output state.
new_burn() hashes the input state. The Light System Program verifies the input hash and nullifies it in Step 4.
4

Light System Program CPI

The Light System Program CPI burns the compressed account permanently.
The Light System Program
  • validates the account exists in state tree with the validity,
  • nullifies the existing account hash, and
  • creates no output state.
Set up CpiAccounts::new():CpiAccounts::new() parses accounts for the CPI call to Light System Program.Pass these parameters:
  • ctx.accounts.signer.as_ref(): the transaction signer
  • ctx.remaining_accounts: Slice with [system_accounts, ...packed_tree_accounts]. The client builds this with PackedAccounts and passes it to the instruction.
  • &LIGHT_CPI_SIGNER: Your program’s CPI signer PDA defined in Constants.
1Verifies validity proofs, compressed account ownership checks, and CPIs the Account Compression Program to update tree accounts.
2CPI Signer
  • PDA to sign CPI calls from your program to the Light System Program.
  • Verified by the Light System Program during CPI.
  • Derived from your program ID.
3Registered Program PDAProvides access control to the Account Compression Program.
4Signs CPI calls from the Light System Program to the Account Compression Program.
5
  • Writes to state and address tree accounts.
  • Clients and the Account Compression Program do not interact directly — handled internally.
6Solana System Program used to transfer lamports.
Build the CPI instruction:
  • new_cpi() initializes the CPI instruction with the proof to prove the account exists in the state tree - defined in the Instruction Data (Step 2).
  • with_light_account adds the LightAccount wrapper configured to burn the account - defined in Step 3.
  • invoke(light_cpi_accounts) calls the Light System Program with CpiAccounts.

Full Code Example

The example programs below implement all steps from this guide.
Install Solana CLI:
Install Anchor CLI:
Install the Light CLI:
Verify installation:
For help with debugging, see the Error Cheatsheet.
Find the source code here.

Next Steps

Build a client for your program

Learn how to create compressed accounts