---
title: Assets on Solana
seoTitle: Solana Tokens, Token Accounts, and Token Extensions
description:
  Learn how digital assets are represented on Solana using Token Programs, mint
  accounts, token accounts, and Token-2022 extensions.
---

Tokens are digital assets that represent ownership over diverse categories of
assets. Tokenization enables the digitalization of property rights. Tokens on
Solana are referred to as SPL
([Solana Program Library](https://github.com/solana-program)) Tokens.

<DocsDiagram
  src="/assets/docs/diagrams/assets-overview.svg"
  alt="The Token Program updates a mint and its token accounts while owners authorize balance changes"
/>

<Cards>
  <Card title="Create a token with the CLI" href="/docs/tokens/quickstart">
    Create a mint, mint supply, and transfer tokens on devnet from your browser.
  </Card>
</Cards>

This section covers the basic concepts of how tokens are represented on Solana.
Refer to the [SPL Token Basics](/docs/tokens/basics) section for code examples.

## Key Points

- [Token Programs](#token-programs) contain all instruction logic for
  interacting with tokens on the network (both fungible and non-fungible).

- A [Mint Account](#mint-account) represents a specific token and stores global
  metadata about the token such as the total supply and mint authority (address
  authorized to create new units of a token).

- A [Token Account](#token-account) tracks individual ownership of tokens for a
  specific mint account for a specific owner.

- An [Associated Token Account](#associated-token-account) is a Token Account
  created with an address derived from the owner and mint account addresses.

## Token Programs

The Solana ecosystem has two main Token Programs. Source code for both programs
below.

<Cards>
  <Card title="Token Program (Original)" href="https://github.com/solana-program/token">
   - Basic token capability (mint, transfer, etc.)
   - Immutable and widely used
  </Card>

  <Card title="Token Extension Program (Token 2022)" href="https://github.com/solana-program/token-2022">
   - Includes all original Token Program features
   - Adds features through "extensions"
  </Card>
</Cards>

Token Programs contains all instruction logic for interacting with tokens on the
network (both fungible and non-fungible). All tokens on Solana are effectively
[data accounts](/docs/core/accounts/account-types#data-accounts) owned by a
Token Program.

![Token Program](/assets/docs/core/tokens/token-program.svg)

### Mint Account

Tokens on Solana are uniquely identified by the address of a
[Mint Account](https://github.com/solana-program/token/blob/6d18ff73b1dd30703a30b1ca941cb0f1d18c2b2a/program/src/state.rs#L16-L30)
owned by the Token Program. This account acts as a global counter for a specific
token and stores data such as:

- **Supply**: Total supply of the token
- **Decimals**: Decimal precision of the token
- **Mint authority**: The account authorized to create new units of the token,
  increasing the supply
- **Freeze authority**: The account authorized to freeze tokens in a Token
  Account, preventing them from being transferred or burned

The mint authority is configured when the mint is initialized. It authorizes
future minting, but it does not have to be the account that created or paid for
the mint account.

![Mint Account](/assets/docs/core/tokens/mint-account.svg)

The full details stored on each Mint Account include the following:

```rust title="Mint Account State"
pub struct Mint {
    /// Optional authority used to mint new tokens. The mint authority may only
    /// be provided during mint creation. If no mint authority is present
    /// then the mint has a fixed supply and no further tokens may be
    /// minted.
    pub mint_authority: COption<Pubkey>,
    /// Total supply of tokens.
    pub supply: u64,
    /// Number of base 10 digits to the right of the decimal place.
    pub decimals: u8,
    /// Is `true` if this structure has been initialized
    pub is_initialized: bool,
    /// Optional authority to freeze token accounts.
    pub freeze_authority: COption<Pubkey>,
}
```

For reference, here is a Solana Explorer link to the
[USDC Mint Account](https://explorer.solana.com/address/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v).

### Token Account

The Token Program creates
[Token Accounts](https://github.com/solana-program/token/blob/6d18ff73b1dd30703a30b1ca941cb0f1d18c2b2a/program/src/state.rs#L87-L108)
to track individual ownership of each token unit. A Token Account stores data
such as:

- **Mint**: The token the Token Account holds units of
- **Owner**: The account authorized to transfer tokens from the Token Account
- **Amount**: Number of the tokens the Token Account currently holds

![Token Account](/assets/docs/core/tokens/token-account.svg)

The full details stored on each Token Account include the following:

```rust title="Token Account State"
pub struct Account {
    /// The mint associated with this account
    pub mint: Pubkey,
    /// The owner of this account.
    pub owner: Pubkey,
    /// The amount of tokens this account holds.
    pub amount: u64,
    /// If `delegate` is `Some` then `delegated_amount` represents
    /// the amount authorized by the delegate
    pub delegate: COption<Pubkey>,
    /// The account's state
    pub state: AccountState,
    /// If is_native.is_some, this is a native token, and the value logs the
    /// rent-exempt reserve. An Account is required to be rent-exempt, so
    /// the value is used by the Processor to ensure that wrapped SOL
    /// accounts do not drop below this threshold.
    pub is_native: COption<u64>,
    /// The amount delegated
    pub delegated_amount: u64,
    /// Optional authority to close the account.
    pub close_authority: COption<Pubkey>,
}
```

A wallet needs a token account for each token (mint) it wants to hold, with the
wallet address set as the token account owner. Each wallet can own multiple
token accounts for the same token (mint), but a token account can only have one
owner and hold units of one token (mint).

![Account Relationship](/assets/docs/core/tokens/token-account-relationship.svg)

<Callout type="info">

Note that each Token Account's data includes an `owner` field identifying who
has authority over the Token Account. This differs from the program owner
specified in the base
[Account](/docs/core/accounts/account-structure#account-fields) type, which is
the Token Program for all Token Accounts.

</Callout>

### Associated Token Account

Associated Token Accounts simplify the process of finding a token account's
address for a specific mint and owner. Think of the Associated Token Account as
the "default" token account for a specific mint and owner.

An Associated Token Account is created with an address derived from the owner's
address and the mint account's address. It's important to understand that an
Associated Token Account is just a token account with a specific address.

This introduces a key concept in Solana development:
[Program Derived Address (PDA)](/docs/core/pda). A PDA derives an address
deterministically using predefined inputs, making it easy to find the address of
an account.

![Associated Token Account](/assets/docs/core/tokens/associated-token-account.svg)

Note that each wallet needs its own token account to hold tokens from the same
mint.

![Accounts Relationship Expanded](/assets/docs/core/tokens/token-account-relationship-ata.svg)
