/**
 * 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, getBytesDecoder, getBytesEncoder, getStructDecoder, getStructEncoder, transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, type TransactionSigner, type WritableAccount, type WritableSignerAccount } from '@solana/kit';
import { YVAULTS_PROGRAM_ADDRESS } from '../programs';
import { getAccountMetaFactory, type ResolvedAccount } from '../shared';

export const CLOSE_STRATEGY_DISCRIMINATOR = new Uint8Array([56, 247, 170, 246, 89, 221, 134, 200]);

export function getCloseStrategyDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode(CLOSE_STRATEGY_DISCRIMINATOR); }

export type CloseStrategyInstruction<TProgram extends string = typeof YVAULTS_PROGRAM_ADDRESS, TAccountAdminAuthority extends string | AccountMeta<string> = string, TAccountStrategy extends string | AccountMeta<string> = string, TAccountOldPositionOrBaseVaultAuthority extends string | AccountMeta<string> = string, TAccountOldPositionMintOrBaseVaultAuthority extends string | AccountMeta<string> = string, TAccountOldPositionTokenAccountOrBaseVaultAuthority extends string | AccountMeta<string> = string, TAccountOldTickArrayLowerOrBaseVaultAuthority extends string | AccountMeta<string> = string, TAccountOldTickArrayUpperOrBaseVaultAuthority extends string | AccountMeta<string> = string, TAccountPool extends string | AccountMeta<string> = string, TAccountTokenAVault extends string | AccountMeta<string> = string, TAccountTokenBVault extends string | AccountMeta<string> = string, TAccountUserTokenAAta extends string | AccountMeta<string> = string, TAccountUserTokenBAta extends string | AccountMeta<string> = string, TAccountTokenAMint extends string | AccountMeta<string> = string, TAccountTokenBMint extends string | AccountMeta<string> = string, TAccountReward0Vault extends string | AccountMeta<string> = string, TAccountReward1Vault extends string | AccountMeta<string> = string, TAccountReward2Vault extends string | AccountMeta<string> = string, TAccountKaminoReward0Vault extends string | AccountMeta<string> = string, TAccountKaminoReward1Vault extends string | AccountMeta<string> = string, TAccountKaminoReward2Vault extends string | AccountMeta<string> = string, TAccountUserReward0Ata extends string | AccountMeta<string> = string, TAccountUserReward1Ata extends string | AccountMeta<string> = string, TAccountUserReward2Ata extends string | AccountMeta<string> = string, TAccountUserKaminoReward0Ata extends string | AccountMeta<string> = string, TAccountUserKaminoReward1Ata extends string | AccountMeta<string> = string, TAccountUserKaminoReward2Ata extends string | AccountMeta<string> = string, TAccountBaseVaultAuthority extends string | AccountMeta<string> = string, TAccountPoolProgram extends string | AccountMeta<string> = string, TAccountTokenProgram extends string | AccountMeta<string> = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", TAccountTokenATokenProgram extends string | AccountMeta<string> = string, TAccountTokenBTokenProgram extends string | AccountMeta<string> = string, TAccountSystem extends string | AccountMeta<string> = string, TAccountEventAuthority extends string | AccountMeta<string> = string, TRemainingAccounts extends readonly AccountMeta<string>[] = []> =
Instruction<TProgram> & InstructionWithData<ReadonlyUint8Array> & InstructionWithAccounts<[TAccountAdminAuthority extends string ? WritableSignerAccount<TAccountAdminAuthority> & AccountSignerMeta<TAccountAdminAuthority> : TAccountAdminAuthority, TAccountStrategy extends string ? WritableAccount<TAccountStrategy> : TAccountStrategy, TAccountOldPositionOrBaseVaultAuthority extends string ? WritableAccount<TAccountOldPositionOrBaseVaultAuthority> : TAccountOldPositionOrBaseVaultAuthority, TAccountOldPositionMintOrBaseVaultAuthority extends string ? WritableAccount<TAccountOldPositionMintOrBaseVaultAuthority> : TAccountOldPositionMintOrBaseVaultAuthority, TAccountOldPositionTokenAccountOrBaseVaultAuthority extends string ? WritableAccount<TAccountOldPositionTokenAccountOrBaseVaultAuthority> : TAccountOldPositionTokenAccountOrBaseVaultAuthority, TAccountOldTickArrayLowerOrBaseVaultAuthority extends string ? WritableAccount<TAccountOldTickArrayLowerOrBaseVaultAuthority> : TAccountOldTickArrayLowerOrBaseVaultAuthority, TAccountOldTickArrayUpperOrBaseVaultAuthority extends string ? WritableAccount<TAccountOldTickArrayUpperOrBaseVaultAuthority> : TAccountOldTickArrayUpperOrBaseVaultAuthority, TAccountPool extends string ? ReadonlyAccount<TAccountPool> : TAccountPool, TAccountTokenAVault extends string ? WritableAccount<TAccountTokenAVault> : TAccountTokenAVault, TAccountTokenBVault extends string ? WritableAccount<TAccountTokenBVault> : TAccountTokenBVault, TAccountUserTokenAAta extends string ? WritableAccount<TAccountUserTokenAAta> : TAccountUserTokenAAta, TAccountUserTokenBAta extends string ? WritableAccount<TAccountUserTokenBAta> : TAccountUserTokenBAta, TAccountTokenAMint extends string ? WritableAccount<TAccountTokenAMint> : TAccountTokenAMint, TAccountTokenBMint extends string ? WritableAccount<TAccountTokenBMint> : TAccountTokenBMint, TAccountReward0Vault extends string ? WritableAccount<TAccountReward0Vault> : TAccountReward0Vault, TAccountReward1Vault extends string ? WritableAccount<TAccountReward1Vault> : TAccountReward1Vault, TAccountReward2Vault extends string ? WritableAccount<TAccountReward2Vault> : TAccountReward2Vault, TAccountKaminoReward0Vault extends string ? WritableAccount<TAccountKaminoReward0Vault> : TAccountKaminoReward0Vault, TAccountKaminoReward1Vault extends string ? WritableAccount<TAccountKaminoReward1Vault> : TAccountKaminoReward1Vault, TAccountKaminoReward2Vault extends string ? WritableAccount<TAccountKaminoReward2Vault> : TAccountKaminoReward2Vault, TAccountUserReward0Ata extends string ? WritableAccount<TAccountUserReward0Ata> : TAccountUserReward0Ata, TAccountUserReward1Ata extends string ? WritableAccount<TAccountUserReward1Ata> : TAccountUserReward1Ata, TAccountUserReward2Ata extends string ? WritableAccount<TAccountUserReward2Ata> : TAccountUserReward2Ata, TAccountUserKaminoReward0Ata extends string ? WritableAccount<TAccountUserKaminoReward0Ata> : TAccountUserKaminoReward0Ata, TAccountUserKaminoReward1Ata extends string ? WritableAccount<TAccountUserKaminoReward1Ata> : TAccountUserKaminoReward1Ata, TAccountUserKaminoReward2Ata extends string ? WritableAccount<TAccountUserKaminoReward2Ata> : TAccountUserKaminoReward2Ata, TAccountBaseVaultAuthority extends string ? WritableAccount<TAccountBaseVaultAuthority> : TAccountBaseVaultAuthority, TAccountPoolProgram extends string ? ReadonlyAccount<TAccountPoolProgram> : TAccountPoolProgram, TAccountTokenProgram extends string ? ReadonlyAccount<TAccountTokenProgram> : TAccountTokenProgram, TAccountTokenATokenProgram extends string ? ReadonlyAccount<TAccountTokenATokenProgram> : TAccountTokenATokenProgram, TAccountTokenBTokenProgram extends string ? ReadonlyAccount<TAccountTokenBTokenProgram> : TAccountTokenBTokenProgram, TAccountSystem extends string ? ReadonlyAccount<TAccountSystem> : TAccountSystem, TAccountEventAuthority extends string ? ReadonlyAccount<TAccountEventAuthority> : TAccountEventAuthority, ...TRemainingAccounts]>;

export type CloseStrategyInstructionData = { discriminator: ReadonlyUint8Array;  };

export type CloseStrategyInstructionDataArgs = {  };

export function getCloseStrategyInstructionDataEncoder(): FixedSizeEncoder<CloseStrategyInstructionDataArgs> {
    return transformEncoder(getStructEncoder([['discriminator', fixEncoderSize(getBytesEncoder(), 8)]]), (value) => ({ ...value, discriminator: CLOSE_STRATEGY_DISCRIMINATOR }));
}

export function getCloseStrategyInstructionDataDecoder(): FixedSizeDecoder<CloseStrategyInstructionData> {
    return getStructDecoder([['discriminator', fixDecoderSize(getBytesDecoder(), 8)]]);
}

export function getCloseStrategyInstructionDataCodec(): FixedSizeCodec<CloseStrategyInstructionDataArgs, CloseStrategyInstructionData> {
    return combineCodec(getCloseStrategyInstructionDataEncoder(), getCloseStrategyInstructionDataDecoder());
}

export type CloseStrategyInput<TAccountAdminAuthority extends string = string, TAccountStrategy extends string = string, TAccountOldPositionOrBaseVaultAuthority extends string = string, TAccountOldPositionMintOrBaseVaultAuthority extends string = string, TAccountOldPositionTokenAccountOrBaseVaultAuthority extends string = string, TAccountOldTickArrayLowerOrBaseVaultAuthority extends string = string, TAccountOldTickArrayUpperOrBaseVaultAuthority extends string = string, TAccountPool extends string = string, TAccountTokenAVault extends string = string, TAccountTokenBVault extends string = string, TAccountUserTokenAAta extends string = string, TAccountUserTokenBAta extends string = string, TAccountTokenAMint extends string = string, TAccountTokenBMint extends string = string, TAccountReward0Vault extends string = string, TAccountReward1Vault extends string = string, TAccountReward2Vault extends string = string, TAccountKaminoReward0Vault extends string = string, TAccountKaminoReward1Vault extends string = string, TAccountKaminoReward2Vault extends string = string, TAccountUserReward0Ata extends string = string, TAccountUserReward1Ata extends string = string, TAccountUserReward2Ata extends string = string, TAccountUserKaminoReward0Ata extends string = string, TAccountUserKaminoReward1Ata extends string = string, TAccountUserKaminoReward2Ata extends string = string, TAccountBaseVaultAuthority extends string = string, TAccountPoolProgram extends string = string, TAccountTokenProgram extends string = string, TAccountTokenATokenProgram extends string = string, TAccountTokenBTokenProgram extends string = string, TAccountSystem extends string = string, TAccountEventAuthority extends string = string> =  {
  adminAuthority: TransactionSigner<TAccountAdminAuthority>;
strategy: Address<TAccountStrategy>;
oldPositionOrBaseVaultAuthority: Address<TAccountOldPositionOrBaseVaultAuthority>;
oldPositionMintOrBaseVaultAuthority: Address<TAccountOldPositionMintOrBaseVaultAuthority>;
oldPositionTokenAccountOrBaseVaultAuthority: Address<TAccountOldPositionTokenAccountOrBaseVaultAuthority>;
oldTickArrayLowerOrBaseVaultAuthority: Address<TAccountOldTickArrayLowerOrBaseVaultAuthority>;
oldTickArrayUpperOrBaseVaultAuthority: Address<TAccountOldTickArrayUpperOrBaseVaultAuthority>;
pool: Address<TAccountPool>;
tokenAVault: Address<TAccountTokenAVault>;
tokenBVault: Address<TAccountTokenBVault>;
userTokenAAta: Address<TAccountUserTokenAAta>;
userTokenBAta: Address<TAccountUserTokenBAta>;
tokenAMint: Address<TAccountTokenAMint>;
tokenBMint: Address<TAccountTokenBMint>;
/** If rewards are uninitialized, pass this as strategy. */
reward0Vault: Address<TAccountReward0Vault>;
/** If rewards are uninitialized, pass this as strategy. */
reward1Vault: Address<TAccountReward1Vault>;
/** If rewards are uninitialized, pass this as strategy. */
reward2Vault: Address<TAccountReward2Vault>;
/** If rewards are uninitialized, pass this as strategy. */
kaminoReward0Vault: Address<TAccountKaminoReward0Vault>;
/** If rewards are uninitialized, pass this as strategy. */
kaminoReward1Vault: Address<TAccountKaminoReward1Vault>;
/** If rewards are uninitialized, pass this as strategy. */
kaminoReward2Vault: Address<TAccountKaminoReward2Vault>;
/** If rewards are uninitialized, pass this as strategy. */
userReward0Ata: Address<TAccountUserReward0Ata>;
/** If rewards are uninitialized, pass this as strategy. */
userReward1Ata: Address<TAccountUserReward1Ata>;
/** If rewards are uninitialized, pass this as strategy. */
userReward2Ata: Address<TAccountUserReward2Ata>;
/** If rewards are uninitialized, pass this as strategy. */
userKaminoReward0Ata: Address<TAccountUserKaminoReward0Ata>;
/** If rewards are uninitialized, pass this as strategy. */
userKaminoReward1Ata: Address<TAccountUserKaminoReward1Ata>;
/** If rewards are uninitialized, pass this as strategy. */
userKaminoReward2Ata: Address<TAccountUserKaminoReward2Ata>;
baseVaultAuthority: Address<TAccountBaseVaultAuthority>;
poolProgram: Address<TAccountPoolProgram>;
tokenProgram?: Address<TAccountTokenProgram>;
tokenATokenProgram: Address<TAccountTokenATokenProgram>;
tokenBTokenProgram: Address<TAccountTokenBTokenProgram>;
system: Address<TAccountSystem>;
eventAuthority?: Address<TAccountEventAuthority>;
}

