Skip to main content
The Compressed Token Program extends existing Solana token standards with light-mints, light-tokens and compressed tokens.
Account TypeKey Features
Light-MintCompressed account
  • Rent-free mint accounts (similar to SPL mints)
  • Custom Token Metadata extension
Light-TokenSolana account
  • Store tokens of light-mints, SPL mints, or Token 2022 mints
  • Sponsored rent exemption via compressible extension
  • Use for active token accounts with frequent writes (trading, etc.)
Compressed TokenCompressed account
  • Compressed account with TokenData field
  • Rent-free and SPL-compatible
  • Use for storage of inactive tokens and token distribution
  • Light-token accounts are automatically compressed/decompressed when active/inactive.

Light-Mint Accounts

  • Light-mints are compressed accounts and cannot be decompressed.
  • SPL mints can not be compressed to light-mints.
Light-mints uniquely represent a token on Solana and store its global metadata, similar to SPL mint accounts with few core differences:
  1. Light-mint accounts are rent-free.
  2. Tokens created from light-mints are light-tokens.
  3. Token metadata (name, symbol, URI) is stored as an extension in the struct.
Diagram showing light-mint compressed account structure with three components: Hash (identifier for light-mint in purple box), Account (struct containing BaseMint with SPL-compatible fields, light-mint Data for program state, and optional Extensions for Token Metadata), and BasemintData (containing Supply, Decimals, Mint Authority, and Freeze Authority fields) with Token Metadata extension
The metadata field is used by the Compressed Token Program to store the internal state of a light-mint. The BaseMint field replicates the field layout and serialization format of SPL Mint accounts. The struct is serialized with Borsh to match the on-chain format of SPL tokens and mints. Here is how light-mints and SPL mints compare:
FieldLight-MintSPL Mint
mint_authority
supply
decimals
is_initialized
freeze_authority
Light-Mint Data-
Extensionsvia Token-2022

Light-Token Account

Light-token accounts are Solana accounts, not compressed accounts.
A light-token account holds token balances like SPL Token accounts:
  • A wallet needs a light-token account for each light-mint, SPL mint, or Token 2022 mint it wants to hold, with the wallet address set as the light-token account owner.
  • Each wallet can own multiple light-token accounts for the same light-mint.
  • A light-token account can only have one owner and hold units of one light-mint.
Diagram showing light-token Solana account structure with three components: Address (identifier for light-token account in purple box), Account (struct containing Data bytes, Executable flag, Lamports balance, and Owner set to Compressed Token Program), and AccountData (containing Mint, Owner, Amount, and Extensions fields)
Light-token accounts replicate the field layout and serialization format of SPL Token accounts. The struct is serialized with Borsh to match the on-chain format of SPL tokens. Here is how light-tokens and SPL tokens compare:
FieldLight-TokenSPL Token Account
mint
owner
amount
delegateunimplemented
state
is_native
delegated_amountunimplemented
close_authority
extensionsvia Token-2022

Rent Config for Light-Tokens

  1. The rent-exemption for light-token account creation is sponsored by Light Protocol.
  2. Transaction payer’s pay rent
    to keep accounts “active”.
  3. “Inactive” accounts, where rent is below one epoch, are compressed
    and the rent-exemption can be claimed by the rent sponsor.
  4. Transfers to inactive accounts (decompress).
This way rent is automatically paid when accounts are used:
EventTotal CostPayerTime of Rent funded
Account CreationTransaction payerFunds 24h rent
Automatic Top ups
(when rent < 3h)
776 lamportsTransaction payerFunds 3h rent
Load Account
(when inactive)
Transaction payerFunds 24h rent
We recommend to use default values, but you can customize prepaid rent and top ups:

Associated Light-Token Account

Associated light-token accounts (light-ATAs) follow the same pattern as associated token accounts (ATA):
  • Each wallet needs its own light-token account to hold tokens from the same light-mint.
  • The address for light-ATAs is deterministically derived with the owner’s address, light-token program ID, and mint address.
let seeds = [
    owner.as_ref(),          // Wallet address (32 bytes)
    program_id.as_ref(),     // Compressed Token Program ID (32 bytes)
    mint.as_ref(),           // light-mint address (32 bytes)
    bump.as_ref(),           // Bump seed (1 byte)
];

Compressed Token Account

Compressed token accounts store token balance, owner, and other information like SPL and light-tokens. Any light-token or SPL token can be compressed/decompressed at will. We recommend to use compressed tokens for token distribution or storage of inactive tokens.
Light-token accounts with the compressible extension are automatically compressed with no writes in 27,000 slots (3h) and decompressed with new writes.
Diagram showing compressed token account structure with three components: Hash (identifier for compressed token account in purple box), Account (struct containing Data bytes, Executable flag, Lamports balance, and Address set to None), and AccountData (containing Mint, Owner, Amount, and Extensions fields marked as unimplemented)

Next Steps

Create Light-Token Accounts