토큰 발행

민팅이란 무엇인가요?

민팅은 기존 토큰의 새로운 단위를 생성하고 민트의 총 공급량을 증가시킵니다.

민트 권한만이 새로운 토큰을 발행할 수 있습니다. 대상 토큰 계정은 이미 존재해야 하며 동일한 민트에 속해 있어야 합니다.

토큰 민팅 방법

토큰 민팅은 Token Program의 MintTo 또는 MintToChecked 명령어를 사용합니다.

아래 예제는 MintToChecked 를 사용하며, 이는 호출자가 민트의 소수점 자릿수를 제공하도록 요구하여 명령어가 민팅 전에 예상되는 토큰 정밀도를 검증할 수 있도록 합니다.

네이티브 민트는 민팅을 지원하지 않습니다.

소스 참조

항목설명Token ProgramToken Extension Program
Mint민트 상태는 민트 권한과 총 토큰 공급량을 저장합니다.소스소스
Account토큰 계정 상태는 민팅에 의해 업데이트되는 대상 잔액을 저장합니다.소스소스
MintTo호출자가 민트의 소수점 자릿수를 제공할 필요 없이 기존 토큰 계정에 토큰을 발행하는 민트 명령어입니다.소스소스
MintToChecked호출자가 민트의 소수점 자릿수를 제공하도록 요구하고 기존 토큰 계정에 토큰을 발행하기 전에 해당 값을 확인하는 민트 명령어입니다.소스소스
process_mint_to토큰 민팅을 위한 공유 프로세서 로직입니다.소스소스

Typescript

아래 Kit 예제는 @solana/kit를 사용하는 권장 방법을 보여줍니다. @solana/web3.js를 사용하는 레거시 예제는 참고용으로 포함되어 있습니다.

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 python3
import asyncio
import json
from solana.rpc.async_api import AsyncClient
from solders.keypair import Keypair
from solders.message import Message
from solders.pubkey import Pubkey
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 (
create_associated_token_account,
get_associated_token_address,
initialize_mint,
InitializeMintParams,
mint_to_checked,
MintToCheckedParams,
)
from spl.token.constants import MINT_LEN, TOKEN_PROGRAM_ID
DECIMALS = 2
AMOUNT_TO_MINT = 100
async 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 value
for key, value in mint_info._asdict().items()
}
token_account = {
key: str(value) if isinstance(value, Pubkey) else value
for 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?

목차

페이지 편집

관리자

© 2026 솔라나 재단.
모든 권리 보유.
연결하기