Token Program
Trên Solana, mọi thứ liên quan đến token đều được xử lý bởi SPL Token Program và Token2022 Program: framework token native của Solana định nghĩa cách tất cả token được tạo, quản lý và chuyển giao.
Đây là một chương trình duy nhất, thống nhất xử lý tất cả các thao tác token trên mạng, đảm bảo tính nhất quán và khả năng tương tác.
Đối với anchor, mọi thứ liên quan đến token có thể được tìm thấy trong crate anchor-spl
. Vì lý do này, sau khi đã khởi tạo workspace Anchor
, chúng ta chỉ cần làm:
cargo add anchor-spl
Mint và Token Account
Nếu bạn quen thuộc với Anchor
, bạn sẽ biết rằng họ có một tập hợp macro giúp người dùng trừu tượng hóa nhiều phức tạp liên quan đến việc khởi tạo account.
Điều tương tự cũng hoạt động ở đây cho các account Mint
, Token
và Associated Token
.
Mint Account
Nhờ vào các macro mà Anchor
cung cấp, đây là cách chúng ta có thể dễ dàng tạo một account Mint
:
#[derive(Accounts)]
pub struct CreateMint<'info> {
#[account(mut)]
pub signer: Signer<'info>,
#[account(
init,
payer = signer,
mint::decimals = 6,
mint::authority = signer.key(),
)]
pub mint: Account<'info, Mint>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
}
Token Account
Điều tương tự cũng áp dụng với account Token
. Tạo account Token
thông qua macro sẽ trông như thế này:
#[derive(Accounts)]
pub struct CreateToken<'info> {
#[account(mut)]
pub signer: Signer<'info>,
pub mint: Account<'info, Mint>,
#[account(
mut,
token::mint = mint,
token::authority = signer,
)]
pub token: Account<'info, TokenAccount>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
}
Associated Token Account
Điều tương tự cũng áp dụng cho account Associated Token
, tạo account Associated Token
thông qua macro sẽ trông tương tự như tạo account Token
, sự khác biệt duy nhất là các ràng buộc và nó sẽ trông như thế này:
#[derive(Accounts)]
pub struct CreateToken<'info> {
#[account(mut)]
pub signer: Signer<'info>,
pub mint: Account<'info, Mint>,
#[account(
mut,
associated_token::mint = mint,
associated_token::authority = signer,
)]
pub token: Account<'info, TokenAccount>,
pub system_program: Program<'info, System>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,
}