ES

Token Account

Holds a balance of one specific token for one specific owner. Associated Token Accounts (ATAs) are the standard derivation.

Token Program 165 bytes

Sample: Jupiter USDC

(cached; refreshes hourly · mainnet only)

Mint Owner Amount Delegate Option Delegate (empty) State Is Native Native (reserved) Delegated Amount Close Authority Option Close Authority (empty)
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 c6 fa 7a f3 be db ad 3a 3d 65 f3 6a ab c9 74 31
0010 b1 bb e4 c2 d2 f6 e0 e4 7c a6 02 03 45 2f 5d 61
0020 04 79 d5 5b f2 31 c0 6e ee 74 c5 6e ce 68 15 07
0030 fd b1 b2 de a3 f4 8e 51 02 b1 cd a2 56 bc 13 8f
0040 27 96 6d 0c 00 00 00 00 00 00 00 00 00 00 00 00
0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00a0 00 00 00 00 00

What it is

A Token Account holds one wallet’s balance of one specific token. Every SPL token balance lives in its own 165-byte account.

Why it exists

SPL Token deliberately separates mint metadata (the Mint account) from individual balances (Token Accounts). The same token — say USDC — exists as exactly one Mint and millions of Token Accounts, one per holder. Most wallets use Associated Token Accounts (ATAs): given a wallet pubkey and a mint, the ATA address is the deterministic PDA derived from the pair, so any tool can compute it without on-chain lookup.

Byte layout

Offset Length Field Type Notes
0 32 mint Pubkey Which token this account holds.
32 32 owner Pubkey Wallet that controls this account (signs transfers).
64 8 amount u64 LE Balance in atomic units.
72 36 delegate COption<Pubkey> 4-byte tag + pubkey. Approved spender, if any.
108 1 state u8 enum 0 Uninitialized, 1 Initialized, 2 Frozen.
109 12 is_native COption<u64> 4-byte tag + u64. Set on wrapped-SOL accounts; the u64 is the rent-exempt reserve.
121 8 delegated_amount u64 LE Atomic units the delegate may spend.
129 36 close_authority COption<Pubkey> 4-byte tag + pubkey. May close this account and reclaim rent.

Total: 165 bytes.

Where you see it

You encounter Token Accounts every time a wallet holds an SPL token — in wallet UIs, transfer instructions, DEX swap routes, and balance lookups. An “account not found” error on a transfer usually means the recipient’s ATA hasn’t been created yet.

Common gotchas

  • Frozen accounts can still receive tokens. State 2 (Frozen) blocks outgoing transfers but not incoming. Used by issuers like Circle for compliance.
  • is_native is not a boolean. It’s COption<u64> — when Some, the account is wrapped SOL and the inner u64 is the rent reserve to preserve on close.
  • ATAs are PDAs of the SPL Associated Token Account program, not of the Token program. The derivation seeds are [wallet, TOKEN_PROGRAM_ID, mint].
  • A Token Account’s owner is the wallet, not the Token program. The on-chain account’s owner field (in the account header, not these 165 bytes) is the Token program; the data’s owner field is the user wallet that authorizes spends.

Last verified: 2026-05-19