
O Token Program
Na Solana, tudo relacionado a tokens é gerenciado pelo SPL Token Program e pelo Token2022 Program: o framework de tokens nativo da Solana que define como todos os tokens são criados, gerenciados e transferidos.
É um programa único e unificado que gerencia todas as operações de tokens na rede, garantindo consistência e interoperabilidade.
Para o Anchor, tudo relacionado a tokens pode ser encontrado no crate anchor-spl. Por esta razão, após ter inicializado um workspace do Anchor, podemos simplesmente fazer:
cargo add anchor-splContas Mint e Token
Se você está familiarizado com o Anchor, sabe que eles têm um conjunto de macros que ajudam o usuário a abstrair muita da complexidade relacionada à inicialização de contas.
O mesmo funciona aqui para contas Mint, Token e Associated Token.
Conta Mint
Graças às macros que o Anchor oferece, é assim que podemos criar facilmente uma conta 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>,
}Conta Token
O mesmo se aplica à conta Token. Criar uma conta Token através de macros ficaria assim:
#[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>,
}Conta Associated Token
O mesmo vale para a conta Associated Token. Criar uma conta Associated Token através de macros seria similar à criação de uma conta Token, a única diferença são as constraints e ficaria assim:
#[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>,
}