export function getCloseStrategyInstruction<TAccountAdminAuthority extends string, TAccountStrategy extends string, TAccountOldPositionOrBaseVaultAuthority extends string, TAccountOldPositionMintOrBaseVaultAuthority extends string, TAccountOldPositionTokenAccountOrBaseVaultAuthority extends string, TAccountOldTickArrayLowerOrBaseVaultAuthority extends string, TAccountOldTickArrayUpperOrBaseVaultAuthority extends string, TAccountPool extends string, TAccountTokenAVault extends string, TAccountTokenBVault extends string, TAccountUserTokenAAta extends string, TAccountUserTokenBAta extends string, TAccountTokenAMint extends string, TAccountTokenBMint extends string, TAccountReward0Vault extends string, TAccountReward1Vault extends string, TAccountReward2Vault extends string, TAccountKaminoReward0Vault extends string, TAccountKaminoReward1Vault extends string, TAccountKaminoReward2Vault extends string, TAccountUserReward0Ata extends string, TAccountUserReward1Ata extends string, TAccountUserReward2Ata extends string, TAccountUserKaminoReward0Ata extends string, TAccountUserKaminoReward1Ata extends string, TAccountUserKaminoReward2Ata extends string, TAccountBaseVaultAuthority extends string, TAccountPoolProgram extends string, TAccountTokenProgram extends string, TAccountTokenATokenProgram extends string, TAccountTokenBTokenProgram extends string, TAccountSystem extends string, TAccountEventAuthority extends string, TProgramAddress extends Address = typeof YVAULTS_PROGRAM_ADDRESS>(input: CloseStrategyInput<TAccountAdminAuthority, TAccountStrategy, TAccountOldPositionOrBaseVaultAuthority, TAccountOldPositionMintOrBaseVaultAuthority, TAccountOldPositionTokenAccountOrBaseVaultAuthority, TAccountOldTickArrayLowerOrBaseVaultAuthority, TAccountOldTickArrayUpperOrBaseVaultAuthority, TAccountPool, TAccountTokenAVault, TAccountTokenBVault, TAccountUserTokenAAta, TAccountUserTokenBAta, TAccountTokenAMint, TAccountTokenBMint, TAccountReward0Vault, TAccountReward1Vault, TAccountReward2Vault, TAccountKaminoReward0Vault, TAccountKaminoReward1Vault, TAccountKaminoReward2Vault, TAccountUserReward0Ata, TAccountUserReward1Ata, TAccountUserReward2Ata, TAccountUserKaminoReward0Ata, TAccountUserKaminoReward1Ata, TAccountUserKaminoReward2Ata, TAccountBaseVaultAuthority, TAccountPoolProgram, TAccountTokenProgram, TAccountTokenATokenProgram, TAccountTokenBTokenProgram, TAccountSystem, TAccountEventAuthority>, config?: { programAddress?: TProgramAddress } ): CloseStrategyInstruction<TProgramAddress, TAccountAdminAuthority, TAccountStrategy, TAccountOldPositionOrBaseVaultAuthority, TAccountOldPositionMintOrBaseVaultAuthority, TAccountOldPositionTokenAccountOrBaseVaultAuthority, TAccountOldTickArrayLowerOrBaseVaultAuthority, TAccountOldTickArrayUpperOrBaseVaultAuthority, TAccountPool, TAccountTokenAVault, TAccountTokenBVault, TAccountUserTokenAAta, TAccountUserTokenBAta, TAccountTokenAMint, TAccountTokenBMint, TAccountReward0Vault, TAccountReward1Vault, TAccountReward2Vault, TAccountKaminoReward0Vault, TAccountKaminoReward1Vault, TAccountKaminoReward2Vault, TAccountUserReward0Ata, TAccountUserReward1Ata, TAccountUserReward2Ata, TAccountUserKaminoReward0Ata, TAccountUserKaminoReward1Ata, TAccountUserKaminoReward2Ata, TAccountBaseVaultAuthority, TAccountPoolProgram, TAccountTokenProgram, TAccountTokenATokenProgram, TAccountTokenBTokenProgram, TAccountSystem, TAccountEventAuthority> {
  // Program address.
const programAddress = config?.programAddress ?? YVAULTS_PROGRAM_ADDRESS;

 // Original accounts.
const originalAccounts = { adminAuthority: { value: input.adminAuthority ?? null, isWritable: true }, strategy: { value: input.strategy ?? null, isWritable: true }, oldPositionOrBaseVaultAuthority: { value: input.oldPositionOrBaseVaultAuthority ?? null, isWritable: true }, oldPositionMintOrBaseVaultAuthority: { value: input.oldPositionMintOrBaseVaultAuthority ?? null, isWritable: true }, oldPositionTokenAccountOrBaseVaultAuthority: { value: input.oldPositionTokenAccountOrBaseVaultAuthority ?? null, isWritable: true }, oldTickArrayLowerOrBaseVaultAuthority: { value: input.oldTickArrayLowerOrBaseVaultAuthority ?? null, isWritable: true }, oldTickArrayUpperOrBaseVaultAuthority: { value: input.oldTickArrayUpperOrBaseVaultAuthority ?? null, isWritable: true }, pool: { value: input.pool ?? null, isWritable: false }, tokenAVault: { value: input.tokenAVault ?? null, isWritable: true }, tokenBVault: { value: input.tokenBVault ?? null, isWritable: true }, userTokenAAta: { value: input.userTokenAAta ?? null, isWritable: true }, userTokenBAta: { value: input.userTokenBAta ?? null, isWritable: true }, tokenAMint: { value: input.tokenAMint ?? null, isWritable: true }, tokenBMint: { value: input.tokenBMint ?? null, isWritable: true }, reward0Vault: { value: input.reward0Vault ?? null, isWritable: true }, reward1Vault: { value: input.reward1Vault ?? null, isWritable: true }, reward2Vault: { value: input.reward2Vault ?? null, isWritable: true }, kaminoReward0Vault: { value: input.kaminoReward0Vault ?? null, isWritable: true }, kaminoReward1Vault: { value: input.kaminoReward1Vault ?? null, isWritable: true }, kaminoReward2Vault: { value: input.kaminoReward2Vault ?? null, isWritable: true }, userReward0Ata: { value: input.userReward0Ata ?? null, isWritable: true }, userReward1Ata: { value: input.userReward1Ata ?? null, isWritable: true }, userReward2Ata: { value: input.userReward2Ata ?? null, isWritable: true }, userKaminoReward0Ata: { value: input.userKaminoReward0Ata ?? null, isWritable: true }, userKaminoReward1Ata: { value: input.userKaminoReward1Ata ?? null, isWritable: true }, userKaminoReward2Ata: { value: input.userKaminoReward2Ata ?? null, isWritable: true }, baseVaultAuthority: { value: input.baseVaultAuthority ?? null, isWritable: true }, poolProgram: { value: input.poolProgram ?? null, isWritable: false }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, tokenATokenProgram: { value: input.tokenATokenProgram ?? null, isWritable: false }, tokenBTokenProgram: { value: input.tokenBTokenProgram ?? null, isWritable: false }, system: { value: input.system ?? null, isWritable: false }, eventAuthority: { value: input.eventAuthority ?? null, isWritable: false } }
const accounts = originalAccounts as Record<keyof typeof originalAccounts, ResolvedAccount>;


// Resolve default values.
if (!accounts.tokenProgram.value) {
accounts.tokenProgram.value = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>;
}

const getAccountMeta = getAccountMetaFactory(programAddress, 'programId');
return Object.freeze({ accounts: [getAccountMeta(accounts.adminAuthority), getAccountMeta(accounts.strategy), getAccountMeta(accounts.oldPositionOrBaseVaultAuthority), getAccountMeta(accounts.oldPositionMintOrBaseVaultAuthority), getAccountMeta(accounts.oldPositionTokenAccountOrBaseVaultAuthority), getAccountMeta(accounts.oldTickArrayLowerOrBaseVaultAuthority), getAccountMeta(accounts.oldTickArrayUpperOrBaseVaultAuthority), getAccountMeta(accounts.pool), getAccountMeta(accounts.tokenAVault), getAccountMeta(accounts.tokenBVault), getAccountMeta(accounts.userTokenAAta), getAccountMeta(accounts.userTokenBAta), getAccountMeta(accounts.tokenAMint), getAccountMeta(accounts.tokenBMint), getAccountMeta(accounts.reward0Vault), getAccountMeta(accounts.reward1Vault), getAccountMeta(accounts.reward2Vault), getAccountMeta(accounts.kaminoReward0Vault), getAccountMeta(accounts.kaminoReward1Vault), getAccountMeta(accounts.kaminoReward2Vault), getAccountMeta(accounts.userReward0Ata), getAccountMeta(accounts.userReward1Ata), getAccountMeta(accounts.userReward2Ata), getAccountMeta(accounts.userKaminoReward0Ata), getAccountMeta(accounts.userKaminoReward1Ata), getAccountMeta(accounts.userKaminoReward2Ata), getAccountMeta(accounts.baseVaultAuthority), getAccountMeta(accounts.poolProgram), getAccountMeta(accounts.tokenProgram), getAccountMeta(accounts.tokenATokenProgram), getAccountMeta(accounts.tokenBTokenProgram), getAccountMeta(accounts.system), getAccountMeta(accounts.eventAuthority)], data: getCloseStrategyInstructionDataEncoder().encode({}), programAddress } as CloseStrategyInstruction<TProgramAddress, TAccountAdminAuthority, TAccountStrategy, TAccountOldPositionOrBaseVaultAuthority, TAccountOldPositionMintOrBaseVaultAuthority, TAccountOldPositionTokenAccountOrBaseVaultAuthority, TAccountOldTickArrayLowerOrBaseVaultAuthority, TAccountOldTickArrayUpperOrBaseVaultAuthority, TAccountPool, TAccountTokenAVault, TAccountTokenBVault, TAccountUserTokenAAta, TAccountUserTokenBAta, TAccountTokenAMint, TAccountTokenBMint, TAccountReward0Vault, TAccountReward1Vault, TAccountReward2Vault, TAccountKaminoReward0Vault, TAccountKaminoReward1Vault, TAccountKaminoReward2Vault, TAccountUserReward0Ata, TAccountUserReward1Ata, TAccountUserReward2Ata, TAccountUserKaminoReward0Ata, TAccountUserKaminoReward1Ata, TAccountUserKaminoReward2Ata, TAccountBaseVaultAuthority, TAccountPoolProgram, TAccountTokenProgram, TAccountTokenATokenProgram, TAccountTokenBTokenProgram, TAccountSystem, TAccountEventAuthority>);
}

