---
title: Token
description: Complete reference for Thru CLI token program commands
source_url:
  html: https://thru.org/docs/cli-reference/token-commands/
  md: https://thru.org/docs/cli-reference/token-commands.md
---

# Token

The `thru token` command provides comprehensive token management functionality, including minting, transfers, account management, and administrative operations.

> **Tip:**
>
> **Transaction Fees**: Currently all transaction fees are set to 0. Transaction fees will be implemented and charged in future releases.

## Prerequisites

- [CLI setup](https://thru.org/docs/program-development/setting-up-thru-devkit.md) with configured keys and RPC endpoint

## Command Overview

- [Initialize Mint](#initialize-mint): Create a new token with specified properties
- [Initialize Account](#initialize-account): Create token accounts for holding tokens
- [Transfer](#transfer): Move tokens between accounts
- [Mint To](#mint-to): Create new tokens and add to account
- [Burn](#burn): Permanently destroy tokens
- [Close Account](#close-account): Close token accounts and reclaim balance
- [Freeze Account](#freeze-account): Freeze accounts to prevent transfers
- [Thaw Account](#thaw-account): Unfreeze previously frozen accounts
- [Derive Mint Account](#derive-mint-account-address): Calculate mint account address from creator and seed
- [Derive Token Account](#derive-token-account-address): Calculate token account address from mint, owner, and seed

## Initialize Mint

Create a new mint account on the blockchain and initialize it as a token mint with specified properties.

```bash
thru token initialize-mint $creator $ticker $seed [OPTIONS]
```

**`creator` · *string* · **required****

Creator address used for mint account derivation, formatted as a 46-char ta…\[address] or 64-char hex key. Effectively, this must be the feepayer.

**`ticker` · *string* · **required****

Token symbol, maximum 8 characters (e.g., “USDC”, “ETH”)

**`seed` · *string* · **required****

32-byte hex string for deterministic mint address derivation. To convert a readable string into a zero-padded 32-byte seed, run `thru program seed-to-hex $seed`.

***string***

Optional mint authority address. If omitted, the creator is used as mint authority.

***string***

Optional hex-encoded state proof for mint account creation. If not provided, the state proof is automatically generated.

***string***

Address that can freeze/unfreeze token accounts (optional)

***integer***

Number of decimal places for token precision (0-18)

***string***

Account to pay transaction fees

**Example:**

**Basic mint:**

```bash
thru token initialize-mint \
  ta...[creator] \
  GOLD \
  0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
```

**With freeze authority:**

```bash
thru token initialize-mint \
  ta...[creator] \
  SILVER \
  0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
  --freeze-authority ta...[freeze_authority] \
  --decimals 6
```

**Custom state proof:**

```bash
thru token initialize-mint \
  ta...[creator] \
  BRONZE \
  0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
  --state-proof a1b2c3d4e5f6789... \
  --fee-payer treasury
```

> **Tip:**
>
> On success, the mint is created and can be used for token operations

## Initialize Account

Create a new token account on the blockchain that can hold tokens from a specific mint.

> **Note:**
>
> **Address Derivation**: Token account addresses are automatically derived using SHA256(owner + mint + user\_seed), creating a unique address for each mint and owner combination. You can verify the derived address using [`derive-token-account`](#derive-token-account-address).

```bash
thru token initialize-account $mint $owner $seed [OPTIONS]
```

**`mint` · *string* · **required****

The mint address for which to create an account

**`owner` · *string* · **required****

Address that will own and control this token account

**`seed` · *string* · **required****

32-byte hex string for deterministic account address derivation. This seed is hashed with the owner and mint to create the final token account address.

***string***

Optional hex-encoded state proof for token account creation. If not provided, the state proof is automatically generated.

***string***

Account to pay transaction fees

**Example:**

**Create account:**

```bash
thru token initialize-account \
  ta...[mint] \
  ta...[owner] \
  fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210
```

**With custom fee payer:**

```bash
thru token initialize-account \
  ta...[mint] \
  ta...[owner] \
  fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210 \
  --fee-payer treasury
```

**Custom state proof:**

```bash
thru token initialize-account \
  ta...[mint] \
  ta...[owner] \
  fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210 \
  --state-proof f9e8d7c6b5a4321... \
  --fee-payer treasury
```

> **Tip:**
>
> Use [`derive-token-account`](#derive-token-account-address) to verify the account address that will be automatically created

## Transfer

Transfer tokens between two token accounts. Both accounts must be associated with the same mint, and neither account can be frozen. The fee payer must be the owner of the source token account to authorize the transfer.

```bash
thru token transfer $from $to $amount [OPTIONS]
```

**`from` · *string* · **required****

Source token account address

**`to` · *string* · **required****

Destination token account address

**`amount` · *integer* · **required****

Amount to transfer (in smallest token units)

***string***

Account to pay transaction fees (must be the owner of the source token account)

**Example:**

**Simple transfer:**

```bash
thru token transfer \
  ta...[from_token_account] \
  ta...[to_token_account] \
  1000000
```

**With custom fee payer:**

```bash
thru token transfer \
  ta...[from_token_account] \
  ta...[to_token_account] \
  500000 \
  --fee-payer alice
```

> **Caution:**
>
> The amount is specified in the smallest token units. For a token with 9 decimals, 1000000000 represents 1.0 tokens

## Mint To

Mint new tokens directly to a token account. The destination account must be associated with the specified mint and cannot be frozen. Only the designated mint authority can perform this operation.

```bash
thru token mint-to $mint $to $authority $amount [OPTIONS]
```

**`mint` · *string* · **required****

The mint address from which to create new tokens

**`to` · *string* · **required****

Destination token account to receive the minted tokens

**`authority` · *string* · **required****

Mint authority address (must match the mint’s authority)

**`amount` · *integer* · **required****

Amount to mint (in smallest token units)

***string***

Account to pay transaction fees

**Example:**

**Mint tokens:**

```bash
thru token mint-to \
  ta...[mint] \
  ta...[destination_token_account] \
  alice \
  5000000000
```

**Large mint operation:**

```bash
thru token mint-to \
  ta...[mint] \
  ta...[destination_token_account] \
  treasury \
  1000000000000 \
  --fee-payer treasury
```

> **Tip:**
>
> Only the designated mint authority can mint new tokens

## Burn

Permanently destroy tokens from an account. The account must be associated with the specified mint and cannot be frozen. Only the account owner can perform this operation.

```bash
thru token burn $account $mint $authority $amount [OPTIONS]
```

**`account` · *string* · **required****

Token account containing tokens to burn

**`mint` · *string* · **required****

The mint address of the tokens being burned

**`authority` · *string* · **required****

Account owner address (must be the owner of the token account being burned)

**`amount` · *integer* · **required****

Amount to burn (in smallest token units)

***string***

Account to pay transaction fees

**Example:**

**Burn tokens:**

```bash
thru token burn \
  ta...[token_account] \
  ta...[mint] \
  alice \
  1000000
```

**Burn with authority:**

```bash
thru token burn \
  ta...[token_account] \
  ta...[mint] \
  burn_authority \
  5000000 \
  --fee-payer treasury
```

> **Caution:**
>
> Burned tokens are permanently destroyed and cannot be recovered

## Close Account

Close a token account and transfer any remaining balance. The account must have a zero balance before closing. Only the account owner can perform this operation.

```bash
thru token close-account $account $destination $authority [OPTIONS]
```

**`account` · *string* · **required****

Token account to close

**`destination` · *string* · **required****

Account to receive any remaining token balance

**`authority` · *string* · **required****

Account owner address (must be the owner of the token account being closed)

***string***

Account to pay transaction fees

**Example:**

**Close account:**

```bash
thru token close-account \
  ta...[token_account] \
  ta...[destination_account] \
  alice
```

**Close with custom fee payer:**

```bash
thru token close-account \
  ta...[token_account] \
  ta...[destination_account] \
  alice \
  --fee-payer treasury
```

> **Caution:**
>
> The account must have exactly zero tokens before it can be closed

## Freeze Account

Freeze a token account to prevent transfers. The account must be associated with the specified mint. Only the mint’s freeze authority can perform this operation, and the mint must have freeze authority enabled.

```bash
thru token freeze-account $account $mint $authority [OPTIONS]
```

**`account` · *string* · **required****

Token account to freeze

**`mint` · *string* · **required****

The mint address associated with the account

**`authority` · *string* · **required****

Freeze authority address (must match the mint’s freeze authority)

***string***

Account to pay transaction fees

**Example:**

```bash
thru token freeze-account \
  ta...[token_account] \
  ta...[mint] \
  freeze_authority
```

> **Caution:**
>
> This operation will fail if the mint does not have freeze authority enabled during mint creation

> **Note:**
>
> Frozen accounts cannot send or receive tokens until unfrozen

## Thaw Account

Unfreeze a previously frozen token account. The account must be associated with the specified mint. Only the mint’s freeze authority can perform this operation, and the mint must have freeze authority enabled.

```bash
thru token thaw-account $account $mint $authority [OPTIONS]
```

**`account` · *string* · **required****

Token account to unfreeze

**`mint` · *string* · **required****

The mint address associated with the account

**`authority` · *string* · **required****

Freeze authority address (must match the mint’s freeze authority)

***string***

Account to pay transaction fees

**Example:**

```bash
thru token thaw-account \
  ta...[token_account] \
  ta...[mint] \
  freeze_authority
```

> **Caution:**
>
> This operation will fail if the mint does not have freeze authority enabled during mint creation

> **Tip:**
>
> After thawing, the account can participate in transfers normally

## Derive Mint Account Address

Calculate the deterministic **mint account** address that would be created for a given creator and seed combination. Use this to predict the mint address before calling `initialize-mint`.

> **Caution:**
>
> **Mint vs Token Account**: This command derives the address for a **mint account** (the token definition itself). To derive the address for a **token account** (which holds token balances), use [`derive-token-account`](#derive-token-account-address) instead.

> **Note:**
>
> **Address Derivation**: Mint account addresses are derived using SHA256(creator + seed), then used with the token program for final PDA derivation. This ensures each creator can create unique mints with different seeds.

```bash
thru token derive-mint-account $creator $seed
```

**`creator` · *string* · **required****

Creator address

**`seed` · *string* · **required****

Seed for derivation (32 bytes hex, 64 hex characters)

**Example:**

**Derive mint address:**

```bash
thru token derive-mint-account \
  ta...[creator] \
  0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
```

**JSON output:**

```bash
thru --json token derive-mint-account \
  ta...[creator] \
  0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
```

> **Tip:**
>
> Returns the calculated mint account address that will be used when creating the mint

> **Tip:**
>
> Use this command before running [`initialize-mint`](#initialize-mint) to know the mint address that will be created

## Derive Token Account Address

Calculate the deterministic **token account** address that would be created for a given mint, owner, and seed combination. Use this to predict token account addresses before calling `initialize-account`.

> **Caution:**
>
> **Token vs Mint Account**: This command derives the address for a **token account** (which holds token balances for an owner). To derive the address for a **mint account** (the token definition itself), use [`derive-mint-account`](#derive-mint-account-address) instead.

```bash
thru token derive-token-account $mint $owner [OPTIONS]
```

**`mint` · *string* · **required****

Mint account address

**`owner` · *string* · **required****

Account owner address

***string***

Seed for derivation (32 bytes hex, optional - defaults to all zeros)

**Example:**

**Default seed (all zeros):**

```bash
thru token derive-token-account \
  ta...[mint] \
  ta...[owner]
```

**Custom seed:**

```bash
thru token derive-token-account \
  ta...[mint] \
  ta...[owner] \
  --seed fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210
```

**JSON output:**

```bash
thru --json token derive-token-account \
  ta...[mint] \
  ta...[owner] \
  --seed fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210
```

> **Tip:**
>
> Returns the calculated token account address that can be used with other commands

> **Note:**
>
> **Address Formula**: The derived address is calculated as SHA256(owner + mint + seed), then used with the token program as the owner for final PDA derivation. This ensures unique addresses for each combination.

## Common Usage Patterns

### Initialize a Token Mint

1. **(Optional) Verify the mint address**

   You can optionally verify the mint account address that will be created:

   ```bash
   thru token derive-mint-account \
     ta...[creator] \
     0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
   ```

   Where:

   - First argument: creator address
   - Second argument: seed for mint derivation (save this securely!)

   > **Note:**
   >
   > The seed is crucial - save it securely as you’ll need it for creating the mint

2. **Initialize the mint**

   Create the mint account - the address and state proof are automatically derived:

   ```bash
   thru token initialize-mint \
     ta...[creator] \
     MYTOKEN \
     0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
     --freeze-authority ta...[freeze_authority] \
     --decimals 6
   ```

   Where:

   - First argument: creator address
   - Second argument: token symbol/ticker
   - Third argument: seed for deterministic address derivation

   > **Tip:**
   >
   > The command automatically derives the mint address and generates the required state proof

### Initialize a Token Account

Creating a token account is now simplified with automatic address and state proof derivation:

1. **(Optional) Verify the token account address**

   You can optionally verify the token account address that will be created:

   ```bash
   thru token derive-token-account \
     ta...[mint] \
     ta...[owner] \
     --seed fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210
   ```

   Where:

   - First argument: mint address (from the mint initialization)
   - Second argument: account owner address
   - `--seed`: unique seed for this token account (save this!)

2. **Initialize the token account**

   Create the token account - the address and state proof are automatically derived:

   ```bash
   thru token initialize-account \
     ta...[mint] \
     ta...[owner] \
     fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210
   ```

   Where:

   - First argument: mint address
   - Second argument: account owner address
   - Third argument: seed for deterministic address derivation

   > **Tip:**
   >
   > The command automatically derives the token account address and generates the required state proof

## Best Practices

> **Tip:**
>
> **Seed Management**: Store seeds securely and use deterministic generation for reproducible addresses

> **Tip:**
>
> **Authority Management**: Use dedicated key management for mint and freeze authorities

> **Caution:**
>
> **Security**: Never share private keys or store them in plain text. Use the CLI’s key management system
