Ekstensi Memo Transfer
Ekstensi MemoTranfer
adalah ekstensi akun Token
yang mewajibkan semua transfer masuk ke akun token menyertakan memo, memfasilitasi pelacakan transaksi yang lebih baik dan identifikasi pengguna.
Menginisialisasi Akun Token
Untuk menginisialisasi ekstensi MemoTransfer
pada akun Token
kita akan membutuhkan fungsi enableRequiredMemoTransfers()
.
Berikut cara membuat token dengan Ekstensi Memo Transfer:
import {
Keypair,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
} from '@solana/web3.js';
import {
createInitializeAccountInstruction,
createEnableRequiredMemoTransfersInstruction,
getAccountLen,
ExtensionType,
TOKEN_2022_PROGRAM_ID,
} from '@solana/spl-token';
const tokenAccount = Keypair.generate();
// Calculate the size needed for a Token account with Memo Transfer extension
const accountLen = getAccountLen([ExtensionType.MemoTransfer]);
// Calculate minimum lamports required for rent exemption
const lamports = await connection.getMinimumBalanceForRentExemption(accountLen);
// Create the account with the correct size and owner
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: keypair.publicKey,
newAccountPubkey: tokenAccount.publicKey,
space: accountLen,
lamports,
programId: TOKEN_2022_PROGRAM_ID,
});
// Initialize the Memo Transfer extension
const enableMemoTransferInstruction = createEnableRequiredMemoTransfersInstruction(
destinationTokenAccount.publicKey,
destinationKeypair.publicKey,
undefined,
TOKEN_2022_PROGRAM_ID,
);
// Initialize the Token account itself
const initializeAccountInstruction = createInitializeAccountInstruction(
tokenAccount.publicKey,
mint.publicKey,
keypair.publicKey,
TOKEN_2022_PROGRAM_ID,
);
const transaction = new Transaction().add(
createAccountInstruction,
initializeAccountInstruction,
enableMemoTransferInstruction,
);
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, tokenAccount], {skipPreflight: false});
console.log(`Token accounts created! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);
Mentransfer Token dengan Memo
Untuk menggunakan program Memo di Solana, kita memiliki dua jalur yang layak.
Membangun instruksi memo "mentah" kita sendiri seperti ini:
const message = "Hello, Solana";
new TransactionInstruction({
keys: [{ pubkey: keypair.publicKey, isSigner: true, isWritable: true }],
data: Buffer.from(message, "utf-8"), // Memo message. In this case it is "Hello, Solana"
programId: new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"), // Memo program that validates keys and memo message
}),
Atau kita dapat menggunakan SDK program Memo setelah mengunduh paketnya seperti ini:
npm i @solana/spl-memo
Dalam contoh kita, kita akan menggunakan opsi kedua dan akan terlihat seperti ini:
const memoInstruction = createMemoInstruction(
"Hello, world!",
[keypair.publicKey],
);
const transferInstruction = createTransferCheckedInstruction(
tokenAccount,
mint.publicKey,
destinationTokenAccount.publicKey,
keypair.publicKey,
BigInt(100e6),
6,
undefined,
TOKEN_2022_PROGRAM_ID,
);
const transferTransaction = new Transaction().add(
memoInstruction,
transferInstruction,
);
const transferSignature = await sendAndConfirmTransaction(connection, transferTransaction, [keypair]);
console.log(`Tokens transferred with memo! Check out your TX here: https://explorer.solana.com/tx/${transferSignature}?cluster=devnet`);
Menonaktifkan dan Mengaktifkan Memo
Jika kita tidak ingin mewajibkan transfer disertai dengan memo, kita dapat melakukannya menggunakan fungsi disableRequiredMemoTransfer
dan akan terlihat seperti ini:
const disableRequiredMemoTransfersInstruction = createDisableRequiredMemoTransfersInstruction(
destinationTokenAccount,
destinationKeypair.publicKey,
undefined,
TOKEN_2022_PROGRAM_ID,
);
const transferInstruction = createTransferCheckedInstruction(
tokenAccount,
mint.publicKey,
destinationTokenAccount,
keypair.publicKey,
BigInt(100e6),
6,
undefined,
TOKEN_2022_PROGRAM_ID,
);
const transaction = new Transaction().add(
disableRequiredMemoTransfersInstruction,
transferInstruction,
);
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, destinationKeypair]);
console.log(`Tokens transferred and account state changed! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);
Dan jika kita ingin mengaktifkannya kembali, kita dapat menggunakan fungsi enableRequiredMemoTransfers()
seperti ini:
const enableRequiredMemoTransfersInstruction = createEnableRequiredMemoTransfersInstruction(
destinationTokenAccount,
destinationKeypair.publicKey,
undefined,
TOKEN_2022_PROGRAM_ID,
);
const transferInstruction = createTransferCheckedInstruction(
tokenAccount,
mint.publicKey,
destinationTokenAccount,
keypair.publicKey,
BigInt(100e6),
6,
undefined,
TOKEN_2022_PROGRAM_ID,
);
const transaction = new Transaction().add(
enableRequiredMemoTransfersInstruction,
transferInstruction,
);
const signature = await sendAndConfirmTransaction(connection, transaction, [keypair, destinationKeypair]);
console.log(`Tokens transferred and account state changed! Check out your TX here: https://explorer.solana.com/tx/${signature}?cluster=devnet`);