/**
 * 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 { assertAccountExists, assertAccountsExist, combineCodec, decodeAccount, fetchEncodedAccount, fetchEncodedAccounts, fixDecoderSize, fixEncoderSize, getAddressDecoder, getAddressEncoder, getArrayDecoder, getArrayEncoder, getBytesDecoder, getBytesEncoder, getI32Decoder, getI32Encoder, getI64Decoder, getI64Encoder, getStructDecoder, getStructEncoder, getU16Decoder, getU16Encoder, getU64Decoder, getU64Encoder, getU8Decoder, getU8Encoder, transformEncoder, type Account, type Address, type EncodedAccount, type FetchAccountConfig, type FetchAccountsConfig, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, type MaybeAccount, type MaybeEncodedAccount, type ReadonlyUint8Array } from '@solana/kit';
import { getProtocolFeeDecoder, getProtocolFeeEncoder, getRewardInfoDecoder, getRewardInfoEncoder, getStaticParametersDecoder, getStaticParametersEncoder, getVariableParametersDecoder, getVariableParametersEncoder, type ProtocolFee, type ProtocolFeeArgs, type RewardInfo, type RewardInfoArgs, type StaticParameters, type StaticParametersArgs, type VariableParameters, type VariableParametersArgs } from '../types';

export const LB_PAIR_DISCRIMINATOR = new Uint8Array([33, 11, 49, 98, 181, 101, 177, 13]);

export function getLbPairDiscriminatorBytes() { return fixEncoderSize(getBytesEncoder(), 8).encode(LB_PAIR_DISCRIMINATOR); }

export type LbPair = { discriminator: ReadonlyUint8Array; parameters: StaticParameters; vParameters: VariableParameters; bumpSeed: ReadonlyUint8Array; 
/** Bin step signer seed */
binStepSeed: ReadonlyUint8Array; 
/** Type of the pair */
pairType: number; 
/** Active bin id */
activeId: number; 
/** Bin step. Represent the price increment / decrement. */
binStep: number; 
/** Status of the pair. Check PairStatus enum. */
status: number; requireBaseFactorSeed: number; baseFactorSeed: ReadonlyUint8Array; padding1: ReadonlyUint8Array; 
/** Token X mint */
tokenXMint: Address; 
/** Token Y mint */
tokenYMint: Address; 
/** LB token X vault */
reserveX: Address; 
/** LB token Y vault */
reserveY: Address; 
/** Uncollected protocol fee */
protocolFee: ProtocolFee; 
/** Protocol fee owner, */
feeOwner: Address; 
/** Farming reward information */
rewardInfos: Array<RewardInfo>; 
/** Oracle pubkey */
oracle: Address; 
/** Packed initialized bin array state */
binArrayBitmap: Array<bigint>; 
/** Last time the pool fee parameter was updated */
lastUpdatedAt: bigint; 
/** Whitelisted wallet */
whitelistedWallet: Address; 
/** Address allowed to swap when the current slot is greater than or equal to the pre-activation slot. The pre-activation slot is calculated as `activation_slot - pre_activation_slot_duration`. */
preActivationSwapAddress: Address; 
/** Base keypair. Only required for permission pair */
baseKey: Address; 
/** Slot to enable the pair. Only applicable for permission pair. */
activationSlot: bigint; 
/** Number of slot before activation slot. Used to calculate pre-activation slot for pre_activation_swap_address */
preActivationSlotDuration: bigint; 
/** _padding2 is reclaimed free space from swap_cap_deactivate_slot and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !! */
padding2: ReadonlyUint8Array; 
/** Liquidity lock duration for positions which created before activate. Only applicable for permission pair. */
lockDurationsInSlot: bigint; 
/** Pool creator */
creator: Address; 
/** Reserved space for future use */
reserved: ReadonlyUint8Array;  };

