import {
Keypair,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
} from "@solana/web3.js";
import { createRpc } from "@lightprotocol/stateless.js";
import { LightTokenProgram } from "@lightprotocol/compressed-token";
import {
TOKEN_2022_PROGRAM_ID,
ExtensionType,
getMintLen,
createInitializeMint2Instruction,
createInitializeGroupPointerInstruction,
createInitializeGroupInstruction,
} from "@solana/spl-token";
const rpc = createRpc(RPC_ENDPOINT);
const groupMintKeypair = Keypair.generate();
const decimals = 0;
// Calculate space including GroupPointer and TokenGroup extensions
const mintLen = getMintLen([ExtensionType.GroupPointer, ExtensionType.TokenGroup]);
const rentExemptBalance = await rpc.getMinimumBalanceForRentExemption(mintLen);
// Create the mint account
const createMintAccountIx = SystemProgram.createAccount({
fromPubkey: payer.publicKey,
lamports: rentExemptBalance,
newAccountPubkey: groupMintKeypair.publicKey,
programId: TOKEN_2022_PROGRAM_ID,
space: mintLen,
});
// Initialize GroupPointer (points to the mint itself)
const initGroupPointerIx = createInitializeGroupPointerInstruction(
groupMintKeypair.publicKey,
payer.publicKey, // authority
groupMintKeypair.publicKey, // group address (self-referencing)
TOKEN_2022_PROGRAM_ID,
);
// Initialize the mint
const initMintIx = createInitializeMint2Instruction(
groupMintKeypair.publicKey,
decimals,
payer.publicKey, // mint authority
null, // freeze authority
TOKEN_2022_PROGRAM_ID,
);
// Initialize the TokenGroup data on the mint
const initGroupIx = createInitializeGroupInstruction({
group: groupMintKeypair.publicKey,
maxSize: 100,
mint: groupMintKeypair.publicKey,
mintAuthority: payer.publicKey,
programId: TOKEN_2022_PROGRAM_ID,
updateAuthority: payer.publicKey,
});
const tx = new Transaction().add(
createMintAccountIx,
initGroupPointerIx,
initMintIx,
initGroupIx,
);
const signature = await sendAndConfirmTransaction(rpc, tx, [
payer,
groupMintKeypair,
]);