Програма Token
У Solana все, що пов'язано з токенами, обробляється Програмою SPL Token та Програмою Token2022: нативним фреймворком токенів Solana, який визначає, як усі токени створюються, керуються та передаються.
Це єдина, уніфікована програма, яка обробляє всі операції з токенами в мережі, забезпечуючи узгодженість та взаємодію.
Для anchor все, що пов'язано з токенами, можна знайти в крейті anchor-spl
. З цієї причини, після ініціалізації робочого простору Anchor
ми можемо просто зробити:
cargo add anchor-spl
Рахунки Mint та Token
Якщо ви знайомі з Anchor
, то знаєте, що вони мають набір макросів, які допомагають користувачу абстрагуватися від багатьох складнощів, пов'язаних з ініціалізацією рахунків.
Те саме працює тут для рахунків Mint
, Token
та Associated Token
.
Рахунок Mint
Завдяки макросам, які пропонує Anchor
, ось як ми можемо легко створити рахунок 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
Те саме стосується рахунку Token
. Створення рахунків Token
через макроси виглядало б так:
#[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
. Створення рахунків Associated Token
через макроси виглядало б подібно до створення рахунку Token
, єдина відмінність полягає в обмеженнях, і це виглядало б так:
#[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>,
}