import { PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY, TransactionInstruction, } from '@solana/web3.js' import { TOKEN_PROGRAM_ID } from '@solana/spl-token' const SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID: PublicKey = new PublicKey( 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL' ) export async function findAssociatedTokenAddress( walletAddress: PublicKey, tokenMintAddress: PublicKey ): Promise { return ( await PublicKey.findProgramAddress( [ walletAddress.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), tokenMintAddress.toBuffer(), ], SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID ) )[0] } export async function createAssociatedTokenAccount( fundingAddress: PublicKey, walletAddress: PublicKey, splTokenMintAddress: PublicKey ): Promise { const associatedTokenAddress = await findAssociatedTokenAddress( walletAddress, splTokenMintAddress ) const keys = [ { pubkey: fundingAddress, isSigner: true, isWritable: true, }, { pubkey: associatedTokenAddress, isSigner: false, isWritable: true, }, { pubkey: walletAddress, isSigner: false, isWritable: false, }, { pubkey: splTokenMintAddress, isSigner: false, isWritable: false, }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false, }, { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false, }, { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false, }, ] return new TransactionInstruction({ keys, programId: SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID, data: Buffer.from([]), }) }