Що таке mint account
Mint account визначає та унікально ідентифікує токен у Solana, а також зберігає спільний стан, який застосовується до всіх token account для цього монетного двору.
Token Program визначає тип облікового запису Mint як:
/// 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>,}
Кожен токен має один mint account, і адреса монетного двору є унікальним ідентифікатором токена в гаманцях, додатках та оглядачах.
Наприклад, USD Coin (USDC) має адресу монетного двору
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v. Адреса монетного двору унікально
ідентифікує USDC у всій екосистемі Solana. Ви можете переглянути цей монетний
двір у
Solana Explorer.
Як створити mint account
Створення монетного двору вимагає двох інструкцій:
- Інструкція
CreateAccountSystem Program створює новий обліковий запис, звільнений від rent, і призначає Token Program як власника програми нового облікового запису. - Інструкція
InitializeMintабоInitializeMint2Token Program ініціалізує новий обліковий запис як монетний двір.
Включіть інструкцію CreateAccount та інструкцію ініціалізації монетного
двору в одній транзакції.
Під час ініціалізації монетного двору Token Program перевіряє, що mint account
ще не ініціалізований і звільнений від rent. Потім Token Program записує
повноваження карбування, повноваження заморожування, десяткові знаки та прапор
is_initialized у дані mint account.
Посилання на джерело
| Елемент | Опис | Token Program | Token Extensions Program |
|---|---|---|---|
Mint | Базовий стан монетного двору, що зберігається у кожному mint account. | Джерело | Джерело |
InitializeMint | Інструкція ініціалізації монетного двору, яка очікує обліковий запис sysvar rent у своєму списку облікових записів. | Джерело | Джерело |
InitializeMint2 | Інструкція ініціалізації монетного двору, яка не вимагає облікового запису sysvar rent у своєму списку облікових записів. | Джерело | Джерело |
_process_initialize_mint | Спільна логіка процесора для ініціалізації монетного двору. | Джерело | Джерело |
process_initialize_mint | Публічний обробник для InitializeMint. | Джерело | Джерело |
process_initialize_mint2 | Публічний обробник для InitializeMint2. | Джерело | Джерело |
Typescript
Наведені нижче приклади Kit демонструють рекомендований підхід з використанням
@solana/kit. Застарілі приклади з використанням @solana/web3.js включені для
довідки.
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())
Як додати метадані
Обліковий запис mint зберігає лише базову інформацію про токен (пропозицію, десяткові знаки, повноваження). Щоб додати до вашого токена зрозумілі для людини метадані, такі як назва, символ і зображення, у вас є два варіанти:
Metaplex Token Metadata
Додайте метадані за допомогою програми Metaplex Token Metadata Program. Працює як з оригінальною Token Program, так і з Token-2022.
Token Extensions Metadata
Використовуйте вбудоване розширення метаданих з Token-2022. Розширення метаданих доступне лише для облікових записів mint, створених за допомогою Token-2022. Щоб додати метадані до облікових записів mint, створених за допомогою оригінальної Token Program, використовуйте Metaplex Token Metadata Program.
Is this page helpful?