Tạo Token Mint
Một mint là nền tảng của bất kỳ SPL token nào. Nó xác định các thuộc tính của token và kiểm soát ai có thể đúc token mới.
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();}
Tạo Token Account
Một token account lưu trữ số dư của một spl-token cụ thể cho một người dùng cụ thể. Để hiểu sự khác biệt giữa loại này và một ATA, hãy đọc phần này.
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();}
Tạo Associated Token Account
Associated Token Accounts (ATA) là các địa chỉ xác định trước để lưu trữ token cho một người dùng cụ thể. Để hiểu sự khác biệt giữa loại này và một ATA, hãy đọc phần này.
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();}
Đúc Token vào Token Account
Sau khi bạn có mint và các token account, bạn có thể đúc token vào các tài khoản đó.
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);}
Thực Hiện Chuyển Token
Chuyển token giữa các tài khoản bằng cách sử dụng lệnh Transfer.
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!");}
Làm Việc với Số Thập Phân
Hầu hết các token sử dụng số thập phân để biểu thị các lượng phân số. Đây là cách xử lý chúng một cách chính xác:
// 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?