import { PublicKey } from "@solana/web3.js"; import { BASKETS_V3_PROGRAM_ID } from "../../constants"; import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { getAta, getRebalanceIntentPda } from "../pda"; import { TransactionInstruction } from "@solana/web3.js"; import { SystemProgram } from "@solana/web3.js"; const REDEEM_TOKENS_DISCRIMINATOR = Buffer.from([83, 49, 112, 2, 105, 193, 106, 126]); export function redeemTokensIx( params: { keeper: PublicKey; basket: PublicKey; owner: PublicKey; tokenMints: PublicKey[]; }, ): TransactionInstruction { const { keeper, basket, owner, } = params; let rebalanceIntent = getRebalanceIntentPda(basket, owner); const keys = [ { pubkey: keeper, isSigner: true, isWritable: true }, { pubkey: basket, isSigner: false, isWritable: true }, { pubkey: rebalanceIntent, isSigner: false, isWritable: true }, { pubkey: owner, isSigner: false, isWritable: true }, { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, ]; // remaining accounts params.tokenMints.forEach((mint) => { keys.push({ pubkey: mint, isWritable: false, isSigner: false }); keys.push({ pubkey: getAta(owner, mint), isWritable: true, isSigner: false }); keys.push({ pubkey: getAta(basket, mint), isWritable: true, isSigner: false }); }); const discriminator = REDEEM_TOKENS_DISCRIMINATOR; const data = discriminator; return new TransactionInstruction({ keys, programId: BASKETS_V3_PROGRAM_ID, data, }); }