import {AccountMeta, PublicKey, SystemProgram} from "@solana/web3.js"; import {PROGRAM_ID as BUBBLEGUM_PROGRAM_ID} from "@metaplex-foundation/mpl-bubblegum/dist/src/generated"; import {PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID} from "@metaplex-foundation/mpl-token-metadata/dist/src/generated"; import * as bs58 from "bs58"; import {SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID} from "@solana/spl-account-compression"; export function decode(stuff: string) { return bufferToArray(bs58.decode(stuff)) } function bufferToArray(buffer: Buffer): number[] { const nums: number[] = []; for (let i = 0; i < buffer.length; i++) { nums.push(buffer[i]); } return nums; } export const mapProof = (assetProof: { proof: string[] }): AccountMeta[] => { if (!assetProof.proof || assetProof.proof.length === 0) { throw new Error("Proof is empty"); } return assetProof.proof.map((node) => ({ pubkey: new PublicKey(node), isSigner: false, isWritable: false, })); }; export function getAccounts(collectionMint: PublicKey, tree: PublicKey) { // treeAuth const [treeAuthority] = PublicKey.findProgramAddressSync( [tree.toBuffer()], BUBBLEGUM_PROGRAM_ID ); // derive a PDA (owned by Bubblegum) to act as the signer of the compressed minting const [bubblegumSigner] = PublicKey.findProgramAddressSync( // `collection_cpi` is a custom prefix required by the Bubblegum program [Buffer.from("collection_cpi", "utf8")], BUBBLEGUM_PROGRAM_ID ); // collection metadata account const [metadataAccount] = PublicKey.findProgramAddressSync( [Buffer.from("metadata", "utf8"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), collectionMint.toBuffer()], TOKEN_METADATA_PROGRAM_ID ); // collection master edition const [masterEditionAccount] = PublicKey.findProgramAddressSync( [ Buffer.from("metadata", "utf8"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), collectionMint.toBuffer(), Buffer.from("edition", "utf8"), ], TOKEN_METADATA_PROGRAM_ID ); return { treeAuthority, collectionMint, collectionMetadata: metadataAccount, editionAccount: masterEditionAccount, merkleTree: tree, bubblegumSigner, logWrapper: SPL_NOOP_PROGRAM_ID, compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, bubblegumProgram: BUBBLEGUM_PROGRAM_ID, systemProgram: SystemProgram.programId, }; }