Program Token2022
Program Token2022, juga dikenal sebagai Token Extensions, adalah superset dari fungsionalitas yang disediakan oleh Program Token.
Jika Anda ingin mempelajari lebih lanjut tentang fungsionalitas tambahan yang tersedia dan apa perbedaannya dengan program token Legacy, ikuti kursus ini
Untuk anchor, semua yang terkait dengan token dapat ditemukan di crate anchor-spl
. Karena alasan ini, setelah menginisialisasi workspace Anchor
kita bisa langsung melakukan:
cargo add anchor-spl
Jangan lupa untuk memperbarui fitur idl-build
yang dapat ditemukan di bagian [features]
dari file Cargo.toml
program kita dengan idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"]
Akun Mint dan Token
Jika Anda familiar dengan Anchor
, Anda akan tahu bahwa mereka memiliki serangkaian makro yang membantu pengguna mengabstraksikan banyak kompleksitas terkait inisialisasi akun.
Hal yang sama berlaku di sini untuk akun Mint
, Token
dan Associated Token
.
Akun Mint dengan Ekstensi
Karena akun Mint
dengan ekstensi memiliki ukuran yang berbeda dan dimiliki oleh program yang berbeda, Anchor
membuat jenis akun baru yang bekerja secara independen jika akun Mint
berasal dari Token Legacy atau dari program Token2022.
Untuk menggunakannya, kita hanya perlu mengimpor baik TokenInterface
dan Mint
dari anchor_spl::token_interface
seperti ini:
use anchor_spl::token_interface::{TokenInterface, Mint};
Setelah itu kita bisa langsung melakukan pub mint: InterfaceAccount<'info, Mint>,
dan menentukan bahwa kita ingin mint menggunakan akun token_program yang kita miliki dalam struct akun seperti ini: mint::token_program = token_program
dan selesai!
Sebelum membahas cara menambahkan ekstensi ke akun mint, berikut cara membuat mint dengan program Token2022:
#[derive(Accounts)]
pub struct CreateMint<'info> {
#[account(mut)]
pub signer: Signer<'info>,
#[account(
init,
payer = signer,
mint::decimals = 6,
mint::authority = signer.key(),
mint::token_program = token_program
)]
pub mint: InterfaceAccount<'info, Mint>,
pub system_program: Program<'info, System>,
pub token_program: Interface<'info, TokenInterface>,
}
Sekarang, untungnya, Anchor
mendukung kita, dan membuat beberapa makro untuk menambahkan ekstensi yang paling populer langsung dalam langkah inisialisasi seperti ini:
#[account(
// ...init
extensions::metadata_pointer::authority = <target_account>,
extensions::metadata_pointer::metadata_address = <target_account>,
extensions::group_pointer::authority = <target_account>,
extensions::group_pointer::group_address = <target_account>,
extensions::group_member_pointer::authority = <target_account>,
extensions::group_member_pointer::member_address = <target_account>,
extensions::transfer_hook::authority = <target_account>,
extensions::transfer_hook::program_id = <target_pubkey>
extensions::close_authority::authority = <target_account>,
extensions::permanent_delegate::delegate = <target_account>,
)]
pub mint: InterfaceAccount<'info, Mint>,
Associated Token Account dengan Ekstensi
Akun Associated Token
dilengkapi dengan ekstensi ImmutableOwner
secara default. Jadi satu-satunya perbedaan antara pembuatan Token Account
Legacy atau Token2022 hanyalah penggunaan Interface Account
.
Berikut cara membuat associated token account:
#[derive(Accounts)]
pub struct CreateAssociatedToken<'info> {
#[account(mut)]
pub signer: Signer<'info>,
pub mint: InterfaceAccount<'info, Mint>,
#[account(
mut,
associated_token::mint = mint,
associated_token::authority = signer,
associated_token::token_program = token_program,
)]
pub associated_token: InterfaceAccount<'info, TokenAccount>,
pub system_program: Program<'info, System>,
pub token_program: Interface<'info, TokenInterface>,
}
Token Account dengan Ekstensi
Akun Token
tidak dilengkapi dengan ekstensi apa pun secara default dan tidak memiliki makro yang membantu kita. Jadi dengan menggunakan makro kita hanya dapat membuat akun Token
Token2022 normal.
Berikut cara membuat token account:
#[derive(Accounts)]
pub struct CreateToken<'info> {
#[account(mut)]
pub signer: Signer<'info>,
pub mint: InterfaceAccount<'info, Mint>,
#[account(
mut,
token::mint = mint,
token::authority = signer,
token::token_program = token_program,
)]
pub token: InterfaceAccount<'info, TokenAccount>,
pub system_program: Program<'info, System>,
pub token_program: Interface<'info, TokenInterface>,
}