export type ParsedCloseStrategyInstruction<TProgram extends string = typeof YVAULTS_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[]> = { programAddress: Address<TProgram>;
accounts: {
adminAuthority: TAccountMetas[0];
strategy: TAccountMetas[1];
oldPositionOrBaseVaultAuthority: TAccountMetas[2];
oldPositionMintOrBaseVaultAuthority: TAccountMetas[3];
oldPositionTokenAccountOrBaseVaultAuthority: TAccountMetas[4];
oldTickArrayLowerOrBaseVaultAuthority: TAccountMetas[5];
oldTickArrayUpperOrBaseVaultAuthority: TAccountMetas[6];
pool: TAccountMetas[7];
tokenAVault: TAccountMetas[8];
tokenBVault: TAccountMetas[9];
userTokenAAta: TAccountMetas[10];
userTokenBAta: TAccountMetas[11];
tokenAMint: TAccountMetas[12];
tokenBMint: TAccountMetas[13];
/** If rewards are uninitialized, pass this as strategy. */
reward0Vault: TAccountMetas[14];
/** If rewards are uninitialized, pass this as strategy. */
reward1Vault: TAccountMetas[15];
/** If rewards are uninitialized, pass this as strategy. */
reward2Vault: TAccountMetas[16];
/** If rewards are uninitialized, pass this as strategy. */
kaminoReward0Vault: TAccountMetas[17];
/** If rewards are uninitialized, pass this as strategy. */
kaminoReward1Vault: TAccountMetas[18];
/** If rewards are uninitialized, pass this as strategy. */
kaminoReward2Vault: TAccountMetas[19];
/** If rewards are uninitialized, pass this as strategy. */
userReward0Ata: TAccountMetas[20];
/** If rewards are uninitialized, pass this as strategy. */
userReward1Ata: TAccountMetas[21];
/** If rewards are uninitialized, pass this as strategy. */
userReward2Ata: TAccountMetas[22];
/** If rewards are uninitialized, pass this as strategy. */
userKaminoReward0Ata: TAccountMetas[23];
/** If rewards are uninitialized, pass this as strategy. */
userKaminoReward1Ata: TAccountMetas[24];
/** If rewards are uninitialized, pass this as strategy. */
userKaminoReward2Ata: TAccountMetas[25];
baseVaultAuthority: TAccountMetas[26];
poolProgram: TAccountMetas[27];
tokenProgram: TAccountMetas[28];
tokenATokenProgram: TAccountMetas[29];
tokenBTokenProgram: TAccountMetas[30];
system: TAccountMetas[31];
eventAuthority?: TAccountMetas[32] | undefined;
};
data: CloseStrategyInstructionData; };