export type LbPairArgs = { parameters: StaticParametersArgs; vParameters: VariableParametersArgs; bumpSeed: ReadonlyUint8Array; 
/** Bin step signer seed */
binStepSeed: ReadonlyUint8Array; 
/** Type of the pair */
pairType: number; 
/** Active bin id */
activeId: number; 
/** Bin step. Represent the price increment / decrement. */
binStep: number; 
/** Status of the pair. Check PairStatus enum. */
status: number; requireBaseFactorSeed: number; baseFactorSeed: ReadonlyUint8Array; padding1: ReadonlyUint8Array; 
/** Token X mint */
tokenXMint: Address; 
/** Token Y mint */
tokenYMint: Address; 
/** LB token X vault */
reserveX: Address; 
/** LB token Y vault */
reserveY: Address; 
/** Uncollected protocol fee */
protocolFee: ProtocolFeeArgs; 
/** Protocol fee owner, */
feeOwner: Address; 
/** Farming reward information */
rewardInfos: Array<RewardInfoArgs>; 
/** Oracle pubkey */
oracle: Address; 
/** Packed initialized bin array state */
binArrayBitmap: Array<number | bigint>; 
/** Last time the pool fee parameter was updated */
lastUpdatedAt: number | bigint; 
/** Whitelisted wallet */
whitelistedWallet: Address; 
/** Address allowed to swap when the current slot is greater than or equal to the pre-activation slot. The pre-activation slot is calculated as `activation_slot - pre_activation_slot_duration`. */
preActivationSwapAddress: Address; 
/** Base keypair. Only required for permission pair */
baseKey: Address; 
/** Slot to enable the pair. Only applicable for permission pair. */
activationSlot: number | bigint; 
/** Number of slot before activation slot. Used to calculate pre-activation slot for pre_activation_swap_address */
preActivationSlotDuration: number | bigint; 
/** _padding2 is reclaimed free space from swap_cap_deactivate_slot and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !! */
padding2: ReadonlyUint8Array; 
/** Liquidity lock duration for positions which created before activate. Only applicable for permission pair. */
lockDurationsInSlot: number | bigint; 
/** Pool creator */
creator: Address; 
/** Reserved space for future use */
reserved: ReadonlyUint8Array;  };

/** Gets the encoder for {@link LbPairArgs} account data. */
export function getLbPairEncoder(): FixedSizeEncoder<LbPairArgs> {
    return transformEncoder(getStructEncoder([['discriminator', fixEncoderSize(getBytesEncoder(), 8)], ['parameters', getStaticParametersEncoder()], ['vParameters', getVariableParametersEncoder()], ['bumpSeed', fixEncoderSize(getBytesEncoder(), 1)], ['binStepSeed', fixEncoderSize(getBytesEncoder(), 2)], ['pairType', getU8Encoder()], ['activeId', getI32Encoder()], ['binStep', getU16Encoder()], ['status', getU8Encoder()], ['requireBaseFactorSeed', getU8Encoder()], ['baseFactorSeed', fixEncoderSize(getBytesEncoder(), 2)], ['padding1', fixEncoderSize(getBytesEncoder(), 2)], ['tokenXMint', getAddressEncoder()], ['tokenYMint', getAddressEncoder()], ['reserveX', getAddressEncoder()], ['reserveY', getAddressEncoder()], ['protocolFee', getProtocolFeeEncoder()], ['feeOwner', getAddressEncoder()], ['rewardInfos', getArrayEncoder(getRewardInfoEncoder(), { size: 2 })], ['oracle', getAddressEncoder()], ['binArrayBitmap', getArrayEncoder(getU64Encoder(), { size: 16 })], ['lastUpdatedAt', getI64Encoder()], ['whitelistedWallet', getAddressEncoder()], ['preActivationSwapAddress', getAddressEncoder()], ['baseKey', getAddressEncoder()], ['activationSlot', getU64Encoder()], ['preActivationSlotDuration', getU64Encoder()], ['padding2', fixEncoderSize(getBytesEncoder(), 8)], ['lockDurationsInSlot', getU64Encoder()], ['creator', getAddressEncoder()], ['reserved', fixEncoderSize(getBytesEncoder(), 24)]]), (value) => ({ ...value, discriminator: LB_PAIR_DISCRIMINATOR }));
}

