> ## Documentation Index
> Fetch the complete documentation index at: https://docs.allium.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Token standards

> ERC-20, ERC-721, ERC-1155, SPL, Token-2022 and the rest — what each standard specifies and why the differences make blockchain data hard.

A **token standard** is an agreed interface a token contract implements: which functions it exposes, which events it emits, and what those events mean. Standards are what let a wallet display a token it has never seen before, and what let an indexer interpret a transfer without reading the contract's source.

They are also the main reason blockchain data is harder than it looks. There is no single global token standard — each ecosystem has its own, several ecosystems have more than one, and plenty of real tokens follow none of them exactly.

## Ethereum and EVM chains

| Standard | Asset type | What it specifies | Notes |
| :- | :- | :- | :- |
| **ERC-20** | Fungible | `transfer`, `approve`, `balanceOf`, plus a `Transfer` event | The default for stablecoins, governance tokens, and wrapped assets |
| **ERC-721** | Non-fungible | One owner per `tokenId`, plus `Transfer` and `Approval` events | The default for NFT collections |
| **ERC-1155** | Both | Many token IDs per contract, batch transfers | Used by games and marketplaces; a single contract can hold fungible and non-fungible IDs |
| **ERC-4626** | Fungible | A standard interface for yield-bearing vault shares | Share balances are not asset balances; the exchange rate moves |
| **ERC-777, ERC-4337, ERC-8004** | — | Extensions: transfer hooks, account abstraction, agent identity | Increasingly common; each one adds an event shape to interpret |

ERC-20 and ERC-721 are the same standard family, and this causes real confusion: both emit an event called `Transfer`, with a third parameter that is an *amount* for ERC-20 and a *token ID* for ERC-721. Deciding which is which requires knowing the contract's type, which is metadata the event itself does not carry.

<Warning>
  Standards are conventions, not enforcement. A contract can call itself ERC-20 and behave differently. Fee-on-transfer tokens move less than the transferred amount; rebasing tokens change every holder's balance with no `Transfer` event at all; some tokens move value through internal calls and emit no event. Any dataset built purely from `Transfer` events will be wrong for these tokens — which is why Allium reconciles balances against onchain state rather than deriving them from events alone.
</Warning>

## Solana

Solana does not put token logic in per-token contracts. A single **Token Program** owns all token accounts, and each token is a *mint* account with its own supply and decimals.

| Standard | Asset type | Notes |
| :- | :- | :- |
| **SPL Token** | Fungible and non-fungible | The original token program. A holding lives in a separate token account owned by the wallet, not in the wallet address itself |
| **Token-2022** | Fungible and non-fungible | Successor program adding extensions: transfer fees, transfer hooks, confidential transfers, interest-bearing tokens |
| **Metaplex** | Non-fungible | The metadata standard layered on top of SPL for NFT names, images, and collections |
| **Compressed NFTs (cNFTs)** | Non-fungible | State stored in a Merkle tree rather than in accounts; cheap to mint at volume, and only readable with the tree's proof data |

The practical consequence: on Solana a wallet's holdings are spread across **associated token accounts**, so "the balance of this address" requires resolving account ownership rather than reading a single mapping. NFTs are just mints with a supply of one, so nothing in the token model itself tells you an asset is an NFT.

## Other ecosystems

| Ecosystem | Token model |
| :- | :- |
| **Bitcoin and UTXO chains** | No native token layer. Value is unspent outputs; token-like protocols (Ordinals, Runes, BRC-20) are conventions encoded in transaction data |
| **Cosmos** | Native denominations plus IBC-transferred denoms, and CosmWasm CW-20 contracts. Balances live in the bank module, not in contracts |
| **Move chains (Aptos, Sui)** | Tokens are typed resources or objects held directly by accounts. The type system enforces properties that EVM standards only suggest |
| **XRP Ledger, Stellar** | Issued assets defined at the ledger level, with trustlines controlling who may hold what |
| **TRON** | TRC-20, closely modelled on ERC-20 |

## Why Allium normalizes

Every one of those models answers "who holds what" differently. Reading them yourself means writing a distinct extraction path per ecosystem, then keeping each one correct as programs and standards change.

Allium's job is to collapse that into one shape:

| You want | Use |
| :- | :- |
| Transfers with a consistent schema across every chain and standard | [Token Transfers](/historical-data/token-transfers) |
| Holdings reconciled against onchain state, not derived from events | [Balances](/historical-data/balances) |
| Symbol, name, decimals, and supply per token | [Tokens](/historical-data/tokens/profile-beta) |
| NFT collections, mints, and sales | [NFTs](/historical-data/nft-trades) |
| Raw events and instructions, unnormalized, for your own logic | Each chain's `raw` schema in the [Data Catalog](/historical-data/overview) |

<Tip>
  When a number disagrees with a block explorer, check the token standard before checking the pipeline. Fee-on-transfer, rebasing, and compressed assets account for most apparent discrepancies. [Data caveats](/historical-data/overview/data-caveats) lists the known cases.
</Tip>

## Next steps

* [Fungible vs non-fungible](/guides/fungible-vs-non-fungible) — the underlying distinction
* [Balances](/historical-data/balances) — how holdings are modelled
