What Does Minting Do?
Minting creates new units of an existing token and increases the mint's total supply.
Only the mint authority can mint new tokens. The destination token account must already exist and must belong to the same mint.
How to Mint Tokens
Minting tokens uses the Token Program's MintTo or MintToChecked
instruction.
The examples below use MintToChecked, which requires the caller to provide
the mint's decimals so the instruction can verify the expected token precision
before minting.
The native mint does not support minting.
Source Reference
| Item | Description | Token Program | Token Extension Program |
|---|---|---|---|
Mint | The mint state stores the mint authority and total token supply. | Source | Source |
Account | The token account state stores the destination balance updated by minting. | Source | Source |
MintTo | A mint instruction that mints tokens to an existing token account without requiring the caller to provide the mint's decimals. | Source | Source |
MintToChecked | A mint instruction that requires the caller to provide the mint's decimals and checks that value before minting tokens to an existing token account. | Source | Source |
process_mint_to | Shared processor logic for minting tokens. | Source | Source |
Typescript
The Kit examples below show the recommended approach using @solana/kit.
Legacy examples using @solana/web3.js are included for reference.
Kit
import { generateKeyPairSigner } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";import {findAssociatedTokenPda,tokenProgram,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const client = await createLocalClient().use(tokenProgram());const mint = await generateKeyPairSigner();const result = await client.token.instructions.mintToATA({mint: mint.address, // Mint for the token being minted.owner: client.payer.address, // Account that owns the token account receiving the minted tokens.mintAuthority: client.payer, // Authority allowed to mint new tokens.amount: 100n, // Token amount in base units.decimals: 2 // Decimals defined on the mint account.}).sendTransaction();const [tokenAccount] = await findAssociatedTokenPda({mint: mint.address,owner: client.payer.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});const mintAccount = await client.token.accounts.mint.fetch(mint.address);const tokenAccountData = await client.token.accounts.token.fetch(tokenAccount);console.log("Mint Address:", mint.address);console.log("Mint Account:", mintAccount.data);console.log("\nToken Account Address:", tokenAccount);console.log("Token Account:", tokenAccountData.data);console.log("\nTransaction Signature:", result.context.signature);
Console
Click to execute the code.
Web3.js
import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";import {createAssociatedTokenAccount,createMint,getAccount,getMint,mintToChecked,TOKEN_PROGRAM_ID} from "@solana/spl-token";const result = await mintToChecked(connection, // Connection to the local validator.feePayer, // Account paying transaction fees.mintPubkey, // Mint for the token being minted.associatedTokenAccount, // Token account receiving the minted tokens.feePayer, // Authority allowed to mint new tokens.100, // Token amount in base units.2, // Decimals defined on the mint account.[], // Additional multisig signers.{commitment: "confirmed" // Confirmation options for the transaction.},TOKEN_PROGRAM_ID // Token program to invoke.);const mintAccount = await getMint(connection,mintPubkey,"confirmed",TOKEN_PROGRAM_ID);const tokenAccountData = await getAccount(connection,associatedTokenAccount,"confirmed",TOKEN_PROGRAM_ID);console.log("Mint Address:", mintPubkey.toBase58());console.log("Mint Account:", mintAccount);console.log("\nAssociated Token Account Address:",associatedTokenAccount.toBase58());console.log("Associated Token Account:", tokenAccountData);console.log("\nTransaction Signature:", result);
Console
Click to execute the code.
Rust
Rust
use anyhow::Result;use solana_client::nonblocking::rpc_client::RpcClient;use solana_commitment_config::CommitmentConfig;use solana_sdk::{program_pack::Pack,signature::{Keypair, Signer},transaction::Transaction,};use solana_system_interface::instruction::create_account;use spl_associated_token_account_interface::{address::get_associated_token_address,instruction::create_associated_token_account,};use spl_token_interface::{id as token_program_id,instruction::{initialize_mint, mint_to_checked},state::{Account, Mint},};#[tokio::main]async fn main() -> Result<()> {let client = RpcClient::new_with_commitment(String::from("http://localhost:8899"),CommitmentConfig::confirmed(),);let associated_token_address = get_associated_token_address(&fee_payer.pubkey(), &mint.pubkey());let mint_amount = 100;let transaction = Transaction::new_signed_with_payer(&[mint_to_checked(&token_program_id(), // Token program to invoke.&mint.pubkey(), // Mint for the token being minted.&associated_token_address, // Token account receiving the minted tokens.&fee_payer.pubkey(), // Authority allowed to mint new tokens.&[], // Additional multisig signers.mint_amount, // Token amount in base units.decimals, // Decimals defined on the mint account.)?,],Some(&fee_payer.pubkey()),&[&fee_payer],latest_blockhash,);let transaction_signature = client.send_and_confirm_transaction(&transaction).await?;let mint_account = client.get_account(&mint.pubkey()).await?;let mint_data = Mint::unpack(&mint_account.data)?;let token_account = client.get_account(&associated_token_address).await?;let token_data = Account::unpack(&token_account.data)?;println!("Mint Address: {}", mint.pubkey());println!("Mint Account: {:#?}", mint_data);println!("\nAssociated Token Account Address: {}",associated_token_address);println!("Associated Token Account: {:#?}", token_data);println!("\nTransaction Signature: {}", transaction_signature);Ok(())}
Console
Click to execute the code.
Python
Python
#!/usr/bin/env python3import asyncioimport jsonfrom solana.rpc.async_api import AsyncClientfrom solders.keypair import Keypairfrom solders.message import Messagefrom solders.pubkey import Pubkeyfrom solders.system_program import create_account, CreateAccountParamsfrom solders.transaction import Transactionfrom spl.token.async_client import AsyncTokenfrom spl.token.instructions import (create_associated_token_account,get_associated_token_address,initialize_mint,InitializeMintParams,mint_to_checked,MintToCheckedParams,)from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_IDDECIMALS = 2AMOUNT_TO_MINT = 100async def main():rpc = AsyncClient("http://localhost:8899")async with rpc:mint_tokens_instruction = mint_to_checked(MintToCheckedParams(program_id=TOKEN_PROGRAM_ID, # Token program to invoke.mint=mint.pubkey(), # Mint for the token being minted.dest=destination_token_account, # Token account receiving the minted tokens.mint_authority=fee_payer.pubkey(), # Authority allowed to mint new tokens.amount=AMOUNT_TO_MINT, # Token amount in base units.decimals=DECIMALS, # Decimals defined on the mint account.))latest_blockhash = await rpc.get_latest_blockhash()transaction = Transaction([fee_payer],Message([mint_tokens_instruction], fee_payer.pubkey()),latest_blockhash.value.blockhash,)result = await rpc.send_transaction(transaction)mint_info = await token.get_mint_info()destination_token_account_info = await token.get_account_info(destination_token_account)mint_account = {key: str(value) if isinstance(value, Pubkey) else valuefor key, value in mint_info._asdict().items()}token_account = {key: str(value) if isinstance(value, Pubkey) else valuefor key, value in destination_token_account_info._asdict().items()}print("Mint Address:", mint.pubkey())print("Mint Account:")print(json.dumps(mint_account, indent=2))print("\nToken Account Address:", destination_token_account)print("Token Account:")print(json.dumps(token_account, indent=2))print("\nTransaction Signature:", result.value)if __name__ == "__main__":asyncio.run(main())
Console
Click to execute the code.
Is this page helpful?