¿Qué es una Cuenta Mint?
Una cuenta mint define e identifica de forma única un token en Solana, y almacena el estado compartido que se aplica a todas las cuentas de token para ese mint.
El Token Program define el tipo de cuenta Mint como:
/// 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>,}
Cada token tiene una cuenta mint, y la dirección del mint es el identificador único del token en billeteras, aplicaciones y exploradores.
Por ejemplo, USD Coin (USDC) tiene la dirección de mint
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. La dirección del mint identifica
de forma única al USDC en todo el ecosistema de Solana. Puedes ver este mint en
Solana Explorer.
Cómo Crear una Cuenta Mint
Crear un mint requiere dos instrucciones:
- La instrucción
CreateAccountdel System Program crea una nueva cuenta exenta de rent y asigna el Token Program como propietario del programa de la nueva cuenta. - La instrucción
InitializeMintoInitializeMint2del Token Program inicializa la nueva cuenta como un mint.
Incluye la instrucción CreateAccount y la instrucción de inicialización
del mint en la misma transacción.
Durante la inicialización del mint, el Token Program verifica que la cuenta mint
no esté ya inicializada y esté exenta de rent. El Token Program luego escribe la
autoridad del mint, la autoridad de congelación, los decimales y el indicador
is_initialized en los datos de la cuenta mint.
Referencia del Código Fuente
| Elemento | Descripción | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | El estado base del mint almacenado en cada cuenta mint. | Fuente | Fuente |
InitializeMint | Una instrucción de inicialización de mint que espera la cuenta sysvar de rent en su lista de cuentas. | Fuente | Fuente |
InitializeMint2 | Una instrucción de inicialización de mint que no requiere la cuenta sysvar de rent en su lista de cuentas. | Fuente | Fuente |
_process_initialize_mint | Lógica de procesador compartida para la inicialización del mint. | Fuente | Fuente |
process_initialize_mint | Controlador público para InitializeMint. | Fuente | Fuente |
process_initialize_mint2 | Controlador público para InitializeMint2. | Fuente | Fuente |
Typescript
Los ejemplos de Kit a continuación muestran el enfoque recomendado usando
@solana/kit. Se incluyen ejemplos heredados usando @solana/web3.js como
referencia.
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())
Cómo Añadir Metadatos
Una mint account solo almacena información básica del token (suministro, decimales, autoridades). Para añadir metadatos legibles para humanos como nombre, símbolo e imagen a tu token, tienes dos opciones:
Metaplex Token Metadata
Añade metadatos utilizando el Metaplex Token Metadata Program. Funciona tanto con el Token Program original como con Token-2022.
Token Extensions Metadata
Utiliza la extensión de metadatos integrada con Token-2022. La extensión de metadatos solo está disponible para mint accounts creadas con Token-2022. Para añadir metadatos a mint accounts creadas con el Token Program original, utiliza el Metaplex Token Metadata Program.
Is this page helpful?