Cosa Fa il Conio?
Il conio crea nuove unità di un token esistente e aumenta l'offerta totale del mint.
Solo l'autorità di conio può coniare nuovi token. Il token account di destinazione deve già esistere e deve appartenere allo stesso mint.
Come Coniare Token
Il conio di token utilizza l'istruzione MintTo o MintToChecked del
Token Program.
Gli esempi seguenti utilizzano MintToChecked, che richiede al chiamante di
fornire i decimali del mint affinché l'istruzione possa verificare la precisione
prevista del token prima di coniare.
Il native mint non supporta il conio.
Riferimento del Codice Sorgente
| Elemento | Descrizione | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | Lo stato del mint memorizza l'autorità di conio e l'offerta totale di token. | Source | Source |
Account | Lo stato del token account memorizza il saldo di destinazione aggiornato dal conio. | Source | Source |
MintTo | Un'istruzione di conio che conia token in un token account esistente senza richiedere al chiamante di fornire i decimali del mint. | Source | Source |
MintToChecked | Un'istruzione di conio che richiede al chiamante di fornire i decimali del mint e verifica quel valore prima di coniare token in un token account esistente. | Source | Source |
process_mint_to | Logica del processore condivisa per il conio di token. | Source | Source |
Typescript
Gli esempi Kit qui sotto mostrano l'approccio consigliato utilizzando
@solana/kit. Gli esempi legacy che utilizzano @solana/web3.js sono inclusi
per riferimento.
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?