Програма Token2022

Програма Token2022, також відома як Token Extensions (Розширення токенів), є надмножиною функціональності, яку надає програма Token.
Якщо ви хочете дізнатися більше про додаткові функції та відмінності від програми Legacy token, перейдіть до цього курсу
Почнімо з встановлення необхідного пакету для роботи з програмою SPL Token за допомогою Web3.js:
npm i @solana/spl-tokenMint та Token акаунти
Якщо ви знайомі зі створенням акаунтів Mint, акаунтів Associated Token або акаунтів Token за допомогою TypeScript, ви побачите, що Token2022 слідує дуже схожому шаблону.
Основна відмінність полягає в ініціалізації акаунтів, оскільки розширення потребують додаткового простору і повинні бути налаштовані до фіналізації mint.
Mint акаунт з розширеннями
При додаванні розширень до Mint, нам потрібно:
Розрахувати додатковий простір, необхідний для даних розширення
Ініціалізувати кожне розширення з його специфічною конфігурацією
Забезпечити правильний порядок інструкцій ініціалізації
Ось як створити mint з розширенням Transfer Fee:
import {
Keypair,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
} from '@solana/web3.js';
import {
createInitializeMintInstruction,
createInitializeTransferFeeConfigInstruction,
getMintLen,
ExtensionType,
TOKEN_2022_PROGRAM_ID,
} from '@solana/spl-token';
const mint = Keypair.generate();
// Calculate the size needed for a Mint account with Transfer Fee extension
const mintLen = getMintLen([ExtensionType.TransferFeeConfig]);
// 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 Transfer Fee extension
const initializeTransferFeeConfig = createInitializeTransferFeeConfigInstruction(
mint.publicKey,
keypair.publicKey,
keypair.publicKey,
500,
BigInt(1e6),
TOKEN_2022_PROGRAM_ID,
);
// Initialize the mint itself
const initializeMintInstruction = createInitializeMintInstruction(
mint.publicKey,
6,
keypair.publicKey,
null,
TOKEN_2022_PROGRAM_ID,
);
// Combine all instructions in the correct order
const transaction = new Transaction().add(
createAccountInstruction,
initializeTransferFeeConfig, // Extension must be initialized before mint
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`);Як бачите, це досить просто:
Згенеруйте пару ключів
Mintза допомогою функціїKeypair.generate().Розрахуйте довжину акаунта
Mintз конкретним розширенням за допомогою функціїgetMintLen()Розрахуйте мінімальну кількість лампортів за допомогою
connection.getMinimumBalanceForRentExemption(mintLen)Створіть акаунт з правильною довжиною, рентою та власником
Ініціалізуйте потрібне розширення на акаунті
Mintз відповідними функціональними можливостямиІніціалізуйте акаунт
Mint
Асоційований токен-рахунок з розширеннями
Рахунки Associated Token мають розширення ImmutableOwner за замовчуванням. Тому єдина різниця між створенням Legacy або Token2022 Token Account полягає лише в програмі-власнику.
Ось як створити рахунок Associated Token:
const ata = await getAssociatedTokenAddress(
mint.publicKey,
keypair.publicKey,
false,
TOKEN_2022_PROGRAM_ID
);
// Create ATA creation instructions for all accounts
const createAtaInstructions = createAssociatedTokenAccountIdempotentInstruction(
keypair.publicKey, // payer
ata, // associated token account address
keypair.publicKey, // owner
mint.publicKey, // mint
TOKEN_2022_PROGRAM_ID
)Токен-рахунок з розширеннями
Механізм створення рахунку Token з розширеннями подібний до того, що ми робили з рахунком Mint:
Розрахувати додатковий простір, необхідний для даних розширення
Ініціалізувати кожне розширення з його специфічною конфігурацією
Забезпечити правильний порядок інструкцій ініціалізації
Ось як створити рахунок Token з розширенням CpiGuard:
const tokenAccount = Keypair.generate();
// Size of Token Account with extensions
const accountLen = getAccountLen([ExtensionType.CpiGuard]);
// Minimum lamports required for Token Account
const lamports = await connection.getMinimumBalanceForRentExemption(accountLen);
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: keypair.publicKey,
newAccountPubkey: tokenAccount.publicKey,
space: accountLen,
lamports,
programId: TOKEN_2022_PROGRAM_ID,
});
const enableCpiGuardInstruction = createEnableCpiGuardInstruction(
tokenAccount.publicKey,
keypair.publicKey,
undefined,
TOKEN_2022_PROGRAM_ID,
);
const initializeAccountInstruction = createInitializeAccountInstruction(
tokenAccount.publicKey,
mint.publicKey,
keypair.publicKey,
TOKEN_2022_PROGRAM_ID,
);
const transaction = new Transaction().add(
createAccountInstruction,
initializeAccountInstruction,
enableCpiGuardInstruction,
);
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, tokenAccount], {commitment: "finalized"});
console.log(`Token accounts created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);