Learn
Solana accounts decoded, byte by byte.
Each page walks you through what the account is, why it exists, and what the on-chain bytes mean — paired with a real, cached mainnet example.
SPL Token
The canonical fungible token program. Every SPL token on Solana uses this layout.
SPL Token Instructions
Token Program
Instruction data layouts for the SPL Token Program — Transfer, MintTo, Burn, Approve, and the Checked variants. A 1-byte discriminator followed by a u64 amount (and decimals for Checked).
Explore
Mint
Token Program · 82 bytes
Describes a token — its authority, total supply, decimals, and optional freeze authority. USDC, USDT, and wrapped SOL all have Mint accounts.
Explore
Multisig
Token Program · 355 bytes
An m-of-n multi-signature account that can act as any authority on a Mint or Token Account. Up to 11 signers; m signatures required to authorize an action.
Explore
Token Account
Token Program · 165 bytes
Holds a balance of one specific token for one specific owner. Associated Token Accounts (ATAs) are the standard derivation.
Explore
Token-2022 Extensions
Token-2022 extends SPL Token with post-base TLV blocks for fees, interest, confidential transfers, metadata, and more.
ConfidentialTransferAccount (extension)
Token-2022 Program · 295 bytes
Account-side Token-2022 extension holding a holder's ElGamal-encrypted balances. The 295-byte counterpart to ConfidentialTransferMint — where the actual hidden amounts and pending-balance machinery live.
Explore
ConfidentialTransferFee (extension)
Token-2022 Program · 129 bytes
The pair of extensions that let transfer fees work on confidential transfers — a mint-side config with an ElGamal key for encrypted withheld fees, and an account-side encrypted withheld amount.
Explore
ConfidentialTransferMint (extension)
Token-2022 Program · 65 bytes
Mint-side Token-2022 extension that enables confidential transfers — amounts are ElGamal-encrypted on-chain and proven correct with zero-knowledge proofs. This extension holds the policy; encrypted balances live on the account side.
Explore
CpiGuard (extension)
Token-2022 Program · 1 bytes
Account-side Token-2022 extension that, when enabled, blocks certain token actions from happening inside a CPI — protecting users from malicious programs that try to redirect approvals or close accounts mid-call.
Explore
DefaultAccountState (extension)
Token-2022 Program · 1 bytes
Mint-side Token-2022 extension that sets the state new TokenAccounts start in. Setting it to Frozen turns the token into an allowlist — accounts must be thawed before they can transact.
Explore
GroupPointer (extension)
Token-2022 Program · 64 bytes
Mint-side Token-2022 extension that records where a token's group (collection) configuration lives. The grouping analogue of MetadataPointer — can point at a TokenGroup account or the mint itself.
Explore
InterestBearingConfig (extension)
Token-2022 Program · 52 bytes
Mint-side Token-2022 extension that makes a token accrue interest continuously. The stored balance never changes — the UI amount is computed from a rate and elapsed time.
Explore
MetadataPointer (extension)
Token-2022 Program · 64 bytes
Mint-side Token-2022 extension that records where a token's metadata lives. It can point at an external account or at the mint itself for inline metadata — Token-2022's answer to Metaplex.
Explore
MintCloseAuthority (extension)
Token-2022 Program · 32 bytes
Mint-side Token-2022 extension that names an authority allowed to close the mint and reclaim its rent — but only once supply is zero. SPL Token mints could never be closed.
Explore
NonTransferable (extension)
Token-2022 Program · 0 bytes
Mint-side Token-2022 extension that makes a token soulbound — it can be minted and burned but never transferred. Its byte payload is empty; the extension's presence is the entire signal.
Explore
PermanentDelegate (extension)
Token-2022 Program · 32 bytes
Mint-side Token-2022 extension that grants one address unlimited authority to transfer or burn tokens from any account of the mint, forever. The clawback primitive — powerful and dangerous.
Explore
ScaledUiAmount (extension)
Token-2022 Program · 56 bytes
Mint-side Token-2022 extension that multiplies displayed balances by a configurable factor. The on-chain amount is unchanged; the UI amount is amount × multiplier — used for rebasing and stock-split-style display.
Explore
TLV Layout Primer
Token-2022 Program
How Token-2022 stores extensions on-chain — a 4-byte Type-Length-Value header followed by per-extension payload, walked left-to-right until a type-0 sentinel.
Explore
Token-2022 Mint/Account + Extensions
Token-2022 Program · 165 bytes
Token-2022 Mints and TokenAccounts share SPL Token's base layouts and append features as post-base TLV extension blocks — a 1-byte discriminator at offset 165 distinguishes Mint from TokenAccount.
Explore
TokenGroup (extension)
Token-2022 Program · 80 bytes
Mint-side Token-2022 extension that defines a group (collection) — its update authority, the group mint, and the current/maximum member count. The Group Interface analogue of a Metaplex Collection.
Explore
TokenMetadata (extension)
Token-2022 Program
Mint-side Token-2022 extension that stores name, symbol, URI, and arbitrary key-value pairs inline in the mint account — Token-2022's self-contained alternative to a separate Metaplex metadata account.
Explore
TransferFeeConfig (extension)
Token-2022 Program · 108 bytes
Mint-side Token-2022 extension that charges a percentage fee on every transfer. Fees accumulate as withheld balances on recipient TokenAccounts and are claimed later by the withdraw authority.
Explore
TransferHook (extension)
Token-2022 Program · 64 bytes
Mint-side Token-2022 extension that calls a custom program on every transfer. The token program CPIs into the hook's Execute instruction, enabling allowlists, royalty enforcement, and per-transfer logic.
Explore
Staking & Voting
Core accounts for Solana's proof-of-stake consensus. Every validator has a Vote account; every delegator has a Stake account.
Stake Account
Stake Program · 200 bytes
Delegates SOL to a validator's Vote account. Tracks staker/withdrawer authorities, lockup, delegated amount, and activation epochs.
Explore
Vote Account
Vote Program · 3762 bytes
A validator's on-chain identity. Records voting authority, commission rate, and a rolling history of votes and epoch credits.
Explore
Metaplex (NFTs)
The Metaplex Token Metadata program attaches rich metadata to SPL mints — the foundation of every Solana NFT.
Collection Authority Record
Metaplex Token Metadata · 35 bytes
A tiny delegate record that lets an address other than the collection's update authority verify NFTs into a Metaplex collection. The on-chain permission slip for delegated collection management.
Explore
Edition Marker
Metaplex Token Metadata · 32 bytes
A 32-byte bitfield that tracks which numbered editions of a Master Edition have already been printed. Each bit is one edition number; one marker covers 248 editions.
Explore
Master Edition
Metaplex Token Metadata
The account that marks an NFT as a one-of-one master and authorizes printing numbered editions of it. Stores current print supply and an optional maximum.
Explore
Token Metadata
Metaplex Token Metadata · 607 bytes
MetadataV1 account — links a mint to its name, symbol, URI, royalties, creators, and optional collection. The foundation of every Solana NFT.
Explore
Use Authority Record
Metaplex Token Metadata · 10 bytes
A tiny delegate record that lets an address other than the NFT owner consume "uses" on a usable NFT, with its own quota. The permission slip behind redeemable/consumable NFTs.
Explore
Compressed NFTs
Bubblegum stores NFTs in a Merkle tree instead of individual accounts — millions of NFTs for the cost of a few accounts.
Transactions
How Solana transactions are encoded on the wire — signatures, message header, account ordering, instructions, and versioned lookup tables.
Address Lookup Table
Address Lookup Table Program
Stores an array of pubkeys that v0 transactions reference by 1-byte index. 56-byte header + tightly-packed 32-byte addresses, up to 256 entries.
Explore
compact-u16 (shortvec)
Transaction encoding
The 1-to-3-byte variable-length integer that prefixes every array in a Solana transaction. Seven value bits per byte plus a continuation flag — the source of most off-by-one transaction-parsing bugs.
Explore
Legacy Transaction
Transaction encoding
The original Solana transaction wire format — a signatures array followed by a message (header, account keys, recent blockhash, instructions). Byte-by-byte, every array prefixed by compact-u16.
Explore
Signatures & Recent Blockhash
Transaction encoding
How a transaction is signed and kept fresh — Ed25519 signatures over the message bytes, a recent blockhash that expires in ~80 seconds, and durable nonces for transactions that need to outlive that window.
Explore
v0 (Versioned) Transaction
Transaction encoding
The versioned transaction format — a 1-byte version prefix, the same message body as a legacy transaction, plus an address-table-lookups section that references accounts stored in Address Lookup Tables.
Explore
Native Program Instructions
Instruction data layouts for Solana's built-in programs — System, Stake, Vote, Compute Budget.
Compute Budget Instructions
Compute Budget Program
Instruction data for the Compute Budget Program — set the compute-unit limit and the per-CU priority fee. A 1-byte discriminator plus a small integer; the levers behind priority fees.
Explore
Stake Program Instructions
Stake Program
Instruction data layouts for the Stake Program — Initialize, DelegateStake, Deactivate, Split, Merge, Withdraw, Authorize. A 4-byte enum discriminator followed by bincode fields.
Explore
System Program Instructions
System Program
Instruction data layouts for the System Program — CreateAccount, Transfer, Allocate, Assign, and the nonce instructions. A 4-byte little-endian enum discriminator followed by bincode-serialized fields.
Explore
Vote Program Instructions
Vote Program
Instruction data layouts for the Vote Program — InitializeAccount, Authorize, Vote, Withdraw, UpdateCommission. A 4-byte enum discriminator followed by bincode fields. Mostly validator-internal.
Explore
Programs (Executable)
On-chain programs are ELF shared objects loaded by one of Solana's BPF loaders.
BPF Upgradeable Program
BPF Upgradeable Loader · 36 bytes
A thin 36-byte pointer from a program's public address to its ProgramData account, which holds the actual ELF bytecode. The indirection is what lets a program be upgraded while keeping its address.
Explore
Buffer Account
BPF Upgradeable Loader
A temporary staging account that holds an program's ELF during deployment or before an upgrade. Once written and verified, its contents are copied into the ProgramData account and the buffer is closed.
Explore
ELF Bytecode
BPF Loader
The compiled program itself — a standard ELF shared object whose 64-byte header identifies it as a little-endian eBPF binary, followed by the program's code and data segments.
Explore
ProgramData Account
BPF Upgradeable Loader
The account that actually holds an upgradeable program's ELF bytecode, plus the slot it was last deployed at and the upgrade authority. Referenced by the tiny Program account at the program's public address.
Explore
Anchor
Conventions the Anchor framework layers on top of raw accounts and instructions — discriminators, space, and rent.
Anchor Account Discriminator
Anchor framework · 8 bytes
The 8-byte prefix Anchor stamps on every account it owns, derived from the account's struct name. It's how an Anchor program tells its own account types apart.
Explore
Anchor init & Account Space
Anchor framework
How Anchor's
Explore
Anchor Instruction Discriminator
Anchor framework · 8 bytes
The 8-byte prefix on every Anchor instruction's data, derived from the instruction name. It's how an Anchor program routes incoming instructions to the right handler.
Explore
Addresses & PDAs
How Solana derives program-controlled addresses and associated token accounts from seeds.
Associated Token Account (ATA) Derivation
Associated Token Account Program
The deterministic PDA that holds a given wallet's balance of a given token. Derived from [wallet, token_program, mint] under the ATA program, so any tool can compute it without an on-chain lookup.
Explore
Canonical Bumps
Addressing · 1 bytes
The bump is the single byte that nudges a PDA off the ed25519 curve. The canonical bump is the first one found counting down from 255 — and using anything else is a security bug.
Explore
PDA Derivation
Addressing
How a Program Derived Address is computed — SHA-256 over seeds, a bump byte, the program id, and a marker string, with the result forced off the ed25519 curve so no private key can exist for it.
Explore
Encoding & Layout
Cross-cutting serialization rules — optional types, Borsh vs bincode, and how rent ties to account size.
Borsh vs bincode
Encoding
The two dominant binary serializations on Solana. Borsh (Anchor, SPL, most app programs) and bincode (native System/Stake/Vote programs) differ in enum tag width and a few conventions — enough to break a decoder that assumes the wrong one.
Explore
COption vs Option vs OptionalNonZeroPubkey
Encoding
Solana has three different ways to encode an optional value, and they're not interchangeable. SPL's COption is 4 bytes of tag, Borsh's Option is 1, and Token-2022's OptionalNonZeroPubkey is 0 — the single most common source of off-by-N decoder bugs.
Explore
Rent & Account Size
Encoding
Why every Solana account has a fixed byte size set at creation and a minimum SOL balance to stay alive. Rent exemption is a deposit proportional to size — refundable when the account closes.
Explore