O Que a Cunhagem Faz?
Cunhar cria novas unidades de um token existente e aumenta o fornecimento total da cunhagem.
Apenas a autoridade de cunhagem pode cunhar novos tokens. A token account de destino já deve existir e deve pertencer à mesma cunhagem.
Como Cunhar Tokens
A cunhagem de tokens utiliza a instrução MintTo ou MintToChecked do
Token Program.
Os exemplos abaixo usam MintToChecked, que requer que o chamador forneça
os decimais da cunhagem para que a instrução possa verificar a precisão esperada
do token antes de cunhar.
A cunhagem nativa não suporta cunhagem.
Referência do Código-Fonte
| Item | Descrição | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | O estado da cunhagem armazena a autoridade de cunhagem e o fornecimento total de tokens. | Fonte | Fonte |
Account | O estado da token account armazena o saldo de destino atualizado pela cunhagem. | Fonte | Fonte |
MintTo | Uma instrução de cunhagem que cunha tokens para uma token account existente sem exigir que o chamador forneça os decimais da cunhagem. | Fonte | Fonte |
MintToChecked | Uma instrução de cunhagem que requer que o chamador forneça os decimais da cunhagem e verifica esse valor antes de cunhar tokens para uma token account existente. | Fonte | Fonte |
process_mint_to | Lógica compartilhada do processador para cunhar tokens. | Fonte | Fonte |
Typescript
Os exemplos Kit abaixo mostram a abordagem recomendada usando @solana/kit.
Exemplos legados usando @solana/web3.js estão incluídos para referência.
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?