export function parseCloseStrategyInstruction<TProgram extends string, TAccountMetas extends readonly AccountMeta[]>(instruction: Instruction<TProgram> & InstructionWithAccounts<TAccountMetas> & InstructionWithData<ReadonlyUint8Array>): ParsedCloseStrategyInstruction<TProgram, TAccountMetas> {
  if (instruction.accounts.length < 33) {
  // TODO: Coded error.
  throw new Error('Not enough accounts');
}
let accountIndex = 0;
const getNextAccount = () => {
  const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!;
  accountIndex += 1;
  return accountMeta;
}
const getNextOptionalAccount = () => {
  const accountMeta = getNextAccount();
  return accountMeta.address === YVAULTS_PROGRAM_ADDRESS ? undefined : accountMeta;
};
  return { programAddress: instruction.programAddress, accounts: { adminAuthority: getNextAccount(), strategy: getNextAccount(), oldPositionOrBaseVaultAuthority: getNextAccount(), oldPositionMintOrBaseVaultAuthority: getNextAccount(), oldPositionTokenAccountOrBaseVaultAuthority: getNextAccount(), oldTickArrayLowerOrBaseVaultAuthority: getNextAccount(), oldTickArrayUpperOrBaseVaultAuthority: getNextAccount(), pool: getNextAccount(), tokenAVault: getNextAccount(), tokenBVault: getNextAccount(), userTokenAAta: getNextAccount(), userTokenBAta: getNextAccount(), tokenAMint: getNextAccount(), tokenBMint: getNextAccount(), reward0Vault: getNextAccount(), reward1Vault: getNextAccount(), reward2Vault: getNextAccount(), kaminoReward0Vault: getNextAccount(), kaminoReward1Vault: getNextAccount(), kaminoReward2Vault: getNextAccount(), userReward0Ata: getNextAccount(), userReward1Ata: getNextAccount(), userReward2Ata: getNextAccount(), userKaminoReward0Ata: getNextAccount(), userKaminoReward1Ata: getNextAccount(), userKaminoReward2Ata: getNextAccount(), baseVaultAuthority: getNextAccount(), poolProgram: getNextAccount(), tokenProgram: getNextAccount(), tokenATokenProgram: getNextAccount(), tokenBTokenProgram: getNextAccount(), system: getNextAccount(), eventAuthority: getNextOptionalAccount() }, data: getCloseStrategyInstructionDataDecoder().decode(instruction.data) };
}