Qu'est-ce qu'un Mint Account
Un mint account définit et identifie de manière unique un token sur Solana, et stocke l'état partagé qui s'applique à tous les token accounts associés à ce mint.
Le Token Program définit le type de compte Mint comme suit :
/// Mint data.#[repr(C)]#[derive(Clone, Copy, Debug, Default, PartialEq)]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 initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Chaque token possède un mint account, et l'adresse du mint constitue l'identifiant unique du token dans les portefeuilles, les applications et les explorateurs.
Par exemple, l'USD Coin (USDC) a l'adresse de mint
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. L'adresse du mint identifie de
manière unique l'USDC dans tout l'écosystème Solana. Vous pouvez consulter ce
mint sur
Solana Explorer.
Comment créer un Mint Account
La création d'un mint nécessite deux instructions :
- L'instruction
CreateAccountdu System Program crée un nouveau compte exempté de rent et assigne le Token Program comme propriétaire du programme du nouveau compte. - L'instruction
InitializeMintouInitializeMint2du Token Program initialise le nouveau compte en tant que mint.
Incluez l'instruction CreateAccount et l'instruction d'initialisation du
mint dans la même transaction.
Lors de l'initialisation du mint, le Token Program vérifie que le mint account
n'est pas déjà initialisé et qu'il est exempté de rent. Le Token Program écrit
ensuite l'autorité de frappe, l'autorité de gel, les décimales et le flag
is_initialized dans les données du mint account.
Référence source
| Élément | Description | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | L'état de base du mint stocké dans chaque mint account. | Source | Source |
InitializeMint | Une instruction d'initialisation de mint qui attend le compte sysvar de rent dans sa liste de comptes. | Source | Source |
InitializeMint2 | Une instruction d'initialisation de mint qui ne nécessite pas le compte sysvar de rent dans sa liste de comptes. | Source | Source |
_process_initialize_mint | Logique de traitement partagée pour l'initialisation du mint. | Source | Source |
process_initialize_mint | Gestionnaire public pour InitializeMint. | Source | Source |
process_initialize_mint2 | Gestionnaire public pour InitializeMint2. | Source | Source |
Typescript
Les exemples Kit ci-dessous montrent l'approche recommandée utilisant
@solana/kit. Les exemples hérités utilisant @solana/web3.js sont inclus à
titre de référence.
Kit
import { generateKeyPairSigner } from "@solana/kit";import { createLocalClient } from "@solana/kit-client-rpc";import { tokenProgram } from "@solana-program/token";const client = await createLocalClient().use(tokenProgram());const mint = await generateKeyPairSigner();const result = await client.token.instructions.createMint({newMint: mint, // New mint account to create.decimals: 9, // Decimals to define on the mint account.mintAuthority: client.payer.address, // Authority allowed to mint new tokens.freezeAuthority: client.payer.address // Authority allowed to freeze token accounts.}).sendTransaction();const mintAccount = await client.token.accounts.mint.fetch(mint.address);console.log("Mint Address:", mint.address);console.log("Mint Account:", mintAccount.data);console.log("\nTransaction Signature:", result.context.signature);
Web3.js
import { Connection, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js";import { createMint, getMint, TOKEN_PROGRAM_ID } from "@solana/spl-token";const mintPubkey = await createMint(connection,feePayer,feePayer.publicKey, // Authority allowed to mint new tokens.feePayer.publicKey, // Authority allowed to freeze token accounts.9, // Decimals to define on the mint account.Keypair.generate(), // New mint account to create.{commitment: "confirmed"},TOKEN_PROGRAM_ID);const mintAccount = await getMint(connection,mintPubkey,"confirmed",TOKEN_PROGRAM_ID);console.log("Mint Address:", mintPubkey.toBase58());console.log("Mint Account:", mintAccount);
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_token_interface::{id as token_program_id, instruction::initialize_mint, state::Mint};#[tokio::main]async fn main() -> Result<()> {let client = RpcClient::new_with_commitment(String::from("http://localhost:8899"),CommitmentConfig::confirmed(),);let latest_blockhash = client.get_latest_blockhash().await?;let transaction = Transaction::new_signed_with_payer(&[create_account(&fee_payer.pubkey(), // Account funding account creation.&mint.pubkey(), // New mint account to create.mint_rent, // Lamports funding the new account rent.Mint::LEN as u64, // Account size in bytes.&token_program_id(), // Program that owns the new account.),initialize_mint(&token_program_id(),&mint.pubkey(), // Mint account to initialize.&fee_payer.pubkey(), // Authority allowed to mint new tokens.Some(&fee_payer.pubkey()), // Authority allowed to freeze token accounts.9, // Decimals to define on the mint account.)?,],Some(&fee_payer.pubkey()),&[&fee_payer, &mint],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)?;println!("Mint Address: {}", mint.pubkey());println!("Mint Account: {:#?}", mint_data);println!("\nTransaction Signature: {}", transaction_signature);Ok(())}
Python
#!/usr/bin/env python3import asyncioimport jsonfrom solana.rpc.async_api import AsyncClientfrom solders.keypair import Keypairfrom solders.message import Messagefrom solders.system_program import create_account, CreateAccountParamsfrom solders.transaction import Transactionfrom spl.token.async_client import AsyncTokenfrom spl.token.instructions import initialize_mint, InitializeMintParamsfrom spl.token.constants import MINT_LEN, TOKEN_PROGRAM_IDDECIMALS = 9async def main():rpc = AsyncClient("http://localhost:8899")async with rpc:create_mint_instructions = [create_account(CreateAccountParams(from_pubkey=fee_payer.pubkey(), # Account funding account creation.to_pubkey=mint.pubkey(), # New mint account to create.lamports=mint_rent, # Lamports funding the new account rent.space=MINT_LEN, # Account size in bytes.owner=TOKEN_PROGRAM_ID, # Program that owns the new account.)),initialize_mint(InitializeMintParams(program_id=TOKEN_PROGRAM_ID, # Token program to invoke.mint=mint.pubkey(), # Mint account to initialize.decimals=DECIMALS, # Decimals to define on the mint account.mint_authority=fee_payer.pubkey(), # Authority allowed to mint new tokens.freeze_authority=fee_payer.pubkey(), # Authority allowed to freeze token accounts.)),]latest_blockhash = await rpc.get_latest_blockhash()transaction = Transaction([fee_payer, mint],Message(create_mint_instructions, fee_payer.pubkey()),latest_blockhash.value.blockhash,)result = await rpc.send_transaction(transaction)token = AsyncToken(rpc, mint.pubkey(), TOKEN_PROGRAM_ID, fee_payer)mint_info = await token.get_mint_info()mint_account = {"mint_authority": None if mint_info.mint_authority is None else str(mint_info.mint_authority),"supply": mint_info.supply,"decimals": mint_info.decimals,"is_initialized": mint_info.is_initialized,"freeze_authority": None if mint_info.freeze_authority is None else str(mint_info.freeze_authority),}print("Mint Address:", mint.pubkey())print("Mint Account:")print(json.dumps(mint_account, indent=2))print("\nTransaction Signature:", result.value)if __name__ == "__main__":asyncio.run(main())
Comment Ajouter des Métadonnées
Un mint account stocke uniquement les informations de base du jeton (offre, décimales, autorités). Pour ajouter des métadonnées lisibles par l'homme telles qu'un nom, un symbole et une image à votre jeton, vous avez deux options :
Métadonnées de Jeton Metaplex
Ajoutez des métadonnées en utilisant le Metaplex Token Metadata Program. Fonctionne avec le Token Program original et Token-2022.
Métadonnées des Extensions de Jeton
Utilisez l'extension de métadonnées intégrée avec Token-2022. L'extension de métadonnées est uniquement disponible pour les mint accounts créés avec Token-2022. Pour ajouter des métadonnées aux mint accounts créés avec le Token Program original, utilisez le Metaplex Token Metadata Program.
Is this page helpful?