/** Gets the decoder for {@link LbPair} account data. */
export function getLbPairDecoder(): FixedSizeDecoder<LbPair> {
    return getStructDecoder([['discriminator', fixDecoderSize(getBytesDecoder(), 8)], ['parameters', getStaticParametersDecoder()], ['vParameters', getVariableParametersDecoder()], ['bumpSeed', fixDecoderSize(getBytesDecoder(), 1)], ['binStepSeed', fixDecoderSize(getBytesDecoder(), 2)], ['pairType', getU8Decoder()], ['activeId', getI32Decoder()], ['binStep', getU16Decoder()], ['status', getU8Decoder()], ['requireBaseFactorSeed', getU8Decoder()], ['baseFactorSeed', fixDecoderSize(getBytesDecoder(), 2)], ['padding1', fixDecoderSize(getBytesDecoder(), 2)], ['tokenXMint', getAddressDecoder()], ['tokenYMint', getAddressDecoder()], ['reserveX', getAddressDecoder()], ['reserveY', getAddressDecoder()], ['protocolFee', getProtocolFeeDecoder()], ['feeOwner', getAddressDecoder()], ['rewardInfos', getArrayDecoder(getRewardInfoDecoder(), { size: 2 })], ['oracle', getAddressDecoder()], ['binArrayBitmap', getArrayDecoder(getU64Decoder(), { size: 16 })], ['lastUpdatedAt', getI64Decoder()], ['whitelistedWallet', getAddressDecoder()], ['preActivationSwapAddress', getAddressDecoder()], ['baseKey', getAddressDecoder()], ['activationSlot', getU64Decoder()], ['preActivationSlotDuration', getU64Decoder()], ['padding2', fixDecoderSize(getBytesDecoder(), 8)], ['lockDurationsInSlot', getU64Decoder()], ['creator', getAddressDecoder()], ['reserved', fixDecoderSize(getBytesDecoder(), 24)]]);
}

/** Gets the codec for {@link LbPair} account data. */
export function getLbPairCodec(): FixedSizeCodec<LbPairArgs, LbPair> {
    return combineCodec(getLbPairEncoder(), getLbPairDecoder());
}

export function decodeLbPair<TAddress extends string = string>(encodedAccount: EncodedAccount<TAddress>): Account<LbPair, TAddress>;
export function decodeLbPair<TAddress extends string = string>(encodedAccount: MaybeEncodedAccount<TAddress>): MaybeAccount<LbPair, TAddress>;
export function decodeLbPair<TAddress extends string = string>(encodedAccount: EncodedAccount<TAddress> | MaybeEncodedAccount<TAddress>): Account<LbPair, TAddress> | MaybeAccount<LbPair, TAddress> {
  return decodeAccount(encodedAccount as MaybeEncodedAccount<TAddress>, getLbPairDecoder());
}

export async function fetchLbPair<TAddress extends string = string>(
  rpc: Parameters<typeof fetchEncodedAccount>[0],
  address: Address<TAddress>,
  config?: FetchAccountConfig,
): Promise<Account<LbPair, TAddress>> {
  const maybeAccount = await fetchMaybeLbPair(rpc, address, config);
  assertAccountExists(maybeAccount);
  return maybeAccount;
}

export async function fetchMaybeLbPair<TAddress extends string = string>(
  rpc: Parameters<typeof fetchEncodedAccount>[0],
  address: Address<TAddress>,
  config?: FetchAccountConfig,
): Promise<MaybeAccount<LbPair, TAddress>> {
  const maybeAccount = await fetchEncodedAccount(rpc, address, config);
  return decodeLbPair(maybeAccount);
}

export async function fetchAllLbPair(
  rpc: Parameters<typeof fetchEncodedAccounts>[0],
  addresses: Array<Address>,
  config?: FetchAccountsConfig,
): Promise<Account<LbPair>[]> {
  const maybeAccounts = await fetchAllMaybeLbPair(rpc, addresses, config);
  assertAccountsExist(maybeAccounts);
  return maybeAccounts;
}

export async function fetchAllMaybeLbPair(
  rpc: Parameters<typeof fetchEncodedAccounts>[0],
  addresses: Array<Address>,
  config?: FetchAccountsConfig,
): Promise<MaybeAccount<LbPair>[]> {
  const maybeAccounts = await fetchEncodedAccounts(rpc, addresses, config);
  return maybeAccounts.map((maybeAccount) => decodeLbPair(maybeAccount));
}

export function getLbPairSize(): number {
  return 904;
}