Typescript
Token2022 di Web3.js

Token2022 di Web3.js

Ekstensi Status Akun Default

Ekstensi DefaultAccountState adalah ekstensi Mint yang memungkinkan semua akun Token yang baru dibuat untuk mint tertentu dibekukan secara default. Kemudian, Freeze Authority dari mint dapat mencairkan (unfreeze) akun Token ini sehingga dapat digunakan.

Initializing the Mint Account

Untuk menginisialisasi ekstensi DefaultAccountState pada akun Mint, kita akan membutuhkan fungsi initializeDefaultAccountState().

Berikut cara membuat mint dengan ekstensi Default Account State:

ts
import {
    Keypair,
    SystemProgram,
    Transaction,
    sendAndConfirmTransaction,
} from '@solana/web3.js';
import {
    createInitializeMintInstruction,
    createInitializeDefaultAccountStateInstruction,
    getMintLen,
    ExtensionType,
    TOKEN_2022_PROGRAM_ID,
} from '@solana/spl-token';
 
const mint = Keypair.generate();
 
// Calculate the size needed for a Mint account with Default Account State extension
const mintLen = getMintLen([ExtensionType.DefaultAccountState]);
 
// Calculate minimum lamports required for rent exemption
const lamports = await connection.getMinimumBalanceForRentExemption(mintLen);
 
// Create the account with the correct size and owner
const createAccountInstruction = SystemProgram.createAccount({
    fromPubkey: keypair.publicKey,
    newAccountPubkey: mint.publicKey,
    space: mintLen,
    lamports,
    programId: TOKEN_2022_PROGRAM_ID,
});
 
// Initialize the Default Account State extension
const initializeDefaultAccountState = createInitializeDefaultAccountStateInstruction(
    mint.publicKey,
    AccountState.Frozen,
    TOKEN_2022_PROGRAM_ID,
);
 
// Initialize the mint itself
const initializeMintInstruction = createInitializeMintInstruction(
    mint.publicKey,
    6,
    keypair.publicKey,
    keypair.publicKey, // freeze authority is MANDATORY
    TOKEN_2022_PROGRAM_ID,
);
 
// Combine all instructions in the correct order
const transaction = new Transaction().add(
    createAccountInstruction,
    initializeDefaultAccountState,
    initializeMintInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, mint]);
 
console.log(`Mint created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Ingat bahwa Freeze Authority pada Mint wajib ada untuk ekstensi ini atau kita tidak akan dapat mencairkan akun Token saat pembuatan.

Thawing the Token Account

Dengan adanya ekstensi DefaultAccountState, semua akun Token yang diinisialisasi akan frozen secara default.

Ini berarti tidak mungkin untuk melakukan Mint, Transfer atau hampir semua hal dengan akun Token tersebut jika kita tidak mencairkannya (unfreeze).

Kita dapat dengan mudah mencairkan akun Token menggunakan instruksi thawAccount seperti ini:

ts
const ata = await getAssociatedTokenAddress(
    mint.publicKey,
    keypair.publicKey,
    false,
    TOKEN_2022_PROGRAM_ID
);
 
const createAtaInstruction = createAssociatedTokenAccountIdempotentInstruction(
    keypair.publicKey, // payer
    ata, // associated token account address
    keypair.publicKey, // owner
    mint.publicKey, // mint
    TOKEN_2022_PROGRAM_ID
)
 
const thawAtaInstruction = createThawAccountInstruction(
    ata,
    mint.publicKey,
    keypair.publicKey,
    undefined,
    TOKEN_2022_PROGRAM_ID,
);
 
const transaction = new Transaction().add(
    createAtaInstruction,
    thawAtaInstruction,
);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair], {skipPreflight: true});
 
console.log(`Token accounts created and thawed! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);

Changing the Default Account State

Ketika kita tidak lagi membutuhkan kontrol yang lebih besar atas distribusi token dan ingin membiarkan semua orang bebas memperdagangkan token kita, kita dapat mengubah status akun default menggunakan instruksi updateDefaultAccountState seperti berikut:

ts
const updateDefaultAccountStateInstruction = createUpdateDefaultAccountStateInstruction(
    mint.publicKey,
    AccountState.Initialized,
    keypair.publicKey,
    undefined,
    TOKEN_2022_PROGRAM_ID,
);
 
const transaction = new Transaction().add(updateDefaultAccountStateInstruction);
 
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair]);
 
console.log(`Default account state changed! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);
Daftar Isi
Lihat Sumber
Blueshift © 2025Commit: 96f50c6