/** * This code was AUTOGENERATED using the Codama library. * Please DO NOT EDIT THIS FILE, instead use visitors * to add features, then rerun Codama to update it. * * @see https://github.com/codama-idl/codama */ import { combineCodec, fixDecoderSize, fixEncoderSize, getAddressEncoder, getBooleanDecoder, getBooleanEncoder, getBytesDecoder, getBytesEncoder, getProgramDerivedAddress, getStructDecoder, getStructEncoder, getU64Decoder, getU64Encoder, SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, SolanaError, transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlySignerAccount, type ReadonlyUint8Array, type TransactionSigner, type WritableAccount, type WritableSignerAccount, } from "@solana/kit"; import { getAccountMetaFactory, getAddressFromResolvedInstructionAccount, type ResolvedInstructionAccount, } from "@solana/program-client-core"; import { findProtocolPda, findRequestWithdrawVaultReceiptPda, findVaultLpMintPda, } from "../pdas"; import { VOLTR_VAULT_PROGRAM_ADDRESS } from "../programs"; export const REQUEST_WITHDRAW_VAULT_DISCRIMINATOR = new Uint8Array([ 248, 225, 47, 22, 116, 144, 23, 143, ]); export function getRequestWithdrawVaultDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode( REQUEST_WITHDRAW_VAULT_DISCRIMINATOR, ); } export type RequestWithdrawVaultInstruction< TProgram extends string = typeof VOLTR_VAULT_PROGRAM_ADDRESS, TAccountPayer extends string | AccountMeta = string, TAccountUserTransferAuthority extends string | AccountMeta = string, TAccountProtocol extends string | AccountMeta = string, TAccountVault extends string | AccountMeta = string, TAccountVaultLpMint extends string | AccountMeta = string, TAccountUserLpAta extends string | AccountMeta = string, TAccountRequestWithdrawLpAta extends string | AccountMeta = string, TAccountRequestWithdrawVaultReceipt extends string | AccountMeta = string, TAccountLpTokenProgram extends string | AccountMeta = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountPayer extends string ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, TAccountUserTransferAuthority extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountUserTransferAuthority, TAccountProtocol extends string ? ReadonlyAccount : TAccountProtocol, TAccountVault extends string ? ReadonlyAccount : TAccountVault, TAccountVaultLpMint extends string ? ReadonlyAccount : TAccountVaultLpMint, TAccountUserLpAta extends string ? WritableAccount : TAccountUserLpAta, TAccountRequestWithdrawLpAta extends string ? WritableAccount : TAccountRequestWithdrawLpAta, TAccountRequestWithdrawVaultReceipt extends string ? WritableAccount : TAccountRequestWithdrawVaultReceipt, TAccountLpTokenProgram extends string ? ReadonlyAccount : TAccountLpTokenProgram, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, ] >; export type RequestWithdrawVaultInstructionData = { discriminator: ReadonlyUint8Array; amount: bigint; isAmountInLp: boolean; isWithdrawAll: boolean; }; export type RequestWithdrawVaultInstructionDataArgs = { amount: number | bigint; isAmountInLp: boolean; isWithdrawAll: boolean; }; export function getRequestWithdrawVaultInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([ ["discriminator", fixEncoderSize(getBytesEncoder(), 8)], ["amount", getU64Encoder()], ["isAmountInLp", getBooleanEncoder()], ["isWithdrawAll", getBooleanEncoder()], ]), (value) => ({ ...value, discriminator: REQUEST_WITHDRAW_VAULT_DISCRIMINATOR, }), ); } export function getRequestWithdrawVaultInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ["discriminator", fixDecoderSize(getBytesDecoder(), 8)], ["amount", getU64Decoder()], ["isAmountInLp", getBooleanDecoder()], ["isWithdrawAll", getBooleanDecoder()], ]); } export function getRequestWithdrawVaultInstructionDataCodec(): FixedSizeCodec< RequestWithdrawVaultInstructionDataArgs, RequestWithdrawVaultInstructionData > { return combineCodec( getRequestWithdrawVaultInstructionDataEncoder(), getRequestWithdrawVaultInstructionDataDecoder(), ); } export type RequestWithdrawVaultAsyncInput< TAccountPayer extends string = string, TAccountUserTransferAuthority extends string = string, TAccountProtocol extends string = string, TAccountVault extends string = string, TAccountVaultLpMint extends string = string, TAccountUserLpAta extends string = string, TAccountRequestWithdrawLpAta extends string = string, TAccountRequestWithdrawVaultReceipt extends string = string, TAccountLpTokenProgram extends string = string, TAccountSystemProgram extends string = string, > = { /** The payer of the request */ payer: TransactionSigner; /** The authority that owns the LP tokens and wants to redeem them */ userTransferAuthority: TransactionSigner; protocol?: Address; vault: Address; vaultLpMint?: Address; /** The user's LP token account from which LP tokens will be burned. */ userLpAta?: Address; /** The request's associated token account for LP. */ requestWithdrawLpAta?: Address; requestWithdrawVaultReceipt?: Address; lpTokenProgram?: Address; systemProgram?: Address; amount: RequestWithdrawVaultInstructionDataArgs["amount"]; isAmountInLp: RequestWithdrawVaultInstructionDataArgs["isAmountInLp"]; isWithdrawAll: RequestWithdrawVaultInstructionDataArgs["isWithdrawAll"]; }; export async function getRequestWithdrawVaultInstructionAsync< TAccountPayer extends string, TAccountUserTransferAuthority extends string, TAccountProtocol extends string, TAccountVault extends string, TAccountVaultLpMint extends string, TAccountUserLpAta extends string, TAccountRequestWithdrawLpAta extends string, TAccountRequestWithdrawVaultReceipt extends string, TAccountLpTokenProgram extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof VOLTR_VAULT_PROGRAM_ADDRESS, >( input: RequestWithdrawVaultAsyncInput< TAccountPayer, TAccountUserTransferAuthority, TAccountProtocol, TAccountVault, TAccountVaultLpMint, TAccountUserLpAta, TAccountRequestWithdrawLpAta, TAccountRequestWithdrawVaultReceipt, TAccountLpTokenProgram, TAccountSystemProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< RequestWithdrawVaultInstruction< TProgramAddress, TAccountPayer, TAccountUserTransferAuthority, TAccountProtocol, TAccountVault, TAccountVaultLpMint, TAccountUserLpAta, TAccountRequestWithdrawLpAta, TAccountRequestWithdrawVaultReceipt, TAccountLpTokenProgram, TAccountSystemProgram > > { // Program address. const programAddress = config?.programAddress ?? VOLTR_VAULT_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { payer: { value: input.payer ?? null, isWritable: true }, userTransferAuthority: { value: input.userTransferAuthority ?? null, isWritable: false, }, protocol: { value: input.protocol ?? null, isWritable: false }, vault: { value: input.vault ?? null, isWritable: false }, vaultLpMint: { value: input.vaultLpMint ?? null, isWritable: false }, userLpAta: { value: input.userLpAta ?? null, isWritable: true }, requestWithdrawLpAta: { value: input.requestWithdrawLpAta ?? null, isWritable: true, }, requestWithdrawVaultReceipt: { value: input.requestWithdrawVaultReceipt ?? null, isWritable: true, }, lpTokenProgram: { value: input.lpTokenProgram ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.protocol.value) { accounts.protocol.value = await findProtocolPda(); } if (!accounts.vaultLpMint.value) { accounts.vaultLpMint.value = await findVaultLpMintPda({ vault: getAddressFromResolvedInstructionAccount( "vault", accounts.vault.value, ), }); } if (!accounts.lpTokenProgram.value) { accounts.lpTokenProgram.value = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">; } if (!accounts.userLpAta.value) { accounts.userLpAta.value = await getProgramDerivedAddress({ programAddress: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, seeds: [ getAddressEncoder().encode( getAddressFromResolvedInstructionAccount( "userTransferAuthority", accounts.userTransferAuthority.value, ), ), getAddressEncoder().encode( getAddressFromResolvedInstructionAccount( "lpTokenProgram", accounts.lpTokenProgram.value, ), ), getAddressEncoder().encode( getAddressFromResolvedInstructionAccount( "vaultLpMint", accounts.vaultLpMint.value, ), ), ], }); } if (!accounts.requestWithdrawVaultReceipt.value) { accounts.requestWithdrawVaultReceipt.value = await findRequestWithdrawVaultReceiptPda({ vault: getAddressFromResolvedInstructionAccount( "vault", accounts.vault.value, ), userTransferAuthority: getAddressFromResolvedInstructionAccount( "userTransferAuthority", accounts.userTransferAuthority.value, ), }); } if (!accounts.requestWithdrawLpAta.value) { accounts.requestWithdrawLpAta.value = await getProgramDerivedAddress({ programAddress: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" as Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">, seeds: [ getAddressEncoder().encode( getAddressFromResolvedInstructionAccount( "requestWithdrawVaultReceipt", accounts.requestWithdrawVaultReceipt.value, ), ), getAddressEncoder().encode( getAddressFromResolvedInstructionAccount( "lpTokenProgram", accounts.lpTokenProgram.value, ), ), getAddressEncoder().encode( getAddressFromResolvedInstructionAccount( "vaultLpMint", accounts.vaultLpMint.value, ), ), ], }); } if (!accounts.systemProgram.value) { accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("payer", accounts.payer), getAccountMeta("userTransferAuthority", accounts.userTransferAuthority), getAccountMeta("protocol", accounts.protocol), getAccountMeta("vault", accounts.vault), getAccountMeta("vaultLpMint", accounts.vaultLpMint), getAccountMeta("userLpAta", accounts.userLpAta), getAccountMeta("requestWithdrawLpAta", accounts.requestWithdrawLpAta), getAccountMeta( "requestWithdrawVaultReceipt", accounts.requestWithdrawVaultReceipt, ), getAccountMeta("lpTokenProgram", accounts.lpTokenProgram), getAccountMeta("systemProgram", accounts.systemProgram), ], data: getRequestWithdrawVaultInstructionDataEncoder().encode( args as RequestWithdrawVaultInstructionDataArgs, ), programAddress, } as RequestWithdrawVaultInstruction< TProgramAddress, TAccountPayer, TAccountUserTransferAuthority, TAccountProtocol, TAccountVault, TAccountVaultLpMint, TAccountUserLpAta, TAccountRequestWithdrawLpAta, TAccountRequestWithdrawVaultReceipt, TAccountLpTokenProgram, TAccountSystemProgram >); } export type RequestWithdrawVaultInput< TAccountPayer extends string = string, TAccountUserTransferAuthority extends string = string, TAccountProtocol extends string = string, TAccountVault extends string = string, TAccountVaultLpMint extends string = string, TAccountUserLpAta extends string = string, TAccountRequestWithdrawLpAta extends string = string, TAccountRequestWithdrawVaultReceipt extends string = string, TAccountLpTokenProgram extends string = string, TAccountSystemProgram extends string = string, > = { /** The payer of the request */ payer: TransactionSigner; /** The authority that owns the LP tokens and wants to redeem them */ userTransferAuthority: TransactionSigner; protocol: Address; vault: Address; vaultLpMint: Address; /** The user's LP token account from which LP tokens will be burned. */ userLpAta: Address; /** The request's associated token account for LP. */ requestWithdrawLpAta: Address; requestWithdrawVaultReceipt: Address; lpTokenProgram?: Address; systemProgram?: Address; amount: RequestWithdrawVaultInstructionDataArgs["amount"]; isAmountInLp: RequestWithdrawVaultInstructionDataArgs["isAmountInLp"]; isWithdrawAll: RequestWithdrawVaultInstructionDataArgs["isWithdrawAll"]; }; export function getRequestWithdrawVaultInstruction< TAccountPayer extends string, TAccountUserTransferAuthority extends string, TAccountProtocol extends string, TAccountVault extends string, TAccountVaultLpMint extends string, TAccountUserLpAta extends string, TAccountRequestWithdrawLpAta extends string, TAccountRequestWithdrawVaultReceipt extends string, TAccountLpTokenProgram extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof VOLTR_VAULT_PROGRAM_ADDRESS, >( input: RequestWithdrawVaultInput< TAccountPayer, TAccountUserTransferAuthority, TAccountProtocol, TAccountVault, TAccountVaultLpMint, TAccountUserLpAta, TAccountRequestWithdrawLpAta, TAccountRequestWithdrawVaultReceipt, TAccountLpTokenProgram, TAccountSystemProgram >, config?: { programAddress?: TProgramAddress }, ): RequestWithdrawVaultInstruction< TProgramAddress, TAccountPayer, TAccountUserTransferAuthority, TAccountProtocol, TAccountVault, TAccountVaultLpMint, TAccountUserLpAta, TAccountRequestWithdrawLpAta, TAccountRequestWithdrawVaultReceipt, TAccountLpTokenProgram, TAccountSystemProgram > { // Program address. const programAddress = config?.programAddress ?? VOLTR_VAULT_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { payer: { value: input.payer ?? null, isWritable: true }, userTransferAuthority: { value: input.userTransferAuthority ?? null, isWritable: false, }, protocol: { value: input.protocol ?? null, isWritable: false }, vault: { value: input.vault ?? null, isWritable: false }, vaultLpMint: { value: input.vaultLpMint ?? null, isWritable: false }, userLpAta: { value: input.userLpAta ?? null, isWritable: true }, requestWithdrawLpAta: { value: input.requestWithdrawLpAta ?? null, isWritable: true, }, requestWithdrawVaultReceipt: { value: input.requestWithdrawVaultReceipt ?? null, isWritable: true, }, lpTokenProgram: { value: input.lpTokenProgram ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.lpTokenProgram.value) { accounts.lpTokenProgram.value = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">; } if (!accounts.systemProgram.value) { accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("payer", accounts.payer), getAccountMeta("userTransferAuthority", accounts.userTransferAuthority), getAccountMeta("protocol", accounts.protocol), getAccountMeta("vault", accounts.vault), getAccountMeta("vaultLpMint", accounts.vaultLpMint), getAccountMeta("userLpAta", accounts.userLpAta), getAccountMeta("requestWithdrawLpAta", accounts.requestWithdrawLpAta), getAccountMeta( "requestWithdrawVaultReceipt", accounts.requestWithdrawVaultReceipt, ), getAccountMeta("lpTokenProgram", accounts.lpTokenProgram), getAccountMeta("systemProgram", accounts.systemProgram), ], data: getRequestWithdrawVaultInstructionDataEncoder().encode( args as RequestWithdrawVaultInstructionDataArgs, ), programAddress, } as RequestWithdrawVaultInstruction< TProgramAddress, TAccountPayer, TAccountUserTransferAuthority, TAccountProtocol, TAccountVault, TAccountVaultLpMint, TAccountUserLpAta, TAccountRequestWithdrawLpAta, TAccountRequestWithdrawVaultReceipt, TAccountLpTokenProgram, TAccountSystemProgram >); } export type ParsedRequestWithdrawVaultInstruction< TProgram extends string = typeof VOLTR_VAULT_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { /** The payer of the request */ payer: TAccountMetas[0]; /** The authority that owns the LP tokens and wants to redeem them */ userTransferAuthority: TAccountMetas[1]; protocol: TAccountMetas[2]; vault: TAccountMetas[3]; vaultLpMint: TAccountMetas[4]; /** The user's LP token account from which LP tokens will be burned. */ userLpAta: TAccountMetas[5]; /** The request's associated token account for LP. */ requestWithdrawLpAta: TAccountMetas[6]; requestWithdrawVaultReceipt: TAccountMetas[7]; lpTokenProgram: TAccountMetas[8]; systemProgram: TAccountMetas[9]; }; data: RequestWithdrawVaultInstructionData; }; export function parseRequestWithdrawVaultInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedRequestWithdrawVaultInstruction { if (instruction.accounts.length < 10) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 10, }, ); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { payer: getNextAccount(), userTransferAuthority: getNextAccount(), protocol: getNextAccount(), vault: getNextAccount(), vaultLpMint: getNextAccount(), userLpAta: getNextAccount(), requestWithdrawLpAta: getNextAccount(), requestWithdrawVaultReceipt: getNextAccount(), lpTokenProgram: getNextAccount(), systemProgram: getNextAccount(), }, data: getRequestWithdrawVaultInstructionDataDecoder().decode( instruction.data, ), }; }