トークンミントの作成
ミントはすべてのSPLトークンの基盤です。トークンのプロパティを定義し、新しいトークンをミントできるユーザーを制御します。
use litesvm::LiteSVM;use litesvm_token::{spl_token::native_mint::DECIMALS,CreateMint,};use solana_sdk::{native_token::LAMPORTS_PER_SOL,signature::{Keypair, Signer},};#[test]fn test_create_mint() {let mut svm = LiteSVM::new();// Create payer account and fund itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create a new SPL token mint with the payer as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&payer.pubkey()).decimals(DECIMALS).send().unwrap();}
token accountの作成
token accountは、特定のユーザーの特定のspl-tokenの残高を保持します。これとATAの違いを理解するには、 このセクションをご覧ください。
use litesvm::LiteSVM;use litesvm_token::{spl_token::native_mint::DECIMALS,CreateMint, CreateAccount,};use solana_sdk::{native_token::LAMPORTS_PER_SOL,signature::{Keypair, Signer},};#[test]fn test_create_mint() {let mut svm = LiteSVM::new();// Create payer account and fund itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create a new SPL token mint with the payer as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&payer.pubkey()).decimals(DECIMALS).send().unwrap();// Create a token account for the payer// You must have created a Mint Account to be able to create a Token Accountlet token_account = CreateAccount::new(&mut svm, &payer, &mint).owner(&payer.pubkey()).send().unwrap();}
associated token accountの作成
Associated Token Accounts(ATAs)は、特定のユーザーのトークンを保持するための決定論的なアドレスです。これとATAの違いを理解するには、 このセクションをご覧ください。
use litesvm::LiteSVM;use litesvm_token::{spl_token::native_mint::DECIMALS,CreateMint, CreateAssociatedTokenAccount,};use solana_sdk::{native_token::LAMPORTS_PER_SOL,signature::{Keypair, Signer},};#[test]fn test_create_mint() {let mut svm = LiteSVM::new();// Create payer account and fund itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create a new SPL token mint with the payer as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&payer.pubkey()).decimals(DECIMALS).send().unwrap();// Create an ATA for the payer// You must have created a Mint Account to be able to create a Token Accountlet associated_token_account = CreateAssociatedTokenAccount::new(&mut svm, &payer, &mint).owner(&payer.pubkey()).send().unwrap();}
token accountへのトークンのミント
ミントとtoken accountが用意できたら、それらのアカウントにトークンをミントできます。
use litesvm::LiteSVM;use litesvm_token::{get_spl_account,spl_token::{native_mint::DECIMALS, state::Account as TokenAccount},CreateAssociatedTokenAccount, CreateMint, MintTo,};use solana_sdk::{native_token::LAMPORTS_PER_SOL,signature::{Keypair, Signer},};#[test]fn test_mint_tokens() {let mut svm = LiteSVM::new();// Create payer account and fund itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create two userslet alice = Keypair::new();// Create a new SPL token mint with alice as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&alice.pubkey()).decimals(DECIMALS).send().unwrap();// Create associated token accounts (ATAs) for alice and boblet alice_token_account = CreateAssociatedTokenAccount::new(&mut svm, &payer, &mint).owner(&alice.pubkey()).send().unwrap();// Mint 1000 tokens to Alice's accountMintTo::new(&mut svm, &payer, &mint, &alice_token_account, 1000).owner(&alice).send().unwrap();// Verify balancelet alice_account: TokenAccount = get_spl_account(&svm, &alice_token_account).unwrap();let alice_balance = alice_account.amount;assert_eq!(alice_balance, 1000);}
トークン転送の実行
Transferのinstructionsを使用して、アカウント間でトークンを転送します。
use litesvm::LiteSVM;use litesvm_token::{get_spl_account,spl_token::{native_mint::DECIMALS, state::Account as TokenAccount},CreateAssociatedTokenAccount, CreateMint, MintTo, Transfer,};use solana_sdk::{native_token::LAMPORTS_PER_SOL,signature::{Keypair, Signer},};#[test]fn test_token_transfer() {let mut svm = LiteSVM::new();// Create payer account and fund itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create two userslet alice = Keypair::new();let bob = Keypair::new();// Create a new SPL token mint with alice as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&alice.pubkey()).decimals(DECIMALS).send().unwrap();// Create associated token accounts (ATAs) for alice and boblet alice_token_account = CreateAssociatedTokenAccount::new(&mut svm, &payer, &mint).owner(&alice.pubkey()).send().unwrap();let bob_token_account = CreateAssociatedTokenAccount::new(&mut svm, &payer, &mint).owner(&bob.pubkey()).send().unwrap();// Mint 1000 tokens to Alice's accountMintTo::new(&mut svm, &payer, &mint, &alice_token_account, 1000).owner(&alice).send().unwrap();// Transfer 400 tokens from Alice to BobTransfer::new(&mut svm, &payer, &mint, &bob_token_account, 400).source(&alice_token_account).owner(&alice).send().unwrap();// Verify balanceslet alice_account: TokenAccount = get_spl_account(&svm, &alice_token_account).unwrap();let bob_account: TokenAccount = get_spl_account(&svm, &bob_token_account).unwrap();let alice_balance = alice_account.amount;let bob_balance = bob_account.amount;assert_eq!(alice_balance, 600);assert_eq!(bob_balance, 400);println!("SPL token transfer successful!");}
小数点の扱い方
ほとんどのトークンは小数点を使用して端数の量を表します。正しく処理する方法は次のとおりです:
// For a token with 6 decimals (like USDC)let decimals = 6;let one_token = 10_u64.pow(decimals as u32);let amount_tokens = 100; // Want to send 100 tokenslet amount_raw = amount_tokens * one_token; // 100,000,000 raw units// For a token with 9 decimals (like SOL)let decimals = 9;let one_sol = 10_u64.pow(decimals as u32);let amount_sol = 1.5; // Want to send 1.5 SOLlet amount_lamports = (amount_sol * one_sol as f64) as u64; // 1,500,000,000 lamports
Is this page helpful?