import BN from 'bn.js'; import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token'; import { PublicKey, SYSVAR_INSTRUCTIONS_PUBKEY, TransactionInstruction } from '@solana/web3.js'; import { BASKETS_V3_PROGRAM_ID } from '../../constants'; import { getAta, getGlobalConfigPda } from '../pda'; const FLASH_WITHDRAW_DISCRIMINATOR = Buffer.from([164, 84, 46, 132, 94, 220, 214, 156]); const FLASH_DEPOSIT_DISCRIMINATOR = Buffer.from([21, 4, 89, 84, 131, 84, 128, 21]); export function flashWithdrawIx(params: { keeper: PublicKey; basket: PublicKey; rebalanceIntent?: PublicKey; intent?: PublicKey; mintIn: PublicKey; mintOut: PublicKey; amountIn: BN; amountOut: BN; mode?: number; }): TransactionInstruction { const { keeper, basket, mintIn, mintOut, amountIn, amountOut, mode } = params; let keeperFromATA = getAta(keeper, mintIn); let keeperToATA = getAta(keeper, mintOut); let basketInATA = getAta(basket, mintIn); let basketOutATA = getAta(basket, mintOut); const keys = [ { pubkey: params.keeper, isWritable: true, isSigner: true }, { pubkey: params.basket, isWritable: true, isSigner: false }, { pubkey: params.rebalanceIntent ?? BASKETS_V3_PROGRAM_ID, isWritable: params.rebalanceIntent ? true : false, isSigner: false }, { pubkey: params.intent ?? BASKETS_V3_PROGRAM_ID, isWritable: params.intent ? true : false, isSigner: false }, { pubkey: params.mintIn, isWritable: false, isSigner: false }, { pubkey: params.mintOut, isWritable: false, isSigner: false }, { pubkey: keeperFromATA, isWritable: true, isSigner: false }, { pubkey: keeperToATA, isWritable: true, isSigner: false }, { pubkey: basketInATA, isWritable: true, isSigner: false }, { pubkey: basketOutATA, isWritable: true, isSigner: false }, { pubkey: getGlobalConfigPda(), isWritable: false, isSigner: false }, { pubkey: SYSVAR_INSTRUCTIONS_PUBKEY, isWritable: false, isSigner: false }, { pubkey: TOKEN_PROGRAM_ID, isWritable: false, isSigner: false }, { pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false, isSigner: false }, ]; const discriminator = FLASH_WITHDRAW_DISCRIMINATOR; const amountInBuffer = Buffer.from(amountIn.toArray("le", 8)); const amountOutBuffer = Buffer.from(amountOut.toArray("le", 8)); const modeBuffer = Buffer.from([mode ?? 0]); const data = Buffer.concat([discriminator, amountInBuffer, amountOutBuffer, modeBuffer]); return new TransactionInstruction({ keys, programId: BASKETS_V3_PROGRAM_ID, data, }); } export function flashDepositIx(params: { keeper: PublicKey; basket: PublicKey; rebalanceIntent?: PublicKey; intent?: PublicKey; mintIn: PublicKey; mintOut: PublicKey; }): TransactionInstruction { const { keeper, basket, mintIn, mintOut } = params; let keeperFromATA = getAta(keeper, mintIn); let keeperToATA = getAta(keeper, mintOut); let basketInATA = getAta(basket, mintIn); let basketOutATA = getAta(basket, mintOut); const keys = [ { pubkey: params.keeper, isWritable: true, isSigner: true }, { pubkey: params.basket, isWritable: true, isSigner: false }, { pubkey: params.rebalanceIntent ? params.rebalanceIntent : BASKETS_V3_PROGRAM_ID, isWritable: params.rebalanceIntent ? true : false, isSigner: false }, { pubkey: params.intent ? params.intent : BASKETS_V3_PROGRAM_ID, isWritable: params.intent ? true : false, isSigner: false }, { pubkey: params.mintIn, isWritable: false, isSigner: false }, { pubkey: params.mintOut, isWritable: false, isSigner: false }, { pubkey: keeperFromATA, isWritable: true, isSigner: false }, { pubkey: keeperToATA, isWritable: true, isSigner: false }, { pubkey: basketInATA, isWritable: true, isSigner: false }, { pubkey: basketOutATA, isWritable: true, isSigner: false }, { pubkey: getGlobalConfigPda(), isWritable: false, isSigner: false }, { pubkey: SYSVAR_INSTRUCTIONS_PUBKEY, isWritable: false, isSigner: false }, { pubkey: TOKEN_PROGRAM_ID, isWritable: false, isSigner: false }, { pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false, isSigner: false }, ]; const discriminator = FLASH_DEPOSIT_DISCRIMINATOR; const data = Buffer.concat([discriminator]); return new TransactionInstruction({ keys, programId: BASKETS_V3_PROGRAM_ID, data, }); }