Створення монетного двору токена

Що таке mint account

Mint account визначає та унікально ідентифікує токен у Solana, а також зберігає спільний стан, який застосовується до всіх token account для цього монетного двору.

Token Program визначає тип облікового запису Mint як:

Mint Account Type
/// 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 initialized
pub 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

Створення монетного двору вимагає двох інструкцій:

  1. Інструкція CreateAccount System Program створює новий обліковий запис, звільнений від rent, і призначає Token Program як власника програми нового облікового запису.
  2. Інструкція InitializeMint або InitializeMint2 Token Program ініціалізує новий обліковий запис як монетний двір.

Включіть інструкцію CreateAccount та інструкцію ініціалізації монетного двору в одній транзакції.

Під час ініціалізації монетного двору Token Program перевіряє, що mint account ще не ініціалізований і звільнений від rent. Потім Token Program записує повноваження карбування, повноваження заморожування, десяткові знаки та прапор is_initialized у дані mint account.

Посилання на джерело

ЕлементОписToken ProgramToken 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);
Console
Click to execute the code.

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);
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_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(())
}
Console
Click to execute the code.

Python

Python
#!/usr/bin/env python3
import asyncio
import json
from solana.rpc.async_api import AsyncClient
from solders.keypair import Keypair
from solders.message import Message
from solders.system_program import create_account, CreateAccountParams
from solders.transaction import Transaction
from spl.token.async_client import AsyncToken
from spl.token.instructions import initialize_mint, InitializeMintParams
from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_ID
DECIMALS = 9
async 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())
Console
Click to execute the code.

Як додати метадані

Обліковий запис mint зберігає лише базову інформацію про токен (пропозицію, десяткові знаки, повноваження). Щоб додати до вашого токена зрозумілі для людини метадані, такі як назва, символ і зображення, у вас є два варіанти:

Is this page helpful?

Зміст

Редагувати сторінку

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку