@meteora-ag/dlmm 1.4.1 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +59 -39
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dlmm/index.ts","../src/dlmm/constants/index.ts","../src/dlmm/idl.ts","../src/dlmm/error.ts","../src/dlmm/helpers/index.ts","../src/dlmm/helpers/math.ts","../src/dlmm/helpers/u64xu64_math.ts","../src/dlmm/helpers/weight.ts","../src/dlmm/helpers/weightToAmounts.ts","../src/dlmm/helpers/computeUnit.ts","../src/dlmm/helpers/derive.ts","../src/dlmm/helpers/binArray.ts","../src/dlmm/types/index.ts","../src/dlmm/helpers/fee.ts","../src/dlmm/helpers/strategy.ts","../src/dlmm/helpers/lbPair.ts","../src/index.ts"],"names":["AnchorProvider","BN","Program","NATIVE_MINT","TOKEN_PROGRAM_ID","createAssociatedTokenAccountIdempotentInstruction","createAssociatedTokenAccountInstruction","getAssociatedTokenAddressSync","ComputeBudgetProgram","PublicKey","SystemProgram","Decimal","Network","TransactionInstruction","gaussian","idx","PositionVersion","PairType","StrategyType","ActivationType","BinLiquidity","BitmapType","PairStatus","sParameters","addLiqIx","setCUIx","blockhash","lastValidBlockHeight","positions","i","toBinArrayPubkey","lowerBinArrayIdx","lowerBinArray","upperBinArray","delta","lowerBinId"],"mappings":"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AA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AA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","sourcesContent":["import { AnchorProvider, BN, Program } from \"@coral-xyz/anchor\";\nimport { bs58 } from \"@coral-xyz/anchor/dist/cjs/utils/bytes\";\nimport {\n AccountLayout,\n MintLayout,\n NATIVE_MINT,\n TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountIdempotentInstruction,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n unpackAccount,\n} from \"@solana/spl-token\";\nimport {\n AccountMeta,\n Cluster,\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport Decimal from \"decimal.js\";\nimport {\n BASIS_POINT_MAX,\n BIN_ARRAY_FEE,\n FEE_PRECISION,\n LBCLMM_PROGRAM_IDS,\n MAX_ACTIVE_BIN_SLIPPAGE,\n MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX,\n MAX_BIN_PER_POSITION,\n MAX_BIN_PER_TX,\n MAX_CLAIM_ALL_ALLOWED,\n MAX_EXTRA_BIN_ARRAYS,\n MAX_FEE_RATE,\n POSITION_FEE,\n PRECISION,\n SCALE_OFFSET,\n} from \"./constants\";\nimport { DlmmSdkError } from \"./error\";\nimport {\n binIdToBinArrayIndex,\n chunkedGetMultipleAccountInfos,\n chunks,\n computeFee,\n computeFeeFromAmount,\n deriveBinArray,\n deriveBinArrayBitmapExtension,\n deriveCustomizablePermissionlessLbPair,\n deriveLbPair,\n deriveLbPair2,\n deriveOracle,\n derivePermissionLbPair,\n derivePosition,\n deriveReserve,\n findNextBinArrayIndexWithLiquidity,\n findNextBinArrayWithLiquidity,\n getBinArrayLowerUpperBinId,\n getBinFromBinArray,\n getEstimatedComputeUnitIxWithBuffer,\n getOrCreateATAInstruction,\n getOutAmount,\n getPriceOfBinByBinId,\n getTokenDecimals,\n getTotalFee,\n isBinIdWithinBinArray,\n isOverflowDefaultBinArrayBitmap,\n swapExactInQuoteAtBin,\n swapExactOutQuoteAtBin,\n toStrategyParameters,\n toWeightDistribution,\n unwrapSOLInstruction,\n wrapSOLInstruction,\n enumerateBins,\n range,\n} from \"./helpers\";\nimport {\n Rounding,\n compressBinAmount,\n computeBaseFactorFromFeeBps,\n distributeAmountToCompressedBinsByRatio,\n findSwappableMinMaxBinId,\n generateAmountForBinRange,\n getPositionCount,\n getQPriceFromId,\n mulDiv,\n mulShr,\n shlDiv,\n} from \"./helpers/math\";\nimport { IDL } from \"./idl\";\nimport {\n ActivationType,\n Bin,\n BinAndAmount,\n BinArray,\n BinArrayAccount,\n BinArrayBitmapExtension,\n BinArrayBitmapExtensionAccount,\n BinLiquidity,\n BinLiquidityDistribution,\n ClmmProgram,\n Clock,\n ClockLayout,\n CompressedBinDepositAmounts,\n EmissionRate,\n FeeInfo,\n InitCustomizablePermissionlessPairIx,\n InitPermissionPairIx,\n LMRewards,\n LbPair,\n LbPairAccount,\n LbPosition,\n LiquidityOneSideParameter,\n LiquidityParameter,\n LiquidityParameterByStrategy,\n LiquidityParameterByWeight,\n PairLockInfo,\n PairStatus,\n PairType,\n Position,\n PositionBinData,\n PositionData,\n PositionInfo,\n PositionV2,\n PositionVersion,\n ProgramStrategyParameter,\n SeedLiquidityResponse,\n SwapExactOutParams,\n SwapFee,\n SwapParams,\n SwapQuote,\n SwapQuoteExactOut,\n SwapWithPriceImpactParams,\n TInitializePositionAndAddLiquidityParams,\n TInitializePositionAndAddLiquidityParamsByStrategy,\n TQuoteCreatePositionParams,\n TokenReserve,\n sParameters,\n vParameters,\n} from \"./types\";\nimport { DEFAULT_ADD_LIQUIDITY_CU } from \"./helpers/computeUnit\";\nimport { max, min } from \"bn.js\";\n\ntype Opt = {\n cluster?: Cluster | \"localhost\";\n programId?: PublicKey;\n};\n\nexport class DLMM {\n constructor(\n public pubkey: PublicKey,\n public program: ClmmProgram,\n public lbPair: LbPair,\n public binArrayBitmapExtension: BinArrayBitmapExtensionAccount | null,\n public tokenX: TokenReserve,\n public tokenY: TokenReserve,\n public clock: Clock,\n private opt?: Opt\n ) { }\n\n /** Static public method */\n\n /**\n * The function `getLbPairs` retrieves a list of LB pair accounts using a connection and optional\n * parameters.\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain network.\n * @param {Opt} [opt] - The `opt` parameter is an optional object that contains additional options\n * for the function. It can have the following properties:\n * @returns The function `getLbPairs` returns a Promise that resolves to an array of\n * `LbPairAccount` objects.\n */\n public static async getLbPairs(\n connection: Connection,\n opt?: Opt\n ): Promise<LbPairAccount[]> {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt?.cluster ?? \"mainnet-beta\"],\n provider\n );\n\n return program.account.lbPair.all();\n }\n\n public static async getPairPubkeyIfExists(\n connection: Connection,\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n baseFactor: BN,\n opt?: Opt\n ): Promise<PublicKey | null> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n try {\n const [lbPair2Key] = deriveLbPair2(\n tokenX,\n tokenY,\n binStep,\n baseFactor,\n program.programId\n );\n const account2 = await program.account.lbPair.fetchNullable(lbPair2Key);\n if (account2) return lbPair2Key;\n\n const [lbPairKey] = deriveLbPair(\n tokenX,\n tokenY,\n binStep,\n program.programId\n );\n\n const account = await program.account.lbPair.fetchNullable(lbPairKey);\n if (account && account.parameters.baseFactor === baseFactor.toNumber()) {\n return lbPairKey;\n }\n\n return null;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * The `create` function is a static method that creates a new instance of the `DLMM` class\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain network.\n * @param {PublicKey} dlmm - The PublicKey of LB Pair.\n * @param {Opt} [opt] - The `opt` parameter is an optional object that can contain additional options\n * for the `create` function. It has the following properties:\n * @returns The `create` function returns a `Promise` that resolves to a `DLMM` object.\n */\n static async create(\n connection: Connection,\n dlmm: PublicKey,\n opt?: Opt\n ): Promise<DLMM> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n const binArrayBitMapExtensionPubkey = deriveBinArrayBitmapExtension(\n dlmm,\n program.programId\n )[0];\n const accountsToFetch = [\n dlmm,\n binArrayBitMapExtensionPubkey,\n SYSVAR_CLOCK_PUBKEY,\n ];\n\n const accountsInfo = await chunkedGetMultipleAccountInfos(\n connection,\n accountsToFetch\n );\n const lbPairAccountInfoBuffer = accountsInfo[0]?.data;\n if (!lbPairAccountInfoBuffer)\n throw new Error(`LB Pair account ${dlmm.toBase58()} not found`);\n const lbPairAccInfo: LbPair = program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccountInfoBuffer\n );\n const binArrayBitMapAccountInfoBuffer = accountsInfo[1]?.data;\n let binArrayBitMapExtensionAccInfo: BinArrayBitmapExtension | null = null;\n if (binArrayBitMapAccountInfoBuffer) {\n binArrayBitMapExtensionAccInfo = program.coder.accounts.decode(\n \"binArrayBitmapExtension\",\n binArrayBitMapAccountInfoBuffer\n );\n }\n\n const clockAccountInfoBuffer = accountsInfo[2]?.data;\n if (!clockAccountInfoBuffer) throw new Error(`Clock account not found`);\n const clock = ClockLayout.decode(clockAccountInfoBuffer) as Clock;\n\n const reserveAccountsInfo = await chunkedGetMultipleAccountInfos(\n program.provider.connection,\n [\n lbPairAccInfo.reserveX,\n lbPairAccInfo.reserveY,\n lbPairAccInfo.tokenXMint,\n lbPairAccInfo.tokenYMint,\n ]\n );\n let binArrayBitmapExtension: BinArrayBitmapExtensionAccount | null;\n if (binArrayBitMapExtensionAccInfo) {\n binArrayBitmapExtension = {\n account: binArrayBitMapExtensionAccInfo,\n publicKey: binArrayBitMapExtensionPubkey,\n };\n }\n\n const reserveXBalance = AccountLayout.decode(reserveAccountsInfo[0].data);\n const reserveYBalance = AccountLayout.decode(reserveAccountsInfo[1].data);\n const tokenXDecimal = MintLayout.decode(\n reserveAccountsInfo[2].data\n ).decimals;\n const tokenYDecimal = MintLayout.decode(\n reserveAccountsInfo[3].data\n ).decimals;\n const tokenX = {\n publicKey: lbPairAccInfo.tokenXMint,\n reserve: lbPairAccInfo.reserveX,\n amount: reserveXBalance.amount,\n decimal: tokenXDecimal,\n };\n const tokenY = {\n publicKey: lbPairAccInfo.tokenYMint,\n reserve: lbPairAccInfo.reserveY,\n amount: reserveYBalance.amount,\n decimal: tokenYDecimal,\n };\n return new DLMM(\n dlmm,\n program,\n lbPairAccInfo,\n binArrayBitmapExtension,\n tokenX,\n tokenY,\n clock,\n opt\n );\n }\n\n /**\n * Similar to `create` function, but it accept multiple lbPairs to be initialized.\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain network.\n * @param dlmmList - An Array of PublicKey of LB Pairs.\n * @param {Opt} [opt] - An optional parameter of type `Opt`.\n * @returns The function `createMultiple` returns a Promise that resolves to an array of `DLMM`\n * objects.\n */\n static async createMultiple(\n connection: Connection,\n dlmmList: Array<PublicKey>,\n opt?: Opt\n ): Promise<DLMM[]> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n const binArrayBitMapExtensions = dlmmList.map(\n (lbPair) => deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n );\n const accountsToFetch = [\n ...dlmmList,\n ...binArrayBitMapExtensions,\n SYSVAR_CLOCK_PUBKEY,\n ];\n\n const accountsInfo = await chunkedGetMultipleAccountInfos(\n connection,\n accountsToFetch\n );\n\n const clockAccount = accountsInfo.pop();\n const clockAccountInfoBuffer = clockAccount?.data;\n if (!clockAccountInfoBuffer) throw new Error(`Clock account not found`);\n const clock = ClockLayout.decode(clockAccountInfoBuffer) as Clock;\n\n const lbPairArraysMap = new Map<string, LbPair>();\n for (let i = 0; i < dlmmList.length; i++) {\n const lbPairPubKey = dlmmList[i];\n const lbPairAccountInfoBuffer = accountsInfo[i]?.data;\n if (!lbPairAccountInfoBuffer)\n throw new Error(`LB Pair account ${lbPairPubKey.toBase58()} not found`);\n const binArrayAccInfo = program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccountInfoBuffer\n );\n lbPairArraysMap.set(lbPairPubKey.toBase58(), binArrayAccInfo);\n }\n\n const binArrayBitMapExtensionsMap = new Map<\n string,\n BinArrayBitmapExtension\n >();\n for (let i = dlmmList.length; i < accountsInfo.length; i++) {\n const index = i - dlmmList.length;\n const lbPairPubkey = dlmmList[index];\n const binArrayBitMapAccountInfoBuffer = accountsInfo[i]?.data;\n if (binArrayBitMapAccountInfoBuffer) {\n const binArrayBitMapExtensionAccInfo = program.coder.accounts.decode(\n \"binArrayBitmapExtension\",\n binArrayBitMapAccountInfoBuffer\n );\n binArrayBitMapExtensionsMap.set(\n lbPairPubkey.toBase58(),\n binArrayBitMapExtensionAccInfo\n );\n }\n }\n\n const reservePublicKeys = Array.from(lbPairArraysMap.values())\n .map(({ reserveX, reserveY }) => [reserveX, reserveY])\n .flat();\n\n const tokenMintPublicKeys = Array.from(lbPairArraysMap.values())\n .map(({ tokenXMint, tokenYMint }) => [tokenXMint, tokenYMint])\n .flat();\n\n const reserveAndTokenMintAccountsInfo =\n await chunkedGetMultipleAccountInfos(program.provider.connection, [\n ...reservePublicKeys,\n ...tokenMintPublicKeys,\n ]);\n\n const lbClmmImpl = await Promise.all(\n dlmmList.map(async (lbPair, index) => {\n const lbPairState = lbPairArraysMap.get(lbPair.toBase58());\n if (!lbPairState)\n throw new Error(`LB Pair ${lbPair.toBase58()} state not found`);\n\n const binArrayBitmapExtensionState = binArrayBitMapExtensionsMap.get(\n lbPair.toBase58()\n );\n const binArrayBitmapExtensionPubkey = binArrayBitMapExtensions[index];\n\n let binArrayBitmapExtension: BinArrayBitmapExtensionAccount | null =\n null;\n if (binArrayBitmapExtensionState) {\n binArrayBitmapExtension = {\n account: binArrayBitmapExtensionState,\n publicKey: binArrayBitmapExtensionPubkey,\n };\n }\n\n const reserveXAccountInfo = reserveAndTokenMintAccountsInfo[index * 2];\n const reserveYAccountInfo =\n reserveAndTokenMintAccountsInfo[index * 2 + 1];\n const tokenXMintAccountInfo =\n reserveAndTokenMintAccountsInfo[reservePublicKeys.length + index * 2];\n const tokenYMintAccountInfo =\n reserveAndTokenMintAccountsInfo[\n reservePublicKeys.length + index * 2 + 1\n ];\n\n if (!reserveXAccountInfo || !reserveYAccountInfo)\n throw new Error(\n `Reserve account for LB Pair ${lbPair.toBase58()} not found`\n );\n\n const reserveXBalance = AccountLayout.decode(reserveXAccountInfo.data);\n const reserveYBalance = AccountLayout.decode(reserveYAccountInfo.data);\n const tokenXDecimal = MintLayout.decode(\n tokenXMintAccountInfo.data\n ).decimals;\n const tokenYDecimal = MintLayout.decode(\n tokenYMintAccountInfo.data\n ).decimals;\n const tokenX = {\n publicKey: lbPairState.tokenXMint,\n reserve: lbPairState.reserveX,\n amount: reserveXBalance.amount,\n decimal: tokenXDecimal,\n };\n const tokenY = {\n publicKey: lbPairState.tokenYMint,\n reserve: lbPairState.reserveY,\n amount: reserveYBalance.amount,\n decimal: tokenYDecimal,\n };\n return new DLMM(\n lbPair,\n program,\n lbPairState,\n binArrayBitmapExtension,\n tokenX,\n tokenY,\n clock,\n opt\n );\n })\n );\n\n return lbClmmImpl;\n }\n\n static async getAllPresetParameters(connection: Connection, opt?: Opt) {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt?.cluster ?? \"mainnet-beta\"],\n provider\n );\n\n const presetParameter = await program.account.presetParameter.all();\n return presetParameter;\n }\n\n /**\n * The function `getAllLbPairPositionsByUser` retrieves all liquidity pool pair positions for a given\n * user.\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain.\n * @param {PublicKey} userPubKey - The user's wallet public key.\n * @param {Opt} [opt] - An optional object that contains additional options for the function.\n * @returns The function `getAllLbPairPositionsByUser` returns a `Promise` that resolves to a `Map`\n * object. The `Map` object contains key-value pairs, where the key is a string representing the LB\n * Pair account, and the value is an object of PositionInfo\n */\n static async getAllLbPairPositionsByUser(\n connection: Connection,\n userPubKey: PublicKey,\n opt?: Opt\n ): Promise<Map<string, PositionInfo>> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n const positionsV2 = await program.account.positionV2.all([\n {\n memcmp: {\n bytes: bs58.encode(userPubKey.toBuffer()),\n offset: 8 + 32,\n },\n },\n ]);\n\n const binArrayPubkeySetV2 = new Set<string>();\n const lbPairSetV2 = new Set<string>();\n positionsV2.forEach(({ account: { upperBinId, lowerBinId, lbPair } }) => {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n lbPair,\n lowerBinArrayIndex,\n program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n lbPair,\n upperBinArrayIndex,\n program.programId\n );\n binArrayPubkeySetV2.add(lowerBinArrayPubKey.toBase58());\n binArrayPubkeySetV2.add(upperBinArrayPubKey.toBase58());\n lbPairSetV2.add(lbPair.toBase58());\n });\n const binArrayPubkeyArrayV2 = Array.from(binArrayPubkeySetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n const lbPairArrayV2 = Array.from(lbPairSetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const [clockAccInfo, ...binArraysAccInfo] =\n await chunkedGetMultipleAccountInfos(connection, [\n SYSVAR_CLOCK_PUBKEY,\n ...binArrayPubkeyArrayV2,\n ...lbPairArrayV2,\n ]);\n\n const positionBinArraysMapV2 = new Map();\n\n for (\n let i = 0;\n i < binArrayPubkeyArrayV2.length;\n i++\n ) {\n const binArrayPubkey =\n binArrayPubkeyArrayV2[\n i\n ];\n const binArrayAccInfoBufferV2 = binArraysAccInfo[i];\n if (binArrayAccInfoBufferV2) {\n const binArrayAccInfo = program.coder.accounts.decode(\n \"binArray\",\n binArrayAccInfoBufferV2.data\n );\n positionBinArraysMapV2.set(binArrayPubkey.toBase58(), binArrayAccInfo);\n }\n }\n\n const lbPairArraysMapV2 = new Map<string, LbPair>();\n for (\n let i =\n binArrayPubkeyArrayV2.length;\n i < binArraysAccInfo.length;\n i++\n ) {\n const lbPairPubkey =\n lbPairArrayV2[\n i - binArrayPubkeyArrayV2.length\n ];\n const lbPairAccInfoBufferV2 = binArraysAccInfo[i];\n if (!lbPairAccInfoBufferV2)\n throw new Error(`LB Pair account ${lbPairPubkey.toBase58()} not found`);\n const lbPairAccInfo = program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccInfoBufferV2.data\n );\n lbPairArraysMapV2.set(lbPairPubkey.toBase58(), lbPairAccInfo);\n }\n\n const reservePublicKeysV2 = Array.from(lbPairArraysMapV2.values())\n .map(({ reserveX, reserveY, tokenXMint, tokenYMint }) => [\n reserveX,\n reserveY,\n tokenXMint,\n tokenYMint,\n ])\n .flat();\n\n const reserveAccountsInfo = await chunkedGetMultipleAccountInfos(\n program.provider.connection,\n reservePublicKeysV2\n );\n\n const lbPairReserveMapV2 = new Map<\n string,\n { reserveX: bigint; reserveY: bigint }\n >();\n const lbPairMintMapV2 = new Map<\n string,\n { mintXDecimal: number; mintYDecimal: number }\n >();\n lbPairArrayV2.forEach((lbPair, idx) => {\n const index = idx * 4;\n const reserveAccBufferXV2 =\n reserveAccountsInfo[index];\n const reserveAccBufferYV2 =\n reserveAccountsInfo[index + 1];\n if (!reserveAccBufferXV2 || !reserveAccBufferYV2)\n throw new Error(\n `Reserve account for LB Pair ${lbPair.toBase58()} not found`\n );\n const reserveAccX = AccountLayout.decode(reserveAccBufferXV2.data);\n const reserveAccY = AccountLayout.decode(reserveAccBufferYV2.data);\n\n lbPairReserveMapV2.set(lbPair.toBase58(), {\n reserveX: reserveAccX.amount,\n reserveY: reserveAccY.amount,\n });\n\n const mintXBufferV2 =\n reserveAccountsInfo[index + 2];\n const mintYBufferV2 =\n reserveAccountsInfo[index + 3];\n if (!mintXBufferV2 || !mintYBufferV2)\n throw new Error(\n `Mint account for LB Pair ${lbPair.toBase58()} not found`\n );\n const mintX = MintLayout.decode(mintXBufferV2.data);\n const mintY = MintLayout.decode(mintYBufferV2.data);\n lbPairMintMapV2.set(lbPair.toBase58(), {\n mintXDecimal: mintX.decimals,\n mintYDecimal: mintY.decimals,\n });\n });\n\n const onChainTimestamp = new BN(\n clockAccInfo.data.readBigInt64LE(32).toString()\n ).toNumber();\n const positionsMap: Map<\n string,\n {\n publicKey: PublicKey;\n lbPair: LbPair;\n tokenX: TokenReserve;\n tokenY: TokenReserve;\n lbPairPositionsData: Array<{\n publicKey: PublicKey;\n positionData: PositionData;\n version: PositionVersion;\n }>;\n }\n > = new Map();\n for (let position of positionsV2) {\n const { account, publicKey: positionPubKey } = position;\n\n const { upperBinId, lowerBinId, lbPair, feeOwner } = account;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n lbPair,\n lowerBinArrayIndex,\n program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n lbPair,\n upperBinArrayIndex,\n program.programId\n );\n const lowerBinArray = positionBinArraysMapV2.get(\n lowerBinArrayPubKey.toBase58()\n );\n const upperBinArray = positionBinArraysMapV2.get(\n upperBinArrayPubKey.toBase58()\n );\n\n const lbPairAcc = lbPairArraysMapV2.get(lbPair.toBase58());\n const [baseTokenDecimal, quoteTokenDecimal] = await Promise.all([\n getTokenDecimals(program.provider.connection, lbPairAcc.tokenXMint),\n getTokenDecimals(program.provider.connection, lbPairAcc.tokenYMint),\n ]);\n const reserveXBalance =\n lbPairReserveMapV2.get(lbPair.toBase58())?.reserveX ?? BigInt(0);\n const reserveYBalance =\n lbPairReserveMapV2.get(lbPair.toBase58())?.reserveY ?? BigInt(0);\n const tokenX = {\n publicKey: lbPairAcc.tokenXMint,\n reserve: lbPairAcc.reserveX,\n amount: reserveXBalance,\n decimal: baseTokenDecimal,\n };\n const tokenY = {\n publicKey: lbPairAcc.tokenYMint,\n reserve: lbPairAcc.reserveY,\n amount: reserveYBalance,\n decimal: quoteTokenDecimal,\n };\n const positionData = !!lowerBinArray && !!upperBinArray ? await DLMM.processPosition(\n program,\n PositionVersion.V2,\n lbPairAcc,\n onChainTimestamp,\n account,\n baseTokenDecimal,\n quoteTokenDecimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n ) : {\n totalXAmount: '0',\n totalYAmount: '0',\n positionBinData: [],\n lastUpdatedAt: new BN(0),\n upperBinId,\n lowerBinId,\n feeX: new BN(0),\n feeY: new BN(0),\n rewardOne: new BN(0),\n rewardTwo: new BN(0),\n feeOwner,\n totalClaimedFeeXAmount: new BN(0),\n totalClaimedFeeYAmount: new BN(0),\n };\n\n if (positionData) {\n positionsMap.set(lbPair.toBase58(), {\n publicKey: lbPair,\n lbPair: lbPairAcc,\n tokenX,\n tokenY,\n lbPairPositionsData: [\n ...(positionsMap.get(lbPair.toBase58())?.lbPairPositionsData ?? []),\n {\n publicKey: positionPubKey,\n positionData,\n version: PositionVersion.V2,\n },\n ],\n });\n }\n }\n\n return positionsMap;\n }\n\n public static getPricePerLamport(\n tokenXDecimal: number,\n tokenYDecimal: number,\n price: number\n ): string {\n return new Decimal(price)\n .mul(new Decimal(10 ** (tokenYDecimal - tokenXDecimal)))\n .toString();\n }\n\n public static getBinIdFromPrice(\n price: string | number | Decimal,\n binStep: number,\n min: boolean\n ): number {\n const binStepNum = new Decimal(binStep).div(new Decimal(BASIS_POINT_MAX));\n const binId = new Decimal(price)\n .log()\n .dividedBy(new Decimal(1).add(binStepNum).log());\n return (min ? binId.floor() : binId.ceil()).toNumber();\n }\n\n /**\n * The function `getLbPairLockInfo` retrieves all pair positions that has locked liquidity.\n * @param {number} [lockDurationOpt] - An optional value indicating the minimum position lock duration that the function should return. \n * Depending on the lbPair activationType, the param should be a number of seconds or a number of slots.\n * @returns The function `getLbPairLockInfo` returns a `Promise` that resolves to a `PairLockInfo`\n * object. The `PairLockInfo` object contains an array of `PositionLockInfo` objects.\n */\n public async getLbPairLockInfo(lockDurationOpt?: number): Promise<PairLockInfo> {\n const lockDuration = lockDurationOpt | 0;\n\n const lbPairPositions = await this.program.account.positionV2.all([\n {\n memcmp: {\n bytes: bs58.encode(this.pubkey.toBuffer()),\n offset: 8,\n },\n },\n ]);\n\n // filter positions has lock_release_point > currentTimestamp + lockDurationSecs\n const clockAccInfo = await this.program.provider.connection.getAccountInfo(SYSVAR_CLOCK_PUBKEY);\n const clock = ClockLayout.decode(clockAccInfo.data) as Clock;\n\n const currentPoint = this.lbPair.activationType == ActivationType.Slot ? clock.slot : clock.unixTimestamp;\n const minLockReleasePoint = currentPoint.add(new BN(lockDuration));\n const positionsWithLock = lbPairPositions.filter(p => p.account.lockReleasePoint.gt(minLockReleasePoint));\n\n if (positionsWithLock.length == 0) {\n return {\n positions: [],\n }\n }\n\n const binArrayPubkeySetV2 = new Set<string>();\n positionsWithLock.forEach(({ account: { upperBinId, lowerBinId, lbPair } }) => {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n binArrayPubkeySetV2.add(lowerBinArrayPubKey.toBase58());\n binArrayPubkeySetV2.add(upperBinArrayPubKey.toBase58());\n });\n const binArrayPubkeyArrayV2 = Array.from(binArrayPubkeySetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const binArraysAccInfo = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n binArrayPubkeyArrayV2,\n );\n\n const positionBinArraysMapV2 = new Map();\n for (let i = 0; i < binArraysAccInfo.length; i++) {\n const binArrayPubkey =\n binArrayPubkeyArrayV2[i];\n const binArrayAccBufferV2 = binArraysAccInfo[i];\n if (!binArrayAccBufferV2)\n throw new Error(\n `Bin Array account ${binArrayPubkey.toBase58()} not found`\n );\n const binArrayAccInfo = this.program.coder.accounts.decode(\n \"binArray\",\n binArrayAccBufferV2.data\n );\n positionBinArraysMapV2.set(binArrayPubkey.toBase58(), binArrayAccInfo);\n }\n\n\n\n const positionsLockInfo = await Promise.all(\n positionsWithLock.map(async ({ publicKey, account }) => {\n const { lowerBinId, upperBinId, feeOwner } = account;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n const lowerBinArray = positionBinArraysMapV2.get(\n lowerBinArrayPubKey.toBase58()\n );\n const upperBinArray = positionBinArraysMapV2.get(\n upperBinArrayPubKey.toBase58()\n );\n\n const positionData = await DLMM.processPosition(\n this.program,\n PositionVersion.V2,\n this.lbPair,\n clock.unixTimestamp.toNumber(),\n account,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n );\n return {\n positionAddress: publicKey,\n owner: account.owner,\n lockReleasePoint: account.lockReleasePoint.toNumber(),\n tokenXAmount: positionData.totalXAmount,\n tokenYAmount: positionData.totalYAmount,\n };\n })\n );\n\n return {\n positions: positionsLockInfo\n };\n }\n\n /** Public methods */\n\n public static async createPermissionLbPair(\n connection: Connection,\n binStep: BN,\n tokenX: PublicKey,\n tokenY: PublicKey,\n activeId: BN,\n baseKey: PublicKey,\n creatorKey: PublicKey,\n feeBps: BN,\n activationType: ActivationType,\n opt?: Opt\n ) {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt.cluster],\n provider\n );\n\n const [lbPair] = derivePermissionLbPair(\n baseKey,\n tokenX,\n tokenY,\n binStep,\n program.programId\n );\n\n const [reserveX] = deriveReserve(tokenX, lbPair, program.programId);\n const [reserveY] = deriveReserve(tokenY, lbPair, program.programId);\n const [oracle] = deriveOracle(lbPair, program.programId);\n\n const activeBinArrayIndex = binIdToBinArrayIndex(activeId);\n const binArrayBitmapExtension = isOverflowDefaultBinArrayBitmap(\n activeBinArrayIndex\n )\n ? deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n : null;\n\n const { minBinId, maxBinId } = findSwappableMinMaxBinId(binStep);\n\n const ixData: InitPermissionPairIx = {\n activeId: activeId.toNumber(),\n binStep: binStep.toNumber(),\n baseFactor: computeBaseFactorFromFeeBps(binStep, feeBps).toNumber(),\n minBinId: minBinId.toNumber(),\n maxBinId: maxBinId.toNumber(),\n activationType,\n };\n\n return program.methods\n .initializePermissionLbPair(ixData)\n .accounts({\n lbPair,\n rent: SYSVAR_RENT_PUBKEY,\n reserveX,\n reserveY,\n binArrayBitmapExtension,\n tokenMintX: tokenX,\n tokenMintY: tokenY,\n tokenProgram: TOKEN_PROGRAM_ID,\n oracle,\n systemProgram: SystemProgram.programId,\n admin: creatorKey,\n base: baseKey,\n })\n .transaction();\n }\n\n public static async createCustomizablePermissionlessLbPair(\n connection: Connection,\n binStep: BN,\n tokenX: PublicKey,\n tokenY: PublicKey,\n activeId: BN,\n feeBps: BN,\n activationType: ActivationType,\n hasAlphaVault: boolean,\n creatorKey: PublicKey,\n activationPoint?: BN,\n creatorPoolOnOffControl?: boolean,\n opt?: Opt\n ): Promise<Transaction> {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt.cluster],\n provider\n );\n\n const [lbPair] = deriveCustomizablePermissionlessLbPair(\n tokenX,\n tokenY,\n program.programId\n );\n\n const [reserveX] = deriveReserve(tokenX, lbPair, program.programId);\n const [reserveY] = deriveReserve(tokenY, lbPair, program.programId);\n const [oracle] = deriveOracle(lbPair, program.programId);\n\n const activeBinArrayIndex = binIdToBinArrayIndex(activeId);\n const binArrayBitmapExtension = isOverflowDefaultBinArrayBitmap(\n activeBinArrayIndex\n )\n ? deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n : null;\n\n const ixData: InitCustomizablePermissionlessPairIx = {\n activeId: activeId.toNumber(),\n binStep: binStep.toNumber(),\n baseFactor: computeBaseFactorFromFeeBps(binStep, feeBps).toNumber(),\n activationType,\n activationPoint: activationPoint ? activationPoint : null,\n hasAlphaVault,\n creatorPoolOnOffControl: creatorPoolOnOffControl ? creatorPoolOnOffControl : false,\n padding: Array(63).fill(0),\n };\n\n const userTokenX = getAssociatedTokenAddressSync(tokenX, creatorKey);\n const userTokenY = getAssociatedTokenAddressSync(tokenY, creatorKey);\n\n return program.methods\n .initializeCustomizablePermissionlessLbPair(ixData)\n .accounts({\n lbPair,\n reserveX,\n reserveY,\n binArrayBitmapExtension,\n tokenMintX: tokenX,\n tokenMintY: tokenY,\n tokenProgram: TOKEN_PROGRAM_ID,\n oracle,\n systemProgram: SystemProgram.programId,\n userTokenX,\n userTokenY,\n funder: creatorKey,\n })\n .transaction();\n }\n\n public static async createLbPair(\n connection: Connection,\n funder: PublicKey,\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n baseFactor: BN,\n presetParameter: PublicKey,\n activeId: BN,\n opt?: Opt\n ): Promise<Transaction> {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt.cluster],\n provider\n );\n\n const existsPool = await this.getPairPubkeyIfExists(\n connection,\n tokenX,\n tokenY,\n binStep,\n baseFactor\n );\n if (existsPool) {\n throw new Error(\"Pool already exists\");\n }\n\n const [lbPair] = deriveLbPair2(\n tokenX,\n tokenY,\n binStep,\n baseFactor,\n program.programId\n );\n\n const [reserveX] = deriveReserve(tokenX, lbPair, program.programId);\n const [reserveY] = deriveReserve(tokenY, lbPair, program.programId);\n const [oracle] = deriveOracle(lbPair, program.programId);\n\n const activeBinArrayIndex = binIdToBinArrayIndex(activeId);\n const binArrayBitmapExtension = isOverflowDefaultBinArrayBitmap(\n activeBinArrayIndex\n )\n ? deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n : null;\n\n return program.methods\n .initializeLbPair(activeId.toNumber(), binStep.toNumber())\n .accounts({\n funder,\n lbPair,\n rent: SYSVAR_RENT_PUBKEY,\n reserveX,\n reserveY,\n binArrayBitmapExtension,\n tokenMintX: tokenX,\n tokenMintY: tokenY,\n tokenProgram: TOKEN_PROGRAM_ID,\n oracle,\n presetParameter,\n systemProgram: SystemProgram.programId,\n })\n .transaction();\n }\n\n /**\n * The function `refetchStates` retrieves and updates various states and data related to bin arrays\n * and lb pairs.\n */\n public async refetchStates(): Promise<void> {\n const binArrayBitmapExtensionPubkey = deriveBinArrayBitmapExtension(\n this.pubkey,\n this.program.programId\n )[0];\n const [\n lbPairAccountInfo,\n binArrayBitmapExtensionAccountInfo,\n reserveXAccountInfo,\n reserveYAccountInfo,\n ] = await chunkedGetMultipleAccountInfos(this.program.provider.connection, [\n this.pubkey,\n binArrayBitmapExtensionPubkey,\n this.lbPair.reserveX,\n this.lbPair.reserveY,\n ]);\n\n const lbPairState = this.program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccountInfo.data\n );\n if (binArrayBitmapExtensionAccountInfo) {\n const binArrayBitmapExtensionState = this.program.coder.accounts.decode(\n \"binArrayBitmapExtension\",\n binArrayBitmapExtensionAccountInfo.data\n );\n\n if (binArrayBitmapExtensionState) {\n this.binArrayBitmapExtension = {\n account: binArrayBitmapExtensionState,\n publicKey: binArrayBitmapExtensionPubkey,\n };\n }\n }\n\n const reserveXBalance = AccountLayout.decode(reserveXAccountInfo.data);\n const reserveYBalance = AccountLayout.decode(reserveYAccountInfo.data);\n const [tokenXDecimal, tokenYDecimal] = await Promise.all([\n getTokenDecimals(\n this.program.provider.connection,\n lbPairState.tokenXMint\n ),\n getTokenDecimals(\n this.program.provider.connection,\n lbPairState.tokenYMint\n ),\n ]);\n\n this.tokenX = {\n amount: reserveXBalance.amount,\n decimal: tokenXDecimal,\n publicKey: lbPairState.tokenXMint,\n reserve: lbPairState.reserveX,\n };\n this.tokenY = {\n amount: reserveYBalance.amount,\n decimal: tokenYDecimal,\n publicKey: lbPairState.tokenYMint,\n reserve: lbPairState.reserveY,\n };\n\n this.lbPair = lbPairState;\n }\n\n /**\n * Set the status of a permissionless LB pair to either enabled or disabled. This require pool field `creator_pool_on_off_control` to be true and type `CustomizablePermissionless`.\n * Pool creator can enable/disable the pair anytime before the pool is opened / activated. Once the pool activation time is passed, the pool creator can only enable the pair.\n * Useful for token launches which do not have fixed activation time.\n * @param enable If true, the pair will be enabled. If false, the pair will be disabled.\n * @param creator The public key of the pool creator.\n * @returns a Promise that resolves to the transaction.\n */\n public async setPairStatusPermissionless(enable: boolean, creator: PublicKey) {\n const tx = await this.program.methods.setPairStatusPermissionless(Number(enable))\n .accounts({\n lbPair: this.pubkey,\n creator\n }).transaction();\n\n const { blockhash, lastValidBlockHeight } = \n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n feePayer: this.lbPair.creator,\n blockhash,\n lastValidBlockHeight,\n }).add(tx);\n }\n\n /**\n * The function `getBinArrays` returns an array of `BinArrayAccount` objects\n * @returns a Promise that resolves to an array of BinArrayAccount objects.\n */\n public async getBinArrays(): Promise<BinArrayAccount[]> {\n return this.program.account.binArray.all([\n {\n memcmp: {\n bytes: bs58.encode(this.pubkey.toBuffer()),\n offset: 8 + 16,\n },\n },\n ]);\n }\n\n /**\n * The function `getBinArrayAroundActiveBin` retrieves a specified number of `BinArrayAccount`\n * objects from the blockchain, based on the active bin and its surrounding bin arrays.\n * @param\n * swapForY - The `swapForY` parameter is a boolean value that indicates whether the swap is using quote token as input.\n * [count=4] - The `count` parameter is the number of bin arrays to retrieve on left and right respectively. By default, it is set to 4.\n * @returns an array of `BinArrayAccount` objects.\n */\n public async getBinArrayForSwap(\n swapForY,\n count = 4\n ): Promise<BinArrayAccount[]> {\n await this.refetchStates();\n\n const binArraysPubkey = new Set<string>();\n\n let shouldStop = false;\n let activeIdToLoop = this.lbPair.activeId;\n\n while (!shouldStop) {\n const binArrayIndex = findNextBinArrayIndexWithLiquidity(\n swapForY,\n new BN(activeIdToLoop),\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null\n );\n if (binArrayIndex === null) shouldStop = true;\n else {\n const [binArrayPubKey] = deriveBinArray(\n this.pubkey,\n binArrayIndex,\n this.program.programId\n );\n binArraysPubkey.add(binArrayPubKey.toBase58());\n\n const [lowerBinId, upperBinId] =\n getBinArrayLowerUpperBinId(binArrayIndex);\n activeIdToLoop = swapForY\n ? lowerBinId.toNumber() - 1\n : upperBinId.toNumber() + 1;\n }\n\n if (binArraysPubkey.size === count) shouldStop = true;\n }\n\n const accountsToFetch = Array.from(binArraysPubkey).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const binArraysAccInfoBuffer = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n accountsToFetch\n );\n\n const binArrays: BinArrayAccount[] = await Promise.all(\n binArraysAccInfoBuffer.map(async (accInfo, idx) => {\n const account: BinArray = this.program.coder.accounts.decode(\n \"binArray\",\n accInfo.data\n );\n const publicKey = accountsToFetch[idx];\n return {\n account,\n publicKey,\n };\n })\n );\n\n return binArrays;\n }\n\n public static calculateFeeInfo(\n baseFactor: number | string,\n binStep: number | string\n ): Omit<FeeInfo, \"protocolFeePercentage\"> {\n const baseFeeRate = new BN(baseFactor).mul(new BN(binStep)).mul(new BN(10));\n const baseFeeRatePercentage = new Decimal(baseFeeRate.toString())\n .mul(new Decimal(100))\n .div(new Decimal(FEE_PRECISION.toString()));\n const maxFeeRatePercentage = new Decimal(MAX_FEE_RATE.toString())\n .mul(new Decimal(100))\n .div(new Decimal(FEE_PRECISION.toString()));\n\n return {\n baseFeeRatePercentage,\n maxFeeRatePercentage,\n };\n }\n\n /**\n * The function `getFeeInfo` calculates and returns the base fee rate percentage, maximum fee rate\n * percentage, and protocol fee percentage.\n * @returns an object of type `FeeInfo` with the following properties: baseFeeRatePercentage, maxFeeRatePercentage, and protocolFeePercentage.\n */\n public getFeeInfo(): FeeInfo {\n const { baseFactor, protocolShare } = this.lbPair.parameters;\n\n const { baseFeeRatePercentage, maxFeeRatePercentage } =\n DLMM.calculateFeeInfo(baseFactor, this.lbPair.binStep);\n\n const protocolFeePercentage = new Decimal(protocolShare.toString())\n .mul(new Decimal(100))\n .div(new Decimal(BASIS_POINT_MAX));\n\n return {\n baseFeeRatePercentage,\n maxFeeRatePercentage,\n protocolFeePercentage,\n };\n }\n\n /**\n * The function calculates and returns a dynamic fee\n * @returns a Decimal value representing the dynamic fee.\n */\n public getDynamicFee(): Decimal {\n let vParameterClone = Object.assign({}, this.lbPair.vParameters);\n let activeId = new BN(this.lbPair.activeId);\n const sParameters = this.lbPair.parameters;\n\n const currentTimestamp = Date.now() / 1000;\n this.updateReference(\n activeId.toNumber(),\n vParameterClone,\n sParameters,\n currentTimestamp\n );\n this.updateVolatilityAccumulator(\n vParameterClone,\n sParameters,\n activeId.toNumber()\n );\n\n const totalFee = getTotalFee(\n this.lbPair.binStep,\n sParameters,\n vParameterClone\n );\n return new Decimal(totalFee.toString())\n .div(new Decimal(FEE_PRECISION.toString()))\n .mul(100);\n }\n\n /**\n * The function `getEmissionRate` returns the emission rates for two rewards.\n * @returns an object of type `EmissionRate`. The object has two properties: `rewardOne` and\n * `rewardTwo`, both of which are of type `Decimal`.\n */\n public getEmissionRate(): EmissionRate {\n const now = Date.now() / 1000;\n const [rewardOneEmissionRate, rewardTwoEmissionRate] =\n this.lbPair.rewardInfos.map(({ rewardRate, rewardDurationEnd }) =>\n now > rewardDurationEnd.toNumber() ? undefined : rewardRate\n );\n\n return {\n rewardOne: rewardOneEmissionRate\n ? new Decimal(rewardOneEmissionRate.toString()).div(PRECISION)\n : undefined,\n rewardTwo: rewardTwoEmissionRate\n ? new Decimal(rewardTwoEmissionRate.toString()).div(PRECISION)\n : undefined,\n };\n }\n\n /**\n * The function `getBinsAroundActiveBin` retrieves a specified number of bins to the left and right\n * of the active bin and returns them along with the active bin ID.\n * @param {number} numberOfBinsToTheLeft - The parameter `numberOfBinsToTheLeft` represents the\n * number of bins to the left of the active bin that you want to retrieve. It determines how many\n * bins you want to include in the result that are positioned to the left of the active bin.\n * @param {number} numberOfBinsToTheRight - The parameter `numberOfBinsToTheRight` represents the\n * number of bins to the right of the active bin that you want to retrieve.\n * @returns an object with two properties: \"activeBin\" and \"bins\". The value of \"activeBin\" is the\n * value of \"this.lbPair.activeId\", and the value of \"bins\" is the result of calling the \"getBins\"\n * function with the specified parameters.\n */\n public async getBinsAroundActiveBin(\n numberOfBinsToTheLeft: number,\n numberOfBinsToTheRight: number\n ): Promise<{ activeBin: number; bins: BinLiquidity[] }> {\n const lowerBinId = this.lbPair.activeId - numberOfBinsToTheLeft - 1;\n const upperBinId = this.lbPair.activeId + numberOfBinsToTheRight + 1;\n\n const bins = await this.getBins(\n this.pubkey,\n lowerBinId,\n upperBinId,\n this.tokenX.decimal,\n this.tokenY.decimal\n );\n\n return { activeBin: this.lbPair.activeId, bins };\n }\n\n /**\n * The function `getBinsBetweenMinAndMaxPrice` retrieves a list of bins within a specified price\n * range.\n * @param {number} minPrice - The minimum price value for filtering the bins.\n * @param {number} maxPrice - The `maxPrice` parameter is the maximum price value that you want to\n * use for filtering the bins.\n * @returns an object with two properties: \"activeBin\" and \"bins\". The value of \"activeBin\" is the\n * active bin ID of the lbPair, and the value of \"bins\" is an array of BinLiquidity objects.\n */\n public async getBinsBetweenMinAndMaxPrice(\n minPrice: number,\n maxPrice: number\n ): Promise<{ activeBin: number; bins: BinLiquidity[] }> {\n const lowerBinId = this.getBinIdFromPrice(minPrice, true) - 1;\n const upperBinId = this.getBinIdFromPrice(maxPrice, false) + 1;\n\n const bins = await this.getBins(\n this.pubkey,\n lowerBinId,\n upperBinId,\n this.tokenX.decimal,\n this.tokenX.decimal\n );\n\n return { activeBin: this.lbPair.activeId, bins };\n }\n\n /**\n * The function `getBinsBetweenLowerAndUpperBound` retrieves a list of bins between a lower and upper\n * bin ID and returns the active bin ID and the list of bins.\n * @param {number} lowerBinId - The lowerBinId parameter is a number that represents the ID of the\n * lowest bin.\n * @param {number} upperBinId - The upperBinID parameter is a number that represents the ID of the\n * highest bin.\n * @param {BinArray} [lowerBinArrays] - The `lowerBinArrays` parameter is an optional parameter of\n * type `BinArray`. It represents an array of bins that are below the lower bin ID.\n * @param {BinArray} [upperBinArrays] - The parameter `upperBinArrays` is an optional parameter of\n * type `BinArray`. It represents an array of bins that are above the upper bin ID.\n * @returns an object with two properties: \"activeBin\" and \"bins\". The value of \"activeBin\" is the\n * active bin ID of the lbPair, and the value of \"bins\" is an array of BinLiquidity objects.\n */\n public async getBinsBetweenLowerAndUpperBound(\n lowerBinId: number,\n upperBinId: number,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ): Promise<{ activeBin: number; bins: BinLiquidity[] }> {\n const bins = await this.getBins(\n this.pubkey,\n lowerBinId,\n upperBinId,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray\n );\n\n return { activeBin: this.lbPair.activeId, bins };\n }\n\n /**\n * The function converts a real price of bin to a lamport value\n * @param {number} price - The `price` parameter is a number representing the price of a token.\n * @returns {string} price per Lamport of bin\n */\n public toPricePerLamport(price: number): string {\n return DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n price\n );\n }\n\n /**\n * The function converts a price per lamport value to a real price of bin\n * @param {number} pricePerLamport - The parameter `pricePerLamport` is a number representing the\n * price per lamport.\n * @returns {string} real price of bin\n */\n public fromPricePerLamport(pricePerLamport: number): string {\n return new Decimal(pricePerLamport)\n .div(new Decimal(10 ** (this.tokenY.decimal - this.tokenX.decimal)))\n .toString();\n }\n\n /**\n * The function retrieves the active bin ID and its corresponding price.\n * @returns an object with two properties: \"binId\" which is a number, and \"price\" which is a string.\n */\n public async getActiveBin(): Promise<BinLiquidity> {\n const { activeId } = await this.program.account.lbPair.fetch(this.pubkey);\n const [activeBinState] = await this.getBins(\n this.pubkey,\n activeId,\n activeId,\n this.tokenX.decimal,\n this.tokenY.decimal\n );\n return activeBinState;\n }\n\n /**\n * The function get bin ID based on a given price and a boolean flag indicating whether to\n * round down or up.\n * @param {number} price - The price parameter is a number that represents the price value.\n * @param {boolean} min - The \"min\" parameter is a boolean value that determines whether to round\n * down or round up the calculated binId. If \"min\" is true, the binId will be rounded down (floor),\n * otherwise it will be rounded up (ceil).\n * @returns {number} which is the binId calculated based on the given price and whether the minimum\n * value should be used.\n */\n public getBinIdFromPrice(price: number, min: boolean): number {\n return DLMM.getBinIdFromPrice(price, this.lbPair.binStep, min);\n }\n\n /**\n * The function `getPositionsByUserAndLbPair` retrieves positions by user and LB pair, including\n * active bin and user positions.\n * @param {PublicKey} [userPubKey] - The `userPubKey` parameter is an optional parameter of type\n * `PublicKey`. It represents the public key of a user. If no `userPubKey` is provided, the function\n * will return an object with an empty `userPositions` array and the active bin information obtained\n * from the `getActive\n * @returns The function `getPositionsByUserAndLbPair` returns a Promise that resolves to an object\n * with two properties:\n * - \"activeBin\" which is an object with two properties: \"binId\" and \"price\". The value of \"binId\"\n * is the active bin ID of the lbPair, and the value of \"price\" is the price of the active bin.\n * - \"userPositions\" which is an array of Position objects.\n */\n public async getPositionsByUserAndLbPair(userPubKey?: PublicKey): Promise<{\n activeBin: BinLiquidity;\n userPositions: Array<LbPosition>;\n }> {\n const promiseResults = await Promise.all([\n this.getActiveBin(),\n userPubKey &&\n this.program.account.positionV2.all([\n {\n memcmp: {\n bytes: bs58.encode(userPubKey.toBuffer()),\n offset: 8 + 32,\n },\n },\n {\n memcmp: {\n bytes: bs58.encode(this.pubkey.toBuffer()),\n offset: 8,\n },\n },\n ]),\n ]);\n\n const [activeBin, positionsV2] = promiseResults;\n\n if (!activeBin) {\n throw new Error(\"Error fetching active bin\");\n }\n\n if (!userPubKey) {\n return {\n activeBin,\n userPositions: [],\n };\n }\n\n if (!positionsV2) {\n throw new Error(\"Error fetching positions\");\n }\n\n const binArrayPubkeySetV2 = new Set<string>();\n positionsV2.forEach(({ account: { upperBinId, lowerBinId, lbPair } }) => {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n binArrayPubkeySetV2.add(lowerBinArrayPubKey.toBase58());\n binArrayPubkeySetV2.add(upperBinArrayPubKey.toBase58());\n });\n const binArrayPubkeyArrayV2 = Array.from(binArrayPubkeySetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const lbPairAndBinArrays = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n [\n this.pubkey,\n SYSVAR_CLOCK_PUBKEY,\n ...binArrayPubkeyArrayV2,\n ]\n );\n\n const [lbPairAccInfo, clockAccInfo, ...binArraysAccInfo] =\n lbPairAndBinArrays;\n\n const positionBinArraysMapV2 = new Map();\n for (let i = 0; i < binArraysAccInfo.length; i++) {\n const binArrayPubkey =\n binArrayPubkeyArrayV2[i];\n const binArrayAccBufferV2 = binArraysAccInfo[i];\n if (!binArrayAccBufferV2)\n throw new Error(\n `Bin Array account ${binArrayPubkey.toBase58()} not found`\n );\n const binArrayAccInfo = this.program.coder.accounts.decode(\n \"binArray\",\n binArrayAccBufferV2.data\n );\n positionBinArraysMapV2.set(binArrayPubkey.toBase58(), binArrayAccInfo);\n }\n\n if (!lbPairAccInfo)\n throw new Error(`LB Pair account ${this.pubkey.toBase58()} not found`);\n\n const onChainTimestamp = new BN(\n clockAccInfo.data.readBigInt64LE(32).toString()\n ).toNumber();\n\n const userPositionsV2 = await Promise.all(\n positionsV2.map(async ({ publicKey, account }) => {\n const { lowerBinId, upperBinId, feeOwner } = account;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n const lowerBinArray = positionBinArraysMapV2.get(\n lowerBinArrayPubKey.toBase58()\n );\n const upperBinArray = positionBinArraysMapV2.get(\n upperBinArrayPubKey.toBase58()\n );\n return {\n publicKey,\n positionData: await DLMM.processPosition(\n this.program,\n PositionVersion.V2,\n this.lbPair,\n onChainTimestamp,\n account,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n ),\n version: PositionVersion.V2,\n };\n })\n );\n\n return {\n activeBin,\n userPositions: userPositionsV2,\n };\n }\n\n public async quoteCreatePosition({ strategy }: TQuoteCreatePositionParams) {\n const { minBinId, maxBinId } = strategy;\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const upperBinArrayIndex = BN.max(\n binIdToBinArrayIndex(new BN(maxBinId)),\n lowerBinArrayIndex.add(new BN(1))\n );\n\n const binArraysCount = (\n await this.binArraysToBeCreate(lowerBinArrayIndex, upperBinArrayIndex)\n ).length;\n const positionCount = Math.ceil((maxBinId - minBinId + 1) / MAX_BIN_PER_TX);\n\n const binArrayCost = binArraysCount * BIN_ARRAY_FEE;\n const positionCost = positionCount * POSITION_FEE;\n return {\n binArraysCount,\n binArrayCost,\n positionCount,\n positionCost,\n };\n }\n\n /**\n * Creates an empty position and initializes the corresponding bin arrays if needed.\n * @param param0 The settings of the requested new position.\n * @returns A promise that resolves into a transaction for creating the requested position.\n */\n public async createEmptyPosition({\n positionPubKey,\n minBinId,\n maxBinId,\n user,\n }: {\n positionPubKey: PublicKey;\n minBinId: number;\n maxBinId: number;\n user: PublicKey;\n }) {\n const createPositionIx = await this.program.methods\n .initializePosition(minBinId, maxBinId - minBinId + 1)\n .accounts({\n payer: user,\n position: positionPubKey,\n lbPair: this.pubkey,\n owner: user,\n })\n .instruction();\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(maxBinId))\n );\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n\n const instructions = [createPositionIx, ...createBinArrayIxs];\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(setCUIx, ...instructions);\n }\n\n /**\n * The function `getPosition` retrieves position information for a given public key and processes it\n * using various data to return a `LbPosition` object.\n * @param {PublicKey} positionPubKey - The `getPosition` function you provided is an asynchronous\n * function that fetches position information based on a given public key. Here's a breakdown of the\n * parameters used in the function:\n * @returns The `getPosition` function returns a Promise that resolves to an object of type\n * `LbPosition`. The object contains the following properties:\n * - `publicKey`: The public key of the position account\n * - `positionData`: Position Object\n * - `version`: The version of the position (in this case, `Position.V2`)\n */\n public async getPosition(positionPubKey: PublicKey): Promise<LbPosition> {\n const positionAccountInfo = await this.program.account.positionV2.fetch(positionPubKey);\n if (!positionAccountInfo) {\n throw new Error(`Position account ${positionPubKey.toBase58()} not found`);\n }\n\n const { lowerBinId, upperBinId, feeOwner } = positionAccountInfo;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const [clockAccInfo, lowerBinArrayAccInfo, upperBinArrayAccInfo] = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n [\n SYSVAR_CLOCK_PUBKEY,\n lowerBinArrayPubKey,\n upperBinArrayPubKey,\n ]\n );\n\n if (!lowerBinArrayAccInfo || !upperBinArrayAccInfo) {\n return {\n publicKey: positionPubKey,\n positionData: {\n totalXAmount: '0',\n totalYAmount: '0',\n positionBinData: [],\n lastUpdatedAt: new BN(0),\n upperBinId,\n lowerBinId,\n feeX: new BN(0),\n feeY: new BN(0),\n rewardOne: new BN(0),\n rewardTwo: new BN(0),\n feeOwner,\n totalClaimedFeeXAmount: new BN(0),\n totalClaimedFeeYAmount: new BN(0),\n },\n version: PositionVersion.V2,\n }\n }\n\n const onChainTimestamp = new BN(\n clockAccInfo.data.readBigInt64LE(32).toString()\n ).toNumber();\n\n const lowerBinArray = this.program.coder.accounts.decode(\n \"binArray\",\n lowerBinArrayAccInfo.data\n )\n const upperBinArray = this.program.coder.accounts.decode(\n \"binArray\",\n upperBinArrayAccInfo.data\n )\n\n return {\n publicKey: positionPubKey,\n positionData: await DLMM.processPosition(\n this.program,\n PositionVersion.V2,\n this.lbPair,\n onChainTimestamp,\n positionAccountInfo,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n ),\n version: PositionVersion.V2,\n }\n }\n\n /**\n * The function `initializePositionAndAddLiquidityByStrategy` function is used to initializes a position and adds liquidity\n * @param {TInitializePositionAndAddLiquidityParamsByStrategy}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `strategy`: The strategy parameters to be used for the liquidity pool (Can use `calculateStrategyParameter` to calculate).\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction>} The function `initializePositionAndAddLiquidityByWeight` returns a `Promise` that\n * resolves to either a single `Transaction` object.\n */\n public async initializePositionAndAddLiquidityByStrategy({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n strategy,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParamsByStrategy) {\n const { maxBinId, minBinId } = strategy;\n\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n const preInstructions: TransactionInstruction[] = [];\n const initializePositionIx = await this.program.methods\n .initializePosition(minBinId, maxBinId - minBinId + 1)\n .accounts({\n payer: user,\n position: positionPubKey,\n lbPair: this.pubkey,\n owner: user,\n })\n .instruction();\n preInstructions.push(initializePositionIx);\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(maxBinId))\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const activeId = this.lbPair.activeId;\n\n const strategyParameters: LiquidityParameterByStrategy[\"strategyParameters\"] =\n toStrategyParameters(strategy) as ProgramStrategyParameter;\n\n const liquidityParams: LiquidityParameterByStrategy = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n activeId,\n maxActiveBinSlippage,\n strategyParameters,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const programMethod =\n this.program.methods.addLiquidityByStrategy(liquidityParams);\n\n const addLiquidityIx = await programMethod\n .accounts(addLiquidityAccounts)\n .instruction();\n\n const instructions = [\n ...preInstructions,\n addLiquidityIx,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * The function `initializePositionAndAddLiquidityByWeight` function is used to initializes a position and adds liquidity\n * @param {TInitializePositionAndAddLiquidityParams}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `xYAmountDistribution`: An array of objects of type `XYAmountDistribution` that represents (can use `calculateSpotDistribution`, `calculateBidAskDistribution` & `calculateNormalDistribution`)\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction|Transaction[]>} The function `initializePositionAndAddLiquidityByWeight` returns a `Promise` that\n * resolves to either a single `Transaction` object (if less than 26bin involved) or an array of `Transaction` objects.\n */\n public async initializePositionAndAddLiquidityByWeight({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n xYAmountDistribution,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParams): Promise<\n Transaction | Transaction[]\n > {\n const { lowerBinId, upperBinId, binIds } =\n this.processXYAmountDistribution(xYAmountDistribution);\n\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n if (upperBinId >= lowerBinId + MAX_BIN_PER_POSITION.toNumber()) {\n throw new Error(\n `Position must be within a range of 1 to ${MAX_BIN_PER_POSITION.toNumber()} bins.`\n );\n }\n\n const preInstructions: Array<TransactionInstruction> = [];\n const initializePositionIx = await this.program.methods\n .initializePosition(lowerBinId, upperBinId - lowerBinId + 1)\n .accounts({\n payer: user,\n position: positionPubKey,\n lbPair: this.pubkey,\n owner: user,\n })\n .instruction();\n preInstructions.push(initializePositionIx);\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(upperBinId))\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const minBinId = Math.min(...binIds);\n const maxBinId = Math.max(...binIds);\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const activeId = this.lbPair.activeId;\n\n const binLiquidityDist: LiquidityParameterByWeight[\"binLiquidityDist\"] =\n toWeightDistribution(\n totalXAmount,\n totalYAmount,\n xYAmountDistribution.map((item) => ({\n binId: item.binId,\n xAmountBpsOfTotal: item.xAmountBpsOfTotal,\n yAmountBpsOfTotal: item.yAmountBpsOfTotal,\n })),\n this.lbPair.binStep\n );\n\n if (binLiquidityDist.length === 0) {\n throw new Error(\"No liquidity to add\");\n }\n\n const liquidityParams: LiquidityParameterByWeight = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n binLiquidityDist,\n activeId,\n maxActiveBinSlippage,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const oneSideLiquidityParams: LiquidityOneSideParameter = {\n amount: totalXAmount.isZero() ? totalYAmount : totalXAmount,\n activeId,\n maxActiveBinSlippage,\n binLiquidityDist,\n };\n\n const oneSideAddLiquidityAccounts = {\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n binArrayBitmapExtension: null,\n sender: user,\n position: positionPubKey,\n reserve: totalXAmount.isZero()\n ? this.lbPair.reserveY\n : this.lbPair.reserveX,\n tokenMint: totalXAmount.isZero()\n ? this.lbPair.tokenYMint\n : this.lbPair.tokenXMint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userToken: totalXAmount.isZero() ? userTokenY : userTokenX,\n };\n\n const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero();\n const programMethod = isOneSideDeposit\n ? this.program.methods.addLiquidityOneSide(oneSideLiquidityParams)\n : this.program.methods.addLiquidityByWeight(liquidityParams);\n\n if (xYAmountDistribution.length < MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX) {\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const instructions = [...preInstructions, addLiqIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n [addLiqIx],\n user,\n DEFAULT_ADD_LIQUIDITY_CU // The function return multiple transactions that dependent on each other, simulation will fail\n );\n\n const mainInstructions = [setCUIx, addLiqIx];\n\n const transactions: Transaction[] = [];\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n if (preInstructions.length) {\n const preInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...preInstructions);\n transactions.push(preInstructionsTx);\n }\n\n const mainTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...mainInstructions);\n transactions.push(mainTx);\n\n if (postInstructions.length) {\n const postInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...postInstructions);\n transactions.push(postInstructionsTx);\n }\n\n return transactions;\n }\n\n /**\n * The `addLiquidityByStrategy` function is used to add liquidity to existing position\n * @param {TInitializePositionAndAddLiquidityParamsByStrategy}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `strategy`: The strategy parameters to be used for the liquidity pool (Can use `calculateStrategyParameter` to calculate).\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction>} The function `addLiquidityByWeight` returns a `Promise` that resolves to either a single\n * `Transaction` object\n */\n public async addLiquidityByStrategy({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n strategy,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParamsByStrategy): Promise<Transaction> {\n const { maxBinId, minBinId } = strategy;\n\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n const preInstructions: TransactionInstruction[] = [];\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const strategyParameters: LiquidityParameterByStrategy[\"strategyParameters\"] =\n toStrategyParameters(strategy) as ProgramStrategyParameter;\n\n const positionAccount = await this.program.account.positionV2.fetch(\n positionPubKey\n );\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(\n new BN(positionAccount.lowerBinId)\n );\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const liquidityParams: LiquidityParameterByStrategy = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n activeId: this.lbPair.activeId,\n maxActiveBinSlippage,\n strategyParameters,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const programMethod =\n this.program.methods.addLiquidityByStrategy(liquidityParams);\n\n const addLiquidityIx = await programMethod\n .accounts(addLiquidityAccounts)\n .instruction();\n\n const instructions = [\n ...preInstructions,\n addLiquidityIx,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * The `addLiquidityByWeight` function is used to add liquidity to existing position\n * @param {TInitializePositionAndAddLiquidityParams}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `xYAmountDistribution`: An array of objects of type `XYAmountDistribution` that represents (can use `calculateSpotDistribution`, `calculateBidAskDistribution` & `calculateNormalDistribution`)\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction|Transaction[]>} The function `addLiquidityByWeight` returns a `Promise` that resolves to either a single\n * `Transaction` object (if less than 26bin involved) or an array of `Transaction` objects.\n */\n public async addLiquidityByWeight({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n xYAmountDistribution,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParams): Promise<\n Transaction | Transaction[]\n > {\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n const positionAccount = await this.program.account.positionV2.fetch(\n positionPubKey\n );\n const { lowerBinId, upperBinId, binIds } =\n this.processXYAmountDistribution(xYAmountDistribution);\n\n if (lowerBinId < positionAccount.lowerBinId)\n throw new Error(\n `Lower Bin ID (${lowerBinId}) lower than Position Lower Bin Id (${positionAccount.lowerBinId})`\n );\n if (upperBinId > positionAccount.upperBinId)\n throw new Error(\n `Upper Bin ID (${upperBinId}) higher than Position Upper Bin Id (${positionAccount.upperBinId})`\n );\n\n const minBinId = Math.min(...binIds);\n const maxBinId = Math.max(...binIds);\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const activeId = this.lbPair.activeId;\n\n const binLiquidityDist: LiquidityParameterByWeight[\"binLiquidityDist\"] =\n toWeightDistribution(\n totalXAmount,\n totalYAmount,\n xYAmountDistribution.map((item) => ({\n binId: item.binId,\n xAmountBpsOfTotal: item.xAmountBpsOfTotal,\n yAmountBpsOfTotal: item.yAmountBpsOfTotal,\n })),\n this.lbPair.binStep\n );\n\n if (binLiquidityDist.length === 0) {\n throw new Error(\"No liquidity to add\");\n }\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(\n new BN(positionAccount.lowerBinId)\n );\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(positionAccount.upperBinId))\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const preInstructions: TransactionInstruction[] = [];\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const liquidityParams: LiquidityParameterByWeight = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n binLiquidityDist,\n activeId,\n maxActiveBinSlippage,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const oneSideLiquidityParams: LiquidityOneSideParameter = {\n amount: totalXAmount.isZero() ? totalYAmount : totalXAmount,\n activeId,\n maxActiveBinSlippage,\n binLiquidityDist,\n };\n\n const oneSideAddLiquidityAccounts = {\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n binArrayBitmapExtension: null,\n sender: user,\n position: positionPubKey,\n reserve: totalXAmount.isZero()\n ? this.lbPair.reserveY\n : this.lbPair.reserveX,\n tokenMint: totalXAmount.isZero()\n ? this.lbPair.tokenYMint\n : this.lbPair.tokenXMint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userToken: totalXAmount.isZero() ? userTokenY : userTokenX,\n };\n\n const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero();\n const programMethod = isOneSideDeposit\n ? this.program.methods.addLiquidityOneSide(oneSideLiquidityParams)\n : this.program.methods.addLiquidityByWeight(liquidityParams);\n\n if (xYAmountDistribution.length < MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX) {\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const instructions = [...preInstructions, addLiqIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n [addLiqIx],\n user\n );\n\n const mainInstructions = [setCUIx, addLiqIx];\n\n const transactions: Transaction[] = [];\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n if (preInstructions.length) {\n const preInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...preInstructions);\n transactions.push(preInstructionsTx);\n }\n\n const mainTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...mainInstructions);\n transactions.push(mainTx);\n\n if (postInstructions.length) {\n const postInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...postInstructions);\n transactions.push(postInstructionsTx);\n }\n\n return transactions;\n }\n\n /**\n * The `removeLiquidity` function is used to remove liquidity from a position,\n * with the option to claim rewards and close the position.\n * @param\n * - `user`: The public key of the user account.\n * - `position`: The public key of the position account.\n * - `binIds`: An array of numbers that represent the bin IDs to remove liquidity from.\n * - `liquiditiesBpsToRemove`: An array of numbers (percentage) that represent the liquidity to remove from each bin.\n * - `shouldClaimAndClose`: A boolean flag that indicates whether to claim rewards and close the position.\n * @returns {Promise<Transaction|Transaction[]>}\n */\n public async removeLiquidity({\n user,\n position,\n binIds,\n bps,\n shouldClaimAndClose = false,\n }: {\n user: PublicKey;\n position: PublicKey;\n binIds: number[];\n bps: BN;\n shouldClaimAndClose?: boolean;\n }): Promise<Transaction | Transaction[]> {\n const lowerBinIdToRemove = Math.min(...binIds);\n const upperBinIdToRemove = Math.max(...binIds);\n const { lbPair, owner, feeOwner, lowerBinId: positionLowerBinId, liquidityShares } = await this.program.account.positionV2.fetch(position);\n\n if (liquidityShares.every((share) => share.isZero())) {\n throw new Error(\"No liquidity to remove\");\n }\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(positionLowerBinId));\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayLower] = deriveBinArray(\n lbPair,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [binArrayUpper] = deriveBinArray(\n lbPair,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const preInstructions: Array<TransactionInstruction> = [];\n\n const walletToReceiveFee = feeOwner.equals(PublicKey.default)\n ? user\n : feeOwner;\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n { ataPubKey: feeOwnerTokenX, ix: createFeeOwnerTokenXIx },\n { ataPubKey: feeOwnerTokenY, ix: createFeeOwnerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n owner,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n owner,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n walletToReceiveFee,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n walletToReceiveFee,\n user\n ),\n ]);\n\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (!walletToReceiveFee.equals(owner)) {\n createFeeOwnerTokenXIx && preInstructions.push(createFeeOwnerTokenXIx);\n createFeeOwnerTokenYIx && preInstructions.push(createFeeOwnerTokenYIx);\n }\n\n const secondTransactionsIx: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n if (shouldClaimAndClose) {\n const claimSwapFeeIx = await this.program.methods\n .claimFee()\n .accounts({\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n sender: user,\n position,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenProgram: TOKEN_PROGRAM_ID,\n tokenXMint: this.tokenX.publicKey,\n tokenYMint: this.tokenY.publicKey,\n userTokenX: feeOwnerTokenX,\n userTokenY: feeOwnerTokenY,\n })\n .instruction();\n postInstructions.push(claimSwapFeeIx);\n\n for (let i = 0; i < 2; i++) {\n const rewardInfo = this.lbPair.rewardInfos[i];\n if (!rewardInfo || rewardInfo.mint.equals(PublicKey.default)) continue;\n\n const { ataPubKey, ix: rewardAtaIx } = await getOrCreateATAInstruction(\n this.program.provider.connection,\n rewardInfo.mint,\n user\n );\n rewardAtaIx && preInstructions.push(rewardAtaIx);\n\n const claimRewardIx = await this.program.methods\n .claimReward(new BN(i))\n .accounts({\n lbPair: this.pubkey,\n sender: user,\n position,\n binArrayLower,\n binArrayUpper,\n rewardVault: rewardInfo.vault,\n rewardMint: rewardInfo.mint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userTokenAccount: ataPubKey,\n })\n .instruction();\n secondTransactionsIx.push(claimRewardIx);\n }\n\n const closePositionIx = await this.program.methods\n .closePosition()\n .accounts({\n binArrayLower,\n binArrayUpper,\n rentReceiver: owner, // Must be position owner\n position,\n lbPair: this.pubkey,\n sender: user,\n })\n .instruction();\n if (secondTransactionsIx.length) {\n secondTransactionsIx.push(closePositionIx);\n } else {\n postInstructions.push(closePositionIx);\n }\n }\n\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinIdToRemove));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinIdToRemove));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const removeLiquidityTx = await this.program.methods\n .removeLiquidityByRange(lowerBinIdToRemove, upperBinIdToRemove, bps.toNumber())\n .accounts({\n position,\n lbPair,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.tokenX.publicKey,\n tokenYMint: this.tokenY.publicKey,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n sender: user,\n })\n .instruction();\n\n const instructions = [\n ...preInstructions,\n removeLiquidityTx,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n if (secondTransactionsIx.length) {\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n secondTransactionsIx,\n user\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n const claimRewardsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(setCUIx, ...secondTransactionsIx);\n\n const mainTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n\n return [mainTx, claimRewardsTx];\n } else {\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n }\n\n /**\n * The `closePosition` function closes a position\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction>}\n */\n public async closePosition({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction> {\n const { lowerBinId } = await this.program.account.positionV2.fetch(\n position.publicKey\n );\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const closePositionTx = await this.program.methods\n .closePosition()\n .accounts({\n binArrayLower,\n binArrayUpper,\n rentReceiver: owner,\n position: position.publicKey,\n lbPair: this.pubkey,\n sender: owner,\n })\n .transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: owner,\n }).add(closePositionTx);\n }\n\n /**\n * The `swapQuoteExactOut` function returns a quote for a swap\n * @param\n * - `outAmount`: Amount of lamport to swap out\n * - `swapForY`: Swap token X to Y when it is true, else reversed.\n * - `allowedSlippage`: Allowed slippage for the swap. Expressed in BPS. To convert from slippage percentage to BPS unit: SLIPPAGE_PERCENTAGE * 100\n * - `maxExtraBinArrays`: Maximum number of extra binArrays to return\n * @returns {SwapQuote}\n * - `inAmount`: Amount of lamport to swap in\n * - `outAmount`: Amount of lamport to swap out\n * - `fee`: Fee amount\n * - `protocolFee`: Protocol fee amount\n * - `maxInAmount`: Maximum amount of lamport to swap in\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @throws {DlmmSdkError}\n *\n */\n public swapQuoteExactOut(\n outAmount: BN,\n swapForY: boolean,\n allowedSlippage: BN,\n binArrays: BinArrayAccount[],\n maxExtraBinArrays: number = 0\n ): SwapQuoteExactOut {\n // TODO: Should we use onchain clock ? Volatile fee rate is sensitive to time. Caching clock might causes the quoted fee off ...\n const currentTimestamp = Date.now() / 1000;\n let outAmountLeft = outAmount;\n if (maxExtraBinArrays < 0 || maxExtraBinArrays > MAX_EXTRA_BIN_ARRAYS) {\n throw new DlmmSdkError(\"INVALID_MAX_EXTRA_BIN_ARRAYS\", `maxExtraBinArrays must be a value between 0 and ${MAX_EXTRA_BIN_ARRAYS}`);\n }\n\n let vParameterClone = Object.assign({}, this.lbPair.vParameters);\n let activeId = new BN(this.lbPair.activeId);\n\n const binStep = this.lbPair.binStep;\n const sParameters = this.lbPair.parameters;\n\n this.updateReference(\n activeId.toNumber(),\n vParameterClone,\n sParameters,\n currentTimestamp\n );\n\n let startBinId = activeId;\n let binArraysForSwap = new Map();\n let actualInAmount: BN = new BN(0);\n let feeAmount: BN = new BN(0);\n let protocolFeeAmount: BN = new BN(0);\n\n while (!outAmountLeft.isZero()) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n throw new DlmmSdkError(\n \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\",\n \"Insufficient liquidity in binArrays\"\n );\n }\n\n binArraysForSwap.set(binArrayAccountToSwap.publicKey, true);\n\n this.updateVolatilityAccumulator(\n vParameterClone,\n sParameters,\n activeId.toNumber()\n );\n\n if (\n isBinIdWithinBinArray(activeId, binArrayAccountToSwap.account.index)\n ) {\n const bin = getBinFromBinArray(\n activeId.toNumber(),\n binArrayAccountToSwap.account\n );\n const { amountIn, amountOut, fee, protocolFee } =\n swapExactOutQuoteAtBin(\n bin,\n binStep,\n sParameters,\n vParameterClone,\n outAmountLeft,\n swapForY\n );\n\n if (!amountOut.isZero()) {\n outAmountLeft = outAmountLeft.sub(amountOut);\n actualInAmount = actualInAmount.add(amountIn);\n feeAmount = feeAmount.add(fee);\n protocolFeeAmount = protocolFee.add(protocolFee);\n }\n }\n\n if (!outAmountLeft.isZero()) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n }\n }\n\n const startPrice = getPriceOfBinByBinId(\n startBinId.toNumber(),\n this.lbPair.binStep\n );\n const endPrice = getPriceOfBinByBinId(\n activeId.toNumber(),\n this.lbPair.binStep\n );\n\n const priceImpact = startPrice\n .sub(endPrice)\n .abs()\n .div(startPrice)\n .mul(new Decimal(100));\n\n const maxInAmount = actualInAmount\n .mul(new BN(BASIS_POINT_MAX).add(allowedSlippage))\n .div(new BN(BASIS_POINT_MAX));\n\n if (maxExtraBinArrays > 0 && maxExtraBinArrays <= MAX_EXTRA_BIN_ARRAYS) {\n const extraBinArrays: Array<PublicKey> = new Array<PublicKey>();\n\n while (extraBinArrays.length < maxExtraBinArrays) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n break;\n }\n\n const binArrayAccountToSwapExisted = binArraysForSwap.has(binArrayAccountToSwap.publicKey);\n\n if (binArrayAccountToSwapExisted) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n } else {\n extraBinArrays.push(binArrayAccountToSwap.publicKey);\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArrayAccountToSwap.account.index);\n\n if (swapForY) {\n activeId = lowerBinId.sub(new BN(1));\n } else {\n activeId = upperBinId.add(new BN(1));\n }\n }\n }\n\n // save to binArraysForSwap result\n extraBinArrays.forEach(binArrayPubkey => {\n binArraysForSwap.set(binArrayPubkey, true);\n })\n }\n\n const binArraysPubkey = Array.from(binArraysForSwap.keys());\n\n return {\n inAmount: actualInAmount,\n maxInAmount,\n outAmount,\n priceImpact,\n fee: feeAmount,\n protocolFee: protocolFeeAmount,\n binArraysPubkey,\n };\n }\n\n /**\n * The `swapQuote` function returns a quote for a swap\n * @param\n * - `inAmount`: Amount of lamport to swap in\n * - `swapForY`: Swap token X to Y when it is true, else reversed.\n * - `allowedSlippage`: Allowed slippage for the swap. Expressed in BPS. To convert from slippage percentage to BPS unit: SLIPPAGE_PERCENTAGE * 100\n * - `binArrays`: binArrays for swapQuote.\n * - `isPartialFill`: Flag to check whether the the swapQuote is partial fill, default = false.\n * - `maxExtraBinArrays`: Maximum number of extra binArrays to return\n * @returns {SwapQuote}\n * - `consumedInAmount`: Amount of lamport to swap in\n * - `outAmount`: Amount of lamport to swap out\n * - `fee`: Fee amount\n * - `protocolFee`: Protocol fee amount\n * - `minOutAmount`: Minimum amount of lamport to swap out\n * - `priceImpact`: Price impact of the swap\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @throws {DlmmSdkError}\n */\n public swapQuote(\n inAmount: BN,\n swapForY: boolean,\n allowedSlippage: BN,\n binArrays: BinArrayAccount[],\n isPartialFill?: boolean,\n maxExtraBinArrays: number = 0\n ): SwapQuote {\n // TODO: Should we use onchain clock ? Volatile fee rate is sensitive to time. Caching clock might causes the quoted fee off ...\n const currentTimestamp = Date.now() / 1000;\n let inAmountLeft = inAmount;\n if (maxExtraBinArrays < 0 || maxExtraBinArrays > MAX_EXTRA_BIN_ARRAYS) {\n throw new DlmmSdkError(\"INVALID_MAX_EXTRA_BIN_ARRAYS\", `maxExtraBinArrays must be a value between 0 and ${MAX_EXTRA_BIN_ARRAYS}`);\n }\n\n let vParameterClone = Object.assign({}, this.lbPair.vParameters);\n let activeId = new BN(this.lbPair.activeId);\n\n const binStep = this.lbPair.binStep;\n const sParameters = this.lbPair.parameters;\n\n this.updateReference(\n activeId.toNumber(),\n vParameterClone,\n sParameters,\n currentTimestamp\n );\n\n let startBin: Bin | null = null;\n let binArraysForSwap = new Map();\n let actualOutAmount: BN = new BN(0);\n let feeAmount: BN = new BN(0);\n let protocolFeeAmount: BN = new BN(0);\n let lastFilledActiveBinId = activeId;\n\n while (!inAmountLeft.isZero()) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n if (isPartialFill) {\n break;\n } else {\n throw new DlmmSdkError(\n \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\",\n \"Insufficient liquidity in binArrays for swapQuote\"\n );\n }\n }\n\n binArraysForSwap.set(binArrayAccountToSwap.publicKey, true);\n\n this.updateVolatilityAccumulator(\n vParameterClone,\n sParameters,\n activeId.toNumber()\n );\n\n if (\n isBinIdWithinBinArray(activeId, binArrayAccountToSwap.account.index)\n ) {\n const bin = getBinFromBinArray(\n activeId.toNumber(),\n binArrayAccountToSwap.account\n );\n const { amountIn, amountOut, fee, protocolFee } = swapExactInQuoteAtBin(\n bin,\n binStep,\n sParameters,\n vParameterClone,\n inAmountLeft,\n swapForY\n );\n\n if (!amountIn.isZero()) {\n inAmountLeft = inAmountLeft.sub(amountIn);\n actualOutAmount = actualOutAmount.add(amountOut);\n feeAmount = feeAmount.add(fee);\n protocolFeeAmount = protocolFee.add(protocolFee);\n\n if (!startBin) {\n startBin = bin;\n }\n\n lastFilledActiveBinId = activeId;\n }\n }\n\n if (!inAmountLeft.isZero()) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n }\n }\n\n if (!startBin) {\n // The pool insufficient liquidity\n throw new DlmmSdkError(\n \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\",\n \"Insufficient liquidity\"\n );\n }\n\n // in case partialFill is true\n inAmount = inAmount.sub(inAmountLeft);\n\n const outAmountWithoutSlippage = getOutAmount(\n startBin,\n inAmount.sub(\n computeFeeFromAmount(binStep, sParameters, vParameterClone, inAmount)\n ),\n swapForY\n );\n\n const priceImpact = new Decimal(actualOutAmount.toString())\n .sub(new Decimal(outAmountWithoutSlippage.toString()))\n .div(new Decimal(outAmountWithoutSlippage.toString()))\n .mul(new Decimal(100));\n\n const minOutAmount = actualOutAmount\n .mul(new BN(BASIS_POINT_MAX).sub(allowedSlippage))\n .div(new BN(BASIS_POINT_MAX));\n\n const endPrice = getPriceOfBinByBinId(\n lastFilledActiveBinId.toNumber(),\n this.lbPair.binStep\n );\n\n if (maxExtraBinArrays > 0 && maxExtraBinArrays <= MAX_EXTRA_BIN_ARRAYS) {\n const extraBinArrays: Array<PublicKey> = new Array<PublicKey>();\n\n while (extraBinArrays.length < maxExtraBinArrays) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n break;\n }\n\n const binArrayAccountToSwapExisted = binArraysForSwap.has(binArrayAccountToSwap.publicKey);\n\n if (binArrayAccountToSwapExisted) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n } else {\n extraBinArrays.push(binArrayAccountToSwap.publicKey);\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArrayAccountToSwap.account.index);\n\n if (swapForY) {\n activeId = lowerBinId.sub(new BN(1));\n } else {\n activeId = upperBinId.add(new BN(1));\n }\n }\n }\n\n // save to binArraysForSwap result\n extraBinArrays.forEach(binArrayPubkey => {\n binArraysForSwap.set(binArrayPubkey, true);\n })\n }\n\n const binArraysPubkey = Array.from(binArraysForSwap.keys());\n\n return {\n consumedInAmount: inAmount,\n outAmount: actualOutAmount,\n fee: feeAmount,\n protocolFee: protocolFeeAmount,\n minOutAmount,\n priceImpact,\n binArraysPubkey,\n endPrice,\n };\n }\n\n public async swapExactOut({\n inToken,\n outToken,\n outAmount,\n maxInAmount,\n lbPair,\n user,\n binArraysPubkey,\n }: SwapExactOutParams): Promise<Transaction> {\n const { tokenXMint, tokenYMint, reserveX, reserveY, activeId, oracle } =\n await this.program.account.lbPair.fetch(lbPair);\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n const [\n { ataPubKey: userTokenIn, ix: createInTokenAccountIx },\n { ataPubKey: userTokenOut, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n inToken,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n outToken,\n user\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n if (inToken.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenIn,\n BigInt(maxInAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (outToken.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n let swapForY = true;\n if (outToken.equals(tokenXMint)) swapForY = false;\n\n const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n });\n\n const swapIx = await this.program.methods\n .swapExactOut(maxInAmount, outAmount)\n .accounts({\n lbPair,\n reserveX,\n reserveY,\n tokenXMint,\n tokenYMint,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n user,\n userTokenIn,\n userTokenOut,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : null,\n oracle,\n hostFeeIn: null,\n })\n .remainingAccounts(binArrays)\n .instruction();\n\n const instructions = [...preInstructions, swapIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * Returns a transaction to be signed and sent by user performing swap.\n * @param {SwapWithPriceImpactParams}\n * - `inToken`: The public key of the token to be swapped in.\n * - `outToken`: The public key of the token to be swapped out.\n * - `inAmount`: The amount of token to be swapped in.\n * - `priceImpact`: Accepted price impact bps.\n * - `lbPair`: The public key of the liquidity pool.\n * - `user`: The public key of the user account.\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @returns {Promise<Transaction>}\n */\n public async swapWithPriceImpact({\n inToken,\n outToken,\n inAmount,\n lbPair,\n user,\n priceImpact,\n binArraysPubkey,\n }: SwapWithPriceImpactParams): Promise<Transaction> {\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n const [\n { ataPubKey: userTokenIn, ix: createInTokenAccountIx },\n { ataPubKey: userTokenOut, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n inToken,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n outToken,\n user\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n if (inToken.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenIn,\n BigInt(inAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (outToken.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n // TODO: needs some refinement in case binArray not yet initialized\n const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n });\n\n const swapIx = await this.program.methods\n .swapWithPriceImpact(\n inAmount,\n this.lbPair.activeId,\n priceImpact.toNumber()\n )\n .accounts({\n lbPair,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n user,\n userTokenIn,\n userTokenOut,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : null,\n oracle: this.lbPair.oracle,\n hostFeeIn: null,\n })\n .remainingAccounts(binArrays)\n .instruction();\n\n const instructions = [...preInstructions, swapIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * Returns a transaction to be signed and sent by user performing swap.\n * @param {SwapParams}\n * - `inToken`: The public key of the token to be swapped in.\n * - `outToken`: The public key of the token to be swapped out.\n * - `inAmount`: The amount of token to be swapped in.\n * - `minOutAmount`: The minimum amount of token to be swapped out.\n * - `lbPair`: The public key of the liquidity pool.\n * - `user`: The public key of the user account.\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @returns {Promise<Transaction>}\n */\n public async swap({\n inToken,\n outToken,\n inAmount,\n minOutAmount,\n lbPair,\n user,\n binArraysPubkey,\n }: SwapParams): Promise<Transaction> {\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n const [\n { ataPubKey: userTokenIn, ix: createInTokenAccountIx },\n { ataPubKey: userTokenOut, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n inToken,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n outToken,\n user\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n if (inToken.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenIn,\n BigInt(inAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (outToken.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n\n // TODO: needs some refinement in case binArray not yet initialized\n const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n });\n\n const swapIx = await this.program.methods\n .swap(inAmount, minOutAmount)\n .accounts({\n lbPair,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n tokenXProgram: TOKEN_PROGRAM_ID, // dont use 2022 first; lack familiarity\n tokenYProgram: TOKEN_PROGRAM_ID, // dont use 2022 first; lack familiarity\n user,\n userTokenIn,\n userTokenOut,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : null,\n oracle: this.lbPair.oracle,\n hostFeeIn: null,\n })\n .remainingAccounts(binArrays)\n .instruction();\n\n const instructions = [...preInstructions, swapIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * The claimLMReward function is used to claim rewards for a specific position owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction>}\n */\n public async claimLMReward({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction> {\n const claimTransactions = await this.createClaimBuildMethod({\n owner,\n position,\n });\n if (!claimTransactions.length) return;\n\n const instructions = claimTransactions.map((t) => t.instructions).flat();\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n owner\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: owner,\n }).add(setCUIx, ...claimTransactions);\n }\n\n /**\n * The `claimAllLMRewards` function is used to claim all liquidity mining rewards for a given owner\n * and their positions.\n * @param\n * - `owner`: The public key of the owner of the positions.\n * - `positions`: An array of objects of type `PositionData` that represents the positions to claim rewards from.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllLMRewards({\n owner,\n positions,\n }: {\n owner: PublicKey;\n positions: LbPosition[];\n }): Promise<Transaction[]> {\n const claimAllTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { rewardOne, rewardTwo } }) =>\n !rewardOne.isZero() || !rewardTwo.isZero()\n )\n .map(async (position, idx) => {\n return await this.createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx: idx === 0,\n });\n })\n )\n ).flat();\n\n const chunkedClaimAllTx = chunks(claimAllTxs, MAX_CLAIM_ALL_ALLOWED);\n\n if (chunkedClaimAllTx.length === 0) return [];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n // First tx simulation will success because it will create all the ATA. Then, we use the simulated CU as references for the rest\n chunkedClaimAllTx[0].map((t) => t.instructions).flat(),\n owner\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return Promise.all(\n chunkedClaimAllTx.map(async (claimAllTx) => {\n return new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n })\n .add(setCUIx)\n .add(...claimAllTx);\n })\n );\n }\n\n public async setActivationPoint(activationPoint: BN) {\n const setActivationPointTx = await this.program.methods\n .setActivationPoint(activationPoint)\n .accounts({\n lbPair: this.pubkey,\n admin: this.lbPair.creator,\n })\n .transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n feePayer: this.lbPair.creator,\n blockhash,\n lastValidBlockHeight,\n }).add(setActivationPointTx);\n }\n\n public async setPairStatus(\n enabled: boolean,\n ): Promise<Transaction> {\n const pairStatus = enabled ? 0 : 1;\n const tx = await this.program.methods.setPairStatus(pairStatus).accounts(\n {\n lbPair: this.pubkey,\n admin: this.lbPair.creator\n }\n ).transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n feePayer: this.lbPair.creator,\n blockhash,\n lastValidBlockHeight,\n }).add(tx);\n }\n\n /**\n * The function `claimSwapFee` is used to claim swap fees for a specific position owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction>}\n */\n public async claimSwapFee({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction> {\n const claimFeeTx = await this.createClaimSwapFeeMethod({ owner, position });\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: owner,\n }).add(claimFeeTx);\n }\n\n /**\n * The `claimAllSwapFee` function to claim swap fees for multiple positions owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the positions.\n * - `positions`: An array of objects of type `PositionData` that represents the positions to claim swap fees from.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllSwapFee({\n owner,\n positions,\n }: {\n owner: PublicKey;\n positions: LbPosition[];\n }): Promise<Transaction[]> {\n const claimAllTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { feeX, feeY } }) =>\n !feeX.isZero() || !feeY.isZero()\n )\n .map(async (position, idx, positions) => {\n return await this.createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePretIx: idx === 0,\n shouldIncludePostIx: idx === positions.length - 1,\n });\n })\n )\n ).flat();\n\n const chunkedClaimAllTx = chunks(claimAllTxs, MAX_CLAIM_ALL_ALLOWED);\n\n if (chunkedClaimAllTx.length === 0) return [];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n // First tx simulation will success because it will create all the ATA. Then, we use the simulated CU as references for the rest\n chunkedClaimAllTx[0].map((t) => t.instructions).flat(),\n owner\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return Promise.all(\n chunkedClaimAllTx.map(async (claimAllTx) => {\n return new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n })\n .add(setCUIx)\n .add(...claimAllTx);\n })\n );\n }\n\n /**\n * The function `claimAllRewardsByPosition` allows a user to claim all rewards for a specific\n * position.\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllRewardsByPosition({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction[]> {\n const preInstructions: TransactionInstruction[] = [];\n\n const pairTokens = [this.tokenX.publicKey, this.tokenY.publicKey];\n const tokensInvolved = [...pairTokens];\n\n for (let i = 0; i < 2; i++) {\n const rewardMint = this.lbPair.rewardInfos[i].mint;\n if (\n !tokensInvolved.some((pubkey) => rewardMint.equals(pubkey)) &&\n !rewardMint.equals(PublicKey.default)\n ) {\n tokensInvolved.push(this.lbPair.rewardInfos[i].mint);\n }\n }\n\n const feeOwner = position.positionData.feeOwner.equals(PublicKey.default)\n ? owner\n : position.positionData.feeOwner;\n\n const createATAAccAndIx = await Promise.all(\n tokensInvolved.map((token) => {\n // Single position. Swap fee only belongs to owner, or the customized fee owner.\n\n if (pairTokens.some((t) => t.equals(token))) {\n return getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n feeOwner,\n owner\n );\n }\n\n // Reward\n return getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n owner\n );\n })\n );\n createATAAccAndIx.forEach(({ ix }) => ix && preInstructions.push(ix));\n\n const claimAllSwapFeeTxs = await this.createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePostIx: false,\n shouldIncludePretIx: false,\n });\n const claimAllLMTxs = await this.createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx: false,\n });\n\n const claimAllTxs = chunks(\n [claimAllSwapFeeTxs, ...claimAllLMTxs],\n MAX_CLAIM_ALL_ALLOWED\n );\n\n const postInstructions: TransactionInstruction[] = [];\n if (tokensInvolved.some((pubkey) => pubkey.equals(NATIVE_MINT))) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return Promise.all(\n claimAllTxs.map(async (claimAllTx) => {\n const mainInstructions = claimAllTx.map((t) => t.instructions).flat();\n const instructions = [\n ...preInstructions,\n ...mainInstructions,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n owner\n );\n\n const tx = new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n }).add(setCUIx);\n\n if (preInstructions.length) tx.add(...preInstructions);\n tx.add(...claimAllTx);\n if (postInstructions.length) tx.add(...postInstructions);\n\n return tx;\n })\n );\n }\n\n /**\n * The `seedLiquidity` function create multiple grouped instructions. The grouped instructions will be either [initialize bin array + initialize position instructions] or [deposit instruction] combination.\n * @param\n * - `owner`: The public key of the positions owner.\n * - `seedAmount`: Lamport amount to be seeded to the pool.\n * - `minPrice`: Start price in UI format\n * - `maxPrice`: End price in UI format\n * - `base`: Base key\n * - `txPayer`: Account rental fee payer\n * - `feeOwner`: Fee owner key. Default to position owner\n * - `operator`: Operator key\n * - `lockReleasePoint`: Timelock. Point (slot/timestamp) the position can withdraw the liquidity,\n * - `shouldSeedPositionOwner` (optional): Whether to send 1 lamport amount of token X to the position owner to prove ownership.\n * @returns {Promise<SeedLiquidityResponse>}\n */\n public async seedLiquidity(\n owner: PublicKey,\n seedAmount: BN,\n curvature: number,\n minPrice: number,\n maxPrice: number,\n base: PublicKey,\n payer: PublicKey,\n feeOwner: PublicKey,\n operator: PublicKey,\n lockReleasePoint: BN,\n shouldSeedPositionOwner: boolean = false\n ): Promise<SeedLiquidityResponse> {\n const toLamportMultiplier = new Decimal(\n 10 ** (this.tokenY.decimal - this.tokenX.decimal)\n );\n\n const minPricePerLamport = new Decimal(minPrice).mul(toLamportMultiplier);\n const maxPricePerLamport = new Decimal(maxPrice).mul(toLamportMultiplier);\n\n const minBinId = new BN(\n DLMM.getBinIdFromPrice(minPricePerLamport, this.lbPair.binStep, false)\n );\n\n const maxBinId = new BN(\n DLMM.getBinIdFromPrice(maxPricePerLamport, this.lbPair.binStep, true)\n );\n\n if (minBinId.toNumber() < this.lbPair.activeId) {\n throw new Error(\"minPrice < current pair price\");\n }\n\n if (minBinId.toNumber() >= maxBinId.toNumber()) {\n throw new Error(\"Price range too small\");\n }\n\n // Generate amount for each bin\n const k = 1.0 / curvature;\n\n const binDepositAmount = generateAmountForBinRange(\n seedAmount,\n this.lbPair.binStep,\n this.tokenX.decimal,\n this.tokenY.decimal,\n minBinId,\n maxBinId,\n k\n );\n\n const decompressMultiplier = new BN(10 ** this.tokenX.decimal);\n\n let { compressedBinAmount, compressionLoss } = compressBinAmount(\n binDepositAmount,\n decompressMultiplier\n );\n\n // Distribute loss after compression back to bins based on bin ratio with total deposited amount\n let {\n newCompressedBinAmount: compressedBinDepositAmount,\n loss: finalLoss,\n } = distributeAmountToCompressedBinsByRatio(\n compressedBinAmount,\n compressionLoss,\n decompressMultiplier,\n new BN(2 ** 32 - 1) // u32\n );\n\n // This amount will be deposited to the last bin without compression\n const positionCount = getPositionCount(minBinId, maxBinId.sub(new BN(1)));\n\n const seederTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n operator,\n false\n );\n\n const seederTokenY = getAssociatedTokenAddressSync(\n this.lbPair.tokenYMint,\n operator,\n false,\n );\n\n const ownerTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n owner, \n false\n );\n\n const sendPositionOwnerTokenProveIxs = [];\n const initializeBinArraysAndPositionIxs = [];\n const addLiquidityIxs = [];\n const appendedInitBinArrayIx = new Set();\n\n if (shouldSeedPositionOwner) {\n const positionOwnerTokenX =\n await this.program.provider.connection.getAccountInfo(ownerTokenX);\n\n let requireTokenProve = false;\n\n if (positionOwnerTokenX) {\n const ownerTokenXState = unpackAccount(\n ownerTokenX,\n positionOwnerTokenX,\n TOKEN_PROGRAM_ID,\n );\n\n requireTokenProve = ownerTokenXState.amount == 0n;\n } else {\n requireTokenProve = true;\n }\n\n if (requireTokenProve) {\n const initPositionOwnerTokenX =\n createAssociatedTokenAccountIdempotentInstruction(\n payer,\n ownerTokenX,\n owner,\n this.lbPair.tokenXMint,\n TOKEN_PROGRAM_ID\n );\n\n sendPositionOwnerTokenProveIxs.push(initPositionOwnerTokenX);\n sendPositionOwnerTokenProveIxs.push(\n createTransferInstruction(\n seederTokenX,\n ownerTokenX,\n operator,\n 1n\n )\n );\n }\n }\n\n for (let i = 0; i < positionCount.toNumber(); i++) {\n const lowerBinId = minBinId.add(MAX_BIN_PER_POSITION.mul(new BN(i)));\n const upperBinId = lowerBinId.add(MAX_BIN_PER_POSITION).sub(new BN(1));\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(lowerBinId);\n const upperBinArrayIndex = binIdToBinArrayIndex(upperBinId);\n\n const [positionPda, _bump] = derivePosition(\n this.pubkey,\n base,\n lowerBinId,\n MAX_BIN_PER_POSITION,\n this.program.programId\n );\n\n const [lowerBinArray] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const [upperBinArray] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const accounts =\n await this.program.provider.connection.getMultipleAccountsInfo([\n lowerBinArray,\n upperBinArray,\n positionPda,\n ]);\n\n let instructions: TransactionInstruction[] = [];\n\n const lowerBinArrayAccount = accounts[0];\n if (\n !lowerBinArrayAccount &&\n !appendedInitBinArrayIx.has(lowerBinArray.toBase58())\n ) {\n instructions.push(\n await this.program.methods\n .initializeBinArray(lowerBinArrayIndex)\n .accounts({\n lbPair: this.pubkey,\n binArray: lowerBinArray,\n funder: payer,\n })\n .instruction()\n );\n\n appendedInitBinArrayIx.add(lowerBinArray.toBase58());\n }\n\n const upperBinArrayAccount = accounts[1];\n if (\n !upperBinArrayAccount &&\n !appendedInitBinArrayIx.has(upperBinArray.toBase58())\n ) {\n instructions.push(\n await this.program.methods\n .initializeBinArray(upperBinArrayIndex)\n .accounts({\n lbPair: this.pubkey,\n binArray: upperBinArray,\n funder: payer,\n })\n .instruction()\n );\n\n appendedInitBinArrayIx.add(upperBinArray.toBase58());\n }\n\n const positionAccount = accounts[2];\n if (!positionAccount) {\n instructions.push(\n await this.program.methods\n .initializePositionByOperator(\n lowerBinId.toNumber(),\n MAX_BIN_PER_POSITION.toNumber(),\n feeOwner,\n lockReleasePoint\n )\n .accounts({\n lbPair: this.pubkey,\n position: positionPda,\n base,\n owner,\n payer,\n operator,\n operatorTokenX: seederTokenX,\n ownerTokenX,\n systemProgram: SystemProgram.programId,\n })\n .instruction()\n );\n }\n\n // Initialize bin arrays and initialize position account in 1 tx\n if (instructions.length > 1) {\n instructions.push(\n await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n payer\n )\n );\n initializeBinArraysAndPositionIxs.push(instructions);\n instructions = [];\n }\n\n const positionDeposited =\n positionAccount &&\n this.program.coder.accounts\n .decode<PositionV2>(\"positionV2\", positionAccount.data)\n .liquidityShares.reduce((total, cur) => total.add(cur), new BN(0))\n .gt(new BN(0));\n\n if (!positionDeposited) {\n const cappedUpperBinId = Math.min(\n upperBinId.toNumber(),\n maxBinId.toNumber() - 1\n );\n\n const bins: CompressedBinDepositAmounts = [];\n\n for (let i = lowerBinId.toNumber(); i <= cappedUpperBinId; i++) {\n bins.push({\n binId: i,\n amount: compressedBinDepositAmount.get(i).toNumber(),\n });\n }\n\n instructions.push(\n await this.program.methods\n .addLiquidityOneSidePrecise({\n bins,\n decompressMultiplier,\n })\n .accounts({\n position: positionPda,\n lbPair: this.pubkey,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : this.program.programId,\n userToken: seederTokenX,\n reserve: this.lbPair.reserveX,\n tokenMint: this.lbPair.tokenXMint,\n binArrayLower: lowerBinArray,\n binArrayUpper: upperBinArray,\n sender: operator,\n })\n .instruction()\n );\n\n // Last position\n if (i + 1 >= positionCount.toNumber() && !finalLoss.isZero()) {\n instructions.push(\n await this.program.methods\n .addLiquidityOneSide({\n amount: finalLoss,\n activeId: this.lbPair.activeId,\n maxActiveBinSlippage: 0,\n binLiquidityDist: [\n {\n binId: cappedUpperBinId,\n weight: 1,\n },\n ],\n })\n .accounts({\n position: positionPda,\n lbPair: this.pubkey,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : this.program.programId,\n userToken: seederTokenX,\n reserve: this.lbPair.reserveX,\n tokenMint: this.lbPair.tokenXMint,\n binArrayLower: lowerBinArray,\n binArrayUpper: upperBinArray,\n sender: operator,\n })\n .instruction()\n );\n }\n\n addLiquidityIxs.push([\n ComputeBudgetProgram.setComputeUnitLimit({\n units: DEFAULT_ADD_LIQUIDITY_CU,\n }),\n ...instructions,\n ]);\n }\n }\n\n return {\n sendPositionOwnerTokenProveIxs,\n initializeBinArraysAndPositionIxs,\n addLiquidityIxs,\n };\n }\n\n /**\n * The `seedLiquidity` function create multiple grouped instructions. The grouped instructions will be either [initialize bin array + initialize position instructions] or [deposit instruction] combination.\n * @param\n * - `payer`: The public key of the tx payer.\n * - `base`: Base key\n * - `seedAmount`: Token X lamport amount to be seeded to the pool.\n * - `price`: TokenX/TokenY Price in UI format\n * - `roundingUp`: Whether to round up the price\n * - `positionOwner`: The owner of the position\n * - `feeOwner`: Position fee owner\n * - `operator`: Operator of the position. Operator able to manage the position on behalf of the position owner. However, liquidity withdrawal issue by the operator can only send to the position owner.\n * - `lockReleasePoint`: The lock release point of the position.\n * - `shouldSeedPositionOwner` (optional): Whether to send 1 lamport amount of token X to the position owner to prove ownership.\n * \n * The returned instructions need to be executed sequentially if it was separated into multiple transactions.\n * @returns {Promise<TransactionInstruction[]>}\n */\n public async seedLiquiditySingleBin(\n payer: PublicKey,\n base: PublicKey,\n seedAmount: BN,\n price: number,\n roundingUp: boolean,\n positionOwner: PublicKey,\n feeOwner: PublicKey,\n operator: PublicKey,\n lockReleasePoint: BN,\n shouldSeedPositionOwner: boolean = false\n ): Promise<TransactionInstruction[]> {\n const pricePerLamport = DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n price\n );\n const binIdNumber = DLMM.getBinIdFromPrice(\n pricePerLamport,\n this.lbPair.binStep,\n !roundingUp\n );\n\n const binId = new BN(binIdNumber);\n const lowerBinArrayIndex = binIdToBinArrayIndex(binId);\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n\n const [lowerBinArray] = deriveBinArray(this.pubkey, lowerBinArrayIndex, this.program.programId);\n const [upperBinArray] = deriveBinArray(this.pubkey, upperBinArrayIndex, this.program.programId);\n const [positionPda] = derivePosition(this.pubkey, base, binId, new BN(1), this.program.programId);\n\n const preInstructions = [];\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n operator,\n payer\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n operator,\n payer\n ),\n ]);\n\n // create userTokenX and userTokenY accounts\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n let [binArrayBitmapExtension] = deriveBinArrayBitmapExtension(\n this.pubkey,\n this.program.programId\n );\n const accounts =\n await this.program.provider.connection.getMultipleAccountsInfo([\n lowerBinArray,\n upperBinArray,\n positionPda,\n binArrayBitmapExtension,\n ]);\n\n if (isOverflowDefaultBinArrayBitmap(lowerBinArrayIndex)) {\n const bitmapExtensionAccount = accounts[3];\n if (!bitmapExtensionAccount) {\n preInstructions.push(await this.program.methods.initializeBinArrayBitmapExtension().accounts({\n binArrayBitmapExtension,\n funder: payer,\n lbPair: this.pubkey\n }).instruction());\n }\n } else {\n binArrayBitmapExtension = this.program.programId;\n }\n\n const operatorTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n operator,\n true\n );\n const positionOwnerTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n positionOwner,\n true\n );\n\n if (shouldSeedPositionOwner) {\n const positionOwnerTokenXAccount = await this.program.provider.connection.getAccountInfo(positionOwnerTokenX);\n if (positionOwnerTokenXAccount) {\n const account = AccountLayout.decode(positionOwnerTokenXAccount.data);\n if (account.amount == BigInt(0)) {\n // send 1 lamport to position owner token X to prove ownership\n const transferIx = createTransferInstruction(operatorTokenX, positionOwnerTokenX, payer, 1);\n preInstructions.push(transferIx);\n }\n } else {\n const createPositionOwnerTokenXIx = createAssociatedTokenAccountInstruction(payer, positionOwnerTokenX, positionOwner, this.lbPair.tokenXMint);\n preInstructions.push(createPositionOwnerTokenXIx);\n\n // send 1 lamport to position owner token X to prove ownership\n const transferIx = createTransferInstruction(operatorTokenX, positionOwnerTokenX, payer, 1);\n preInstructions.push(transferIx);\n }\n }\n\n const lowerBinArrayAccount = accounts[0];\n const upperBinArrayAccount = accounts[1];\n const positionAccount = accounts[2];\n\n if (!lowerBinArrayAccount) {\n preInstructions.push(\n await this.program.methods\n .initializeBinArray(lowerBinArrayIndex)\n .accounts({\n binArray: lowerBinArray,\n funder: payer,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n\n if (!upperBinArrayAccount) {\n preInstructions.push(\n await this.program.methods\n .initializeBinArray(upperBinArrayIndex)\n .accounts({\n binArray: upperBinArray,\n funder: payer,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n\n if (!positionAccount) {\n preInstructions.push(\n await this.program.methods\n .initializePositionByOperator(\n binId.toNumber(),\n 1,\n feeOwner,\n lockReleasePoint\n )\n .accounts({\n payer,\n base,\n position: positionPda,\n lbPair: this.pubkey,\n owner: positionOwner,\n operator,\n operatorTokenX,\n ownerTokenX: positionOwnerTokenX,\n })\n .instruction()\n );\n }\n\n const binLiquidityDist: BinLiquidityDistribution = {\n binId: binIdNumber,\n distributionX: BASIS_POINT_MAX,\n distributionY: 0,\n };\n\n const addLiquidityParams: LiquidityParameter = {\n amountX: seedAmount,\n amountY: new BN(0),\n binLiquidityDist: [binLiquidityDist],\n };\n\n const depositLiquidityIx = await this.program.methods.addLiquidity(addLiquidityParams).accounts({\n position: positionPda,\n lbPair: this.pubkey,\n binArrayBitmapExtension,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower: lowerBinArray,\n binArrayUpper: upperBinArray,\n sender: operator,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n }).instruction();\n\n return [...preInstructions, depositLiquidityIx];\n }\n\n /**\n * Initializes bin arrays for the given bin array indexes if it wasn't initialized.\n *\n * @param {BN[]} binArrayIndexes - An array of bin array indexes to initialize.\n * @param {PublicKey} funder - The public key of the funder.\n * @return {Promise<TransactionInstruction[]>} An array of transaction instructions to initialize the bin arrays.\n */\n public async initializeBinArrays(binArrayIndexes: BN[], funder: PublicKey) {\n const ixs: TransactionInstruction[] = [];\n\n for (const idx of binArrayIndexes) {\n const [binArray] = deriveBinArray(\n this.pubkey,\n idx,\n this.program.programId\n );\n\n const binArrayAccount =\n await this.program.provider.connection.getAccountInfo(binArray);\n\n if (binArrayAccount === null) {\n ixs.push(\n await this.program.methods\n .initializeBinArray(idx)\n .accounts({\n binArray,\n funder,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n }\n\n return ixs;\n }\n\n /**\n *\n * @param\n * - `lowerBinId`: Lower bin ID of the position. This represent the lowest price of the position\n * - `positionWidth`: Width of the position. This will decide the upper bin id of the position, which represents the highest price of the position. UpperBinId = lowerBinId + positionWidth\n * - `owner`: Owner of the position.\n * - `operator`: Operator of the position. Operator able to manage the position on behalf of the position owner. However, liquidity withdrawal issue by the operator can only send to the position owner.\n * - `base`: Base key\n * - `feeOwner`: Owner of the fees earned by the position.\n * - `payer`: Payer for the position account rental.\n * - `lockReleasePoint`: The lock release point of the position.\n * @returns\n */\n public async initializePositionByOperator({\n lowerBinId,\n positionWidth,\n owner,\n feeOwner,\n base,\n operator,\n payer,\n lockReleasePoint,\n }: {\n lowerBinId: BN;\n positionWidth: BN;\n owner: PublicKey;\n feeOwner: PublicKey;\n operator: PublicKey;\n payer: PublicKey;\n base: PublicKey;\n lockReleasePoint: BN;\n }): Promise<Transaction> {\n const [positionPda, _bump] = derivePosition(\n this.pubkey,\n base,\n lowerBinId,\n positionWidth,\n this.program.programId\n );\n\n const operatorTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n operator,\n true\n );\n\n const ownerTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n owner,\n true\n );\n\n const initializePositionByOperatorTx = await this.program.methods\n .initializePositionByOperator(\n lowerBinId.toNumber(),\n MAX_BIN_PER_POSITION.toNumber(),\n feeOwner,\n lockReleasePoint\n )\n .accounts({\n lbPair: this.pubkey,\n position: positionPda,\n base,\n operator,\n owner,\n ownerTokenX,\n operatorTokenX,\n payer,\n })\n .transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n feePayer: operator,\n blockhash,\n lastValidBlockHeight,\n }).add(initializePositionByOperatorTx);\n }\n\n /**\n * The `claimAllRewards` function to claim swap fees and LM rewards for multiple positions owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the positions.\n * - `positions`: An array of objects of type `PositionData` that represents the positions to claim swap fees and LM rewards from.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllRewards({\n owner,\n positions,\n }: {\n owner: PublicKey;\n positions: LbPosition[];\n }): Promise<Transaction[]> {\n const preInstructions: TransactionInstruction[] = [];\n const pairsToken = [this.tokenX.publicKey, this.tokenY.publicKey];\n const tokensInvolved = [...pairsToken];\n for (let i = 0; i < 2; i++) {\n const rewardMint = this.lbPair.rewardInfos[i].mint;\n if (\n !tokensInvolved.some((pubkey) => rewardMint.equals(pubkey)) &&\n !rewardMint.equals(PublicKey.default)\n ) {\n tokensInvolved.push(this.lbPair.rewardInfos[i].mint);\n }\n }\n\n // Filter only position with fees and/or rewards\n positions = positions.filter(\n ({ positionData: { feeX, feeY, rewardOne, rewardTwo } }) =>\n !feeX.isZero() ||\n !feeY.isZero() ||\n !rewardOne.isZero() ||\n !rewardTwo.isZero()\n );\n\n const feeOwners = [\n ...new Set([\n owner.toBase58(),\n ...positions\n .filter((p) => !p.positionData.feeOwner.equals(PublicKey.default))\n .map((p) => p.positionData.feeOwner.toBase58()),\n ]),\n ].map((pk) => new PublicKey(pk));\n\n const createATAAccAndIx = await Promise.all(\n tokensInvolved\n .map((token) => {\n // There's multiple positions, therefore swap fee ATA might includes account from owner, and customized fee owners\n if (pairsToken.some((p) => p.equals(token))) {\n return feeOwners.map((customOwner) =>\n getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n customOwner,\n owner\n )\n );\n }\n //\n return [\n getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n owner\n ),\n ];\n })\n .flat()\n );\n\n createATAAccAndIx.forEach(({ ix }) => ix && preInstructions.push(ix));\n\n const claimAllSwapFeeTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { feeX, feeY } }) =>\n !feeX.isZero() || !feeY.isZero()\n )\n .map(async (position) => {\n return await this.createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePretIx: false,\n shouldIncludePostIx: false,\n });\n })\n )\n ).flat();\n\n const claimAllLMTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { rewardOne, rewardTwo } }) =>\n !rewardOne.isZero() || !rewardTwo.isZero()\n )\n .map(async (position) => {\n return await this.createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx: false,\n });\n })\n )\n ).flat();\n\n const chunkedClaimAllTx = chunks(\n [...claimAllSwapFeeTxs, ...claimAllLMTxs],\n MAX_CLAIM_ALL_ALLOWED\n );\n\n const postInstructions: TransactionInstruction[] = [];\n if (tokensInvolved.some((pubkey) => pubkey.equals(NATIVE_MINT))) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return Promise.all(\n chunkedClaimAllTx.map(async (claimAllTx) => {\n const mainIxs = claimAllTx.map((t) => t.instructions).flat();\n const instructions = [\n ...preInstructions,\n ...mainIxs,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n owner\n );\n\n const tx = new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n }).add(setCUIx);\n\n if (preInstructions.length) tx.add(...preInstructions);\n tx.add(...claimAllTx);\n if (postInstructions.length) tx.add(...postInstructions);\n\n return tx;\n })\n );\n }\n\n public canSyncWithMarketPrice(marketPrice: number, activeBinId: number) {\n const marketPriceBinId = this.getBinIdFromPrice(\n Number(\n DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n marketPrice\n )\n ),\n false\n );\n\n const marketPriceBinArrayIndex = binIdToBinArrayIndex(\n new BN(marketPriceBinId)\n );\n\n const swapForY = marketPriceBinId < activeBinId;\n const toBinArrayIndex = findNextBinArrayIndexWithLiquidity(\n swapForY,\n new BN(activeBinId),\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null\n );\n if (toBinArrayIndex === null) return true;\n\n return swapForY\n ? marketPriceBinArrayIndex.gt(toBinArrayIndex)\n : marketPriceBinArrayIndex.lt(toBinArrayIndex);\n }\n\n /**\n * The `syncWithMarketPrice` function is used to sync the liquidity pool with the market price.\n * @param\n * - `marketPrice`: The market price to sync with.\n * - `owner`: The public key of the owner of the liquidity pool.\n * @returns {Promise<Transaction>}\n */\n public async syncWithMarketPrice(marketPrice: number, owner: PublicKey) {\n const marketPriceBinId = this.getBinIdFromPrice(\n Number(\n DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n marketPrice\n )\n ),\n false\n );\n const activeBin = await this.getActiveBin();\n const activeBinId = activeBin.binId;\n\n if (!this.canSyncWithMarketPrice(marketPrice, activeBinId)) {\n throw new Error(\n \"Unable to sync with market price due to bin with liquidity between current and market price bin\"\n );\n }\n\n const fromBinArrayIndex = binIdToBinArrayIndex(new BN(activeBinId));\n\n const swapForY = marketPriceBinId < activeBinId;\n const toBinArrayIndex = findNextBinArrayIndexWithLiquidity(\n swapForY,\n new BN(activeBinId),\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null\n );\n const accountsToFetch = [];\n const [binArrayBitMapExtensionPubkey] = deriveBinArrayBitmapExtension(\n this.pubkey,\n this.program.programId\n );\n accountsToFetch.push(binArrayBitMapExtensionPubkey);\n const [fromBinArrayPubkey] = deriveBinArray(\n this.pubkey,\n fromBinArrayIndex,\n this.program.programId\n );\n accountsToFetch.push(fromBinArrayPubkey);\n const toBinArrayPubkey = (() => {\n if (!toBinArrayIndex) return null;\n\n const [toBinArrayPubkey] = deriveBinArray(\n this.pubkey,\n toBinArrayIndex,\n this.program.programId\n );\n\n accountsToFetch.push(toBinArrayPubkey);\n\n return toBinArrayPubkey;\n })();\n\n const binArrayAccounts =\n await this.program.provider.connection.getMultipleAccountsInfo(\n accountsToFetch\n );\n\n let fromBinArray: PublicKey | null = null;\n let toBinArray: PublicKey | null = null;\n let binArrayBitmapExtension: PublicKey | null = null;\n if (!!binArrayAccounts?.[0]) {\n binArrayBitmapExtension = binArrayBitMapExtensionPubkey;\n }\n if (!!binArrayAccounts?.[1]) {\n fromBinArray = fromBinArrayPubkey;\n }\n\n if (!!binArrayAccounts?.[2] && !!toBinArrayIndex) {\n toBinArray = toBinArrayPubkey;\n }\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n const syncWithMarketPriceTx = await this.program.methods\n .goToABin(marketPriceBinId)\n .accounts({\n lbPair: this.pubkey,\n binArrayBitmapExtension,\n fromBinArray,\n toBinArray,\n })\n .transaction();\n\n return new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n }).add(syncWithMarketPriceTx);\n }\n\n public async getMaxPriceInBinArrays(\n binArrayAccounts: BinArrayAccount[]\n ): Promise<string> {\n // Don't mutate\n const sortedBinArrays = [...binArrayAccounts].sort(\n ({ account: { index: indexA } }, { account: { index: indexB } }) =>\n indexA.toNumber() - indexB.toNumber()\n );\n let count = sortedBinArrays.length - 1;\n let binPriceWithLastLiquidity;\n while (count >= 0) {\n const binArray = sortedBinArrays[count];\n if (binArray) {\n const bins = binArray.account.bins;\n if (bins.every(({ amountX }) => amountX.isZero())) {\n count--;\n } else {\n const lastBinWithLiquidityIndex = bins.findLastIndex(\n ({ amountX }) => !amountX.isZero()\n );\n binPriceWithLastLiquidity =\n bins[lastBinWithLiquidityIndex].price.toString();\n count = -1;\n }\n }\n }\n\n return this.fromPricePerLamport(\n Number(binPriceWithLastLiquidity) / (2 ** 64 - 1)\n );\n }\n\n public getAmountOutWithdrawSingleSide(\n maxLiquidityShare: BN,\n price: BN,\n bin: Bin,\n isWithdrawForY: boolean\n ) {\n const amountX = mulDiv(\n maxLiquidityShare,\n bin.amountX,\n bin.liquiditySupply,\n Rounding.Down\n );\n const amountY = mulDiv(\n maxLiquidityShare,\n bin.amountY,\n bin.liquiditySupply,\n Rounding.Down\n );\n\n const amount0 = isWithdrawForY ? amountX : amountY;\n const amount1 = isWithdrawForY ? amountY : amountX;\n const remainAmountX = bin.amountX.sub(amountX);\n const remainAmountY = bin.amountY.sub(amountY);\n\n if (amount0.eq(new BN(0))) {\n return {\n withdrawAmount: amount1,\n };\n }\n\n let maxAmountOut = isWithdrawForY ? remainAmountY : remainAmountX;\n let maxAmountIn = isWithdrawForY\n ? shlDiv(remainAmountY, price, SCALE_OFFSET, Rounding.Up)\n : mulShr(remainAmountX, price, SCALE_OFFSET, Rounding.Up);\n\n let maxFee = computeFee(\n this.lbPair.binStep,\n this.lbPair.parameters,\n this.lbPair.vParameters,\n maxAmountIn\n );\n\n maxAmountIn = maxAmountIn.add(maxFee);\n\n if (amount0.gt(maxAmountIn)) {\n return {\n withdrawAmount: amount1.add(maxAmountOut),\n };\n }\n const fee = computeFeeFromAmount(\n this.lbPair.binStep,\n this.lbPair.parameters,\n this.lbPair.vParameters,\n amount0\n );\n const amount0AfterFee = amount0.sub(fee);\n const amountOut = isWithdrawForY\n ? mulShr(price, amount0AfterFee, SCALE_OFFSET, Rounding.Down)\n : shlDiv(amount0AfterFee, price, SCALE_OFFSET, Rounding.Down);\n\n return {\n withdrawAmount: amount1.add(amountOut),\n };\n }\n\n public async getWithdrawSingleSideAmount(\n positionPubkey: PublicKey,\n isWithdrawForY: boolean\n ) {\n let totalWithdrawAmount = new BN(0);\n let lowerBinArray: BinArray | undefined | null;\n let upperBinArray: BinArray | undefined | null;\n\n const position = await this.program.account.positionV2.fetch(\n positionPubkey\n );\n const lowerBinArrayIdx = binIdToBinArrayIndex(new BN(position.lowerBinId));\n const [lowerBinArrayPubKey] = deriveBinArray(\n position.lbPair,\n lowerBinArrayIdx,\n this.program.programId\n );\n const upperBinArrayIdx = lowerBinArrayIdx.add(new BN(1));\n const [upperBinArrayPubKey] = deriveBinArray(\n position.lbPair,\n upperBinArrayIdx,\n this.program.programId\n );\n\n [lowerBinArray, upperBinArray] =\n await this.program.account.binArray.fetchMultiple([\n lowerBinArrayPubKey,\n upperBinArrayPubKey,\n ]);\n\n for (let idx = 0; idx < position.liquidityShares.length; idx++) {\n const shareToRemove = position.liquidityShares[idx];\n\n if (shareToRemove.eq(new BN(0))) {\n continue;\n }\n\n const binId = new BN(position.lowerBinId).add(new BN(idx));\n const binArrayIndex = binIdToBinArrayIndex(binId);\n const binArray = binArrayIndex.eq(lowerBinArrayIdx)\n ? lowerBinArray\n : upperBinArray;\n\n if (!binArray) {\n throw new Error(\"BinArray not found\");\n }\n\n const bin = getBinFromBinArray(binId.toNumber(), binArray);\n\n if (isWithdrawForY) {\n if (binId.gt(new BN(this.lbPair.activeId))) {\n break;\n }\n } else {\n if (binId.lt(new BN(this.lbPair.activeId))) {\n continue;\n }\n }\n\n const price = getQPriceFromId(binId, new BN(this.lbPair.binStep));\n const { withdrawAmount } = this.getAmountOutWithdrawSingleSide(\n shareToRemove,\n price,\n bin,\n isWithdrawForY\n );\n\n totalWithdrawAmount = totalWithdrawAmount.add(withdrawAmount);\n }\n return totalWithdrawAmount;\n }\n\n /**\n *\n * @param swapInitiator Address of the swap initiator\n * @returns\n */\n public isSwapDisabled(swapInitiator: PublicKey) {\n if (this.lbPair.status == PairStatus.Disabled) {\n return true;\n }\n\n if (this.lbPair.pairType == PairType.Permissioned) {\n const currentPoint =\n this.lbPair.activationType == ActivationType.Slot\n ? this.clock.slot\n : this.clock.unixTimestamp;\n\n const preActivationSwapPoint = this.lbPair.activationPoint.sub(\n this.lbPair.preActivationDuration\n );\n\n const activationPoint =\n !this.lbPair.preActivationSwapAddress.equals(PublicKey.default) &&\n this.lbPair.preActivationSwapAddress.equals(swapInitiator)\n ? preActivationSwapPoint\n : this.lbPair.activationPoint;\n\n if (currentPoint < activationPoint) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Private static method */\n\n private static async getBinArrays(\n program: ClmmProgram,\n lbPairPubkey: PublicKey\n ): Promise<Array<BinArrayAccount>> {\n return program.account.binArray.all([\n {\n memcmp: {\n bytes: bs58.encode(lbPairPubkey.toBuffer()),\n offset: 8 + 16,\n },\n },\n ]);\n }\n\n private static async getClaimableLMReward(\n program: ClmmProgram,\n positionVersion: PositionVersion,\n lbPair: LbPair,\n onChainTimestamp: number,\n position: Position,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ): Promise<LMRewards> {\n const lowerBinArrayIdx = binIdToBinArrayIndex(new BN(position.lowerBinId));\n\n let rewards = [new BN(0), new BN(0)];\n\n let _lowerBinArray: BinArray | undefined | null = lowerBinArray;\n let _upperBinArray: BinArray | undefined | null = upperBinArray;\n if (!lowerBinArray || !upperBinArray) {\n const lowerBinArrayIdx = binIdToBinArrayIndex(\n new BN(position.lowerBinId)\n );\n const [lowerBinArray] = deriveBinArray(\n position.lbPair,\n lowerBinArrayIdx,\n program.programId\n );\n\n const upperBinArrayIdx = lowerBinArrayIdx.add(new BN(1));\n const [upperBinArray] = deriveBinArray(\n position.lbPair,\n upperBinArrayIdx,\n program.programId\n );\n\n [_lowerBinArray, _upperBinArray] =\n await program.account.binArray.fetchMultiple([\n lowerBinArray,\n upperBinArray,\n ]);\n }\n\n if (!_lowerBinArray || !_upperBinArray)\n throw new Error(\"BinArray not found\");\n\n for (let i = position.lowerBinId; i <= position.upperBinId; i++) {\n const binArrayIdx = binIdToBinArrayIndex(new BN(i));\n const binArray = binArrayIdx.eq(lowerBinArrayIdx)\n ? _lowerBinArray\n : _upperBinArray;\n const binState = getBinFromBinArray(i, binArray);\n const binIdxInPosition = i - position.lowerBinId;\n\n const positionRewardInfo = position.rewardInfos[binIdxInPosition];\n const liquidityShare =\n positionVersion === PositionVersion.V1\n ? position.liquidityShares[binIdxInPosition]\n : position.liquidityShares[binIdxInPosition].shrn(64);\n\n for (let j = 0; j < 2; j++) {\n const pairRewardInfo = lbPair.rewardInfos[j];\n\n if (!pairRewardInfo.mint.equals(PublicKey.default)) {\n let rewardPerTokenStored = binState.rewardPerTokenStored[j];\n\n if (i == lbPair.activeId && !binState.liquiditySupply.isZero()) {\n const currentTime = new BN(\n Math.min(\n onChainTimestamp,\n pairRewardInfo.rewardDurationEnd.toNumber()\n )\n );\n const delta = currentTime.sub(pairRewardInfo.lastUpdateTime);\n const liquiditySupply =\n binArray.version == 0\n ? binState.liquiditySupply\n : binState.liquiditySupply.shrn(64);\n const rewardPerTokenStoredDelta = pairRewardInfo.rewardRate\n .mul(delta)\n .div(new BN(15))\n .div(liquiditySupply);\n rewardPerTokenStored = rewardPerTokenStored.add(\n rewardPerTokenStoredDelta\n );\n }\n\n const delta = rewardPerTokenStored.sub(\n positionRewardInfo.rewardPerTokenCompletes[j]\n );\n const newReward = mulShr(\n delta,\n liquidityShare,\n SCALE_OFFSET,\n Rounding.Down\n );\n rewards[j] = rewards[j]\n .add(newReward)\n .add(positionRewardInfo.rewardPendings[j]);\n }\n }\n }\n\n return {\n rewardOne: rewards[0],\n rewardTwo: rewards[1],\n };\n }\n\n private static async getClaimableSwapFee(\n program: ClmmProgram,\n positionVersion: PositionVersion,\n position: Position,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ): Promise<SwapFee> {\n const lowerBinArrayIdx = binIdToBinArrayIndex(new BN(position.lowerBinId));\n\n let feeX = new BN(0);\n let feeY = new BN(0);\n\n let _lowerBinArray: BinArray | undefined | null = lowerBinArray;\n let _upperBinArray: BinArray | undefined | null = upperBinArray;\n if (!lowerBinArray || !upperBinArray) {\n const lowerBinArrayIdx = binIdToBinArrayIndex(\n new BN(position.lowerBinId)\n );\n const [lowerBinArray] = deriveBinArray(\n position.lbPair,\n lowerBinArrayIdx,\n program.programId\n );\n\n const upperBinArrayIdx = lowerBinArrayIdx.add(new BN(1));\n const [upperBinArray] = deriveBinArray(\n position.lbPair,\n upperBinArrayIdx,\n program.programId\n );\n\n [_lowerBinArray, _upperBinArray] =\n await program.account.binArray.fetchMultiple([\n lowerBinArray,\n upperBinArray,\n ]);\n }\n\n if (!_lowerBinArray || !_upperBinArray)\n throw new Error(\"BinArray not found\");\n\n for (let i = position.lowerBinId; i <= position.upperBinId; i++) {\n const binArrayIdx = binIdToBinArrayIndex(new BN(i));\n const binArray = binArrayIdx.eq(lowerBinArrayIdx)\n ? _lowerBinArray\n : _upperBinArray;\n const binState = getBinFromBinArray(i, binArray);\n const binIdxInPosition = i - position.lowerBinId;\n\n const feeInfos = position.feeInfos[binIdxInPosition];\n const liquidityShare =\n positionVersion === PositionVersion.V1\n ? position.liquidityShares[binIdxInPosition]\n : position.liquidityShares[binIdxInPosition].shrn(64);\n\n const newFeeX = mulShr(\n liquidityShare,\n binState.feeAmountXPerTokenStored.sub(feeInfos.feeXPerTokenComplete),\n SCALE_OFFSET,\n Rounding.Down\n );\n\n const newFeeY = mulShr(\n liquidityShare,\n binState.feeAmountYPerTokenStored.sub(feeInfos.feeYPerTokenComplete),\n SCALE_OFFSET,\n Rounding.Down\n );\n\n feeX = feeX.add(newFeeX).add(feeInfos.feeXPending);\n feeY = feeY.add(newFeeY).add(feeInfos.feeYPending);\n }\n\n return { feeX, feeY };\n }\n\n private static async processPosition(\n program: ClmmProgram,\n version: PositionVersion,\n lbPair: LbPair,\n onChainTimestamp: number,\n position: Position,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n lowerBinArray: BinArray,\n upperBinArray: BinArray,\n feeOwner: PublicKey\n ): Promise<PositionData | null> {\n const {\n lowerBinId,\n upperBinId,\n liquidityShares: posShares,\n lastUpdatedAt,\n totalClaimedFeeXAmount,\n totalClaimedFeeYAmount,\n } = position;\n\n const bins = this.getBinsBetweenLowerAndUpperBound(\n lbPair,\n lowerBinId,\n upperBinId,\n baseTokenDecimal,\n quoteTokenDecimal,\n lowerBinArray,\n upperBinArray\n );\n\n if (!bins.length) return null;\n\n /// assertion\n if (\n bins[0].binId !== lowerBinId ||\n bins[bins.length - 1].binId !== upperBinId\n )\n throw new Error(\"Bin ID mismatch\");\n\n const positionData: PositionBinData[] = [];\n let totalXAmount = new Decimal(0);\n let totalYAmount = new Decimal(0);\n\n bins.forEach((bin, idx) => {\n const binSupply = new Decimal(bin.supply.toString());\n\n const posShare = new Decimal(posShares[idx].toString());\n const positionXAmount = binSupply.eq(new Decimal(\"0\"))\n ? new Decimal(\"0\")\n : posShare.mul(bin.xAmount.toString()).div(binSupply);\n const positionYAmount = binSupply.eq(new Decimal(\"0\"))\n ? new Decimal(\"0\")\n : posShare.mul(bin.yAmount.toString()).div(binSupply);\n\n totalXAmount = totalXAmount.add(positionXAmount);\n totalYAmount = totalYAmount.add(positionYAmount);\n\n positionData.push({\n binId: bin.binId,\n price: bin.price,\n pricePerToken: bin.pricePerToken,\n binXAmount: bin.xAmount.toString(),\n binYAmount: bin.yAmount.toString(),\n binLiquidity: binSupply.toString(),\n positionLiquidity: posShare.toString(),\n positionXAmount: positionXAmount.toString(),\n positionYAmount: positionYAmount.toString(),\n });\n });\n\n const { feeX, feeY } = await this.getClaimableSwapFee(\n program,\n version,\n position,\n lowerBinArray,\n upperBinArray\n );\n const { rewardOne, rewardTwo } = await this.getClaimableLMReward(\n program,\n version,\n lbPair,\n onChainTimestamp,\n position,\n lowerBinArray,\n upperBinArray\n );\n\n return {\n totalXAmount: totalXAmount.toString(),\n totalYAmount: totalYAmount.toString(),\n positionBinData: positionData,\n lastUpdatedAt,\n lowerBinId,\n upperBinId,\n feeX,\n feeY,\n rewardOne,\n rewardTwo,\n feeOwner,\n totalClaimedFeeXAmount,\n totalClaimedFeeYAmount,\n };\n }\n\n private static getBinsBetweenLowerAndUpperBound(\n lbPair: LbPair,\n lowerBinId: number,\n upperBinId: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n lowerBinArrays: BinArray,\n upperBinArrays: BinArray\n ): BinLiquidity[] {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n let bins: BinLiquidity[] = [];\n if (lowerBinArrayIndex.eq(upperBinArrayIndex)) {\n const binArray = lowerBinArrays;\n\n const [lowerBinIdForBinArray] = getBinArrayLowerUpperBinId(\n binArray.index\n );\n\n binArray.bins.forEach((bin, idx) => {\n const binId = lowerBinIdForBinArray.toNumber() + idx;\n\n if (binId >= lowerBinId && binId <= upperBinId) {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n lbPair.binStep\n ).toString();\n bins.push({\n binId,\n xAmount: bin.amountX,\n yAmount: bin.amountY,\n supply: bin.liquiditySupply,\n price: pricePerLamport,\n version: binArray.version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n });\n }\n });\n } else {\n const binArrays = [lowerBinArrays, upperBinArrays];\n\n binArrays.forEach((binArray) => {\n const [lowerBinIdForBinArray] = getBinArrayLowerUpperBinId(\n binArray.index\n );\n binArray.bins.forEach((bin, idx) => {\n const binId = lowerBinIdForBinArray.toNumber() + idx;\n if (binId >= lowerBinId && binId <= upperBinId) {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n lbPair.binStep\n ).toString();\n bins.push({\n binId,\n xAmount: bin.amountX,\n yAmount: bin.amountY,\n supply: bin.liquiditySupply,\n price: pricePerLamport,\n version: binArray.version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n });\n }\n });\n });\n }\n\n return bins;\n }\n\n /** Private method */\n\n private processXYAmountDistribution(xYAmountDistribution: BinAndAmount[]) {\n let currentBinId: number | null = null;\n const xAmountDistribution: BN[] = [];\n const yAmountDistribution: BN[] = [];\n const binIds: number[] = [];\n\n xYAmountDistribution.forEach((binAndAmount) => {\n xAmountDistribution.push(binAndAmount.xAmountBpsOfTotal);\n yAmountDistribution.push(binAndAmount.yAmountBpsOfTotal);\n binIds.push(binAndAmount.binId);\n\n if (currentBinId && binAndAmount.binId !== currentBinId + 1) {\n throw new Error(\"Discontinuous Bin ID\");\n } else {\n currentBinId = binAndAmount.binId;\n }\n });\n\n return {\n lowerBinId: xYAmountDistribution[0].binId,\n upperBinId: xYAmountDistribution[xYAmountDistribution.length - 1].binId,\n xAmountDistribution,\n yAmountDistribution,\n binIds,\n };\n }\n\n private async getBins(\n lbPairPubKey: PublicKey,\n lowerBinId: number,\n upperBinId: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ) {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const hasCachedLowerBinArray = lowerBinArray != null;\n const hasCachedUpperBinArray = upperBinArray != null;\n const isSingleBinArray = lowerBinArrayIndex.eq(upperBinArrayIndex);\n\n const lowerBinArrayIndexOffset = hasCachedLowerBinArray ? 1 : 0;\n const upperBinArrayIndexOffset = hasCachedUpperBinArray ? -1 : 0;\n\n const binArrayPubkeys = range(\n lowerBinArrayIndex.toNumber() + lowerBinArrayIndexOffset,\n upperBinArrayIndex.toNumber() + upperBinArrayIndexOffset,\n i => deriveBinArray(lbPairPubKey, new BN(i), this.program.programId)[0]\n );\n const fetchedBinArrays = binArrayPubkeys.length !== 0 ?\n await this.program.account.binArray.fetchMultiple(binArrayPubkeys) : [];\n const binArrays = [\n ...(hasCachedLowerBinArray ? [lowerBinArray] : []),\n ...fetchedBinArrays,\n ...((hasCachedUpperBinArray && !isSingleBinArray) ? [upperBinArray] : [])\n ];\n\n const binsById = new Map(binArrays\n .filter(x => x != null)\n .flatMap(({ bins, index }) => {\n const [lowerBinId] = getBinArrayLowerUpperBinId(index);\n return bins.map((b, i) => [lowerBinId.toNumber() + i, b] as [number, Bin]);\n }));\n const version = binArrays.find(binArray => binArray != null)?.version ?? 1;\n\n return Array.from(enumerateBins(\n binsById,\n lowerBinId,\n upperBinId,\n this.lbPair.binStep,\n baseTokenDecimal,\n quoteTokenDecimal,\n version,\n ));\n }\n\n private async binArraysToBeCreate(\n lowerBinArrayIndex: BN,\n upperBinArrayIndex: BN\n ) {\n const binArrayIndexes: BN[] = Array.from(\n { length: upperBinArrayIndex.sub(lowerBinArrayIndex).toNumber() + 1 },\n (_, index) => index + lowerBinArrayIndex.toNumber()\n ).map((idx) => new BN(idx));\n\n const binArrays: PublicKey[] = [];\n for (const idx of binArrayIndexes) {\n const [binArrayPubKey] = deriveBinArray(\n this.pubkey,\n idx,\n this.program.programId\n );\n binArrays.push(binArrayPubKey);\n }\n\n const binArrayAccounts =\n await this.program.provider.connection.getMultipleAccountsInfo(binArrays);\n\n return binArrayAccounts\n .filter((binArray) => binArray === null)\n .map((_, index) => binArrays[index]);\n }\n\n private async createBinArraysIfNeeded(\n upperBinArrayIndex: BN,\n lowerBinArrayIndex: BN,\n funder: PublicKey\n ): Promise<TransactionInstruction[]> {\n const ixs: TransactionInstruction[] = [];\n\n const binArrayIndexes: BN[] = Array.from(\n { length: upperBinArrayIndex.sub(lowerBinArrayIndex).toNumber() + 1 },\n (_, index) => index + lowerBinArrayIndex.toNumber()\n ).map((idx) => new BN(idx));\n\n for (const idx of binArrayIndexes) {\n const [binArray] = deriveBinArray(\n this.pubkey,\n idx,\n this.program.programId\n );\n\n const binArrayAccount =\n await this.program.provider.connection.getAccountInfo(binArray);\n\n if (binArrayAccount === null) {\n ixs.push(\n await this.program.methods\n .initializeBinArray(idx)\n .accounts({\n binArray,\n funder,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n }\n return ixs;\n }\n\n private updateVolatilityAccumulator(\n vParameter: vParameters,\n sParameter: sParameters,\n activeId: number\n ) {\n const deltaId = Math.abs(vParameter.indexReference - activeId);\n const newVolatilityAccumulator =\n vParameter.volatilityReference + deltaId * BASIS_POINT_MAX;\n\n vParameter.volatilityAccumulator = Math.min(\n newVolatilityAccumulator,\n sParameter.maxVolatilityAccumulator\n );\n }\n\n private updateReference(\n activeId: number,\n vParameter: vParameters,\n sParameter: sParameters,\n currentTimestamp: number\n ) {\n const elapsed =\n currentTimestamp - vParameter.lastUpdateTimestamp.toNumber();\n\n if (elapsed >= sParameter.filterPeriod) {\n vParameter.indexReference = activeId;\n if (elapsed < sParameter.decayPeriod) {\n const decayedVolatilityReference = Math.floor(\n (vParameter.volatilityAccumulator * sParameter.reductionFactor) /\n BASIS_POINT_MAX\n );\n vParameter.volatilityReference = decayedVolatilityReference;\n } else {\n vParameter.volatilityReference = 0;\n }\n }\n }\n\n private async createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx = true,\n }: {\n owner: PublicKey;\n position: LbPosition;\n shouldIncludePreIx?: boolean;\n }) {\n const lowerBinArrayIndex = binIdToBinArrayIndex(\n new BN(position.positionData.lowerBinId)\n );\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const claimTransactions: Transaction[] = [];\n for (let i = 0; i < 2; i++) {\n const rewardInfo = this.lbPair.rewardInfos[i];\n if (!rewardInfo || rewardInfo.mint.equals(PublicKey.default)) continue;\n\n const preInstructions = [];\n const { ataPubKey, ix } = await getOrCreateATAInstruction(\n this.program.provider.connection,\n rewardInfo.mint,\n owner\n );\n ix && preInstructions.push(ix);\n const claimTransaction = await this.program.methods\n .claimReward(new BN(i))\n .accounts({\n lbPair: this.pubkey,\n sender: owner,\n position: position.publicKey,\n binArrayLower,\n binArrayUpper,\n rewardVault: rewardInfo.vault,\n rewardMint: rewardInfo.mint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userTokenAccount: ataPubKey,\n })\n .preInstructions(shouldIncludePreIx ? preInstructions : [])\n .transaction();\n claimTransactions.push(claimTransaction);\n }\n\n return claimTransactions;\n }\n\n private async createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePretIx = true,\n shouldIncludePostIx = true,\n }: {\n owner: PublicKey;\n position: LbPosition;\n shouldIncludePretIx?: boolean;\n shouldIncludePostIx?: boolean;\n }) {\n const { lowerBinId, feeOwner } = position.positionData;\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const [reserveX] = deriveReserve(\n this.tokenX.publicKey,\n this.pubkey,\n this.program.programId\n );\n const [reserveY] = deriveReserve(\n this.tokenY.publicKey,\n this.pubkey,\n this.program.programId\n );\n\n const walletToReceiveFee = feeOwner.equals(PublicKey.default)\n ? owner\n : feeOwner;\n\n const preInstructions: TransactionInstruction[] = [];\n const [\n { ataPubKey: userTokenX, ix: createInTokenAccountIx },\n { ataPubKey: userTokenY, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n walletToReceiveFee,\n owner\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n walletToReceiveFee,\n owner\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const claimFeeTx = await this.program.methods\n .claimFee()\n .accounts({\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n sender: owner,\n position: position.publicKey,\n reserveX,\n reserveY,\n tokenProgram: TOKEN_PROGRAM_ID,\n tokenXMint: this.tokenX.publicKey,\n tokenYMint: this.tokenY.publicKey,\n userTokenX,\n userTokenY,\n })\n .preInstructions(shouldIncludePretIx ? preInstructions : [])\n .postInstructions(shouldIncludePostIx ? postInstructions : [])\n .transaction();\n\n return claimFeeTx;\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { IDL } from \"../idl\";\nimport { BN } from \"@coral-xyz/anchor\";\n\nexport const LBCLMM_PROGRAM_IDS = {\n devnet: \"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo\",\n localhost: \"LbVRzDTvBDEcrthxfZ4RL6yiq3uZw8bS6MwtdY6UhFQ\",\n \"mainnet-beta\": \"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo\",\n};\n\nexport const ADMIN = {\n devnet: \"6WaLrrRfReGKBYUSkmx2K6AuT21ida4j8at2SUiZdXu8\",\n localhost: \"bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1\",\n};\n\nexport enum Network {\n MAINNET = \"mainnet-beta\",\n TESTNET = \"testnet\",\n DEVNET = \"devnet\",\n LOCAL = \"localhost\",\n}\n\nexport const BASIS_POINT_MAX = 10000;\nexport const SCALE_OFFSET = 64;\nexport const SCALE = new BN(1).shln(SCALE_OFFSET);\n\nexport const FEE_PRECISION = new BN(1_000_000_000);\nexport const MAX_FEE_RATE = new BN(100_000_000);\nexport const BIN_ARRAY_FEE = 0.07054656;\nexport const POSITION_FEE = 0.0565152;\n\nconst CONSTANTS = Object.entries(IDL.constants);\n\nexport const MAX_BIN_ARRAY_SIZE = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"MAX_BIN_PER_ARRAY\")?.[1].value ?? 0\n);\nexport const MAX_BIN_PER_POSITION = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"MAX_BIN_PER_POSITION\")?.[1].value ?? 0\n);\nexport const BIN_ARRAY_BITMAP_SIZE = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"BIN_ARRAY_BITMAP_SIZE\")?.[1].value ?? 0\n);\nexport const EXTENSION_BINARRAY_BITMAP_SIZE = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"EXTENSION_BINARRAY_BITMAP_SIZE\")?.[1]\n .value ?? 0\n);\n\nexport const SIMULATION_USER = new PublicKey(\n \"HrY9qR5TiB2xPzzvbBu5KrBorMfYGQXh9osXydz4jy9s\"\n);\n\nexport const PRECISION = 18446744073709551616;\n\nexport const MAX_CLAIM_ALL_ALLOWED = 3;\n\nexport const MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX = 26;\nexport const MAX_BIN_PER_TX = 69;\n\nexport const MAX_ACTIVE_BIN_SLIPPAGE = 3;\n\nexport const ILM_BASE = new PublicKey(\n \"MFGQxwAmB91SwuYX36okv2Qmdc9aMuHTwWGUrp4AtB1\"\n);\n\nexport const MAX_EXTRA_BIN_ARRAYS = 3;\n","export type LbClmm = {\n \"version\": \"0.8.6\",\n \"name\": \"lb_clmm\",\n \"constants\": [\n {\n \"name\": \"BASIS_POINT_MAX\",\n \"type\": \"i32\",\n \"value\": \"10000\"\n },\n {\n \"name\": \"MAX_BIN_PER_ARRAY\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MAX_BIN_PER_POSITION\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MIN_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"- 443636\"\n },\n {\n \"name\": \"MAX_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"443636\"\n },\n {\n \"name\": \"MAX_FEE_RATE\",\n \"type\": \"u64\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"FEE_PRECISION\",\n \"type\": \"u64\",\n \"value\": \"1_000_000_000\"\n },\n {\n \"name\": \"MAX_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2_500\"\n },\n {\n \"name\": \"HOST_FEE_BPS\",\n \"type\": \"u16\",\n \"value\": \"2_000\"\n },\n {\n \"name\": \"NUM_REWARDS\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"2\"\n },\n {\n \"name\": \"MIN_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"1\"\n },\n {\n \"name\": \"MAX_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"31536000\"\n },\n {\n \"name\": \"EXTENSION_BINARRAY_BITMAP_SIZE\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"12\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SIZE\",\n \"type\": \"i32\",\n \"value\": \"512\"\n },\n {\n \"name\": \"MAX_REWARD_BIN_SPLIT\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"15\"\n },\n {\n \"name\": \"ILM_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2000\"\n },\n {\n \"name\": \"PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"500\"\n },\n {\n \"name\": \"MAX_BIN_STEP\",\n \"type\": \"u16\",\n \"value\": \"400\"\n },\n {\n \"name\": \"MAX_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"MIN_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000\"\n },\n {\n \"name\": \"MINIMUM_LIQUIDITY\",\n \"type\": \"u128\",\n \"value\": \"1_000_000\"\n },\n {\n \"name\": \"BIN_ARRAY\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 110, 95, 97, 114, 114, 97, 121]\"\n },\n {\n \"name\": \"ORACLE\",\n \"type\": \"bytes\",\n \"value\": \"[111, 114, 97, 99, 108, 101]\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SEED\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 116, 109, 97, 112]\"\n },\n {\n \"name\": \"PRESET_PARAMETER\",\n \"type\": \"bytes\",\n \"value\": \"[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]\"\n },\n {\n \"name\": \"POSITION\",\n \"type\": \"bytes\",\n \"value\": \"[112, 111, 115, 105, 116, 105, 111, 110]\"\n }\n ],\n \"instructions\": [\n {\n \"name\": \"initializeLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"presetParameter\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"initializePermissionLbPair\",\n \"accounts\": [\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ixData\",\n \"type\": {\n \"defined\": \"InitPermissionPairIx\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeCustomizablePermissionlessLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": \"CustomizableParams\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeBinArrayBitmapExtension\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"docs\": [\n \"Initialize an account to store if a bin array is initialized.\"\n ]\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"initializeBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n }\n ]\n },\n {\n \"name\": \"addLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByWeight\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByWeight\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategy\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategy\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategyOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategyOneSide\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityOneSideParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"removeLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binLiquidityRemoval\",\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityReduction\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initializePosition\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionPda\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"owner\"\n ]\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionByOperator\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"operator\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"operator\"\n ]\n },\n {\n \"name\": \"operatorTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"ownerTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"feeOwner\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"updatePositionOperator\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"operator\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"swap\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"minAmountOut\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapExactOut\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"maxInAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"outAmount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapWithPriceImpact\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"type\": {\n \"option\": \"i32\"\n }\n },\n {\n \"name\": \"maxPriceImpactBps\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"withdrawProtocolFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializeReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"fundReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"carryForward\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"updateRewardFunder\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"updateRewardDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"closePosition\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateBaseFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"BaseFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"updateDynamicFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"DynamicFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"increaseOracleLength\",\n \"accounts\": [\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lengthToAdd\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ix\",\n \"type\": {\n \"defined\": \"InitPresetParametersIx\"\n }\n }\n ]\n },\n {\n \"name\": \"closePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"removeAllLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"setPairStatus\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"migratePosition\",\n \"accounts\": [\n {\n \"name\": \"positionV2\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"positionV1\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"migrateBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateFeesAndRewards\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"withdrawIneligibleReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setActivationPoint\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"activationPoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"removeLiquidityByRange\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSidePrecise\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"parameter\",\n \"type\": {\n \"defined\": \"AddLiquiditySingleSidePreciseParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"goToABin\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"fromBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"toBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationSwapAddress\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationSwapAddress\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"setPairStatusPermissionless\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"binArrayBitmapExtension\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"positiveBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is positive\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n },\n {\n \"name\": \"negativeBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is negative\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"binArray\",\n \"docs\": [\n \"An account to contain a range of bin. For example: Bin 100 <-> 200.\",\n \"For example:\",\n \"BinArray index: 0 contains bin 0 <-> 599\",\n \"index: 2 contains bin 600 <-> 1199, ...\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"Version of binArray\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"bins\",\n \"type\": {\n \"array\": [\n {\n \"defined\": \"Bin\"\n },\n 70\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"parameters\",\n \"type\": {\n \"defined\": \"StaticParameters\"\n }\n },\n {\n \"name\": \"vParameters\",\n \"type\": {\n \"defined\": \"VariableParameters\"\n }\n },\n {\n \"name\": \"bumpSeed\",\n \"type\": {\n \"array\": [\n \"u8\",\n 1\n ]\n }\n },\n {\n \"name\": \"binStepSeed\",\n \"docs\": [\n \"Bin step signer seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"pairType\",\n \"docs\": [\n \"Type of the pair\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"status\",\n \"docs\": [\n \"Status of the pair. Check PairStatus enum.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"requireBaseFactorSeed\",\n \"docs\": [\n \"Require base factor seed\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"baseFactorSeed\",\n \"docs\": [\n \"Base factor seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Allow pool creator to enable/disable pool with restricted validation. Only applicable for customizable permissionless pair type.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenXMint\",\n \"docs\": [\n \"Token X mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"tokenYMint\",\n \"docs\": [\n \"Token Y mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveX\",\n \"docs\": [\n \"LB token X vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveY\",\n \"docs\": [\n \"LB token Y vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"protocolFee\",\n \"docs\": [\n \"Uncollected protocol fee\"\n ],\n \"type\": {\n \"defined\": \"ProtocolFee\"\n }\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"RewardInfo\"\n },\n 2\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle pubkey\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"binArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 16\n ]\n }\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last time the pool fee parameter was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding2\",\n \"docs\": [\n \"_padding_2, previous whitelisted_wallet, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"preActivationSwapAddress\",\n \"docs\": [\n \"Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"baseKey\",\n \"docs\": [\n \"Base keypair. Only required for permission pair\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Time point to enable the pair. Only applicable for permission pair.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"preActivationDuration\",\n \"docs\": [\n \"Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding3\",\n \"docs\": [\n \"_padding 3 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"padding4\",\n \"docs\": [\n \"_padding_4, previous lock_duration, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"creator\",\n \"docs\": [\n \"Pool creator\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 24\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"idx\",\n \"docs\": [\n \"Index of latest observation\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeSize\",\n \"docs\": [\n \"Size of active sample. Active sample is initialized observation.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"length\",\n \"docs\": [\n \"Number of observations\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"position\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 160\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"positionV2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"operator\",\n \"docs\": [\n \"Operator of position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"docs\": [\n \"Time point which the locked liquidity can be withdraw\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding0\",\n \"docs\": [\n \"_padding_0, previous subjected_to_bootstrap_liquidity_locking, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"feeOwner\",\n \"docs\": [\n \"Address is able to claim fee in this position, only valid for bootstrap_liquidity_position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 87\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"presetParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n }\n ],\n \"types\": [\n {\n \"name\": \"InitPresetParametersIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor for base fee rate\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategyOneSide\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategy\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"min bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"max bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyType\",\n \"docs\": [\n \"strategy type\"\n ],\n \"type\": {\n \"defined\": \"StrategyType\"\n }\n },\n {\n \"name\": \"parameteres\",\n \"docs\": [\n \"parameters\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityOneSideParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistributionByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"weight\",\n \"docs\": [\n \"weight of liquidity distributed for this bin id\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"AddLiquiditySingleSidePreciseParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bins\",\n \"type\": {\n \"vec\": {\n \"defined\": \"CompressedBinDepositAmount\"\n }\n }\n },\n {\n \"name\": \"decompressMultiplier\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"CompressedBinDepositAmount\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistribution\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"distributionX\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"distributionY\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistribution\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CustomizableParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Pool price\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type. 0 = Slot, 1 = Time. Check ActivationType enum\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"hasAlphaVault\",\n \"docs\": [\n \"Whether the pool has an alpha vault\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Decide when does the pool start trade. None = Now\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Pool creator have permission to enable/disable pool with restricted program validation. Only applicable for customizable permissionless pool.\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding, for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 63\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"InitPermissionPairIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"minBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"activationType\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityReduction\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"Bin\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of token X in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of token Y in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Bin price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquiditySupply\",\n \"docs\": [\n \"Liquidities of the bin. This is the same as LP mint supply. q-number\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"rewardPerTokenStored\",\n \"docs\": [\n \"reward_a_per_token_stored\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"feeAmountXPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token X per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeAmountYPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token Y per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountXIn\",\n \"docs\": [\n \"Total token X swap into the bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountYIn\",\n \"docs\": [\n \"Total token Y swap into he bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"RewardInfo\",\n \"docs\": [\n \"Stores the state relevant for tracking liquidity mining rewards\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"Reward token mint.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"vault\",\n \"docs\": [\n \"Reward vault token account.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"funder\",\n \"docs\": [\n \"Authority account that allows to fund rewards\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"rewardDuration\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDurationEnd\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardRate\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"lastUpdateTime\",\n \"docs\": [\n \"The last time reward states were updated.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"cumulativeSecondsWithEmptyLiquidityReward\",\n \"docs\": [\n \"Accumulated seconds where when farm distribute rewards, but the bin is empty. The reward will be accumulated for next reward time window.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Observation\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cumulativeActiveBinId\",\n \"docs\": [\n \"Cumulative active bin ID\"\n ],\n \"type\": \"i128\"\n },\n {\n \"name\": \"createdAt\",\n \"docs\": [\n \"Observation sample created timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Observation sample last updated timestamp\"\n ],\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"StaticParameters\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"VariableParameters\",\n \"docs\": [\n \"Parameters that changes based on dynamic of the market\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"volatilityAccumulator\",\n \"docs\": [\n \"Volatility accumulator measure the number of bin crossed since reference bin ID. Normally (without filter period taken into consideration), reference bin ID is the active bin of last swap.\",\n \"It affects the variable fee rate\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"volatilityReference\",\n \"docs\": [\n \"Volatility reference is decayed volatility accumulator. It is always <= volatility_accumulator\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"indexReference\",\n \"docs\": [\n \"Active bin id of last swap.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"lastUpdateTimestamp\",\n \"docs\": [\n \"Last timestamp the variable parameters was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"FeeInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"feeXPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeYPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeXPending\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"feeYPending\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"UserRewardInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"rewardPerTokenCompletes\",\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"rewardPendings\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyType\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"SpotOneSide\"\n },\n {\n \"name\": \"CurveOneSide\"\n },\n {\n \"name\": \"BidAskOneSide\"\n },\n {\n \"name\": \"SpotBalanced\"\n },\n {\n \"name\": \"CurveBalanced\"\n },\n {\n \"name\": \"BidAskBalanced\"\n },\n {\n \"name\": \"SpotImBalanced\"\n },\n {\n \"name\": \"CurveImBalanced\"\n },\n {\n \"name\": \"BidAskImBalanced\"\n }\n ]\n }\n },\n {\n \"name\": \"Rounding\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Up\"\n },\n {\n \"name\": \"Down\"\n }\n ]\n }\n },\n {\n \"name\": \"ActivationType\",\n \"docs\": [\n \"Type of the activation\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Slot\"\n },\n {\n \"name\": \"Timestamp\"\n }\n ]\n }\n },\n {\n \"name\": \"LayoutVersion\",\n \"docs\": [\n \"Layout version\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"V0\"\n },\n {\n \"name\": \"V1\"\n }\n ]\n }\n },\n {\n \"name\": \"PairType\",\n \"docs\": [\n \"Type of the Pair. 0 = Permissionless, 1 = Permission, 2 = CustomizablePermissionless. Putting 0 as permissionless for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Permissionless\"\n },\n {\n \"name\": \"Permission\"\n },\n {\n \"name\": \"CustomizablePermissionless\"\n }\n ]\n }\n },\n {\n \"name\": \"PairStatus\",\n \"docs\": [\n \"Pair status. 0 = Enabled, 1 = Disabled. Putting 0 as enabled for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Enabled\"\n },\n {\n \"name\": \"Disabled\"\n }\n ]\n }\n }\n ],\n \"events\": [\n {\n \"name\": \"CompositionFee\",\n \"fields\": [\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binId\",\n \"type\": \"i16\",\n \"index\": false\n },\n {\n \"name\": \"tokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"tokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"AddLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"RemoveLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"Swap\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"startBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"endBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amountOut\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"swapForY\",\n \"type\": \"bool\",\n \"index\": false\n },\n {\n \"name\": \"fee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolFee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeBps\",\n \"type\": \"u128\",\n \"index\": false\n },\n {\n \"name\": \"hostFee\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"totalReward\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FundReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"InitializeReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardDuration\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardFunder\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionClose\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimFee\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"feeX\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeY\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"LbPairCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"tokenX\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"tokenY\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"protocolShare\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"DynamicFeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"filterPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"decayPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"reductionFactor\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"variableFeeControl\",\n \"type\": \"u32\",\n \"index\": false\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"type\": \"u32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"IncreaseObservation\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newObservationLength\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"WithdrawIneligibleReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionOperator\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"oldOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionLockReleasePoint\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"currentPoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"sender\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"GoToABin\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"InvalidStartBinIndex\",\n \"msg\": \"Invalid start bin index\"\n },\n {\n \"code\": 6001,\n \"name\": \"InvalidBinId\",\n \"msg\": \"Invalid bin id\"\n },\n {\n \"code\": 6002,\n \"name\": \"InvalidInput\",\n \"msg\": \"Invalid input data\"\n },\n {\n \"code\": 6003,\n \"name\": \"ExceededAmountSlippageTolerance\",\n \"msg\": \"Exceeded amount slippage tolerance\"\n },\n {\n \"code\": 6004,\n \"name\": \"ExceededBinSlippageTolerance\",\n \"msg\": \"Exceeded bin slippage tolerance\"\n },\n {\n \"code\": 6005,\n \"name\": \"CompositionFactorFlawed\",\n \"msg\": \"Composition factor flawed\"\n },\n {\n \"code\": 6006,\n \"name\": \"NonPresetBinStep\",\n \"msg\": \"Non preset bin step\"\n },\n {\n \"code\": 6007,\n \"name\": \"ZeroLiquidity\",\n \"msg\": \"Zero liquidity\"\n },\n {\n \"code\": 6008,\n \"name\": \"InvalidPosition\",\n \"msg\": \"Invalid position\"\n },\n {\n \"code\": 6009,\n \"name\": \"BinArrayNotFound\",\n \"msg\": \"Bin array not found\"\n },\n {\n \"code\": 6010,\n \"name\": \"InvalidTokenMint\",\n \"msg\": \"Invalid token mint\"\n },\n {\n \"code\": 6011,\n \"name\": \"InvalidAccountForSingleDeposit\",\n \"msg\": \"Invalid account for single deposit\"\n },\n {\n \"code\": 6012,\n \"name\": \"PairInsufficientLiquidity\",\n \"msg\": \"Pair insufficient liquidity\"\n },\n {\n \"code\": 6013,\n \"name\": \"InvalidFeeOwner\",\n \"msg\": \"Invalid fee owner\"\n },\n {\n \"code\": 6014,\n \"name\": \"InvalidFeeWithdrawAmount\",\n \"msg\": \"Invalid fee withdraw amount\"\n },\n {\n \"code\": 6015,\n \"name\": \"InvalidAdmin\",\n \"msg\": \"Invalid admin\"\n },\n {\n \"code\": 6016,\n \"name\": \"IdenticalFeeOwner\",\n \"msg\": \"Identical fee owner\"\n },\n {\n \"code\": 6017,\n \"name\": \"InvalidBps\",\n \"msg\": \"Invalid basis point\"\n },\n {\n \"code\": 6018,\n \"name\": \"MathOverflow\",\n \"msg\": \"Math operation overflow\"\n },\n {\n \"code\": 6019,\n \"name\": \"TypeCastFailed\",\n \"msg\": \"Type cast error\"\n },\n {\n \"code\": 6020,\n \"name\": \"InvalidRewardIndex\",\n \"msg\": \"Invalid reward index\"\n },\n {\n \"code\": 6021,\n \"name\": \"InvalidRewardDuration\",\n \"msg\": \"Invalid reward duration\"\n },\n {\n \"code\": 6022,\n \"name\": \"RewardInitialized\",\n \"msg\": \"Reward already initialized\"\n },\n {\n \"code\": 6023,\n \"name\": \"RewardUninitialized\",\n \"msg\": \"Reward not initialized\"\n },\n {\n \"code\": 6024,\n \"name\": \"IdenticalFunder\",\n \"msg\": \"Identical funder\"\n },\n {\n \"code\": 6025,\n \"name\": \"RewardCampaignInProgress\",\n \"msg\": \"Reward campaign in progress\"\n },\n {\n \"code\": 6026,\n \"name\": \"IdenticalRewardDuration\",\n \"msg\": \"Reward duration is the same\"\n },\n {\n \"code\": 6027,\n \"name\": \"InvalidBinArray\",\n \"msg\": \"Invalid bin array\"\n },\n {\n \"code\": 6028,\n \"name\": \"NonContinuousBinArrays\",\n \"msg\": \"Bin arrays must be continuous\"\n },\n {\n \"code\": 6029,\n \"name\": \"InvalidRewardVault\",\n \"msg\": \"Invalid reward vault\"\n },\n {\n \"code\": 6030,\n \"name\": \"NonEmptyPosition\",\n \"msg\": \"Position is not empty\"\n },\n {\n \"code\": 6031,\n \"name\": \"UnauthorizedAccess\",\n \"msg\": \"Unauthorized access\"\n },\n {\n \"code\": 6032,\n \"name\": \"InvalidFeeParameter\",\n \"msg\": \"Invalid fee parameter\"\n },\n {\n \"code\": 6033,\n \"name\": \"MissingOracle\",\n \"msg\": \"Missing oracle account\"\n },\n {\n \"code\": 6034,\n \"name\": \"InsufficientSample\",\n \"msg\": \"Insufficient observation sample\"\n },\n {\n \"code\": 6035,\n \"name\": \"InvalidLookupTimestamp\",\n \"msg\": \"Invalid lookup timestamp\"\n },\n {\n \"code\": 6036,\n \"name\": \"BitmapExtensionAccountIsNotProvided\",\n \"msg\": \"Bitmap extension account is not provided\"\n },\n {\n \"code\": 6037,\n \"name\": \"CannotFindNonZeroLiquidityBinArrayId\",\n \"msg\": \"Cannot find non-zero liquidity binArrayId\"\n },\n {\n \"code\": 6038,\n \"name\": \"BinIdOutOfBound\",\n \"msg\": \"Bin id out of bound\"\n },\n {\n \"code\": 6039,\n \"name\": \"InsufficientOutAmount\",\n \"msg\": \"Insufficient amount in for minimum out\"\n },\n {\n \"code\": 6040,\n \"name\": \"InvalidPositionWidth\",\n \"msg\": \"Invalid position width\"\n },\n {\n \"code\": 6041,\n \"name\": \"ExcessiveFeeUpdate\",\n \"msg\": \"Excessive fee update\"\n },\n {\n \"code\": 6042,\n \"name\": \"PoolDisabled\",\n \"msg\": \"Pool disabled\"\n },\n {\n \"code\": 6043,\n \"name\": \"InvalidPoolType\",\n \"msg\": \"Invalid pool type\"\n },\n {\n \"code\": 6044,\n \"name\": \"ExceedMaxWhitelist\",\n \"msg\": \"Whitelist for wallet is full\"\n },\n {\n \"code\": 6045,\n \"name\": \"InvalidIndex\",\n \"msg\": \"Invalid index\"\n },\n {\n \"code\": 6046,\n \"name\": \"RewardNotEnded\",\n \"msg\": \"Reward not ended\"\n },\n {\n \"code\": 6047,\n \"name\": \"MustWithdrawnIneligibleReward\",\n \"msg\": \"Must withdraw ineligible reward\"\n },\n {\n \"code\": 6048,\n \"name\": \"UnauthorizedAddress\",\n \"msg\": \"Unauthorized address\"\n },\n {\n \"code\": 6049,\n \"name\": \"OperatorsAreTheSame\",\n \"msg\": \"Cannot update because operators are the same\"\n },\n {\n \"code\": 6050,\n \"name\": \"WithdrawToWrongTokenAccount\",\n \"msg\": \"Withdraw to wrong token account\"\n },\n {\n \"code\": 6051,\n \"name\": \"WrongRentReceiver\",\n \"msg\": \"Wrong rent receiver\"\n },\n {\n \"code\": 6052,\n \"name\": \"AlreadyPassActivationPoint\",\n \"msg\": \"Already activated\"\n },\n {\n \"code\": 6053,\n \"name\": \"ExceedMaxSwappedAmount\",\n \"msg\": \"Swapped amount is exceeded max swapped amount\"\n },\n {\n \"code\": 6054,\n \"name\": \"InvalidStrategyParameters\",\n \"msg\": \"Invalid strategy parameters\"\n },\n {\n \"code\": 6055,\n \"name\": \"LiquidityLocked\",\n \"msg\": \"Liquidity locked\"\n },\n {\n \"code\": 6056,\n \"name\": \"BinRangeIsNotEmpty\",\n \"msg\": \"Bin range is not empty\"\n },\n {\n \"code\": 6057,\n \"name\": \"NotExactAmountOut\",\n \"msg\": \"Amount out is not matched with exact amount out\"\n },\n {\n \"code\": 6058,\n \"name\": \"InvalidActivationType\",\n \"msg\": \"Invalid activation type\"\n },\n {\n \"code\": 6059,\n \"name\": \"InvalidActivationDuration\",\n \"msg\": \"Invalid activation duration\"\n },\n {\n \"code\": 6060,\n \"name\": \"MissingTokenAmountAsTokenLaunchProof\",\n \"msg\": \"Missing token amount as token launch owner proof\"\n },\n {\n \"code\": 6061,\n \"name\": \"InvalidQuoteToken\",\n \"msg\": \"Quote token must be SOL or USDC\"\n },\n {\n \"code\": 6062,\n \"name\": \"InvalidBinStep\",\n \"msg\": \"Invalid bin step\"\n },\n {\n \"code\": 6063,\n \"name\": \"InvalidBaseFee\",\n \"msg\": \"Invalid base fee\"\n },\n {\n \"code\": 6064,\n \"name\": \"InvalidPreActivationDuration\",\n \"msg\": \"Invalid pre-activation duration\"\n },\n {\n \"code\": 6065,\n \"name\": \"AlreadyPassPreActivationSwapPoint\",\n \"msg\": \"Already pass pre-activation swap point\"\n },\n {\n \"code\": 6066,\n \"name\": \"InvalidStatus\",\n \"msg\": \"Invalid status\"\n },\n {\n \"code\": 6067,\n \"name\": \"ExceededMaxOracleLength\",\n \"msg\": \"Exceed max oracle length\"\n },\n {\n \"code\": 6068,\n \"name\": \"InvalidMinimumLiquidity\",\n \"msg\": \"Invalid minimum liquidity\"\n }\n ]\n};\n\nexport const IDL: LbClmm = {\n \"version\": \"0.8.6\",\n \"name\": \"lb_clmm\",\n \"constants\": [\n {\n \"name\": \"BASIS_POINT_MAX\",\n \"type\": \"i32\",\n \"value\": \"10000\"\n },\n {\n \"name\": \"MAX_BIN_PER_ARRAY\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MAX_BIN_PER_POSITION\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MIN_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"- 443636\"\n },\n {\n \"name\": \"MAX_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"443636\"\n },\n {\n \"name\": \"MAX_FEE_RATE\",\n \"type\": \"u64\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"FEE_PRECISION\",\n \"type\": \"u64\",\n \"value\": \"1_000_000_000\"\n },\n {\n \"name\": \"MAX_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2_500\"\n },\n {\n \"name\": \"HOST_FEE_BPS\",\n \"type\": \"u16\",\n \"value\": \"2_000\"\n },\n {\n \"name\": \"NUM_REWARDS\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"2\"\n },\n {\n \"name\": \"MIN_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"1\"\n },\n {\n \"name\": \"MAX_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"31536000\"\n },\n {\n \"name\": \"EXTENSION_BINARRAY_BITMAP_SIZE\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"12\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SIZE\",\n \"type\": \"i32\",\n \"value\": \"512\"\n },\n {\n \"name\": \"MAX_REWARD_BIN_SPLIT\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"15\"\n },\n {\n \"name\": \"ILM_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2000\"\n },\n {\n \"name\": \"PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"500\"\n },\n {\n \"name\": \"MAX_BIN_STEP\",\n \"type\": \"u16\",\n \"value\": \"400\"\n },\n {\n \"name\": \"MAX_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"MIN_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000\"\n },\n {\n \"name\": \"MINIMUM_LIQUIDITY\",\n \"type\": \"u128\",\n \"value\": \"1_000_000\"\n },\n {\n \"name\": \"BIN_ARRAY\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 110, 95, 97, 114, 114, 97, 121]\"\n },\n {\n \"name\": \"ORACLE\",\n \"type\": \"bytes\",\n \"value\": \"[111, 114, 97, 99, 108, 101]\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SEED\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 116, 109, 97, 112]\"\n },\n {\n \"name\": \"PRESET_PARAMETER\",\n \"type\": \"bytes\",\n \"value\": \"[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]\"\n },\n {\n \"name\": \"POSITION\",\n \"type\": \"bytes\",\n \"value\": \"[112, 111, 115, 105, 116, 105, 111, 110]\"\n }\n ],\n \"instructions\": [\n {\n \"name\": \"initializeLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"presetParameter\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"initializePermissionLbPair\",\n \"accounts\": [\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ixData\",\n \"type\": {\n \"defined\": \"InitPermissionPairIx\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeCustomizablePermissionlessLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": \"CustomizableParams\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeBinArrayBitmapExtension\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"docs\": [\n \"Initialize an account to store if a bin array is initialized.\"\n ]\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"initializeBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n }\n ]\n },\n {\n \"name\": \"addLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByWeight\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByWeight\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategy\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategy\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategyOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategyOneSide\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityOneSideParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"removeLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binLiquidityRemoval\",\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityReduction\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initializePosition\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionPda\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"owner\"\n ]\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionByOperator\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"operator\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"operator\"\n ]\n },\n {\n \"name\": \"operatorTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"ownerTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"feeOwner\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"updatePositionOperator\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"operator\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"swap\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"minAmountOut\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapExactOut\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"maxInAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"outAmount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapWithPriceImpact\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"type\": {\n \"option\": \"i32\"\n }\n },\n {\n \"name\": \"maxPriceImpactBps\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"withdrawProtocolFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializeReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"fundReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"carryForward\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"updateRewardFunder\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"updateRewardDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"closePosition\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateBaseFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"BaseFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"updateDynamicFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"DynamicFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"increaseOracleLength\",\n \"accounts\": [\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lengthToAdd\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ix\",\n \"type\": {\n \"defined\": \"InitPresetParametersIx\"\n }\n }\n ]\n },\n {\n \"name\": \"closePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"removeAllLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"setPairStatus\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"migratePosition\",\n \"accounts\": [\n {\n \"name\": \"positionV2\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"positionV1\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"migrateBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateFeesAndRewards\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"withdrawIneligibleReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setActivationPoint\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"activationPoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"removeLiquidityByRange\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSidePrecise\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"parameter\",\n \"type\": {\n \"defined\": \"AddLiquiditySingleSidePreciseParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"goToABin\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"fromBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"toBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationSwapAddress\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationSwapAddress\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"setPairStatusPermissionless\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"binArrayBitmapExtension\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"positiveBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is positive\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n },\n {\n \"name\": \"negativeBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is negative\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"binArray\",\n \"docs\": [\n \"An account to contain a range of bin. For example: Bin 100 <-> 200.\",\n \"For example:\",\n \"BinArray index: 0 contains bin 0 <-> 599\",\n \"index: 2 contains bin 600 <-> 1199, ...\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"Version of binArray\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"bins\",\n \"type\": {\n \"array\": [\n {\n \"defined\": \"Bin\"\n },\n 70\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"parameters\",\n \"type\": {\n \"defined\": \"StaticParameters\"\n }\n },\n {\n \"name\": \"vParameters\",\n \"type\": {\n \"defined\": \"VariableParameters\"\n }\n },\n {\n \"name\": \"bumpSeed\",\n \"type\": {\n \"array\": [\n \"u8\",\n 1\n ]\n }\n },\n {\n \"name\": \"binStepSeed\",\n \"docs\": [\n \"Bin step signer seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"pairType\",\n \"docs\": [\n \"Type of the pair\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"status\",\n \"docs\": [\n \"Status of the pair. Check PairStatus enum.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"requireBaseFactorSeed\",\n \"docs\": [\n \"Require base factor seed\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"baseFactorSeed\",\n \"docs\": [\n \"Base factor seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Allow pool creator to enable/disable pool with restricted validation. Only applicable for customizable permissionless pair type.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenXMint\",\n \"docs\": [\n \"Token X mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"tokenYMint\",\n \"docs\": [\n \"Token Y mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveX\",\n \"docs\": [\n \"LB token X vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveY\",\n \"docs\": [\n \"LB token Y vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"protocolFee\",\n \"docs\": [\n \"Uncollected protocol fee\"\n ],\n \"type\": {\n \"defined\": \"ProtocolFee\"\n }\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"RewardInfo\"\n },\n 2\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle pubkey\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"binArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 16\n ]\n }\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last time the pool fee parameter was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding2\",\n \"docs\": [\n \"_padding_2, previous whitelisted_wallet, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"preActivationSwapAddress\",\n \"docs\": [\n \"Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"baseKey\",\n \"docs\": [\n \"Base keypair. Only required for permission pair\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Time point to enable the pair. Only applicable for permission pair.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"preActivationDuration\",\n \"docs\": [\n \"Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding3\",\n \"docs\": [\n \"_padding 3 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"padding4\",\n \"docs\": [\n \"_padding_4, previous lock_duration, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"creator\",\n \"docs\": [\n \"Pool creator\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 24\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"idx\",\n \"docs\": [\n \"Index of latest observation\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeSize\",\n \"docs\": [\n \"Size of active sample. Active sample is initialized observation.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"length\",\n \"docs\": [\n \"Number of observations\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"position\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 160\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"positionV2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"operator\",\n \"docs\": [\n \"Operator of position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"docs\": [\n \"Time point which the locked liquidity can be withdraw\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding0\",\n \"docs\": [\n \"_padding_0, previous subjected_to_bootstrap_liquidity_locking, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"feeOwner\",\n \"docs\": [\n \"Address is able to claim fee in this position, only valid for bootstrap_liquidity_position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 87\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"presetParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n }\n ],\n \"types\": [\n {\n \"name\": \"InitPresetParametersIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor for base fee rate\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategyOneSide\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategy\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"min bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"max bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyType\",\n \"docs\": [\n \"strategy type\"\n ],\n \"type\": {\n \"defined\": \"StrategyType\"\n }\n },\n {\n \"name\": \"parameteres\",\n \"docs\": [\n \"parameters\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityOneSideParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistributionByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"weight\",\n \"docs\": [\n \"weight of liquidity distributed for this bin id\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"AddLiquiditySingleSidePreciseParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bins\",\n \"type\": {\n \"vec\": {\n \"defined\": \"CompressedBinDepositAmount\"\n }\n }\n },\n {\n \"name\": \"decompressMultiplier\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"CompressedBinDepositAmount\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistribution\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"distributionX\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"distributionY\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistribution\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CustomizableParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Pool price\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type. 0 = Slot, 1 = Time. Check ActivationType enum\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"hasAlphaVault\",\n \"docs\": [\n \"Whether the pool has an alpha vault\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Decide when does the pool start trade. None = Now\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Pool creator have permission to enable/disable pool with restricted program validation. Only applicable for customizable permissionless pool.\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding, for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 63\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"InitPermissionPairIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"minBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"activationType\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityReduction\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"Bin\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of token X in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of token Y in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Bin price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquiditySupply\",\n \"docs\": [\n \"Liquidities of the bin. This is the same as LP mint supply. q-number\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"rewardPerTokenStored\",\n \"docs\": [\n \"reward_a_per_token_stored\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"feeAmountXPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token X per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeAmountYPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token Y per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountXIn\",\n \"docs\": [\n \"Total token X swap into the bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountYIn\",\n \"docs\": [\n \"Total token Y swap into he bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"RewardInfo\",\n \"docs\": [\n \"Stores the state relevant for tracking liquidity mining rewards\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"Reward token mint.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"vault\",\n \"docs\": [\n \"Reward vault token account.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"funder\",\n \"docs\": [\n \"Authority account that allows to fund rewards\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"rewardDuration\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDurationEnd\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardRate\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"lastUpdateTime\",\n \"docs\": [\n \"The last time reward states were updated.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"cumulativeSecondsWithEmptyLiquidityReward\",\n \"docs\": [\n \"Accumulated seconds where when farm distribute rewards, but the bin is empty. The reward will be accumulated for next reward time window.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Observation\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cumulativeActiveBinId\",\n \"docs\": [\n \"Cumulative active bin ID\"\n ],\n \"type\": \"i128\"\n },\n {\n \"name\": \"createdAt\",\n \"docs\": [\n \"Observation sample created timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Observation sample last updated timestamp\"\n ],\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"StaticParameters\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"VariableParameters\",\n \"docs\": [\n \"Parameters that changes based on dynamic of the market\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"volatilityAccumulator\",\n \"docs\": [\n \"Volatility accumulator measure the number of bin crossed since reference bin ID. Normally (without filter period taken into consideration), reference bin ID is the active bin of last swap.\",\n \"It affects the variable fee rate\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"volatilityReference\",\n \"docs\": [\n \"Volatility reference is decayed volatility accumulator. It is always <= volatility_accumulator\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"indexReference\",\n \"docs\": [\n \"Active bin id of last swap.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"lastUpdateTimestamp\",\n \"docs\": [\n \"Last timestamp the variable parameters was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"FeeInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"feeXPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeYPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeXPending\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"feeYPending\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"UserRewardInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"rewardPerTokenCompletes\",\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"rewardPendings\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyType\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"SpotOneSide\"\n },\n {\n \"name\": \"CurveOneSide\"\n },\n {\n \"name\": \"BidAskOneSide\"\n },\n {\n \"name\": \"SpotBalanced\"\n },\n {\n \"name\": \"CurveBalanced\"\n },\n {\n \"name\": \"BidAskBalanced\"\n },\n {\n \"name\": \"SpotImBalanced\"\n },\n {\n \"name\": \"CurveImBalanced\"\n },\n {\n \"name\": \"BidAskImBalanced\"\n }\n ]\n }\n },\n {\n \"name\": \"Rounding\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Up\"\n },\n {\n \"name\": \"Down\"\n }\n ]\n }\n },\n {\n \"name\": \"ActivationType\",\n \"docs\": [\n \"Type of the activation\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Slot\"\n },\n {\n \"name\": \"Timestamp\"\n }\n ]\n }\n },\n {\n \"name\": \"LayoutVersion\",\n \"docs\": [\n \"Layout version\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"V0\"\n },\n {\n \"name\": \"V1\"\n }\n ]\n }\n },\n {\n \"name\": \"PairType\",\n \"docs\": [\n \"Type of the Pair. 0 = Permissionless, 1 = Permission, 2 = CustomizablePermissionless. Putting 0 as permissionless for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Permissionless\"\n },\n {\n \"name\": \"Permission\"\n },\n {\n \"name\": \"CustomizablePermissionless\"\n }\n ]\n }\n },\n {\n \"name\": \"PairStatus\",\n \"docs\": [\n \"Pair status. 0 = Enabled, 1 = Disabled. Putting 0 as enabled for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Enabled\"\n },\n {\n \"name\": \"Disabled\"\n }\n ]\n }\n }\n ],\n \"events\": [\n {\n \"name\": \"CompositionFee\",\n \"fields\": [\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binId\",\n \"type\": \"i16\",\n \"index\": false\n },\n {\n \"name\": \"tokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"tokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"AddLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"RemoveLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"Swap\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"startBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"endBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amountOut\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"swapForY\",\n \"type\": \"bool\",\n \"index\": false\n },\n {\n \"name\": \"fee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolFee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeBps\",\n \"type\": \"u128\",\n \"index\": false\n },\n {\n \"name\": \"hostFee\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"totalReward\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FundReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"InitializeReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardDuration\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardFunder\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionClose\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimFee\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"feeX\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeY\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"LbPairCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"tokenX\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"tokenY\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"protocolShare\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"DynamicFeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"filterPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"decayPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"reductionFactor\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"variableFeeControl\",\n \"type\": \"u32\",\n \"index\": false\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"type\": \"u32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"IncreaseObservation\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newObservationLength\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"WithdrawIneligibleReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionOperator\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"oldOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionLockReleasePoint\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"currentPoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"sender\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"GoToABin\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"InvalidStartBinIndex\",\n \"msg\": \"Invalid start bin index\"\n },\n {\n \"code\": 6001,\n \"name\": \"InvalidBinId\",\n \"msg\": \"Invalid bin id\"\n },\n {\n \"code\": 6002,\n \"name\": \"InvalidInput\",\n \"msg\": \"Invalid input data\"\n },\n {\n \"code\": 6003,\n \"name\": \"ExceededAmountSlippageTolerance\",\n \"msg\": \"Exceeded amount slippage tolerance\"\n },\n {\n \"code\": 6004,\n \"name\": \"ExceededBinSlippageTolerance\",\n \"msg\": \"Exceeded bin slippage tolerance\"\n },\n {\n \"code\": 6005,\n \"name\": \"CompositionFactorFlawed\",\n \"msg\": \"Composition factor flawed\"\n },\n {\n \"code\": 6006,\n \"name\": \"NonPresetBinStep\",\n \"msg\": \"Non preset bin step\"\n },\n {\n \"code\": 6007,\n \"name\": \"ZeroLiquidity\",\n \"msg\": \"Zero liquidity\"\n },\n {\n \"code\": 6008,\n \"name\": \"InvalidPosition\",\n \"msg\": \"Invalid position\"\n },\n {\n \"code\": 6009,\n \"name\": \"BinArrayNotFound\",\n \"msg\": \"Bin array not found\"\n },\n {\n \"code\": 6010,\n \"name\": \"InvalidTokenMint\",\n \"msg\": \"Invalid token mint\"\n },\n {\n \"code\": 6011,\n \"name\": \"InvalidAccountForSingleDeposit\",\n \"msg\": \"Invalid account for single deposit\"\n },\n {\n \"code\": 6012,\n \"name\": \"PairInsufficientLiquidity\",\n \"msg\": \"Pair insufficient liquidity\"\n },\n {\n \"code\": 6013,\n \"name\": \"InvalidFeeOwner\",\n \"msg\": \"Invalid fee owner\"\n },\n {\n \"code\": 6014,\n \"name\": \"InvalidFeeWithdrawAmount\",\n \"msg\": \"Invalid fee withdraw amount\"\n },\n {\n \"code\": 6015,\n \"name\": \"InvalidAdmin\",\n \"msg\": \"Invalid admin\"\n },\n {\n \"code\": 6016,\n \"name\": \"IdenticalFeeOwner\",\n \"msg\": \"Identical fee owner\"\n },\n {\n \"code\": 6017,\n \"name\": \"InvalidBps\",\n \"msg\": \"Invalid basis point\"\n },\n {\n \"code\": 6018,\n \"name\": \"MathOverflow\",\n \"msg\": \"Math operation overflow\"\n },\n {\n \"code\": 6019,\n \"name\": \"TypeCastFailed\",\n \"msg\": \"Type cast error\"\n },\n {\n \"code\": 6020,\n \"name\": \"InvalidRewardIndex\",\n \"msg\": \"Invalid reward index\"\n },\n {\n \"code\": 6021,\n \"name\": \"InvalidRewardDuration\",\n \"msg\": \"Invalid reward duration\"\n },\n {\n \"code\": 6022,\n \"name\": \"RewardInitialized\",\n \"msg\": \"Reward already initialized\"\n },\n {\n \"code\": 6023,\n \"name\": \"RewardUninitialized\",\n \"msg\": \"Reward not initialized\"\n },\n {\n \"code\": 6024,\n \"name\": \"IdenticalFunder\",\n \"msg\": \"Identical funder\"\n },\n {\n \"code\": 6025,\n \"name\": \"RewardCampaignInProgress\",\n \"msg\": \"Reward campaign in progress\"\n },\n {\n \"code\": 6026,\n \"name\": \"IdenticalRewardDuration\",\n \"msg\": \"Reward duration is the same\"\n },\n {\n \"code\": 6027,\n \"name\": \"InvalidBinArray\",\n \"msg\": \"Invalid bin array\"\n },\n {\n \"code\": 6028,\n \"name\": \"NonContinuousBinArrays\",\n \"msg\": \"Bin arrays must be continuous\"\n },\n {\n \"code\": 6029,\n \"name\": \"InvalidRewardVault\",\n \"msg\": \"Invalid reward vault\"\n },\n {\n \"code\": 6030,\n \"name\": \"NonEmptyPosition\",\n \"msg\": \"Position is not empty\"\n },\n {\n \"code\": 6031,\n \"name\": \"UnauthorizedAccess\",\n \"msg\": \"Unauthorized access\"\n },\n {\n \"code\": 6032,\n \"name\": \"InvalidFeeParameter\",\n \"msg\": \"Invalid fee parameter\"\n },\n {\n \"code\": 6033,\n \"name\": \"MissingOracle\",\n \"msg\": \"Missing oracle account\"\n },\n {\n \"code\": 6034,\n \"name\": \"InsufficientSample\",\n \"msg\": \"Insufficient observation sample\"\n },\n {\n \"code\": 6035,\n \"name\": \"InvalidLookupTimestamp\",\n \"msg\": \"Invalid lookup timestamp\"\n },\n {\n \"code\": 6036,\n \"name\": \"BitmapExtensionAccountIsNotProvided\",\n \"msg\": \"Bitmap extension account is not provided\"\n },\n {\n \"code\": 6037,\n \"name\": \"CannotFindNonZeroLiquidityBinArrayId\",\n \"msg\": \"Cannot find non-zero liquidity binArrayId\"\n },\n {\n \"code\": 6038,\n \"name\": \"BinIdOutOfBound\",\n \"msg\": \"Bin id out of bound\"\n },\n {\n \"code\": 6039,\n \"name\": \"InsufficientOutAmount\",\n \"msg\": \"Insufficient amount in for minimum out\"\n },\n {\n \"code\": 6040,\n \"name\": \"InvalidPositionWidth\",\n \"msg\": \"Invalid position width\"\n },\n {\n \"code\": 6041,\n \"name\": \"ExcessiveFeeUpdate\",\n \"msg\": \"Excessive fee update\"\n },\n {\n \"code\": 6042,\n \"name\": \"PoolDisabled\",\n \"msg\": \"Pool disabled\"\n },\n {\n \"code\": 6043,\n \"name\": \"InvalidPoolType\",\n \"msg\": \"Invalid pool type\"\n },\n {\n \"code\": 6044,\n \"name\": \"ExceedMaxWhitelist\",\n \"msg\": \"Whitelist for wallet is full\"\n },\n {\n \"code\": 6045,\n \"name\": \"InvalidIndex\",\n \"msg\": \"Invalid index\"\n },\n {\n \"code\": 6046,\n \"name\": \"RewardNotEnded\",\n \"msg\": \"Reward not ended\"\n },\n {\n \"code\": 6047,\n \"name\": \"MustWithdrawnIneligibleReward\",\n \"msg\": \"Must withdraw ineligible reward\"\n },\n {\n \"code\": 6048,\n \"name\": \"UnauthorizedAddress\",\n \"msg\": \"Unauthorized address\"\n },\n {\n \"code\": 6049,\n \"name\": \"OperatorsAreTheSame\",\n \"msg\": \"Cannot update because operators are the same\"\n },\n {\n \"code\": 6050,\n \"name\": \"WithdrawToWrongTokenAccount\",\n \"msg\": \"Withdraw to wrong token account\"\n },\n {\n \"code\": 6051,\n \"name\": \"WrongRentReceiver\",\n \"msg\": \"Wrong rent receiver\"\n },\n {\n \"code\": 6052,\n \"name\": \"AlreadyPassActivationPoint\",\n \"msg\": \"Already activated\"\n },\n {\n \"code\": 6053,\n \"name\": \"ExceedMaxSwappedAmount\",\n \"msg\": \"Swapped amount is exceeded max swapped amount\"\n },\n {\n \"code\": 6054,\n \"name\": \"InvalidStrategyParameters\",\n \"msg\": \"Invalid strategy parameters\"\n },\n {\n \"code\": 6055,\n \"name\": \"LiquidityLocked\",\n \"msg\": \"Liquidity locked\"\n },\n {\n \"code\": 6056,\n \"name\": \"BinRangeIsNotEmpty\",\n \"msg\": \"Bin range is not empty\"\n },\n {\n \"code\": 6057,\n \"name\": \"NotExactAmountOut\",\n \"msg\": \"Amount out is not matched with exact amount out\"\n },\n {\n \"code\": 6058,\n \"name\": \"InvalidActivationType\",\n \"msg\": \"Invalid activation type\"\n },\n {\n \"code\": 6059,\n \"name\": \"InvalidActivationDuration\",\n \"msg\": \"Invalid activation duration\"\n },\n {\n \"code\": 6060,\n \"name\": \"MissingTokenAmountAsTokenLaunchProof\",\n \"msg\": \"Missing token amount as token launch owner proof\"\n },\n {\n \"code\": 6061,\n \"name\": \"InvalidQuoteToken\",\n \"msg\": \"Quote token must be SOL or USDC\"\n },\n {\n \"code\": 6062,\n \"name\": \"InvalidBinStep\",\n \"msg\": \"Invalid bin step\"\n },\n {\n \"code\": 6063,\n \"name\": \"InvalidBaseFee\",\n \"msg\": \"Invalid base fee\"\n },\n {\n \"code\": 6064,\n \"name\": \"InvalidPreActivationDuration\",\n \"msg\": \"Invalid pre-activation duration\"\n },\n {\n \"code\": 6065,\n \"name\": \"AlreadyPassPreActivationSwapPoint\",\n \"msg\": \"Already pass pre-activation swap point\"\n },\n {\n \"code\": 6066,\n \"name\": \"InvalidStatus\",\n \"msg\": \"Invalid status\"\n },\n {\n \"code\": 6067,\n \"name\": \"ExceededMaxOracleLength\",\n \"msg\": \"Exceed max oracle length\"\n },\n {\n \"code\": 6068,\n \"name\": \"InvalidMinimumLiquidity\",\n \"msg\": \"Invalid minimum liquidity\"\n }\n ]\n};\n","import { IDL } from \"./idl\";\nimport { AnchorError, ProgramError } from \"@coral-xyz/anchor\";\nimport { LBCLMM_PROGRAM_IDS } from \"./constants\";\n\ntype Codes = (typeof IDL.errors)[number][\"code\"];\n\n// ProgramError error parser\nexport class DLMMError extends Error {\n public errorCode: number;\n public errorName: string;\n public errorMessage: string;\n\n constructor(error: object | Codes) {\n let _errorCode = 0;\n let _errorName = \"Something went wrong\";\n let _errorMessage = \"Something went wrong\";\n\n if (error instanceof Error) {\n const anchorError = AnchorError.parse(\n JSON.parse(JSON.stringify(error)).logs as string[]\n );\n\n if (\n anchorError?.program.toBase58() === LBCLMM_PROGRAM_IDS[\"mainnet-beta\"]\n ) {\n _errorCode = anchorError.error.errorCode.number;\n _errorName = anchorError.error.errorCode.code;\n _errorMessage = anchorError.error.errorMessage;\n }\n } else {\n const idlError = IDL.errors.find((err) => err.code === error);\n\n if (idlError) {\n _errorCode = idlError.code;\n _errorName = idlError.name;\n _errorMessage = idlError.msg;\n }\n }\n\n super(_errorMessage);\n\n this.errorCode = _errorCode;\n this.errorName = _errorName;\n this.errorMessage = _errorMessage;\n }\n}\n\n// SDK error\ntype ErrorName = \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\" | \"INVALID_MAX_EXTRA_BIN_ARRAYS\";\n\nexport class DlmmSdkError extends Error {\n name: ErrorName;\n message: string;\n\n constructor(name: ErrorName, message: string) {\n super();\n this.name = name;\n this.message = message;\n }\n}\n","import { BN, EventParser } from \"@coral-xyz/anchor\";\nimport {\n NATIVE_MINT,\n TOKEN_PROGRAM_ID,\n TokenAccountNotFoundError,\n TokenInvalidAccountOwnerError,\n createAssociatedTokenAccountIdempotentInstruction,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n getAccount,\n getAssociatedTokenAddressSync,\n getMint,\n} from \"@solana/spl-token\";\nimport { SCALE_OFFSET } from \"../constants\";\nimport {\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { Bin, ClmmProgram, GetOrCreateATAResponse } from \"../types\";\nimport { Rounding, mulShr, shlDiv } from \"./math\";\nimport { getSimulationComputeUnits, MAX_CU_BUFFER, MIN_CU_BUFFER } from \"./computeUnit\";\n\nexport * from \"./derive\";\nexport * from \"./binArray\";\nexport * from \"./weight\";\nexport * from \"./fee\";\nexport * from \"./weightToAmounts\";\nexport * from \"./strategy\";\nexport * from \"./lbPair\";\n\nexport function chunks<T>(array: T[], size: number): T[][] {\n return Array.apply(0, new Array(Math.ceil(array.length / size))).map(\n (_, index) => array.slice(index * size, (index + 1) * size)\n );\n}\n\nexport function range<T>(\n min: number,\n max: number,\n mapfn: (i: number) => T\n) {\n const length = max - min + 1;\n return Array.from({ length }, (_, i) => mapfn(min + i));\n}\n\nexport async function chunkedFetchMultiplePoolAccount(\n program: ClmmProgram,\n pks: PublicKey[],\n chunkSize: number = 100\n) {\n const accounts = (\n await Promise.all(\n chunks(pks, chunkSize).map((chunk) =>\n program.account.lbPair.fetchMultiple(chunk)\n )\n )\n ).flat();\n\n return accounts.filter(Boolean);\n}\n\nexport async function chunkedFetchMultipleBinArrayBitmapExtensionAccount(\n program: ClmmProgram,\n pks: PublicKey[],\n chunkSize: number = 100\n) {\n const accounts = (\n await Promise.all(\n chunks(pks, chunkSize).map((chunk) =>\n program.account.binArrayBitmapExtension.fetchMultiple(chunk)\n )\n )\n ).flat();\n\n return accounts;\n}\n\nexport function getOutAmount(bin: Bin, inAmount: BN, swapForY: boolean) {\n return swapForY\n ? mulShr(inAmount, bin.price, SCALE_OFFSET, Rounding.Down)\n : shlDiv(inAmount, bin.price, SCALE_OFFSET, Rounding.Down);\n}\n\nexport async function getTokenDecimals(conn: Connection, mint: PublicKey) {\n const token = await getMint(conn, mint);\n return await token.decimals;\n}\n\nexport const getOrCreateATAInstruction = async (\n connection: Connection,\n tokenMint: PublicKey,\n owner: PublicKey,\n payer: PublicKey = owner,\n allowOwnerOffCurve = true\n): Promise<GetOrCreateATAResponse> => {\n const toAccount = getAssociatedTokenAddressSync(\n tokenMint,\n owner,\n allowOwnerOffCurve\n );\n\n try {\n await getAccount(connection, toAccount);\n\n return { ataPubKey: toAccount, ix: undefined };\n } catch (e) {\n if (\n e instanceof TokenAccountNotFoundError ||\n e instanceof TokenInvalidAccountOwnerError\n ) {\n const ix = createAssociatedTokenAccountIdempotentInstruction(\n payer,\n toAccount,\n owner,\n tokenMint\n );\n\n return { ataPubKey: toAccount, ix };\n } else {\n /* handle error */\n console.error(\"Error::getOrCreateATAInstruction\", e);\n throw e;\n }\n }\n};\n\nexport async function getTokenBalance(\n conn: Connection,\n tokenAccount: PublicKey\n): Promise<bigint> {\n const acc = await getAccount(conn, tokenAccount);\n return acc.amount;\n}\n\nexport const parseLogs = <T>(eventParser: EventParser, logs: string[]) => {\n if (!logs.length) throw new Error(\"No logs found\");\n\n for (const event of eventParser?.parseLogs(logs)) {\n return event.data as T;\n }\n\n throw new Error(\"No events found\");\n};\n\nexport const wrapSOLInstruction = (\n from: PublicKey,\n to: PublicKey,\n amount: bigint\n): TransactionInstruction[] => {\n return [\n SystemProgram.transfer({\n fromPubkey: from,\n toPubkey: to,\n lamports: amount,\n }),\n new TransactionInstruction({\n keys: [\n {\n pubkey: to,\n isSigner: false,\n isWritable: true,\n },\n ],\n data: Buffer.from(new Uint8Array([17])),\n programId: TOKEN_PROGRAM_ID,\n }),\n ];\n};\n\nexport const unwrapSOLInstruction = async (\n owner: PublicKey,\n allowOwnerOffCurve = true\n) => {\n const wSolATAAccount = getAssociatedTokenAddressSync(\n NATIVE_MINT,\n owner,\n allowOwnerOffCurve\n );\n if (wSolATAAccount) {\n const closedWrappedSolInstruction = createCloseAccountInstruction(\n wSolATAAccount,\n owner,\n owner,\n [],\n TOKEN_PROGRAM_ID\n );\n return closedWrappedSolInstruction;\n }\n return null;\n};\n\nexport async function chunkedGetMultipleAccountInfos(\n connection: Connection,\n pks: PublicKey[],\n chunkSize: number = 100\n) {\n const accountInfos = (\n await Promise.all(\n chunks(pks, chunkSize).map((chunk) =>\n connection.getMultipleAccountsInfo(chunk)\n )\n )\n ).flat();\n\n return accountInfos;\n}\n\n/**\n * Gets the estimated compute unit usage with a buffer.\n * @param connection A Solana connection object.\n * @param instructions The instructions of the transaction to simulate.\n * @param feePayer The public key of the fee payer.\n * @param buffer The buffer to add to the estimated compute unit usage. Max value is 1. Default value is 0.1 if not provided, and will be capped between 50k - 200k.\n * @returns The estimated compute unit usage with the buffer.\n */\nexport const getEstimatedComputeUnitUsageWithBuffer = async (\n connection: Connection,\n instructions: TransactionInstruction[],\n feePayer: PublicKey,\n buffer?: number\n) => {\n if (!buffer) {\n buffer = 0.1;\n }\n // Avoid negative value\n buffer = Math.max(0, buffer);\n // Limit buffer to 1\n buffer = Math.min(1, buffer);\n\n const estimatedComputeUnitUsage = await getSimulationComputeUnits(\n connection,\n instructions,\n feePayer,\n []\n );\n\n let extraComputeUnitBuffer = estimatedComputeUnitUsage * buffer;\n if (extraComputeUnitBuffer > MAX_CU_BUFFER) {\n extraComputeUnitBuffer = MAX_CU_BUFFER;\n } else if (extraComputeUnitBuffer < MIN_CU_BUFFER) {\n extraComputeUnitBuffer = MIN_CU_BUFFER;\n }\n\n return estimatedComputeUnitUsage + extraComputeUnitBuffer;\n};\n\n/**\n * Gets the estimated compute unit usage with a buffer and converts it to a SetComputeUnitLimit instruction.\n * If the estimated compute unit usage cannot be retrieved, returns a SetComputeUnitLimit instruction with the fallback unit.\n * @param connection A Solana connection object.\n * @param instructions The instructions of the transaction to simulate.\n * @param feePayer The public key of the fee payer.\n * @param buffer The buffer to add to the estimated compute unit usage. Max value is 1. Default value is 0.1 if not provided, and will be capped between 50k - 200k.\n * @returns A SetComputeUnitLimit instruction with the estimated compute unit usage.\n */\nexport const getEstimatedComputeUnitIxWithBuffer = async (\n connection: Connection,\n instructions: TransactionInstruction[],\n feePayer: PublicKey,\n buffer?: number\n) => {\n const units = await getEstimatedComputeUnitUsageWithBuffer(\n connection,\n instructions,\n feePayer,\n buffer\n ).catch((error) => {\n console.error(\"Error::getEstimatedComputeUnitUsageWithBuffer\", error);\n return 1_400_000;\n });\n\n return ComputeBudgetProgram.setComputeUnitLimit({ units });\n};\n","import { BN } from \"@coral-xyz/anchor\";\nimport {\n BASIS_POINT_MAX,\n MAX_BIN_PER_POSITION,\n SCALE_OFFSET,\n} from \"../constants\";\nimport Decimal from \"decimal.js\";\nimport { ONE, pow } from \"./u64xu64_math\";\nimport { DLMM } from \"..\";\nimport { getPriceOfBinByBinId } from \"./weight\";\n\nexport enum Rounding {\n Up,\n Down,\n}\n\nexport function mulShr(x: BN, y: BN, offset: number, rounding: Rounding) {\n const denominator = new BN(1).shln(offset);\n return mulDiv(x, y, denominator, rounding);\n}\n\nexport function shlDiv(x: BN, y: BN, offset: number, rounding: Rounding) {\n const scale = new BN(1).shln(offset);\n return mulDiv(x, scale, y, rounding);\n}\n\nexport function mulDiv(x: BN, y: BN, denominator: BN, rounding: Rounding) {\n const { div, mod } = x.mul(y).divmod(denominator);\n\n if (rounding == Rounding.Up && !mod.isZero()) {\n return div.add(new BN(1));\n }\n return div;\n}\n\nexport function computeBaseFactorFromFeeBps(binStep: BN, feeBps: BN) {\n const U16_MAX = 65535;\n const computedBaseFactor =\n (feeBps.toNumber() * BASIS_POINT_MAX) / binStep.toNumber();\n\n // Sanity check\n const computedBaseFactorFloor = Math.floor(computedBaseFactor);\n if (computedBaseFactor != computedBaseFactorFloor) {\n if (computedBaseFactorFloor >= U16_MAX) {\n throw \"base factor for the give fee bps overflow u16\";\n }\n\n if (computedBaseFactorFloor == 0) {\n throw \"base factor for the give fee bps underflow\";\n }\n\n if (computedBaseFactor % 1 != 0) {\n throw \"couldn't compute base factor for the exact fee bps\";\n }\n }\n\n return new BN(computedBaseFactor);\n}\n\nexport function getQPriceFromId(binId: BN, binStep: BN): BN {\n const bps = binStep.shln(SCALE_OFFSET).div(new BN(BASIS_POINT_MAX));\n const base = ONE.add(bps);\n return pow(base, binId);\n}\n\nexport function findSwappableMinMaxBinId(binStep: BN) {\n const base = 1 + binStep.toNumber() / BASIS_POINT_MAX;\n const maxQPriceSupported = new Decimal(\"18446744073709551615\");\n const n = maxQPriceSupported.log(10).div(new Decimal(base).log(10)).floor();\n\n let minBinId = new BN(n.neg().toString());\n let maxBinId = new BN(n.toString());\n\n let minQPrice = new BN(1);\n let maxQPrice = new BN(\"340282366920938463463374607431768211455\");\n\n while (true) {\n const qPrice = getQPriceFromId(minBinId, binStep);\n if (qPrice.gt(minQPrice) && !qPrice.isZero()) {\n break;\n } else {\n minBinId = minBinId.add(new BN(1));\n }\n }\n\n while (true) {\n const qPrice = getQPriceFromId(maxBinId, binStep);\n if (qPrice.lt(maxQPrice) && !qPrice.isZero()) {\n break;\n } else {\n maxBinId = maxBinId.sub(new BN(1));\n }\n }\n\n return {\n minBinId,\n maxBinId,\n };\n}\n\nexport function getC(\n amount: BN,\n binStep: number,\n binId: BN,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n minPrice: Decimal,\n maxPrice: Decimal,\n k: number\n) {\n const currentPricePerLamport = new Decimal(1 + binStep / 10000).pow(\n binId.toNumber()\n );\n const currentPricePerToken = currentPricePerLamport.mul(\n new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal))\n );\n const priceRange = maxPrice.sub(minPrice);\n const currentPriceDeltaFromMin = currentPricePerToken.sub(\n new Decimal(minPrice)\n );\n\n const c = new Decimal(amount.toString()).mul(\n currentPriceDeltaFromMin.div(priceRange).pow(k)\n );\n\n return c.floor();\n}\n\nexport function distributeAmountToCompressedBinsByRatio(\n compressedBinAmount: Map<number, BN>,\n uncompressedAmount: BN,\n multiplier: BN,\n binCapAmount: BN\n) {\n const newCompressedBinAmount = new Map<number, BN>();\n let totalCompressedAmount = new BN(0);\n\n for (const compressedAmount of compressedBinAmount.values()) {\n totalCompressedAmount = totalCompressedAmount.add(compressedAmount);\n }\n\n let totalDepositedAmount = new BN(0);\n\n for (const [binId, compressedAmount] of compressedBinAmount.entries()) {\n const depositAmount = compressedAmount\n .mul(uncompressedAmount)\n .div(totalCompressedAmount);\n\n let compressedDepositAmount = depositAmount.div(multiplier);\n\n let newCompressedAmount = compressedAmount.add(compressedDepositAmount);\n if (newCompressedAmount.gt(binCapAmount)) {\n compressedDepositAmount = compressedDepositAmount.sub(\n newCompressedAmount.sub(binCapAmount)\n );\n newCompressedAmount = binCapAmount;\n }\n newCompressedBinAmount.set(binId, newCompressedAmount);\n\n totalDepositedAmount = totalDepositedAmount.add(\n compressedDepositAmount.mul(multiplier)\n );\n }\n\n const loss = uncompressedAmount.sub(totalDepositedAmount);\n\n return {\n newCompressedBinAmount,\n loss,\n };\n}\n\nexport function getPositionCount(minBinId: BN, maxBinId: BN) {\n const binDelta = maxBinId.sub(minBinId);\n const positionCount = binDelta.div(MAX_BIN_PER_POSITION);\n return positionCount.add(new BN(1));\n}\n\nexport function compressBinAmount(binAmount: Map<number, BN>, multiplier: BN) {\n const compressedBinAmount = new Map<number, BN>();\n\n let totalAmount = new BN(0);\n let compressionLoss = new BN(0);\n\n for (const [binId, amount] of binAmount) {\n totalAmount = totalAmount.add(amount);\n const compressedAmount = amount.div(multiplier);\n\n compressedBinAmount.set(binId, compressedAmount);\n let loss = amount.sub(compressedAmount.mul(multiplier));\n compressionLoss = compressionLoss.add(loss);\n }\n\n return {\n compressedBinAmount,\n compressionLoss,\n };\n}\n\nexport function generateAmountForBinRange(\n amount: BN,\n binStep: number,\n tokenXDecimal: number,\n tokenYDecimal: number,\n minBinId: BN,\n maxBinId: BN,\n k: number\n) {\n const toTokenMultiplier = new Decimal(10 ** (tokenXDecimal - tokenYDecimal));\n const minPrice = getPriceOfBinByBinId(minBinId.toNumber(), binStep).mul(\n toTokenMultiplier\n );\n const maxPrice = getPriceOfBinByBinId(maxBinId.toNumber(), binStep).mul(\n toTokenMultiplier\n );\n const binAmounts = new Map<number, BN>();\n\n for (let i = minBinId.toNumber(); i < maxBinId.toNumber(); i++) {\n const binAmount = generateBinAmount(\n amount,\n binStep,\n new BN(i),\n tokenXDecimal,\n tokenYDecimal,\n minPrice,\n maxPrice,\n k\n );\n\n binAmounts.set(i, binAmount);\n }\n\n return binAmounts;\n}\n\nexport function generateBinAmount(\n amount: BN,\n binStep: number,\n binId: BN,\n tokenXDecimal: number,\n tokenYDecimal: number,\n minPrice: Decimal,\n maxPrice: Decimal,\n k: number\n) {\n const c1 = getC(\n amount,\n binStep,\n binId.add(new BN(1)),\n tokenXDecimal,\n tokenYDecimal,\n minPrice,\n maxPrice,\n k\n );\n\n const c0 = getC(\n amount,\n binStep,\n binId,\n tokenXDecimal,\n tokenYDecimal,\n minPrice,\n maxPrice,\n k\n );\n\n return new BN(c1.sub(c0).floor().toString());\n}\n","import BN from \"bn.js\";\nimport { SCALE_OFFSET } from \"../constants\";\n\nconst MAX_EXPONENTIAL = new BN(0x80000);\n\nexport const ONE = new BN(1).shln(SCALE_OFFSET);\nconst MAX = new BN(2).pow(new BN(128)).sub(new BN(1));\n\nexport function pow(base: BN, exp: BN): BN {\n let invert = exp.isNeg();\n\n if (exp.isZero()) {\n return ONE;\n }\n\n exp = invert ? exp.abs() : exp;\n\n if (exp.gt(MAX_EXPONENTIAL)) {\n return new BN(0);\n }\n\n let squaredBase = base;\n let result = ONE;\n\n if (squaredBase.gte(result)) {\n squaredBase = MAX.div(squaredBase);\n invert = !invert;\n }\n\n if (!exp.and(new BN(0x1)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x2)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x4)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x8)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x10)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x20)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x40)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x80)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x100)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x200)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x400)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x800)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x1000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x2000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x4000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x8000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x10000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x20000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x40000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n if (result.isZero()) {\n return new BN(0);\n }\n\n if (invert) {\n result = MAX.div(result);\n }\n\n return result;\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport gaussian, { Gaussian } from \"gaussian\";\nimport { BASIS_POINT_MAX } from \"../constants\";\nimport Decimal from \"decimal.js\";\nimport { toAmountAskSide, toAmountBidSide, toAmountBothSide } from \"./weightToAmounts\";\n\nexport function getPriceOfBinByBinId(binId: number, binStep: number): Decimal {\n const binStepNum = new Decimal(binStep).div(new Decimal(BASIS_POINT_MAX));\n return new Decimal(1).add(new Decimal(binStepNum)).pow(new Decimal(binId));\n}\n\n/// Build a gaussian distribution from the bins, with active bin as the mean.\nfunction buildGaussianFromBins(activeBin: number, binIds: number[]) {\n const smallestBin = Math.min(...binIds);\n const largestBin = Math.max(...binIds);\n\n // Define the Gaussian distribution. The mean will be active bin when active bin is within the bin ids. Else, use left or right most bin id as the mean.\n let mean = 0;\n const isAroundActiveBin = binIds.find((bid) => bid == activeBin);\n // The liquidity will be distributed surrounding active bin\n if (isAroundActiveBin) {\n mean = activeBin;\n }\n // The liquidity will be distributed to the right side of the active bin.\n else if (activeBin < smallestBin) {\n mean = smallestBin;\n }\n // The liquidity will be distributed to the left side of the active bin.\n else {\n mean = largestBin;\n }\n\n const TWO_STANDARD_DEVIATION = 4;\n const stdDev = (largestBin - smallestBin) / TWO_STANDARD_DEVIATION;\n const variance = Math.max(stdDev ** 2, 1);\n\n return gaussian(mean, variance);\n}\n\n/// Find the probability of the bin id over the gaussian. The probability ranged from 0 - 1 and will be used as liquidity allocation for that particular bin.\nfunction generateBinLiquidityAllocation(\n gaussian: Gaussian,\n binIds: number[],\n invert: boolean\n) {\n const allocations = binIds.map((bid) =>\n invert ? 1 / gaussian.pdf(bid) : gaussian.pdf(bid)\n );\n const totalAllocations = allocations.reduce((acc, v) => acc + v, 0);\n // Gaussian impossible to cover 100%, normalized it to have total of 100%\n return allocations.map((a) => a / totalAllocations);\n}\n\n/// Convert liquidity allocation from 0..1 to 0..10000 bps unit. The sum of allocations must be 1. Return BPS and the loss after conversion.\nfunction computeAllocationBps(allocations: number[]): {\n bpsAllocations: BN[];\n pLoss: BN;\n} {\n let totalAllocation = new BN(0);\n const bpsAllocations: BN[] = [];\n\n for (const allocation of allocations) {\n const allocBps = new BN(allocation * 10000);\n bpsAllocations.push(allocBps);\n totalAllocation = totalAllocation.add(allocBps);\n }\n\n const pLoss = new BN(10000).sub(totalAllocation);\n return {\n bpsAllocations,\n pLoss,\n };\n}\n/** private */\n\nexport function toWeightDistribution(\n amountX: BN,\n amountY: BN,\n distributions: {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n }[],\n binStep: number\n): { binId: number; weight: number }[] {\n // get all quote amount\n let totalQuote = new BN(0);\n const precision = 1_000_000_000_000;\n const quoteDistributions = distributions.map((bin) => {\n const price = new BN(\n getPriceOfBinByBinId(bin.binId, binStep).mul(precision).floor().toString()\n );\n const quoteValue = amountX\n .mul(new BN(bin.xAmountBpsOfTotal))\n .mul(new BN(price))\n .div(new BN(BASIS_POINT_MAX))\n .div(new BN(precision));\n const quoteAmount = quoteValue.add(\n amountY.mul(new BN(bin.yAmountBpsOfTotal)).div(new BN(BASIS_POINT_MAX))\n );\n totalQuote = totalQuote.add(quoteAmount);\n return {\n binId: bin.binId,\n quoteAmount,\n };\n });\n\n if (totalQuote.eq(new BN(0))) {\n return [];\n }\n\n const distributionWeights = quoteDistributions\n .map((bin) => {\n const weight = Math.floor(\n bin.quoteAmount.mul(new BN(65535)).div(totalQuote).toNumber()\n );\n return {\n binId: bin.binId,\n weight,\n };\n })\n .filter((item) => item.weight > 0);\n\n return distributionWeights;\n}\n\nexport function calculateSpotDistribution(\n activeBin: number,\n binIds: number[]\n): { binId: number; xAmountBpsOfTotal: BN; yAmountBpsOfTotal: BN }[] {\n if (!binIds.includes(activeBin)) {\n const { div: dist, mod: rem } = new BN(10_000).divmod(\n new BN(binIds.length)\n );\n const loss = rem.isZero() ? new BN(0) : new BN(1);\n\n const distributions =\n binIds[0] < activeBin\n ? binIds.map((binId) => ({\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: dist,\n }))\n : binIds.map((binId) => ({\n binId,\n xAmountBpsOfTotal: dist,\n yAmountBpsOfTotal: new BN(0),\n }));\n\n // Add the loss to the left most bin\n if (binIds[0] < activeBin) {\n distributions[0].yAmountBpsOfTotal.add(loss);\n }\n // Add the loss to the right most bin\n else {\n distributions[binIds.length - 1].xAmountBpsOfTotal.add(loss);\n }\n\n return distributions;\n }\n\n const binYCount = binIds.filter((binId) => binId < activeBin).length;\n const binXCount = binIds.filter((binId) => binId > activeBin).length;\n\n const totalYBinCapacity = binYCount + 0.5;\n const totalXBinCapacity = binXCount + 0.5;\n\n const yBinBps = new BN(10_000 / totalYBinCapacity);\n const yActiveBinBps = new BN(10_000).sub(yBinBps.mul(new BN(binYCount)));\n\n const xBinBps = new BN(10_000 / totalXBinCapacity);\n const xActiveBinBps = new BN(10_000).sub(xBinBps.mul(new BN(binXCount)));\n\n return binIds.map((binId) => {\n const isYBin = binId < activeBin;\n const isXBin = binId > activeBin;\n const isActiveBin = binId === activeBin;\n\n if (isYBin) {\n return {\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: yBinBps,\n };\n }\n\n if (isXBin) {\n return {\n binId,\n xAmountBpsOfTotal: xBinBps,\n yAmountBpsOfTotal: new BN(0),\n };\n }\n\n if (isActiveBin) {\n return {\n binId,\n xAmountBpsOfTotal: xActiveBinBps,\n yAmountBpsOfTotal: yActiveBinBps,\n };\n }\n });\n}\n\nexport function calculateBidAskDistribution(\n activeBin: number,\n binIds: number[]\n): {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n}[] {\n const smallestBin = Math.min(...binIds);\n const largestBin = Math.max(...binIds);\n\n const rightOnly = activeBin < smallestBin;\n const leftOnly = activeBin > largestBin;\n\n const gaussian = buildGaussianFromBins(activeBin, binIds);\n const allocations = generateBinLiquidityAllocation(gaussian, binIds, true);\n\n // To the right of active bin, liquidity distribution consists of only token X.\n if (rightOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: bpsAllocations[idx],\n yAmountBpsOfTotal: new BN(0),\n }));\n const idx = binDistributions.length - 1;\n binDistributions[idx].xAmountBpsOfTotal =\n binDistributions[idx].xAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // To the left of active bin, liquidity distribution consists of only token Y.\n if (leftOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: bpsAllocations[idx],\n }));\n binDistributions[0].yAmountBpsOfTotal =\n binDistributions[0].yAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // Find total X, and Y bps allocations for normalization.\n const [totalXAllocation, totalYAllocation] = allocations.reduce(\n ([xAcc, yAcc], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n return [xAcc + allocation, yAcc];\n } else if (binId < activeBin) {\n return [xAcc, yAcc + allocation];\n } else {\n const half = allocation / 2;\n return [xAcc + half, yAcc + half];\n }\n },\n [0, 0]\n );\n\n // Normalize and convert to BPS\n const [normXAllocations, normYAllocations] = allocations.reduce<[BN[], BN[]]>(\n ([xAllocations, yAllocations], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n const distX = new BN((allocation * 10000) / totalXAllocation);\n xAllocations.push(distX);\n }\n if (binId < activeBin) {\n const distY = new BN((allocation * 10000) / totalYAllocation);\n yAllocations.push(distY);\n }\n if (binId == activeBin) {\n const half = allocation / 2;\n const distX = new BN((half * 10000) / totalXAllocation);\n const distY = new BN((half * 10000) / totalYAllocation);\n xAllocations.push(distX);\n yAllocations.push(distY);\n }\n return [xAllocations, yAllocations];\n },\n [[], []]\n );\n\n const totalXNormAllocations = normXAllocations.reduce(\n (acc, v) => acc.add(v),\n new BN(0)\n );\n const totalYNormAllocations = normYAllocations.reduce(\n (acc, v) => acc.add(v),\n new BN(0)\n );\n\n const xPLoss = new BN(10000).sub(totalXNormAllocations);\n const yPLoss = new BN(10000).sub(totalYNormAllocations);\n\n const distributions = binIds.map((binId) => {\n if (binId === activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXAllocations.shift(),\n yAmountBpsOfTotal: normYAllocations.shift(),\n };\n }\n\n if (binId > activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXAllocations.shift(),\n yAmountBpsOfTotal: new BN(0),\n };\n }\n\n if (binId < activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: normYAllocations.shift(),\n };\n }\n });\n\n if (!yPLoss.isZero()) {\n distributions[0].yAmountBpsOfTotal =\n distributions[0].yAmountBpsOfTotal.add(yPLoss);\n }\n\n if (!xPLoss.isZero()) {\n const last = distributions.length - 1;\n distributions[last].xAmountBpsOfTotal =\n distributions[last].xAmountBpsOfTotal.add(xPLoss);\n }\n\n return distributions;\n}\n\nexport function calculateNormalDistribution(\n activeBin: number,\n binIds: number[]\n): {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n}[] {\n const smallestBin = Math.min(...binIds);\n const largestBin = Math.max(...binIds);\n\n const rightOnly = activeBin < smallestBin;\n const leftOnly = activeBin > largestBin;\n\n const gaussian = buildGaussianFromBins(activeBin, binIds);\n const allocations = generateBinLiquidityAllocation(gaussian, binIds, false);\n\n // To the right of active bin, liquidity distribution consists of only token X.\n if (rightOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: bpsAllocations[idx],\n yAmountBpsOfTotal: new BN(0),\n }));\n // When contains only X token, bin closest to active bin will be index 0.\n // Add back the precision loss\n binDistributions[0].xAmountBpsOfTotal =\n binDistributions[0].xAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // To the left of active bin, liquidity distribution consists of only token Y.\n if (leftOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: bpsAllocations[idx],\n }));\n // When contains only Y token, bin closest to active bin will be last index.\n // Add back the precision loss\n const idx = binDistributions.length - 1;\n binDistributions[idx].yAmountBpsOfTotal =\n binDistributions[idx].yAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // The liquidity distribution consists of token X and Y. Allocations from gaussian only says how much liquidity percentage per bin over the full bin range.\n // Normalize liquidity allocation percentage into X - 100%, Y - 100%.\n\n // Find total X, and Y bps allocations for normalization.\n const [totalXAllocation, totalYAllocation] = allocations.reduce(\n ([xAcc, yAcc], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n return [xAcc + allocation, yAcc];\n } else if (binId < activeBin) {\n return [xAcc, yAcc + allocation];\n } else {\n const half = allocation / 2;\n return [xAcc + half, yAcc + half];\n }\n },\n [0, 0]\n );\n\n // Normalize and convert to BPS\n const [normXAllocations, normYAllocations] = allocations.reduce(\n ([xAllocations, yAllocations], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n const distX = new BN((allocation * 10000) / totalXAllocation);\n xAllocations.push(distX);\n }\n if (binId < activeBin) {\n const distY = new BN((allocation * 10000) / totalYAllocation);\n yAllocations.push(distY);\n }\n return [xAllocations, yAllocations];\n },\n [[], []]\n );\n\n const normXActiveBinAllocation = normXAllocations.reduce(\n (maxBps, bps) => maxBps.sub(bps),\n new BN(10_000)\n );\n const normYActiveBinAllocation = normYAllocations.reduce(\n (maxBps, bps) => maxBps.sub(bps),\n new BN(10_000)\n );\n\n return binIds.map((binId) => {\n if (binId === activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXActiveBinAllocation,\n yAmountBpsOfTotal: normYActiveBinAllocation,\n };\n }\n\n if (binId > activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXAllocations.shift(),\n yAmountBpsOfTotal: new BN(0),\n };\n }\n\n if (binId < activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: normYAllocations.shift(),\n };\n }\n });\n}\n\nexport function fromWeightDistributionToAmountOneSide(\n amount: BN,\n distributions: { binId: number; weight: number }[],\n binStep: number,\n activeId: number,\n depositForY: boolean,\n): { binId: number; amount: BN }[] {\n if (depositForY) {\n return toAmountBidSide(activeId, amount, distributions);\n } else {\n return toAmountAskSide(activeId, binStep, amount, distributions);\n }\n}\n\nexport function fromWeightDistributionToAmount(\n amountX: BN,\n amountY: BN,\n distributions: { binId: number; weight: number }[],\n binStep: number,\n activeId: number,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN\n): { binId: number; amountX: BN; amountY: BN }[] {\n // sort distribution\n var distributions = distributions.sort((n1, n2) => {\n return n1.binId - n2.binId;\n });\n\n if (distributions.length == 0) {\n return [];\n }\n\n // only bid side\n if (activeId > distributions[distributions.length - 1].binId) {\n let amounts = toAmountBidSide(activeId, amountY, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(bin.amount.toString()),\n };\n });\n }\n\n // only ask side\n if (activeId < distributions[0].binId) {\n let amounts = toAmountAskSide(activeId, binStep, amountX, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(bin.amount.toString()),\n amountY: new BN(0),\n };\n });\n }\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, distributions);\n}","\nimport Decimal from \"decimal.js\";\nimport { BN } from \"@coral-xyz/anchor\";\nimport { getPriceOfBinByBinId } from \"./weight\";\n\nexport function toAmountBidSide(\n activeId: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[],\n): {\n binId: number,\n amount: BN\n}[] {\n // get sum of weight\n const totalWeight = distributions.reduce(function (sum, el) {\n return el.binId > activeId ? sum : sum.add(el.weight); // skip all ask side\n }, new Decimal(0));\n\n if (totalWeight.cmp(new Decimal(0)) != 1) {\n throw Error(\"Invalid parameteres\");\n }\n return distributions.map((bin) => {\n if (bin.binId > activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n };\n } else {\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString())\n .mul(new Decimal(bin.weight).div(totalWeight))\n .floor().toString()),\n };\n }\n });\n}\n\nexport function toAmountAskSide(activeId: number,\n binStep: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[]): {\n binId: number,\n amount: BN\n }[] {\n // get sum of weight\n const totalWeight: Decimal = distributions.reduce(function (sum, el) {\n if (el.binId < activeId) {\n return sum;\n } else {\n const price = getPriceOfBinByBinId(el.binId, binStep);\n const weightPerPrice = new Decimal(el.weight).div(price);\n return sum.add(weightPerPrice);\n }\n }, new Decimal(0));\n\n if (totalWeight.cmp(new Decimal(0)) != 1) {\n throw Error(\"Invalid parameteres\");\n }\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n };\n } else {\n const price = getPriceOfBinByBinId(bin.binId, binStep);\n const weightPerPrice = new Decimal(bin.weight).div(price);\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString()).mul(weightPerPrice).div(totalWeight).floor().toString()),\n };\n }\n })\n}\n\nexport function toAmountBothSide(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]): {\n binId: number,\n amountX: BN,\n amountY: BN\n }[] {\n // only bid side\n if (activeId > distributions[distributions.length - 1].binId) {\n let amounts = toAmountBidSide(activeId, amountY, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n };\n })\n }\n // only ask side\n if (activeId < distributions[0].binId) {\n let amounts = toAmountAskSide(activeId, binStep, amountX, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n };\n })\n }\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId;\n });\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep);\n let wx0 = new Decimal(0);\n let wy0 = new Decimal(0);\n const activeBin = activeBins[0];\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)));\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2));\n } else {\n let amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString());\n let amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString());\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(\n p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec))\n );\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(\n new Decimal(1).add(\n p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)\n )\n );\n }\n }\n\n let totalWeightX = wx0;\n let totalWeightY = wy0;\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n }\n if (element.binId > activeId) {\n let price = getPriceOfBinByBinId(element.binId, binStep);\n let weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const kx = new Decimal(amountX.toString()).div(totalWeightX);\n const ky = new Decimal(amountY.toString()).div(totalWeightY);\n let k = (kx.lessThan(ky) ? kx : ky);\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight));\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n };\n }\n if (bin.binId > activeId) {\n const price = getPriceOfBinByBinId(bin.binId, binStep);\n const weighPerPrice = new Decimal(bin.weight).div(price);\n const amount = k.mul(weighPerPrice);\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n };\n }\n\n const amountXActiveBin = k.mul(wx0);\n const amountYActiveBin = k.mul(wy0);\n return {\n binId: bin.binId,\n amountX: new BN(amountXActiveBin.floor().toString()),\n amountY: new BN(amountYActiveBin.floor().toString()),\n };\n });\n } else {\n let totalWeightX = new Decimal(0);\n let totalWeightY = new Decimal(0);\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n } else {\n let price = getPriceOfBinByBinId(element.binId, binStep);\n let weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n\n let kx = new Decimal(amountX.toString()).div(totalWeightX);\n let ky = new Decimal(amountY.toString()).div(totalWeightY);\n let k = kx.lessThan(ky) ? kx : ky;\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight));\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n };\n } else {\n let price = getPriceOfBinByBinId(bin.binId, binStep);\n let weighPerPrice = new Decimal(bin.weight).div(price);\n const amount = k.mul(weighPerPrice);\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n };\n }\n });\n }\n}\n\n\nexport function autoFillYByWeight(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId;\n });\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep);\n let wx0 = new Decimal(0);\n let wy0 = new Decimal(0);\n const activeBin = activeBins[0];\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)));\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2));\n } else {\n let amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString());\n let amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString());\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(\n p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec))\n );\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(\n new Decimal(1).add(\n p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)\n )\n );\n }\n }\n\n let totalWeightX = wx0;\n let totalWeightY = wy0;\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX);\n const amountY = kx.mul(totalWeightY);\n return new BN(amountY.floor().toString())\n } else {\n let totalWeightX = new Decimal(0);\n let totalWeightY = new Decimal(0);\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX);\n const amountY = kx.mul(totalWeightY);\n return new BN(amountY.floor().toString())\n }\n}\n\n\nexport function autoFillXByWeight(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId;\n });\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep);\n let wx0 = new Decimal(0);\n let wy0 = new Decimal(0);\n const activeBin = activeBins[0];\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)));\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2));\n } else {\n let amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString());\n let amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString());\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(\n p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec))\n );\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(\n new Decimal(1).add(\n p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)\n )\n );\n }\n }\n\n let totalWeightX = wx0;\n let totalWeightY = wy0;\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY);\n const amountX = ky.mul(totalWeightX);\n return new BN(amountX.floor().toString())\n } else {\n let totalWeightX = new Decimal(0);\n let totalWeightY = new Decimal(0);\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY);\n const amountX = ky.mul(totalWeightX);\n return new BN(amountX.floor().toString())\n }\n}","import { AddressLookupTableAccount, Commitment, ComputeBudgetProgram, Connection, PublicKey, TransactionInstruction, TransactionMessage, VersionedTransaction } from \"@solana/web3.js\";\n\n// https://solscan.io/tx/4ryJKTB1vYmGU6YnUWwbLps18FaJjiTwgRozcgdP8RFcwp7zUZi85vgWE7rARNx2NvzDJiM9CUWArqzY7LHv38WL\nexport const DEFAULT_ADD_LIQUIDITY_CU = 800_000;\n\nexport const MIN_CU_BUFFER = 50_000;\nexport const MAX_CU_BUFFER = 200_000;\n\nexport const getSimulationComputeUnits = async (\n connection: Connection,\n instructions: Array<TransactionInstruction>,\n payer: PublicKey,\n lookupTables: Array<AddressLookupTableAccount> | [],\n commitment: Commitment = \"confirmed\",\n ): Promise<number | null> => {\n const testInstructions = [\n // Set an arbitrarily high number in simulation\n // so we can be sure the transaction will succeed\n // and get the real compute units used\n ComputeBudgetProgram.setComputeUnitLimit({ units: 1_400_000 }),\n ...instructions,\n ];\n \n const testTransaction = new VersionedTransaction(\n new TransactionMessage({\n instructions: testInstructions,\n payerKey: payer,\n // RecentBlockhash can by any public key during simulation\n // since 'replaceRecentBlockhash' is set to 'true' below\n recentBlockhash: PublicKey.default.toString(),\n }).compileToV0Message(lookupTables),\n );\n \n const rpcResponse = await connection.simulateTransaction(testTransaction, {\n replaceRecentBlockhash: true,\n sigVerify: false,\n commitment,\n });\n \n if (rpcResponse?.value?.err) {\n const logs = rpcResponse.value.logs?.join(\"\\n • \") || \"No logs available\";\n throw new Error(\n `Transaction simulation failed:\\n •${logs}` +\n JSON.stringify(rpcResponse?.value?.err),\n );\n }\n \n return rpcResponse.value.unitsConsumed || null;\n };\n","import { BN } from \"@coral-xyz/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { DLMM } from \"..\";\nimport { ILM_BASE } from \"../constants\";\n\n/** private */\nfunction sortTokenMints(tokenX: PublicKey, tokenY: PublicKey) {\n const [minKey, maxKey] =\n tokenX.toBuffer().compare(tokenY.toBuffer()) == 1\n ? [tokenY, tokenX]\n : [tokenX, tokenY];\n return [minKey, maxKey];\n}\n/** private */\n\n/**\n *\n * @deprecated Use derivePresetParameter2\n */\nexport function derivePresetParameter(binStep: BN, programId: PublicKey) {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"preset_parameter\"),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function derivePresetParameter2(\n binStep: BN,\n baseFactor: BN,\n programId: PublicKey\n) {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"preset_parameter\"),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n new Uint8Array(baseFactor.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function deriveLbPair2(\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n baseFactor: BN,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [\n minKey.toBuffer(),\n maxKey.toBuffer(),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n new Uint8Array(baseFactor.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\n/**\n *\n * @deprecated Use deriveLbPair2\n */\n\nexport function deriveLbPair(\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [\n minKey.toBuffer(),\n maxKey.toBuffer(),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function deriveCustomizablePermissionlessLbPair(\n tokenX: PublicKey,\n tokenY: PublicKey,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [ILM_BASE.toBuffer(), minKey.toBuffer(), maxKey.toBuffer()],\n programId\n );\n}\n\nexport function derivePermissionLbPair(\n baseKey: PublicKey,\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [\n baseKey.toBuffer(),\n minKey.toBuffer(),\n maxKey.toBuffer(),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function deriveOracle(lbPair: PublicKey, programId: PublicKey) {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"oracle\"), lbPair.toBytes()],\n programId\n );\n}\n\nexport function derivePosition(\n lbPair: PublicKey,\n base: PublicKey,\n lowerBinId: BN,\n width: BN,\n programId: PublicKey\n) {\n let lowerBinIdBytes: Uint8Array;\n if (lowerBinId.isNeg()) {\n lowerBinIdBytes = new Uint8Array(\n lowerBinId.toTwos(32).toArrayLike(Buffer, \"le\", 4)\n );\n } else {\n lowerBinIdBytes = new Uint8Array(lowerBinId.toArrayLike(Buffer, \"le\", 4));\n }\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"position\"),\n lbPair.toBuffer(),\n base.toBuffer(),\n lowerBinIdBytes,\n new Uint8Array(width.toBuffer(\"le\", 4)),\n ],\n programId\n );\n}\n\nexport function deriveBinArray(\n lbPair: PublicKey,\n index: BN,\n programId: PublicKey\n) {\n let binArrayBytes: Uint8Array;\n if (index.isNeg()) {\n binArrayBytes = new Uint8Array(\n index.toTwos(64).toArrayLike(Buffer, \"le\", 8)\n );\n } else {\n binArrayBytes = new Uint8Array(index.toArrayLike(Buffer, \"le\", 8));\n }\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"bin_array\"), lbPair.toBytes(), binArrayBytes],\n programId\n );\n}\n\nexport function deriveReserve(\n token: PublicKey,\n lbPair: PublicKey,\n programId: PublicKey\n) {\n return PublicKey.findProgramAddressSync(\n [lbPair.toBuffer(), token.toBuffer()],\n programId\n );\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { MAX_BIN_ARRAY_SIZE, MAX_BIN_PER_POSITION } from \"../constants\";\nimport {\n Bin,\n BinArray,\n BinArrayAccount,\n BinArrayBitmapExtension,\n BinLiquidity,\n BitmapType,\n LbPair,\n} from \"../types\";\nimport {\n EXTENSION_BINARRAY_BITMAP_SIZE,\n BIN_ARRAY_BITMAP_SIZE,\n} from \"../constants\";\nimport { getPositionCount } from \"./math\";\nimport { deriveBinArray } from \"./derive\";\n\n/** private */\nfunction internalBitmapRange() {\n const lowerBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.neg();\n const upperBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.sub(new BN(1));\n return [lowerBinArrayIndex, upperBinArrayIndex];\n}\n\nfunction buildBitmapFromU64Arrays(u64Arrays: BN[], type: BitmapType) {\n const buffer = Buffer.concat(\n u64Arrays.map((b) => {\n return b.toArrayLike(Buffer, \"le\", 8);\n })\n );\n\n return new BN(buffer, \"le\");\n}\n\nfunction bitmapTypeDetail(type: BitmapType) {\n if (type == BitmapType.U1024) {\n return {\n bits: 1024,\n bytes: 1024 / 8,\n };\n } else {\n return {\n bits: 512,\n bytes: 512 / 8,\n };\n }\n}\n\nfunction mostSignificantBit(number: BN, bitLength: number) {\n const highestIndex = bitLength - 1;\n if (number.isZero()) {\n return null;\n }\n\n for (let i = highestIndex; i >= 0; i--) {\n if (number.testn(i)) {\n return highestIndex - i;\n }\n }\n return null;\n}\n\nfunction leastSignificantBit(number: BN, bitLength: number) {\n if (number.isZero()) {\n return null;\n }\n for (let i = 0; i < bitLength; i++) {\n if (number.testn(i)) {\n return i;\n }\n }\n return null;\n}\n\nfunction extensionBitmapRange() {\n return [\n BIN_ARRAY_BITMAP_SIZE.neg().mul(\n EXTENSION_BINARRAY_BITMAP_SIZE.add(new BN(1))\n ),\n BIN_ARRAY_BITMAP_SIZE.mul(\n EXTENSION_BINARRAY_BITMAP_SIZE.add(new BN(1))\n ).sub(new BN(1)),\n ];\n}\n\nfunction findSetBit(\n startIndex: number,\n endIndex: number,\n binArrayBitmapExtension: BinArrayBitmapExtension\n): number | null {\n const getBinArrayOffset = (binArrayIndex: BN) => {\n return binArrayIndex.gt(new BN(0))\n ? binArrayIndex.mod(BIN_ARRAY_BITMAP_SIZE)\n : binArrayIndex.add(new BN(1)).neg().mod(BIN_ARRAY_BITMAP_SIZE);\n };\n\n const getBitmapOffset = (binArrayIndex: BN) => {\n return binArrayIndex.gt(new BN(0))\n ? binArrayIndex.div(BIN_ARRAY_BITMAP_SIZE).sub(new BN(1))\n : binArrayIndex\n .add(new BN(1))\n .neg()\n .div(BIN_ARRAY_BITMAP_SIZE)\n .sub(new BN(1));\n };\n\n if (startIndex <= endIndex) {\n for (let i = startIndex; i <= endIndex; i++) {\n const binArrayOffset = getBinArrayOffset(new BN(i)).toNumber();\n const bitmapOffset = getBitmapOffset(new BN(i)).toNumber();\n const bitmapChunks =\n i > 0\n ? binArrayBitmapExtension.positiveBinArrayBitmap[bitmapOffset]\n : binArrayBitmapExtension.negativeBinArrayBitmap[bitmapOffset];\n const bitmap = buildBitmapFromU64Arrays(bitmapChunks, BitmapType.U512);\n if (bitmap.testn(binArrayOffset)) {\n return i;\n }\n }\n } else {\n for (let i = startIndex; i >= endIndex; i--) {\n const binArrayOffset = getBinArrayOffset(new BN(i)).toNumber();\n const bitmapOffset = getBitmapOffset(new BN(i)).toNumber();\n const bitmapChunks =\n i > 0\n ? binArrayBitmapExtension.positiveBinArrayBitmap[bitmapOffset]\n : binArrayBitmapExtension.negativeBinArrayBitmap[bitmapOffset];\n const bitmap = buildBitmapFromU64Arrays(bitmapChunks, BitmapType.U512);\n if (bitmap.testn(binArrayOffset)) {\n return i;\n }\n }\n }\n\n return null;\n}\n/** private */\n\nexport function isOverflowDefaultBinArrayBitmap(binArrayIndex: BN) {\n const [minBinArrayIndex, maxBinArrayIndex] = internalBitmapRange();\n return (\n binArrayIndex.gt(maxBinArrayIndex) || binArrayIndex.lt(minBinArrayIndex)\n );\n}\n\nexport function deriveBinArrayBitmapExtension(\n lbPair: PublicKey,\n programId: PublicKey\n) {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"bitmap\"), lbPair.toBytes()],\n programId\n );\n}\n\nexport function binIdToBinArrayIndex(binId: BN): BN {\n const { div: idx, mod } = binId.divmod(MAX_BIN_ARRAY_SIZE);\n return binId.isNeg() && !mod.isZero() ? idx.sub(new BN(1)) : idx;\n}\n\nexport function getBinArrayLowerUpperBinId(binArrayIndex: BN) {\n const lowerBinId = binArrayIndex.mul(MAX_BIN_ARRAY_SIZE);\n const upperBinId = lowerBinId.add(MAX_BIN_ARRAY_SIZE).sub(new BN(1));\n\n return [lowerBinId, upperBinId];\n}\n\nexport function isBinIdWithinBinArray(activeId: BN, binArrayIndex: BN) {\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArrayIndex);\n return activeId.gte(lowerBinId) && activeId.lte(upperBinId);\n}\n\nexport function getBinFromBinArray(binId: number, binArray: BinArray): Bin {\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArray.index);\n\n let index = 0;\n if (binId > 0) {\n index = binId - lowerBinId.toNumber();\n } else {\n const delta = upperBinId.toNumber() - binId;\n index = MAX_BIN_ARRAY_SIZE.toNumber() - delta - 1;\n }\n\n return binArray.bins[index];\n}\n\nexport function findNextBinArrayIndexWithLiquidity(\n swapForY: boolean,\n activeId: BN,\n lbPairState: LbPair,\n binArrayBitmapExtension: BinArrayBitmapExtension | null\n): BN | null {\n const [lowerBinArrayIndex, upperBinArrayIndex] = internalBitmapRange();\n let startBinArrayIndex = binIdToBinArrayIndex(activeId);\n\n while (true) {\n if (isOverflowDefaultBinArrayBitmap(startBinArrayIndex)) {\n if (binArrayBitmapExtension === null) {\n return null;\n }\n // When bin array index is negative, the MSB is smallest bin array index.\n\n const [minBinArrayIndex, maxBinArrayIndex] = extensionBitmapRange();\n\n if (startBinArrayIndex.isNeg()) {\n if (swapForY) {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n minBinArrayIndex.toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n return null;\n }\n } else {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n BIN_ARRAY_BITMAP_SIZE.neg().sub(new BN(1)).toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n // Move to internal bitmap\n startBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.neg();\n }\n }\n } else {\n if (swapForY) {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n BIN_ARRAY_BITMAP_SIZE.toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n // Move to internal bitmap\n startBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.sub(new BN(1));\n }\n } else {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n maxBinArrayIndex.toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n return null;\n }\n }\n }\n } else {\n // Internal bitmap\n const bitmapType = BitmapType.U1024;\n const bitmapDetail = bitmapTypeDetail(bitmapType);\n const offset = startBinArrayIndex.add(BIN_ARRAY_BITMAP_SIZE);\n\n const bitmap = buildBitmapFromU64Arrays(\n lbPairState.binArrayBitmap,\n bitmapType\n );\n\n if (swapForY) {\n const upperBitRange = new BN(bitmapDetail.bits - 1).sub(offset);\n const croppedBitmap = bitmap.shln(upperBitRange.toNumber());\n\n const msb = mostSignificantBit(croppedBitmap, bitmapDetail.bits);\n\n if (msb !== null) {\n return startBinArrayIndex.sub(new BN(msb));\n } else {\n // Move to extension\n startBinArrayIndex = lowerBinArrayIndex.sub(new BN(1));\n }\n } else {\n const lowerBitRange = offset;\n const croppedBitmap = bitmap.shrn(lowerBitRange.toNumber());\n const lsb = leastSignificantBit(croppedBitmap, bitmapDetail.bits);\n if (lsb !== null) {\n return startBinArrayIndex.add(new BN(lsb));\n } else {\n // Move to extension\n startBinArrayIndex = upperBinArrayIndex.add(new BN(1));\n }\n }\n }\n }\n}\n\nexport function findNextBinArrayWithLiquidity(\n swapForY: boolean,\n activeBinId: BN,\n lbPairState: LbPair,\n binArrayBitmapExtension: BinArrayBitmapExtension | null,\n binArrays: BinArrayAccount[]\n): BinArrayAccount | null {\n const nearestBinArrayIndexWithLiquidity = findNextBinArrayIndexWithLiquidity(\n swapForY,\n activeBinId,\n lbPairState,\n binArrayBitmapExtension\n );\n\n if (nearestBinArrayIndexWithLiquidity == null) {\n return null;\n }\n\n const binArrayAccount = binArrays.find((ba) =>\n ba.account.index.eq(nearestBinArrayIndexWithLiquidity)\n );\n if (!binArrayAccount) {\n // Cached bin array couldn't cover more bins, partial quoted.\n return null;\n }\n\n return binArrayAccount;\n}\n\n/**\n * Retrieves the bin arrays required to initialize multiple positions in continuous range.\n *\n * @param {PublicKey} pair - The public key of the pair.\n * @param {BN} fromBinId - The starting bin ID.\n * @param {BN} toBinId - The ending bin ID.\n * @return {[{key: PublicKey, index: BN }]} An array of bin arrays required for the given position range.\n */\nexport function getBinArraysRequiredByPositionRange(\n pair: PublicKey,\n fromBinId: BN,\n toBinId: BN,\n programId: PublicKey\n): { key: PublicKey; index: BN }[] {\n const [minBinId, maxBinId] = fromBinId.lt(toBinId)\n ? [fromBinId, toBinId]\n : [toBinId, fromBinId];\n\n const positionCount = getPositionCount(minBinId, maxBinId);\n const binArrays = new Map<String, BN>();\n\n for (let i = 0; i < positionCount.toNumber(); i++) {\n const lowerBinId = minBinId.add(MAX_BIN_PER_POSITION.mul(new BN(i)));\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(lowerBinId);\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n\n const [lowerBinArray] = deriveBinArray(pair, lowerBinArrayIndex, programId);\n const [upperBinArray] = deriveBinArray(pair, upperBinArrayIndex, programId);\n\n binArrays.set(lowerBinArray.toBase58(), lowerBinArrayIndex);\n binArrays.set(upperBinArray.toBase58(), upperBinArrayIndex);\n }\n\n return Array.from(binArrays, ([key, index]) => ({\n key: new PublicKey(key),\n index,\n }));\n}\n\nexport function* enumerateBins(\n binsById: Map<number, Bin>,\n lowerBinId: number,\n upperBinId: number,\n binStep: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n version: number\n) {\n for (let currentBinId = lowerBinId; currentBinId <= upperBinId; currentBinId++) {\n const bin = binsById.get(currentBinId);\n if (bin != null) {\n yield BinLiquidity.fromBin(bin, currentBinId, binStep, baseTokenDecimal, quoteTokenDecimal, version);\n } else {\n yield BinLiquidity.empty(currentBinId, binStep, baseTokenDecimal, quoteTokenDecimal, version);\n }\n }\n}","import {\n BN,\n IdlAccounts,\n IdlTypes,\n Program,\n ProgramAccount,\n} from \"@coral-xyz/anchor\";\nimport { LbClmm } from \"../idl\";\nimport { getPriceOfBinByBinId } from \"../helpers\";\nimport { PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport Decimal from \"decimal.js\";\nimport { u64, i64, struct } from \"@coral-xyz/borsh\";\n\nexport interface FeeInfo {\n baseFeeRatePercentage: Decimal;\n maxFeeRatePercentage: Decimal;\n protocolFeePercentage: Decimal;\n}\n\nexport interface BinAndAmount {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n}\n\nexport interface TokenReserve {\n publicKey: PublicKey;\n reserve: PublicKey;\n amount: bigint;\n decimal: number;\n}\n\nexport type ClmmProgram = Program<LbClmm>;\n\nexport type LbPair = IdlAccounts<LbClmm>[\"lbPair\"];\nexport type LbPairAccount = ProgramAccount<IdlAccounts<LbClmm>[\"lbPair\"]>;\n\nexport type Bin = IdlTypes<LbClmm>[\"Bin\"];\nexport type BinArray = IdlAccounts<LbClmm>[\"binArray\"];\nexport type BinArrayAccount = ProgramAccount<IdlAccounts<LbClmm>[\"binArray\"]>;\n\nexport type Position = IdlAccounts<LbClmm>[\"position\"];\nexport type PositionV2 = IdlAccounts<LbClmm>[\"positionV2\"];\n\nexport type vParameters = IdlAccounts<LbClmm>[\"lbPair\"][\"vParameters\"];\nexport type sParameters = IdlAccounts<LbClmm>[\"lbPair\"][\"parameters\"];\n\nexport type InitPermissionPairIx = IdlTypes<LbClmm>[\"InitPermissionPairIx\"];\nexport type InitCustomizablePermissionlessPairIx =\n IdlTypes<LbClmm>[\"CustomizableParams\"];\n\nexport type BinLiquidityDistribution =\n IdlTypes<LbClmm>[\"BinLiquidityDistribution\"];\nexport type BinLiquidityReduction = IdlTypes<LbClmm>[\"BinLiquidityReduction\"];\n\nexport type BinArrayBitmapExtensionAccount = ProgramAccount<\n IdlAccounts<LbClmm>[\"binArrayBitmapExtension\"]\n>;\nexport type BinArrayBitmapExtension =\n IdlAccounts<LbClmm>[\"binArrayBitmapExtension\"];\n\nexport type LiquidityParameterByWeight =\n IdlTypes<LbClmm>[\"LiquidityParameterByWeight\"];\nexport type LiquidityOneSideParameter =\n IdlTypes<LbClmm>[\"LiquidityOneSideParameter\"];\n\nexport type LiquidityParameterByStrategy =\n IdlTypes<LbClmm>[\"LiquidityParameterByStrategy\"];\nexport type LiquidityParameterByStrategyOneSide =\n IdlTypes<LbClmm>[\"LiquidityParameterByStrategyOneSide\"];\nexport type LiquidityParameter = IdlTypes<LbClmm>[\"LiquidityParameter\"];\n\nexport type ProgramStrategyParameter = IdlTypes<LbClmm>[\"StrategyParameters\"];\nexport type ProgramStrategyType = IdlTypes<LbClmm>[\"StrategyType\"];\n\nexport type CompressedBinDepositAmount =\n IdlTypes<LbClmm>[\"CompressedBinDepositAmount\"];\nexport type CompressedBinDepositAmounts = CompressedBinDepositAmount[];\n\nexport interface LbPosition {\n publicKey: PublicKey;\n positionData: PositionData;\n version: PositionVersion;\n}\n\nexport interface PositionInfo {\n publicKey: PublicKey;\n lbPair: LbPair;\n tokenX: TokenReserve;\n tokenY: TokenReserve;\n lbPairPositionsData: Array<LbPosition>;\n}\n\nexport interface FeeInfo {\n baseFeeRatePercentage: Decimal;\n maxFeeRatePercentage: Decimal;\n protocolFeePercentage: Decimal;\n}\n\nexport interface EmissionRate {\n rewardOne: Decimal | undefined;\n rewardTwo: Decimal | undefined;\n}\n\nexport interface SwapFee {\n feeX: BN;\n feeY: BN;\n}\n\nexport interface LMRewards {\n rewardOne: BN;\n rewardTwo: BN;\n}\n\nexport enum PositionVersion {\n V1,\n V2,\n}\n\nexport enum PairType {\n Permissionless,\n Permissioned,\n}\n\nexport const Strategy = {\n SpotBalanced: { spotBalanced: {} },\n CurveBalanced: { curveBalanced: {} },\n BidAskBalanced: { bidAskBalanced: {} },\n SpotImBalanced: { spotImBalanced: {} },\n CurveImBalanced: { curveImBalanced: {} },\n BidAskImBalanced: { bidAskImBalanced: {} },\n};\n\nexport enum StrategyType {\n Spot,\n Curve,\n BidAsk,\n}\n\nexport enum ActivationType {\n Slot,\n Timestamp,\n}\n\nexport interface StrategyParameters {\n maxBinId: number;\n minBinId: number;\n strategyType: StrategyType;\n singleSidedX?: boolean;\n}\n\nexport interface TQuoteCreatePositionParams {\n strategy: StrategyParameters;\n}\n\nexport interface TInitializePositionAndAddLiquidityParams {\n positionPubKey: PublicKey;\n totalXAmount: BN;\n totalYAmount: BN;\n xYAmountDistribution: BinAndAmount[];\n user: PublicKey;\n slippage?: number;\n}\n\nexport interface TInitializePositionAndAddLiquidityParamsByStrategy {\n positionPubKey: PublicKey;\n totalXAmount: BN;\n totalYAmount: BN;\n strategy: StrategyParameters;\n user: PublicKey;\n slippage?: number;\n}\n\nexport interface BinLiquidity {\n binId: number;\n xAmount: BN;\n yAmount: BN;\n supply: BN;\n version: number;\n price: string;\n pricePerToken: string;\n}\n\nexport module BinLiquidity {\n export function fromBin(\n bin: Bin,\n binId: number,\n binStep: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n version: number\n ): BinLiquidity {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n binStep\n ).toString();\n return {\n binId,\n xAmount: bin.amountX,\n yAmount: bin.amountY,\n supply: bin.liquiditySupply,\n price: pricePerLamport,\n version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n };\n }\n\n export function empty(\n binId: number,\n binStep: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n version: number\n ): BinLiquidity {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n binStep\n ).toString();\n return {\n binId,\n xAmount: new BN(0),\n yAmount: new BN(0),\n supply: new BN(0),\n price: pricePerLamport,\n version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n };\n }\n}\n\nexport interface SwapQuote {\n consumedInAmount: BN;\n outAmount: BN;\n fee: BN;\n protocolFee: BN;\n minOutAmount: BN;\n priceImpact: Decimal;\n binArraysPubkey: any[];\n endPrice: Decimal;\n}\n\nexport interface SwapQuoteExactOut {\n inAmount: BN;\n outAmount: BN;\n fee: BN;\n priceImpact: Decimal;\n protocolFee: BN;\n maxInAmount: BN;\n binArraysPubkey: any[];\n}\n\nexport interface IAccountsCache {\n binArrays: Map<String, BinArray>;\n lbPair: LbPair;\n}\n\nexport interface PositionBinData {\n binId: number;\n price: string;\n pricePerToken: string;\n binXAmount: string;\n binYAmount: string;\n binLiquidity: string;\n positionLiquidity: string;\n positionXAmount: string;\n positionYAmount: string;\n}\n\nexport interface PositionData {\n totalXAmount: string;\n totalYAmount: string;\n positionBinData: PositionBinData[];\n lastUpdatedAt: BN;\n upperBinId: number;\n lowerBinId: number;\n feeX: BN;\n feeY: BN;\n rewardOne: BN;\n rewardTwo: BN;\n feeOwner: PublicKey;\n totalClaimedFeeXAmount: BN;\n totalClaimedFeeYAmount: BN;\n}\n\nexport interface SwapWithPriceImpactParams {\n /**\n * mint of in token\n */\n inToken: PublicKey;\n /**\n * mint of out token\n */\n outToken: PublicKey;\n /**\n * in token amount\n */\n inAmount: BN;\n /**\n * price impact in bps\n */\n priceImpact: BN;\n /**\n * desired lbPair to swap against\n */\n lbPair: PublicKey;\n /**\n * user\n */\n user: PublicKey;\n binArraysPubkey: PublicKey[];\n}\n\nexport interface SwapParams {\n /**\n * mint of in token\n */\n inToken: PublicKey;\n /**\n * mint of out token\n */\n outToken: PublicKey;\n /**\n * in token amount\n */\n inAmount: BN;\n /**\n * minimum out with slippage\n */\n minOutAmount: BN;\n /**\n * desired lbPair to swap against\n */\n lbPair: PublicKey;\n /**\n * user\n */\n user: PublicKey;\n binArraysPubkey: PublicKey[];\n}\n\nexport interface SwapExactOutParams {\n /**\n * mint of in token\n */\n inToken: PublicKey;\n /**\n * mint of out token\n */\n outToken: PublicKey;\n /**\n * out token amount\n */\n outAmount: BN;\n /**\n * maximum in amount, also known as slippage\n */\n maxInAmount: BN;\n /**\n * desired lbPair to swap against\n */\n lbPair: PublicKey;\n /**\n * user\n */\n user: PublicKey;\n binArraysPubkey: PublicKey[];\n}\n\nexport interface GetOrCreateATAResponse {\n ataPubKey: PublicKey;\n ix?: TransactionInstruction;\n}\n\nexport enum BitmapType {\n U1024,\n U512,\n}\n\nexport interface SeedLiquidityResponse {\n sendPositionOwnerTokenProveIxs: TransactionInstruction[];\n initializeBinArraysAndPositionIxs: TransactionInstruction[][];\n addLiquidityIxs: TransactionInstruction[][];\n}\n\nexport interface Clock {\n slot: BN;\n epochStartTimestamp: BN;\n epoch: BN;\n leaderScheduleEpoch: BN;\n unixTimestamp: BN;\n}\n\nexport const ClockLayout = struct([\n u64(\"slot\"),\n i64(\"epochStartTimestamp\"),\n u64(\"epoch\"),\n u64(\"leaderScheduleEpoch\"),\n i64(\"unixTimestamp\"),\n]);\n\nexport enum PairStatus {\n Enabled,\n Disabled,\n}\n\nexport interface PairLockInfo {\n positions: Array<PositionLockInfo>;\n}\n\nexport interface PositionLockInfo {\n positionAddress: PublicKey,\n owner: PublicKey,\n tokenXAmount: string,\n tokenYAmount: string,\n lockReleasePoint: number\n}","import { BN } from \"@coral-xyz/anchor\";\nimport {\n BASIS_POINT_MAX,\n FEE_PRECISION,\n MAX_FEE_RATE,\n SCALE_OFFSET,\n} from \"../constants\";\nimport { Bin, sParameters, vParameters } from \"../types\";\nimport { Rounding, mulShr, shlDiv } from \"./math\";\nimport { getOutAmount } from \".\";\n\nexport function getBaseFee(binStep: number, sParameter: sParameters) {\n return new BN(sParameter.baseFactor).mul(new BN(binStep)).mul(new BN(10));\n}\n\nexport function getVariableFee(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters\n) {\n if (sParameter.variableFeeControl > 0) {\n const square_vfa_bin = new BN(vParameter.volatilityAccumulator)\n .mul(new BN(binStep))\n .pow(new BN(2));\n const v_fee = new BN(sParameter.variableFeeControl).mul(square_vfa_bin);\n\n return v_fee.add(new BN(99_999_999_999)).div(new BN(100_000_000_000));\n }\n return new BN(0);\n}\n\nexport function getTotalFee(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters\n) {\n const totalFee = getBaseFee(binStep, sParameter).add(\n getVariableFee(binStep, sParameter, vParameter)\n );\n return totalFee.gt(MAX_FEE_RATE) ? MAX_FEE_RATE : totalFee;\n}\n\nexport function computeFee(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n inAmount: BN\n) {\n const totalFee = getTotalFee(binStep, sParameter, vParameter);\n const denominator = FEE_PRECISION.sub(totalFee);\n\n return inAmount\n .mul(totalFee)\n .add(denominator)\n .sub(new BN(1))\n .div(denominator);\n}\n\nexport function computeFeeFromAmount(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n inAmountWithFees: BN\n) {\n const totalFee = getTotalFee(binStep, sParameter, vParameter);\n return inAmountWithFees\n .mul(totalFee)\n .add(FEE_PRECISION.sub(new BN(1)))\n .div(FEE_PRECISION);\n}\n\nexport function computeProtocolFee(feeAmount: BN, sParameter: sParameters) {\n return feeAmount\n .mul(new BN(sParameter.protocolShare))\n .div(new BN(BASIS_POINT_MAX));\n}\n\nexport function swapExactOutQuoteAtBin(\n bin: Bin,\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n outAmount: BN,\n swapForY: boolean\n): {\n amountIn: BN;\n amountOut: BN;\n fee: BN;\n protocolFee: BN;\n} {\n if (swapForY && bin.amountY.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n if (!swapForY && bin.amountX.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n let maxAmountOut: BN;\n let maxAmountIn: BN;\n\n if (swapForY) {\n maxAmountOut = bin.amountY;\n maxAmountIn = shlDiv(bin.amountY, bin.price, SCALE_OFFSET, Rounding.Up);\n } else {\n maxAmountOut = bin.amountX;\n maxAmountIn = mulShr(bin.amountX, bin.price, SCALE_OFFSET, Rounding.Up);\n }\n\n if (outAmount.gte(maxAmountOut)) {\n const maxFee = computeFee(binStep, sParameter, vParameter, maxAmountIn);\n const protocolFee = computeProtocolFee(maxFee, sParameter);\n return {\n amountIn: maxAmountIn,\n amountOut: maxAmountOut,\n fee: maxFee,\n protocolFee,\n };\n } else {\n const amountIn = getAmountIn(outAmount, bin.price, swapForY);\n const fee = computeFee(binStep, sParameter, vParameter, amountIn);\n const protocolFee = computeProtocolFee(fee, sParameter);\n return {\n amountIn,\n amountOut: outAmount,\n fee,\n protocolFee,\n };\n }\n}\n\nexport function swapExactInQuoteAtBin(\n bin: Bin,\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n inAmount: BN,\n swapForY: boolean\n): {\n amountIn: BN;\n amountOut: BN;\n fee: BN;\n protocolFee: BN;\n} {\n if (swapForY && bin.amountY.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n if (!swapForY && bin.amountX.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n let maxAmountOut: BN;\n let maxAmountIn: BN;\n\n if (swapForY) {\n maxAmountOut = bin.amountY;\n maxAmountIn = shlDiv(bin.amountY, bin.price, SCALE_OFFSET, Rounding.Up);\n } else {\n maxAmountOut = bin.amountX;\n maxAmountIn = mulShr(bin.amountX, bin.price, SCALE_OFFSET, Rounding.Up);\n }\n\n const maxFee = computeFee(binStep, sParameter, vParameter, maxAmountIn);\n maxAmountIn = maxAmountIn.add(maxFee);\n\n let amountInWithFees: BN;\n let amountOut: BN;\n let fee: BN;\n let protocolFee: BN;\n\n if (inAmount.gt(maxAmountIn)) {\n amountInWithFees = maxAmountIn;\n amountOut = maxAmountOut;\n fee = maxFee;\n protocolFee = computeProtocolFee(maxFee, sParameter);\n } else {\n fee = computeFeeFromAmount(binStep, sParameter, vParameter, inAmount);\n const amountInAfterFee = inAmount.sub(fee);\n const computedOutAmount = getOutAmount(bin, amountInAfterFee, swapForY);\n\n amountOut = computedOutAmount.gt(maxAmountOut)\n ? maxAmountOut\n : computedOutAmount;\n protocolFee = computeProtocolFee(fee, sParameter);\n amountInWithFees = inAmount;\n }\n\n return {\n amountIn: amountInWithFees,\n amountOut,\n fee,\n protocolFee,\n };\n}\n\nfunction getAmountIn(amountOut: BN, price: BN, swapForY: Boolean): BN {\n if (swapForY) {\n return shlDiv(amountOut, price, SCALE_OFFSET, Rounding.Up);\n } else {\n return mulShr(amountOut, price, SCALE_OFFSET, Rounding.Up);\n }\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport { StrategyType, StrategyParameters } from \"../types\";\nimport {\n autoFillXByWeight,\n autoFillYByWeight,\n toAmountAskSide,\n toAmountBidSide,\n toAmountBothSide,\n} from \"./weightToAmounts\";\nimport Decimal from \"decimal.js\";\nconst DEFAULT_MAX_WEIGHT = 2000;\nconst DEFAULT_MIN_WEIGHT = 200;\n\nfunction toWeightSpotBalanced(\n minBinId: number,\n maxBinId: number\n): {\n binId: number;\n weight: number;\n}[] {\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: 1,\n });\n }\n return distributions;\n}\n\nfunction toWeightDecendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number;\n weight: number;\n}[] {\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: maxBinId - i + 1,\n });\n }\n return distributions;\n}\n\nfunction toWeightAscendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number;\n weight: number;\n}[] {\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: i - minBinId + 1,\n });\n }\n return distributions;\n}\n\nfunction toWeightCurve(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number;\n weight: number;\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw \"Invalid strategy params\";\n }\n let maxWeight = DEFAULT_MAX_WEIGHT;\n let minWeight = DEFAULT_MIN_WEIGHT;\n\n let diffWeight = maxWeight - minWeight;\n let diffMinWeight =\n activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0;\n let diffMaxWeight =\n maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0;\n\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (activeId - i) * diffMinWeight,\n });\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (i - activeId) * diffMaxWeight,\n });\n } else {\n distributions.push({\n binId: i,\n weight: maxWeight,\n });\n }\n }\n return distributions;\n}\n\nfunction toWeightBidAsk(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number;\n weight: number;\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw \"Invalid strategy params\";\n }\n let maxWeight = DEFAULT_MAX_WEIGHT;\n let minWeight = DEFAULT_MIN_WEIGHT;\n\n let diffWeight = maxWeight - minWeight;\n let diffMinWeight =\n activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0;\n let diffMaxWeight =\n maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0;\n\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (activeId - i) * diffMinWeight,\n });\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (i - activeId) * diffMaxWeight,\n });\n } else {\n distributions.push({\n binId: i,\n weight: minWeight,\n });\n }\n }\n return distributions;\n}\n\nexport function toAmountsBothSideByStrategy(\n activeId: number,\n binStep: number,\n minBinId: number,\n maxBinId: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n strategyType: StrategyType\n): {\n binId: number;\n amountX: BN;\n amountY: BN;\n}[] {\n const isSingleSideX = amountY.isZero();\n switch (strategyType) {\n case StrategyType.Spot: {\n if (activeId < minBinId || activeId > maxBinId) {\n const weights = toWeightSpotBalanced(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n const amountsInBin = [];\n if (!isSingleSideX) {\n if (minBinId <= activeId) {\n const weights = toWeightSpotBalanced(minBinId, activeId);\n const amounts = toAmountBidSide(activeId, amountY, weights);\n\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId < maxBinId) {\n const weights = toWeightSpotBalanced(activeId + 1, maxBinId);\n const amounts = toAmountAskSide(activeId, binStep, amountX, weights);\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n } else {\n if (minBinId < activeId) {\n const weights = toWeightSpotBalanced(minBinId, activeId - 1);\n const amountsIntoBidSide = toAmountBidSide(\n activeId,\n amountY,\n weights\n );\n for (let bin of amountsIntoBidSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId <= maxBinId) {\n const weights = toWeightSpotBalanced(activeId, maxBinId);\n const amountsIntoAskSide = toAmountAskSide(\n activeId,\n binStep,\n amountX,\n weights\n );\n for (let bin of amountsIntoAskSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n }\n return amountsInBin;\n }\n case StrategyType.Curve: {\n // ask side\n if (activeId < minBinId) {\n let weights = toWeightDecendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n // bid side\n if (activeId > maxBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n const amountsInBin = [];\n if (!isSingleSideX) {\n if (minBinId <= activeId) {\n const weights = toWeightAscendingOrder(minBinId, activeId);\n const amounts = toAmountBidSide(activeId, amountY, weights);\n\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId < maxBinId) {\n const weights = toWeightDecendingOrder(activeId + 1, maxBinId);\n const amounts = toAmountAskSide(activeId, binStep, amountX, weights);\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n } else {\n if (minBinId < activeId) {\n const weights = toWeightAscendingOrder(minBinId, activeId - 1);\n const amountsIntoBidSide = toAmountBidSide(\n activeId,\n amountY,\n weights\n );\n for (let bin of amountsIntoBidSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId <= maxBinId) {\n const weights = toWeightDecendingOrder(activeId, maxBinId);\n const amountsIntoAskSide = toAmountAskSide(\n activeId,\n binStep,\n amountX,\n weights\n );\n for (let bin of amountsIntoAskSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n }\n return amountsInBin;\n }\n case StrategyType.BidAsk: {\n // ask side\n if (activeId < minBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n // bid side\n if (activeId > maxBinId) {\n const weights = toWeightDecendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n const amountsInBin = [];\n if (!isSingleSideX) {\n if (minBinId <= activeId) {\n const weights = toWeightDecendingOrder(minBinId, activeId);\n const amounts = toAmountBidSide(activeId, amountY, weights);\n\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId < maxBinId) {\n const weights = toWeightAscendingOrder(activeId + 1, maxBinId);\n const amounts = toAmountAskSide(activeId, binStep, amountX, weights);\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n } else {\n if (minBinId < activeId) {\n const weights = toWeightDecendingOrder(minBinId, activeId - 1);\n const amountsIntoBidSide = toAmountBidSide(\n activeId,\n amountY,\n weights\n );\n for (let bin of amountsIntoBidSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId <= maxBinId) {\n const weights = toWeightAscendingOrder(activeId, maxBinId);\n const amountsIntoAskSide = toAmountAskSide(\n activeId,\n binStep,\n amountX,\n weights\n );\n for (let bin of amountsIntoAskSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n }\n return amountsInBin;\n }\n case StrategyType.Spot: {\n let weights = toWeightSpotBalanced(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.Curve: {\n let weights = toWeightCurve(minBinId, maxBinId, activeId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.BidAsk: {\n let weights = toWeightBidAsk(minBinId, maxBinId, activeId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n }\n}\n\n// only apply for\nexport function autoFillYByStrategy(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n let weights = toWeightSpotBalanced(minBinId, maxBinId);\n return autoFillYByWeight(\n activeId,\n binStep,\n amountX,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.Curve: {\n let weights = toWeightCurve(minBinId, maxBinId, activeId);\n return autoFillYByWeight(\n activeId,\n binStep,\n amountX,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.BidAsk: {\n let weights = toWeightBidAsk(minBinId, maxBinId, activeId);\n return autoFillYByWeight(\n activeId,\n binStep,\n amountX,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n }\n}\n\n// only apply for balanced deposit\nexport function autoFillXByStrategy(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n let weights = toWeightSpotBalanced(minBinId, maxBinId);\n return autoFillXByWeight(\n activeId,\n binStep,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.Curve: {\n let weights = toWeightCurve(minBinId, maxBinId, activeId);\n return autoFillXByWeight(\n activeId,\n binStep,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.BidAsk: {\n let weights = toWeightBidAsk(minBinId, maxBinId, activeId);\n return autoFillXByWeight(\n activeId,\n binStep,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n }\n}\n\n// this this function to convert correct type for program\nexport function toStrategyParameters({\n maxBinId,\n minBinId,\n strategyType,\n singleSidedX,\n}: StrategyParameters) {\n const parameters = [singleSidedX ? 1 : 0, ...new Array<number>(63).fill(0)];\n switch (strategyType) {\n case StrategyType.Spot: {\n return {\n minBinId,\n maxBinId,\n strategyType: { spotImBalanced: {} },\n parameteres: Buffer.from(parameters).toJSON().data,\n };\n }\n case StrategyType.Curve: {\n return {\n minBinId,\n maxBinId,\n strategyType: { curveImBalanced: {} },\n parameteres: Buffer.from(parameters).toJSON().data,\n };\n }\n case StrategyType.BidAsk: {\n return {\n minBinId,\n maxBinId,\n strategyType: { bidAskImBalanced: {} },\n parameteres: Buffer.from(parameters).toJSON().data,\n };\n }\n }\n}\n","import { AnchorProvider, Program } from \"@coral-xyz/anchor\";\nimport { Cluster, Connection, PublicKey } from \"@solana/web3.js\";\nimport { IDL } from \"../idl\";\nimport { LBCLMM_PROGRAM_IDS } from \"../constants\";\n\n/**\n * It fetches the pool account from the AMM program, and returns the mint addresses for the two tokens\n * @param {Connection} connection - Connection - The connection to the Solana cluster\n * @param {string} poolAddress - The address of the pool account.\n * @returns The tokenAMint and tokenBMint addresses for the pool.\n */\nexport async function getTokensMintFromPoolAddress(\n connection: Connection,\n poolAddress: string,\n opt?: {\n cluster?: Cluster;\n }\n) {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n LBCLMM_PROGRAM_IDS[opt?.cluster ?? \"mainnet-beta\"],\n provider\n );\n\n const poolAccount = await program.account.lbPair.fetchNullable(\n new PublicKey(poolAddress)\n );\n\n if (!poolAccount) throw new Error(\"Pool account not found\");\n\n return {\n tokenXMint: poolAccount.tokenXMint,\n tokenYMint: poolAccount.tokenYMint,\n };\n}\n","import { DLMM } from \"./dlmm\";\n\nexport default DLMM;\nexport * from \"./dlmm/helpers\";\nexport * from \"./dlmm/types\";\nexport * from \"./dlmm/error\";\nexport * from \"./dlmm/constants\";\nexport * from \"./dlmm/idl\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dlmm/index.ts","../src/dlmm/constants/index.ts","../src/dlmm/idl.ts","../src/dlmm/error.ts","../src/dlmm/helpers/index.ts","../src/dlmm/helpers/math.ts","../src/dlmm/helpers/u64xu64_math.ts","../src/dlmm/helpers/weight.ts","../src/dlmm/helpers/weightToAmounts.ts","../src/dlmm/helpers/computeUnit.ts","../src/dlmm/helpers/derive.ts","../src/dlmm/helpers/binArray.ts","../src/dlmm/types/index.ts","../src/dlmm/helpers/fee.ts","../src/dlmm/helpers/strategy.ts","../src/dlmm/helpers/lbPair.ts","../src/index.ts"],"names":["AnchorProvider","BN","Program","NATIVE_MINT","TOKEN_PROGRAM_ID","createAssociatedTokenAccountIdempotentInstruction","createAssociatedTokenAccountInstruction","getAssociatedTokenAddressSync","ComputeBudgetProgram","PublicKey","SystemProgram","Decimal","Network","TransactionInstruction","gaussian","idx","PositionVersion","PairType","StrategyType","ActivationType","BinLiquidity","BitmapType","PairStatus","sParameters","addLiqIx","setCUIx","blockhash","lastValidBlockHeight","positions","i","toBinArrayPubkey","lowerBinArrayIdx","lowerBinArray","upperBinArray","delta","lowerBinId"],"mappings":"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AA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AA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","sourcesContent":["import { AnchorProvider, BN, Program } from \"@coral-xyz/anchor\";\nimport { bs58 } from \"@coral-xyz/anchor/dist/cjs/utils/bytes\";\nimport {\n AccountLayout,\n MintLayout,\n NATIVE_MINT,\n TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountIdempotentInstruction,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n unpackAccount,\n} from \"@solana/spl-token\";\nimport {\n AccountMeta,\n Cluster,\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport Decimal from \"decimal.js\";\nimport {\n BASIS_POINT_MAX,\n BIN_ARRAY_FEE,\n FEE_PRECISION,\n LBCLMM_PROGRAM_IDS,\n MAX_ACTIVE_BIN_SLIPPAGE,\n MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX,\n MAX_BIN_PER_POSITION,\n MAX_BIN_PER_TX,\n MAX_CLAIM_ALL_ALLOWED,\n MAX_EXTRA_BIN_ARRAYS,\n MAX_FEE_RATE,\n POSITION_FEE,\n PRECISION,\n SCALE_OFFSET,\n} from \"./constants\";\nimport { DlmmSdkError } from \"./error\";\nimport {\n binIdToBinArrayIndex,\n chunkedGetMultipleAccountInfos,\n chunks,\n computeFee,\n computeFeeFromAmount,\n deriveBinArray,\n deriveBinArrayBitmapExtension,\n deriveCustomizablePermissionlessLbPair,\n deriveLbPair,\n deriveLbPair2,\n deriveOracle,\n derivePermissionLbPair,\n derivePosition,\n deriveReserve,\n findNextBinArrayIndexWithLiquidity,\n findNextBinArrayWithLiquidity,\n getBinArrayLowerUpperBinId,\n getBinFromBinArray,\n getEstimatedComputeUnitIxWithBuffer,\n getOrCreateATAInstruction,\n getOutAmount,\n getPriceOfBinByBinId,\n getTokenDecimals,\n getTotalFee,\n isBinIdWithinBinArray,\n isOverflowDefaultBinArrayBitmap,\n swapExactInQuoteAtBin,\n swapExactOutQuoteAtBin,\n toStrategyParameters,\n toWeightDistribution,\n unwrapSOLInstruction,\n wrapSOLInstruction,\n enumerateBins,\n range,\n} from \"./helpers\";\nimport {\n Rounding,\n compressBinAmount,\n computeBaseFactorFromFeeBps,\n distributeAmountToCompressedBinsByRatio,\n findSwappableMinMaxBinId,\n generateAmountForBinRange,\n getPositionCount,\n getQPriceFromId,\n mulDiv,\n mulShr,\n shlDiv,\n} from \"./helpers/math\";\nimport { IDL } from \"./idl\";\nimport {\n ActivationType,\n Bin,\n BinAndAmount,\n BinArray,\n BinArrayAccount,\n BinArrayBitmapExtension,\n BinArrayBitmapExtensionAccount,\n BinLiquidity,\n BinLiquidityDistribution,\n ClmmProgram,\n Clock,\n ClockLayout,\n CompressedBinDepositAmounts,\n EmissionRate,\n FeeInfo,\n InitCustomizablePermissionlessPairIx,\n InitPermissionPairIx,\n LMRewards,\n LbPair,\n LbPairAccount,\n LbPosition,\n LiquidityOneSideParameter,\n LiquidityParameter,\n LiquidityParameterByStrategy,\n LiquidityParameterByWeight,\n PairLockInfo,\n PairStatus,\n PairType,\n Position,\n PositionBinData,\n PositionData,\n PositionInfo,\n PositionV2,\n PositionVersion,\n ProgramStrategyParameter,\n SeedLiquidityResponse,\n SwapExactOutParams,\n SwapFee,\n SwapParams,\n SwapQuote,\n SwapQuoteExactOut,\n SwapWithPriceImpactParams,\n TInitializePositionAndAddLiquidityParams,\n TInitializePositionAndAddLiquidityParamsByStrategy,\n TQuoteCreatePositionParams,\n TokenReserve,\n sParameters,\n vParameters,\n} from \"./types\";\nimport { DEFAULT_ADD_LIQUIDITY_CU } from \"./helpers/computeUnit\";\nimport { max, min } from \"bn.js\";\n\ntype Opt = {\n cluster?: Cluster | \"localhost\";\n programId?: PublicKey;\n};\n\nexport class DLMM {\n constructor(\n public pubkey: PublicKey,\n public program: ClmmProgram,\n public lbPair: LbPair,\n public binArrayBitmapExtension: BinArrayBitmapExtensionAccount | null,\n public tokenX: TokenReserve,\n public tokenY: TokenReserve,\n public clock: Clock,\n private opt?: Opt\n ) { }\n\n /** Static public method */\n\n /**\n * The function `getLbPairs` retrieves a list of LB pair accounts using a connection and optional\n * parameters.\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain network.\n * @param {Opt} [opt] - The `opt` parameter is an optional object that contains additional options\n * for the function. It can have the following properties:\n * @returns The function `getLbPairs` returns a Promise that resolves to an array of\n * `LbPairAccount` objects.\n */\n public static async getLbPairs(\n connection: Connection,\n opt?: Opt\n ): Promise<LbPairAccount[]> {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt?.cluster ?? \"mainnet-beta\"],\n provider\n );\n\n return program.account.lbPair.all();\n }\n\n public static async getPairPubkeyIfExists(\n connection: Connection,\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n baseFactor: BN,\n opt?: Opt\n ): Promise<PublicKey | null> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n try {\n const [lbPair2Key] = deriveLbPair2(\n tokenX,\n tokenY,\n binStep,\n baseFactor,\n program.programId\n );\n const account2 = await program.account.lbPair.fetchNullable(lbPair2Key);\n if (account2) return lbPair2Key;\n\n const [lbPairKey] = deriveLbPair(\n tokenX,\n tokenY,\n binStep,\n program.programId\n );\n\n const account = await program.account.lbPair.fetchNullable(lbPairKey);\n if (account && account.parameters.baseFactor === baseFactor.toNumber()) {\n return lbPairKey;\n }\n\n return null;\n } catch (error) {\n return null;\n }\n }\n\n public static async getCustomizablePermissionlessLbPairIfExists(\n connection: Connection,\n tokenX: PublicKey,\n tokenY: PublicKey,\n opt?: Opt\n ): Promise<PublicKey | null> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n try {\n const [lpPair] = deriveCustomizablePermissionlessLbPair(\n tokenX,\n tokenY,\n program.programId\n );\n const account = await program.account.lbPair.fetchNullable(lpPair);\n if (account) return lpPair;\n\n return null;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * The `create` function is a static method that creates a new instance of the `DLMM` class\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain network.\n * @param {PublicKey} dlmm - The PublicKey of LB Pair.\n * @param {Opt} [opt] - The `opt` parameter is an optional object that can contain additional options\n * for the `create` function. It has the following properties:\n * @returns The `create` function returns a `Promise` that resolves to a `DLMM` object.\n */\n static async create(\n connection: Connection,\n dlmm: PublicKey,\n opt?: Opt\n ): Promise<DLMM> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n const binArrayBitMapExtensionPubkey = deriveBinArrayBitmapExtension(\n dlmm,\n program.programId\n )[0];\n const accountsToFetch = [\n dlmm,\n binArrayBitMapExtensionPubkey,\n SYSVAR_CLOCK_PUBKEY,\n ];\n\n const accountsInfo = await chunkedGetMultipleAccountInfos(\n connection,\n accountsToFetch\n );\n const lbPairAccountInfoBuffer = accountsInfo[0]?.data;\n if (!lbPairAccountInfoBuffer)\n throw new Error(`LB Pair account ${dlmm.toBase58()} not found`);\n const lbPairAccInfo: LbPair = program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccountInfoBuffer\n );\n const binArrayBitMapAccountInfoBuffer = accountsInfo[1]?.data;\n let binArrayBitMapExtensionAccInfo: BinArrayBitmapExtension | null = null;\n if (binArrayBitMapAccountInfoBuffer) {\n binArrayBitMapExtensionAccInfo = program.coder.accounts.decode(\n \"binArrayBitmapExtension\",\n binArrayBitMapAccountInfoBuffer\n );\n }\n\n const clockAccountInfoBuffer = accountsInfo[2]?.data;\n if (!clockAccountInfoBuffer) throw new Error(`Clock account not found`);\n const clock = ClockLayout.decode(clockAccountInfoBuffer) as Clock;\n\n const reserveAccountsInfo = await chunkedGetMultipleAccountInfos(\n program.provider.connection,\n [\n lbPairAccInfo.reserveX,\n lbPairAccInfo.reserveY,\n lbPairAccInfo.tokenXMint,\n lbPairAccInfo.tokenYMint,\n ]\n );\n let binArrayBitmapExtension: BinArrayBitmapExtensionAccount | null;\n if (binArrayBitMapExtensionAccInfo) {\n binArrayBitmapExtension = {\n account: binArrayBitMapExtensionAccInfo,\n publicKey: binArrayBitMapExtensionPubkey,\n };\n }\n\n const reserveXBalance = AccountLayout.decode(reserveAccountsInfo[0].data);\n const reserveYBalance = AccountLayout.decode(reserveAccountsInfo[1].data);\n const tokenXDecimal = MintLayout.decode(\n reserveAccountsInfo[2].data\n ).decimals;\n const tokenYDecimal = MintLayout.decode(\n reserveAccountsInfo[3].data\n ).decimals;\n const tokenX = {\n publicKey: lbPairAccInfo.tokenXMint,\n reserve: lbPairAccInfo.reserveX,\n amount: reserveXBalance.amount,\n decimal: tokenXDecimal,\n };\n const tokenY = {\n publicKey: lbPairAccInfo.tokenYMint,\n reserve: lbPairAccInfo.reserveY,\n amount: reserveYBalance.amount,\n decimal: tokenYDecimal,\n };\n return new DLMM(\n dlmm,\n program,\n lbPairAccInfo,\n binArrayBitmapExtension,\n tokenX,\n tokenY,\n clock,\n opt\n );\n }\n\n /**\n * Similar to `create` function, but it accept multiple lbPairs to be initialized.\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain network.\n * @param dlmmList - An Array of PublicKey of LB Pairs.\n * @param {Opt} [opt] - An optional parameter of type `Opt`.\n * @returns The function `createMultiple` returns a Promise that resolves to an array of `DLMM`\n * objects.\n */\n static async createMultiple(\n connection: Connection,\n dlmmList: Array<PublicKey>,\n opt?: Opt\n ): Promise<DLMM[]> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n const binArrayBitMapExtensions = dlmmList.map(\n (lbPair) => deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n );\n const accountsToFetch = [\n ...dlmmList,\n ...binArrayBitMapExtensions,\n SYSVAR_CLOCK_PUBKEY,\n ];\n\n const accountsInfo = await chunkedGetMultipleAccountInfos(\n connection,\n accountsToFetch\n );\n\n const clockAccount = accountsInfo.pop();\n const clockAccountInfoBuffer = clockAccount?.data;\n if (!clockAccountInfoBuffer) throw new Error(`Clock account not found`);\n const clock = ClockLayout.decode(clockAccountInfoBuffer) as Clock;\n\n const lbPairArraysMap = new Map<string, LbPair>();\n for (let i = 0; i < dlmmList.length; i++) {\n const lbPairPubKey = dlmmList[i];\n const lbPairAccountInfoBuffer = accountsInfo[i]?.data;\n if (!lbPairAccountInfoBuffer)\n throw new Error(`LB Pair account ${lbPairPubKey.toBase58()} not found`);\n const binArrayAccInfo = program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccountInfoBuffer\n );\n lbPairArraysMap.set(lbPairPubKey.toBase58(), binArrayAccInfo);\n }\n\n const binArrayBitMapExtensionsMap = new Map<\n string,\n BinArrayBitmapExtension\n >();\n for (let i = dlmmList.length; i < accountsInfo.length; i++) {\n const index = i - dlmmList.length;\n const lbPairPubkey = dlmmList[index];\n const binArrayBitMapAccountInfoBuffer = accountsInfo[i]?.data;\n if (binArrayBitMapAccountInfoBuffer) {\n const binArrayBitMapExtensionAccInfo = program.coder.accounts.decode(\n \"binArrayBitmapExtension\",\n binArrayBitMapAccountInfoBuffer\n );\n binArrayBitMapExtensionsMap.set(\n lbPairPubkey.toBase58(),\n binArrayBitMapExtensionAccInfo\n );\n }\n }\n\n const reservePublicKeys = Array.from(lbPairArraysMap.values())\n .map(({ reserveX, reserveY }) => [reserveX, reserveY])\n .flat();\n\n const tokenMintPublicKeys = Array.from(lbPairArraysMap.values())\n .map(({ tokenXMint, tokenYMint }) => [tokenXMint, tokenYMint])\n .flat();\n\n const reserveAndTokenMintAccountsInfo =\n await chunkedGetMultipleAccountInfos(program.provider.connection, [\n ...reservePublicKeys,\n ...tokenMintPublicKeys,\n ]);\n\n const lbClmmImpl = await Promise.all(\n dlmmList.map(async (lbPair, index) => {\n const lbPairState = lbPairArraysMap.get(lbPair.toBase58());\n if (!lbPairState)\n throw new Error(`LB Pair ${lbPair.toBase58()} state not found`);\n\n const binArrayBitmapExtensionState = binArrayBitMapExtensionsMap.get(\n lbPair.toBase58()\n );\n const binArrayBitmapExtensionPubkey = binArrayBitMapExtensions[index];\n\n let binArrayBitmapExtension: BinArrayBitmapExtensionAccount | null =\n null;\n if (binArrayBitmapExtensionState) {\n binArrayBitmapExtension = {\n account: binArrayBitmapExtensionState,\n publicKey: binArrayBitmapExtensionPubkey,\n };\n }\n\n const reserveXAccountInfo = reserveAndTokenMintAccountsInfo[index * 2];\n const reserveYAccountInfo =\n reserveAndTokenMintAccountsInfo[index * 2 + 1];\n const tokenXMintAccountInfo =\n reserveAndTokenMintAccountsInfo[reservePublicKeys.length + index * 2];\n const tokenYMintAccountInfo =\n reserveAndTokenMintAccountsInfo[\n reservePublicKeys.length + index * 2 + 1\n ];\n\n if (!reserveXAccountInfo || !reserveYAccountInfo)\n throw new Error(\n `Reserve account for LB Pair ${lbPair.toBase58()} not found`\n );\n\n const reserveXBalance = AccountLayout.decode(reserveXAccountInfo.data);\n const reserveYBalance = AccountLayout.decode(reserveYAccountInfo.data);\n const tokenXDecimal = MintLayout.decode(\n tokenXMintAccountInfo.data\n ).decimals;\n const tokenYDecimal = MintLayout.decode(\n tokenYMintAccountInfo.data\n ).decimals;\n const tokenX = {\n publicKey: lbPairState.tokenXMint,\n reserve: lbPairState.reserveX,\n amount: reserveXBalance.amount,\n decimal: tokenXDecimal,\n };\n const tokenY = {\n publicKey: lbPairState.tokenYMint,\n reserve: lbPairState.reserveY,\n amount: reserveYBalance.amount,\n decimal: tokenYDecimal,\n };\n return new DLMM(\n lbPair,\n program,\n lbPairState,\n binArrayBitmapExtension,\n tokenX,\n tokenY,\n clock,\n opt\n );\n })\n );\n\n return lbClmmImpl;\n }\n\n static async getAllPresetParameters(connection: Connection, opt?: Opt) {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt?.cluster ?? \"mainnet-beta\"],\n provider\n );\n\n const presetParameter = await program.account.presetParameter.all();\n return presetParameter;\n }\n\n /**\n * The function `getAllLbPairPositionsByUser` retrieves all liquidity pool pair positions for a given\n * user.\n * @param {Connection} connection - The `connection` parameter is an instance of the `Connection`\n * class, which represents the connection to the Solana blockchain.\n * @param {PublicKey} userPubKey - The user's wallet public key.\n * @param {Opt} [opt] - An optional object that contains additional options for the function.\n * @returns The function `getAllLbPairPositionsByUser` returns a `Promise` that resolves to a `Map`\n * object. The `Map` object contains key-value pairs, where the key is a string representing the LB\n * Pair account, and the value is an object of PositionInfo\n */\n static async getAllLbPairPositionsByUser(\n connection: Connection,\n userPubKey: PublicKey,\n opt?: Opt\n ): Promise<Map<string, PositionInfo>> {\n const cluster = opt?.cluster || \"mainnet-beta\";\n\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[cluster],\n provider\n );\n\n const positionsV2 = await program.account.positionV2.all([\n {\n memcmp: {\n bytes: bs58.encode(userPubKey.toBuffer()),\n offset: 8 + 32,\n },\n },\n ]);\n\n const binArrayPubkeySetV2 = new Set<string>();\n const lbPairSetV2 = new Set<string>();\n positionsV2.forEach(({ account: { upperBinId, lowerBinId, lbPair } }) => {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n lbPair,\n lowerBinArrayIndex,\n program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n lbPair,\n upperBinArrayIndex,\n program.programId\n );\n binArrayPubkeySetV2.add(lowerBinArrayPubKey.toBase58());\n binArrayPubkeySetV2.add(upperBinArrayPubKey.toBase58());\n lbPairSetV2.add(lbPair.toBase58());\n });\n const binArrayPubkeyArrayV2 = Array.from(binArrayPubkeySetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n const lbPairArrayV2 = Array.from(lbPairSetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const [clockAccInfo, ...binArraysAccInfo] =\n await chunkedGetMultipleAccountInfos(connection, [\n SYSVAR_CLOCK_PUBKEY,\n ...binArrayPubkeyArrayV2,\n ...lbPairArrayV2,\n ]);\n\n const positionBinArraysMapV2 = new Map();\n\n for (\n let i = 0;\n i < binArrayPubkeyArrayV2.length;\n i++\n ) {\n const binArrayPubkey =\n binArrayPubkeyArrayV2[\n i\n ];\n const binArrayAccInfoBufferV2 = binArraysAccInfo[i];\n if (binArrayAccInfoBufferV2) {\n const binArrayAccInfo = program.coder.accounts.decode(\n \"binArray\",\n binArrayAccInfoBufferV2.data\n );\n positionBinArraysMapV2.set(binArrayPubkey.toBase58(), binArrayAccInfo);\n }\n }\n\n const lbPairArraysMapV2 = new Map<string, LbPair>();\n for (\n let i =\n binArrayPubkeyArrayV2.length;\n i < binArraysAccInfo.length;\n i++\n ) {\n const lbPairPubkey =\n lbPairArrayV2[\n i - binArrayPubkeyArrayV2.length\n ];\n const lbPairAccInfoBufferV2 = binArraysAccInfo[i];\n if (!lbPairAccInfoBufferV2)\n throw new Error(`LB Pair account ${lbPairPubkey.toBase58()} not found`);\n const lbPairAccInfo = program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccInfoBufferV2.data\n );\n lbPairArraysMapV2.set(lbPairPubkey.toBase58(), lbPairAccInfo);\n }\n\n const reservePublicKeysV2 = Array.from(lbPairArraysMapV2.values())\n .map(({ reserveX, reserveY, tokenXMint, tokenYMint }) => [\n reserveX,\n reserveY,\n tokenXMint,\n tokenYMint,\n ])\n .flat();\n\n const reserveAccountsInfo = await chunkedGetMultipleAccountInfos(\n program.provider.connection,\n reservePublicKeysV2\n );\n\n const lbPairReserveMapV2 = new Map<\n string,\n { reserveX: bigint; reserveY: bigint }\n >();\n const lbPairMintMapV2 = new Map<\n string,\n { mintXDecimal: number; mintYDecimal: number }\n >();\n lbPairArrayV2.forEach((lbPair, idx) => {\n const index = idx * 4;\n const reserveAccBufferXV2 =\n reserveAccountsInfo[index];\n const reserveAccBufferYV2 =\n reserveAccountsInfo[index + 1];\n if (!reserveAccBufferXV2 || !reserveAccBufferYV2)\n throw new Error(\n `Reserve account for LB Pair ${lbPair.toBase58()} not found`\n );\n const reserveAccX = AccountLayout.decode(reserveAccBufferXV2.data);\n const reserveAccY = AccountLayout.decode(reserveAccBufferYV2.data);\n\n lbPairReserveMapV2.set(lbPair.toBase58(), {\n reserveX: reserveAccX.amount,\n reserveY: reserveAccY.amount,\n });\n\n const mintXBufferV2 =\n reserveAccountsInfo[index + 2];\n const mintYBufferV2 =\n reserveAccountsInfo[index + 3];\n if (!mintXBufferV2 || !mintYBufferV2)\n throw new Error(\n `Mint account for LB Pair ${lbPair.toBase58()} not found`\n );\n const mintX = MintLayout.decode(mintXBufferV2.data);\n const mintY = MintLayout.decode(mintYBufferV2.data);\n lbPairMintMapV2.set(lbPair.toBase58(), {\n mintXDecimal: mintX.decimals,\n mintYDecimal: mintY.decimals,\n });\n });\n\n const onChainTimestamp = new BN(\n clockAccInfo.data.readBigInt64LE(32).toString()\n ).toNumber();\n const positionsMap: Map<\n string,\n {\n publicKey: PublicKey;\n lbPair: LbPair;\n tokenX: TokenReserve;\n tokenY: TokenReserve;\n lbPairPositionsData: Array<{\n publicKey: PublicKey;\n positionData: PositionData;\n version: PositionVersion;\n }>;\n }\n > = new Map();\n for (let position of positionsV2) {\n const { account, publicKey: positionPubKey } = position;\n\n const { upperBinId, lowerBinId, lbPair, feeOwner } = account;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n lbPair,\n lowerBinArrayIndex,\n program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n lbPair,\n upperBinArrayIndex,\n program.programId\n );\n const lowerBinArray = positionBinArraysMapV2.get(\n lowerBinArrayPubKey.toBase58()\n );\n const upperBinArray = positionBinArraysMapV2.get(\n upperBinArrayPubKey.toBase58()\n );\n\n const lbPairAcc = lbPairArraysMapV2.get(lbPair.toBase58());\n const [baseTokenDecimal, quoteTokenDecimal] = await Promise.all([\n getTokenDecimals(program.provider.connection, lbPairAcc.tokenXMint),\n getTokenDecimals(program.provider.connection, lbPairAcc.tokenYMint),\n ]);\n const reserveXBalance =\n lbPairReserveMapV2.get(lbPair.toBase58())?.reserveX ?? BigInt(0);\n const reserveYBalance =\n lbPairReserveMapV2.get(lbPair.toBase58())?.reserveY ?? BigInt(0);\n const tokenX = {\n publicKey: lbPairAcc.tokenXMint,\n reserve: lbPairAcc.reserveX,\n amount: reserveXBalance,\n decimal: baseTokenDecimal,\n };\n const tokenY = {\n publicKey: lbPairAcc.tokenYMint,\n reserve: lbPairAcc.reserveY,\n amount: reserveYBalance,\n decimal: quoteTokenDecimal,\n };\n const positionData = !!lowerBinArray && !!upperBinArray ? await DLMM.processPosition(\n program,\n PositionVersion.V2,\n lbPairAcc,\n onChainTimestamp,\n account,\n baseTokenDecimal,\n quoteTokenDecimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n ) : {\n totalXAmount: '0',\n totalYAmount: '0',\n positionBinData: [],\n lastUpdatedAt: new BN(0),\n upperBinId,\n lowerBinId,\n feeX: new BN(0),\n feeY: new BN(0),\n rewardOne: new BN(0),\n rewardTwo: new BN(0),\n feeOwner,\n totalClaimedFeeXAmount: new BN(0),\n totalClaimedFeeYAmount: new BN(0),\n };\n\n if (positionData) {\n positionsMap.set(lbPair.toBase58(), {\n publicKey: lbPair,\n lbPair: lbPairAcc,\n tokenX,\n tokenY,\n lbPairPositionsData: [\n ...(positionsMap.get(lbPair.toBase58())?.lbPairPositionsData ?? []),\n {\n publicKey: positionPubKey,\n positionData,\n version: PositionVersion.V2,\n },\n ],\n });\n }\n }\n\n return positionsMap;\n }\n\n public static getPricePerLamport(\n tokenXDecimal: number,\n tokenYDecimal: number,\n price: number\n ): string {\n return new Decimal(price)\n .mul(new Decimal(10 ** (tokenYDecimal - tokenXDecimal)))\n .toString();\n }\n\n public static getBinIdFromPrice(\n price: string | number | Decimal,\n binStep: number,\n min: boolean\n ): number {\n const binStepNum = new Decimal(binStep).div(new Decimal(BASIS_POINT_MAX));\n const binId = new Decimal(price)\n .log()\n .dividedBy(new Decimal(1).add(binStepNum).log());\n return (min ? binId.floor() : binId.ceil()).toNumber();\n }\n\n /**\n * The function `getLbPairLockInfo` retrieves all pair positions that has locked liquidity.\n * @param {number} [lockDurationOpt] - An optional value indicating the minimum position lock duration that the function should return. \n * Depending on the lbPair activationType, the param should be a number of seconds or a number of slots.\n * @returns The function `getLbPairLockInfo` returns a `Promise` that resolves to a `PairLockInfo`\n * object. The `PairLockInfo` object contains an array of `PositionLockInfo` objects.\n */\n public async getLbPairLockInfo(lockDurationOpt?: number): Promise<PairLockInfo> {\n const lockDuration = lockDurationOpt | 0;\n\n const lbPairPositions = await this.program.account.positionV2.all([\n {\n memcmp: {\n bytes: bs58.encode(this.pubkey.toBuffer()),\n offset: 8,\n },\n },\n ]);\n\n // filter positions has lock_release_point > currentTimestamp + lockDurationSecs\n const clockAccInfo = await this.program.provider.connection.getAccountInfo(SYSVAR_CLOCK_PUBKEY);\n const clock = ClockLayout.decode(clockAccInfo.data) as Clock;\n\n const currentPoint = this.lbPair.activationType == ActivationType.Slot ? clock.slot : clock.unixTimestamp;\n const minLockReleasePoint = currentPoint.add(new BN(lockDuration));\n const positionsWithLock = lbPairPositions.filter(p => p.account.lockReleasePoint.gt(minLockReleasePoint));\n\n if (positionsWithLock.length == 0) {\n return {\n positions: [],\n }\n }\n\n const binArrayPubkeySetV2 = new Set<string>();\n positionsWithLock.forEach(({ account: { upperBinId, lowerBinId, lbPair } }) => {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n binArrayPubkeySetV2.add(lowerBinArrayPubKey.toBase58());\n binArrayPubkeySetV2.add(upperBinArrayPubKey.toBase58());\n });\n const binArrayPubkeyArrayV2 = Array.from(binArrayPubkeySetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const binArraysAccInfo = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n binArrayPubkeyArrayV2,\n );\n\n const positionBinArraysMapV2 = new Map();\n for (let i = 0; i < binArraysAccInfo.length; i++) {\n const binArrayPubkey =\n binArrayPubkeyArrayV2[i];\n const binArrayAccBufferV2 = binArraysAccInfo[i];\n if (!binArrayAccBufferV2)\n throw new Error(\n `Bin Array account ${binArrayPubkey.toBase58()} not found`\n );\n const binArrayAccInfo = this.program.coder.accounts.decode(\n \"binArray\",\n binArrayAccBufferV2.data\n );\n positionBinArraysMapV2.set(binArrayPubkey.toBase58(), binArrayAccInfo);\n }\n\n\n\n const positionsLockInfo = await Promise.all(\n positionsWithLock.map(async ({ publicKey, account }) => {\n const { lowerBinId, upperBinId, feeOwner } = account;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n const lowerBinArray = positionBinArraysMapV2.get(\n lowerBinArrayPubKey.toBase58()\n );\n const upperBinArray = positionBinArraysMapV2.get(\n upperBinArrayPubKey.toBase58()\n );\n\n const positionData = await DLMM.processPosition(\n this.program,\n PositionVersion.V2,\n this.lbPair,\n clock.unixTimestamp.toNumber(),\n account,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n );\n return {\n positionAddress: publicKey,\n owner: account.owner,\n lockReleasePoint: account.lockReleasePoint.toNumber(),\n tokenXAmount: positionData.totalXAmount,\n tokenYAmount: positionData.totalYAmount,\n };\n })\n );\n\n return {\n positions: positionsLockInfo\n };\n }\n\n /** Public methods */\n\n public static async createPermissionLbPair(\n connection: Connection,\n binStep: BN,\n tokenX: PublicKey,\n tokenY: PublicKey,\n activeId: BN,\n baseKey: PublicKey,\n creatorKey: PublicKey,\n feeBps: BN,\n activationType: ActivationType,\n opt?: Opt\n ) {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt.cluster],\n provider\n );\n\n const [lbPair] = derivePermissionLbPair(\n baseKey,\n tokenX,\n tokenY,\n binStep,\n program.programId\n );\n\n const [reserveX] = deriveReserve(tokenX, lbPair, program.programId);\n const [reserveY] = deriveReserve(tokenY, lbPair, program.programId);\n const [oracle] = deriveOracle(lbPair, program.programId);\n\n const activeBinArrayIndex = binIdToBinArrayIndex(activeId);\n const binArrayBitmapExtension = isOverflowDefaultBinArrayBitmap(\n activeBinArrayIndex\n )\n ? deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n : null;\n\n const { minBinId, maxBinId } = findSwappableMinMaxBinId(binStep);\n\n const ixData: InitPermissionPairIx = {\n activeId: activeId.toNumber(),\n binStep: binStep.toNumber(),\n baseFactor: computeBaseFactorFromFeeBps(binStep, feeBps).toNumber(),\n minBinId: minBinId.toNumber(),\n maxBinId: maxBinId.toNumber(),\n activationType,\n };\n\n return program.methods\n .initializePermissionLbPair(ixData)\n .accounts({\n lbPair,\n rent: SYSVAR_RENT_PUBKEY,\n reserveX,\n reserveY,\n binArrayBitmapExtension,\n tokenMintX: tokenX,\n tokenMintY: tokenY,\n tokenProgram: TOKEN_PROGRAM_ID,\n oracle,\n systemProgram: SystemProgram.programId,\n admin: creatorKey,\n base: baseKey,\n })\n .transaction();\n }\n\n public static async createCustomizablePermissionlessLbPair(\n connection: Connection,\n binStep: BN,\n tokenX: PublicKey,\n tokenY: PublicKey,\n activeId: BN,\n feeBps: BN,\n activationType: ActivationType,\n hasAlphaVault: boolean,\n creatorKey: PublicKey,\n activationPoint?: BN,\n creatorPoolOnOffControl?: boolean,\n opt?: Opt\n ): Promise<Transaction> {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt.cluster],\n provider\n );\n\n const [lbPair] = deriveCustomizablePermissionlessLbPair(\n tokenX,\n tokenY,\n program.programId\n );\n\n const [reserveX] = deriveReserve(tokenX, lbPair, program.programId);\n const [reserveY] = deriveReserve(tokenY, lbPair, program.programId);\n const [oracle] = deriveOracle(lbPair, program.programId);\n\n const activeBinArrayIndex = binIdToBinArrayIndex(activeId);\n const binArrayBitmapExtension = isOverflowDefaultBinArrayBitmap(\n activeBinArrayIndex\n )\n ? deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n : null;\n\n const ixData: InitCustomizablePermissionlessPairIx = {\n activeId: activeId.toNumber(),\n binStep: binStep.toNumber(),\n baseFactor: computeBaseFactorFromFeeBps(binStep, feeBps).toNumber(),\n activationType,\n activationPoint: activationPoint ? activationPoint : null,\n hasAlphaVault,\n creatorPoolOnOffControl: creatorPoolOnOffControl ? creatorPoolOnOffControl : false,\n padding: Array(63).fill(0),\n };\n\n const userTokenX = getAssociatedTokenAddressSync(tokenX, creatorKey);\n const userTokenY = getAssociatedTokenAddressSync(tokenY, creatorKey);\n\n return program.methods\n .initializeCustomizablePermissionlessLbPair(ixData)\n .accounts({\n lbPair,\n reserveX,\n reserveY,\n binArrayBitmapExtension,\n tokenMintX: tokenX,\n tokenMintY: tokenY,\n tokenProgram: TOKEN_PROGRAM_ID,\n oracle,\n systemProgram: SystemProgram.programId,\n userTokenX,\n userTokenY,\n funder: creatorKey,\n })\n .transaction();\n }\n\n public static async createLbPair(\n connection: Connection,\n funder: PublicKey,\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n baseFactor: BN,\n presetParameter: PublicKey,\n activeId: BN,\n opt?: Opt\n ): Promise<Transaction> {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n opt?.programId ?? LBCLMM_PROGRAM_IDS[opt.cluster],\n provider\n );\n\n const existsPool = await this.getPairPubkeyIfExists(\n connection,\n tokenX,\n tokenY,\n binStep,\n baseFactor\n );\n if (existsPool) {\n throw new Error(\"Pool already exists\");\n }\n\n const [lbPair] = deriveLbPair2(\n tokenX,\n tokenY,\n binStep,\n baseFactor,\n program.programId\n );\n\n const [reserveX] = deriveReserve(tokenX, lbPair, program.programId);\n const [reserveY] = deriveReserve(tokenY, lbPair, program.programId);\n const [oracle] = deriveOracle(lbPair, program.programId);\n\n const activeBinArrayIndex = binIdToBinArrayIndex(activeId);\n const binArrayBitmapExtension = isOverflowDefaultBinArrayBitmap(\n activeBinArrayIndex\n )\n ? deriveBinArrayBitmapExtension(lbPair, program.programId)[0]\n : null;\n\n return program.methods\n .initializeLbPair(activeId.toNumber(), binStep.toNumber())\n .accounts({\n funder,\n lbPair,\n rent: SYSVAR_RENT_PUBKEY,\n reserveX,\n reserveY,\n binArrayBitmapExtension,\n tokenMintX: tokenX,\n tokenMintY: tokenY,\n tokenProgram: TOKEN_PROGRAM_ID,\n oracle,\n presetParameter,\n systemProgram: SystemProgram.programId,\n })\n .transaction();\n }\n\n /**\n * The function `refetchStates` retrieves and updates various states and data related to bin arrays\n * and lb pairs.\n */\n public async refetchStates(): Promise<void> {\n const binArrayBitmapExtensionPubkey = deriveBinArrayBitmapExtension(\n this.pubkey,\n this.program.programId\n )[0];\n const [\n lbPairAccountInfo,\n binArrayBitmapExtensionAccountInfo,\n reserveXAccountInfo,\n reserveYAccountInfo,\n ] = await chunkedGetMultipleAccountInfos(this.program.provider.connection, [\n this.pubkey,\n binArrayBitmapExtensionPubkey,\n this.lbPair.reserveX,\n this.lbPair.reserveY,\n ]);\n\n const lbPairState = this.program.coder.accounts.decode(\n \"lbPair\",\n lbPairAccountInfo.data\n );\n if (binArrayBitmapExtensionAccountInfo) {\n const binArrayBitmapExtensionState = this.program.coder.accounts.decode(\n \"binArrayBitmapExtension\",\n binArrayBitmapExtensionAccountInfo.data\n );\n\n if (binArrayBitmapExtensionState) {\n this.binArrayBitmapExtension = {\n account: binArrayBitmapExtensionState,\n publicKey: binArrayBitmapExtensionPubkey,\n };\n }\n }\n\n const reserveXBalance = AccountLayout.decode(reserveXAccountInfo.data);\n const reserveYBalance = AccountLayout.decode(reserveYAccountInfo.data);\n const [tokenXDecimal, tokenYDecimal] = await Promise.all([\n getTokenDecimals(\n this.program.provider.connection,\n lbPairState.tokenXMint\n ),\n getTokenDecimals(\n this.program.provider.connection,\n lbPairState.tokenYMint\n ),\n ]);\n\n this.tokenX = {\n amount: reserveXBalance.amount,\n decimal: tokenXDecimal,\n publicKey: lbPairState.tokenXMint,\n reserve: lbPairState.reserveX,\n };\n this.tokenY = {\n amount: reserveYBalance.amount,\n decimal: tokenYDecimal,\n publicKey: lbPairState.tokenYMint,\n reserve: lbPairState.reserveY,\n };\n\n this.lbPair = lbPairState;\n }\n\n /**\n * Set the status of a permissionless LB pair to either enabled or disabled. This require pool field `creator_pool_on_off_control` to be true and type `CustomizablePermissionless`.\n * Pool creator can enable/disable the pair anytime before the pool is opened / activated. Once the pool activation time is passed, the pool creator can only enable the pair.\n * Useful for token launches which do not have fixed activation time.\n * @param enable If true, the pair will be enabled. If false, the pair will be disabled.\n * @param creator The public key of the pool creator.\n * @returns a Promise that resolves to the transaction.\n */\n public async setPairStatusPermissionless(enable: boolean, creator: PublicKey) {\n const status: PairStatus = enable ? 0 : 1; // 0 = enable, 1 = disable\n\n const tx = await this.program.methods.setPairStatusPermissionless(status)\n .accounts({\n lbPair: this.pubkey,\n creator\n }).transaction();\n\n const { blockhash, lastValidBlockHeight } = \n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n feePayer: this.lbPair.creator,\n blockhash,\n lastValidBlockHeight,\n }).add(tx);\n }\n\n /**\n * The function `getBinArrays` returns an array of `BinArrayAccount` objects\n * @returns a Promise that resolves to an array of BinArrayAccount objects.\n */\n public async getBinArrays(): Promise<BinArrayAccount[]> {\n return this.program.account.binArray.all([\n {\n memcmp: {\n bytes: bs58.encode(this.pubkey.toBuffer()),\n offset: 8 + 16,\n },\n },\n ]);\n }\n\n /**\n * The function `getBinArrayAroundActiveBin` retrieves a specified number of `BinArrayAccount`\n * objects from the blockchain, based on the active bin and its surrounding bin arrays.\n * @param\n * swapForY - The `swapForY` parameter is a boolean value that indicates whether the swap is using quote token as input.\n * [count=4] - The `count` parameter is the number of bin arrays to retrieve on left and right respectively. By default, it is set to 4.\n * @returns an array of `BinArrayAccount` objects.\n */\n public async getBinArrayForSwap(\n swapForY,\n count = 4\n ): Promise<BinArrayAccount[]> {\n await this.refetchStates();\n\n const binArraysPubkey = new Set<string>();\n\n let shouldStop = false;\n let activeIdToLoop = this.lbPair.activeId;\n\n while (!shouldStop) {\n const binArrayIndex = findNextBinArrayIndexWithLiquidity(\n swapForY,\n new BN(activeIdToLoop),\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null\n );\n if (binArrayIndex === null) shouldStop = true;\n else {\n const [binArrayPubKey] = deriveBinArray(\n this.pubkey,\n binArrayIndex,\n this.program.programId\n );\n binArraysPubkey.add(binArrayPubKey.toBase58());\n\n const [lowerBinId, upperBinId] =\n getBinArrayLowerUpperBinId(binArrayIndex);\n activeIdToLoop = swapForY\n ? lowerBinId.toNumber() - 1\n : upperBinId.toNumber() + 1;\n }\n\n if (binArraysPubkey.size === count) shouldStop = true;\n }\n\n const accountsToFetch = Array.from(binArraysPubkey).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const binArraysAccInfoBuffer = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n accountsToFetch\n );\n\n const binArrays: BinArrayAccount[] = await Promise.all(\n binArraysAccInfoBuffer.map(async (accInfo, idx) => {\n const account: BinArray = this.program.coder.accounts.decode(\n \"binArray\",\n accInfo.data\n );\n const publicKey = accountsToFetch[idx];\n return {\n account,\n publicKey,\n };\n })\n );\n\n return binArrays;\n }\n\n public static calculateFeeInfo(\n baseFactor: number | string,\n binStep: number | string\n ): Omit<FeeInfo, \"protocolFeePercentage\"> {\n const baseFeeRate = new BN(baseFactor).mul(new BN(binStep)).mul(new BN(10));\n const baseFeeRatePercentage = new Decimal(baseFeeRate.toString())\n .mul(new Decimal(100))\n .div(new Decimal(FEE_PRECISION.toString()));\n const maxFeeRatePercentage = new Decimal(MAX_FEE_RATE.toString())\n .mul(new Decimal(100))\n .div(new Decimal(FEE_PRECISION.toString()));\n\n return {\n baseFeeRatePercentage,\n maxFeeRatePercentage,\n };\n }\n\n /**\n * The function `getFeeInfo` calculates and returns the base fee rate percentage, maximum fee rate\n * percentage, and protocol fee percentage.\n * @returns an object of type `FeeInfo` with the following properties: baseFeeRatePercentage, maxFeeRatePercentage, and protocolFeePercentage.\n */\n public getFeeInfo(): FeeInfo {\n const { baseFactor, protocolShare } = this.lbPair.parameters;\n\n const { baseFeeRatePercentage, maxFeeRatePercentage } =\n DLMM.calculateFeeInfo(baseFactor, this.lbPair.binStep);\n\n const protocolFeePercentage = new Decimal(protocolShare.toString())\n .mul(new Decimal(100))\n .div(new Decimal(BASIS_POINT_MAX));\n\n return {\n baseFeeRatePercentage,\n maxFeeRatePercentage,\n protocolFeePercentage,\n };\n }\n\n /**\n * The function calculates and returns a dynamic fee\n * @returns a Decimal value representing the dynamic fee.\n */\n public getDynamicFee(): Decimal {\n let vParameterClone = Object.assign({}, this.lbPair.vParameters);\n let activeId = new BN(this.lbPair.activeId);\n const sParameters = this.lbPair.parameters;\n\n const currentTimestamp = Date.now() / 1000;\n this.updateReference(\n activeId.toNumber(),\n vParameterClone,\n sParameters,\n currentTimestamp\n );\n this.updateVolatilityAccumulator(\n vParameterClone,\n sParameters,\n activeId.toNumber()\n );\n\n const totalFee = getTotalFee(\n this.lbPair.binStep,\n sParameters,\n vParameterClone\n );\n return new Decimal(totalFee.toString())\n .div(new Decimal(FEE_PRECISION.toString()))\n .mul(100);\n }\n\n /**\n * The function `getEmissionRate` returns the emission rates for two rewards.\n * @returns an object of type `EmissionRate`. The object has two properties: `rewardOne` and\n * `rewardTwo`, both of which are of type `Decimal`.\n */\n public getEmissionRate(): EmissionRate {\n const now = Date.now() / 1000;\n const [rewardOneEmissionRate, rewardTwoEmissionRate] =\n this.lbPair.rewardInfos.map(({ rewardRate, rewardDurationEnd }) =>\n now > rewardDurationEnd.toNumber() ? undefined : rewardRate\n );\n\n return {\n rewardOne: rewardOneEmissionRate\n ? new Decimal(rewardOneEmissionRate.toString()).div(PRECISION)\n : undefined,\n rewardTwo: rewardTwoEmissionRate\n ? new Decimal(rewardTwoEmissionRate.toString()).div(PRECISION)\n : undefined,\n };\n }\n\n /**\n * The function `getBinsAroundActiveBin` retrieves a specified number of bins to the left and right\n * of the active bin and returns them along with the active bin ID.\n * @param {number} numberOfBinsToTheLeft - The parameter `numberOfBinsToTheLeft` represents the\n * number of bins to the left of the active bin that you want to retrieve. It determines how many\n * bins you want to include in the result that are positioned to the left of the active bin.\n * @param {number} numberOfBinsToTheRight - The parameter `numberOfBinsToTheRight` represents the\n * number of bins to the right of the active bin that you want to retrieve.\n * @returns an object with two properties: \"activeBin\" and \"bins\". The value of \"activeBin\" is the\n * value of \"this.lbPair.activeId\", and the value of \"bins\" is the result of calling the \"getBins\"\n * function with the specified parameters.\n */\n public async getBinsAroundActiveBin(\n numberOfBinsToTheLeft: number,\n numberOfBinsToTheRight: number\n ): Promise<{ activeBin: number; bins: BinLiquidity[] }> {\n const lowerBinId = this.lbPair.activeId - numberOfBinsToTheLeft - 1;\n const upperBinId = this.lbPair.activeId + numberOfBinsToTheRight + 1;\n\n const bins = await this.getBins(\n this.pubkey,\n lowerBinId,\n upperBinId,\n this.tokenX.decimal,\n this.tokenY.decimal\n );\n\n return { activeBin: this.lbPair.activeId, bins };\n }\n\n /**\n * The function `getBinsBetweenMinAndMaxPrice` retrieves a list of bins within a specified price\n * range.\n * @param {number} minPrice - The minimum price value for filtering the bins.\n * @param {number} maxPrice - The `maxPrice` parameter is the maximum price value that you want to\n * use for filtering the bins.\n * @returns an object with two properties: \"activeBin\" and \"bins\". The value of \"activeBin\" is the\n * active bin ID of the lbPair, and the value of \"bins\" is an array of BinLiquidity objects.\n */\n public async getBinsBetweenMinAndMaxPrice(\n minPrice: number,\n maxPrice: number\n ): Promise<{ activeBin: number; bins: BinLiquidity[] }> {\n const lowerBinId = this.getBinIdFromPrice(minPrice, true) - 1;\n const upperBinId = this.getBinIdFromPrice(maxPrice, false) + 1;\n\n const bins = await this.getBins(\n this.pubkey,\n lowerBinId,\n upperBinId,\n this.tokenX.decimal,\n this.tokenX.decimal\n );\n\n return { activeBin: this.lbPair.activeId, bins };\n }\n\n /**\n * The function `getBinsBetweenLowerAndUpperBound` retrieves a list of bins between a lower and upper\n * bin ID and returns the active bin ID and the list of bins.\n * @param {number} lowerBinId - The lowerBinId parameter is a number that represents the ID of the\n * lowest bin.\n * @param {number} upperBinId - The upperBinID parameter is a number that represents the ID of the\n * highest bin.\n * @param {BinArray} [lowerBinArrays] - The `lowerBinArrays` parameter is an optional parameter of\n * type `BinArray`. It represents an array of bins that are below the lower bin ID.\n * @param {BinArray} [upperBinArrays] - The parameter `upperBinArrays` is an optional parameter of\n * type `BinArray`. It represents an array of bins that are above the upper bin ID.\n * @returns an object with two properties: \"activeBin\" and \"bins\". The value of \"activeBin\" is the\n * active bin ID of the lbPair, and the value of \"bins\" is an array of BinLiquidity objects.\n */\n public async getBinsBetweenLowerAndUpperBound(\n lowerBinId: number,\n upperBinId: number,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ): Promise<{ activeBin: number; bins: BinLiquidity[] }> {\n const bins = await this.getBins(\n this.pubkey,\n lowerBinId,\n upperBinId,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray\n );\n\n return { activeBin: this.lbPair.activeId, bins };\n }\n\n /**\n * The function converts a real price of bin to a lamport value\n * @param {number} price - The `price` parameter is a number representing the price of a token.\n * @returns {string} price per Lamport of bin\n */\n public toPricePerLamport(price: number): string {\n return DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n price\n );\n }\n\n /**\n * The function converts a price per lamport value to a real price of bin\n * @param {number} pricePerLamport - The parameter `pricePerLamport` is a number representing the\n * price per lamport.\n * @returns {string} real price of bin\n */\n public fromPricePerLamport(pricePerLamport: number): string {\n return new Decimal(pricePerLamport)\n .div(new Decimal(10 ** (this.tokenY.decimal - this.tokenX.decimal)))\n .toString();\n }\n\n /**\n * The function retrieves the active bin ID and its corresponding price.\n * @returns an object with two properties: \"binId\" which is a number, and \"price\" which is a string.\n */\n public async getActiveBin(): Promise<BinLiquidity> {\n const { activeId } = await this.program.account.lbPair.fetch(this.pubkey);\n const [activeBinState] = await this.getBins(\n this.pubkey,\n activeId,\n activeId,\n this.tokenX.decimal,\n this.tokenY.decimal\n );\n return activeBinState;\n }\n\n /**\n * The function get bin ID based on a given price and a boolean flag indicating whether to\n * round down or up.\n * @param {number} price - The price parameter is a number that represents the price value.\n * @param {boolean} min - The \"min\" parameter is a boolean value that determines whether to round\n * down or round up the calculated binId. If \"min\" is true, the binId will be rounded down (floor),\n * otherwise it will be rounded up (ceil).\n * @returns {number} which is the binId calculated based on the given price and whether the minimum\n * value should be used.\n */\n public getBinIdFromPrice(price: number, min: boolean): number {\n return DLMM.getBinIdFromPrice(price, this.lbPair.binStep, min);\n }\n\n /**\n * The function `getPositionsByUserAndLbPair` retrieves positions by user and LB pair, including\n * active bin and user positions.\n * @param {PublicKey} [userPubKey] - The `userPubKey` parameter is an optional parameter of type\n * `PublicKey`. It represents the public key of a user. If no `userPubKey` is provided, the function\n * will return an object with an empty `userPositions` array and the active bin information obtained\n * from the `getActive\n * @returns The function `getPositionsByUserAndLbPair` returns a Promise that resolves to an object\n * with two properties:\n * - \"activeBin\" which is an object with two properties: \"binId\" and \"price\". The value of \"binId\"\n * is the active bin ID of the lbPair, and the value of \"price\" is the price of the active bin.\n * - \"userPositions\" which is an array of Position objects.\n */\n public async getPositionsByUserAndLbPair(userPubKey?: PublicKey): Promise<{\n activeBin: BinLiquidity;\n userPositions: Array<LbPosition>;\n }> {\n const promiseResults = await Promise.all([\n this.getActiveBin(),\n userPubKey &&\n this.program.account.positionV2.all([\n {\n memcmp: {\n bytes: bs58.encode(userPubKey.toBuffer()),\n offset: 8 + 32,\n },\n },\n {\n memcmp: {\n bytes: bs58.encode(this.pubkey.toBuffer()),\n offset: 8,\n },\n },\n ]),\n ]);\n\n const [activeBin, positionsV2] = promiseResults;\n\n if (!activeBin) {\n throw new Error(\"Error fetching active bin\");\n }\n\n if (!userPubKey) {\n return {\n activeBin,\n userPositions: [],\n };\n }\n\n if (!positionsV2) {\n throw new Error(\"Error fetching positions\");\n }\n\n const binArrayPubkeySetV2 = new Set<string>();\n positionsV2.forEach(({ account: { upperBinId, lowerBinId, lbPair } }) => {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n binArrayPubkeySetV2.add(lowerBinArrayPubKey.toBase58());\n binArrayPubkeySetV2.add(upperBinArrayPubKey.toBase58());\n });\n const binArrayPubkeyArrayV2 = Array.from(binArrayPubkeySetV2).map(\n (pubkey) => new PublicKey(pubkey)\n );\n\n const lbPairAndBinArrays = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n [\n this.pubkey,\n SYSVAR_CLOCK_PUBKEY,\n ...binArrayPubkeyArrayV2,\n ]\n );\n\n const [lbPairAccInfo, clockAccInfo, ...binArraysAccInfo] =\n lbPairAndBinArrays;\n\n const positionBinArraysMapV2 = new Map();\n for (let i = 0; i < binArraysAccInfo.length; i++) {\n const binArrayPubkey =\n binArrayPubkeyArrayV2[i];\n const binArrayAccBufferV2 = binArraysAccInfo[i];\n if (!binArrayAccBufferV2)\n throw new Error(\n `Bin Array account ${binArrayPubkey.toBase58()} not found`\n );\n const binArrayAccInfo = this.program.coder.accounts.decode(\n \"binArray\",\n binArrayAccBufferV2.data\n );\n positionBinArraysMapV2.set(binArrayPubkey.toBase58(), binArrayAccInfo);\n }\n\n if (!lbPairAccInfo)\n throw new Error(`LB Pair account ${this.pubkey.toBase58()} not found`);\n\n const onChainTimestamp = new BN(\n clockAccInfo.data.readBigInt64LE(32).toString()\n ).toNumber();\n\n const userPositionsV2 = await Promise.all(\n positionsV2.map(async ({ publicKey, account }) => {\n const { lowerBinId, upperBinId, feeOwner } = account;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n const lowerBinArray = positionBinArraysMapV2.get(\n lowerBinArrayPubKey.toBase58()\n );\n const upperBinArray = positionBinArraysMapV2.get(\n upperBinArrayPubKey.toBase58()\n );\n return {\n publicKey,\n positionData: await DLMM.processPosition(\n this.program,\n PositionVersion.V2,\n this.lbPair,\n onChainTimestamp,\n account,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n ),\n version: PositionVersion.V2,\n };\n })\n );\n\n return {\n activeBin,\n userPositions: userPositionsV2,\n };\n }\n\n public async quoteCreatePosition({ strategy }: TQuoteCreatePositionParams) {\n const { minBinId, maxBinId } = strategy;\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const upperBinArrayIndex = BN.max(\n binIdToBinArrayIndex(new BN(maxBinId)),\n lowerBinArrayIndex.add(new BN(1))\n );\n\n const binArraysCount = (\n await this.binArraysToBeCreate(lowerBinArrayIndex, upperBinArrayIndex)\n ).length;\n const positionCount = Math.ceil((maxBinId - minBinId + 1) / MAX_BIN_PER_TX);\n\n const binArrayCost = binArraysCount * BIN_ARRAY_FEE;\n const positionCost = positionCount * POSITION_FEE;\n return {\n binArraysCount,\n binArrayCost,\n positionCount,\n positionCost,\n };\n }\n\n /**\n * Creates an empty position and initializes the corresponding bin arrays if needed.\n * @param param0 The settings of the requested new position.\n * @returns A promise that resolves into a transaction for creating the requested position.\n */\n public async createEmptyPosition({\n positionPubKey,\n minBinId,\n maxBinId,\n user,\n }: {\n positionPubKey: PublicKey;\n minBinId: number;\n maxBinId: number;\n user: PublicKey;\n }) {\n const createPositionIx = await this.program.methods\n .initializePosition(minBinId, maxBinId - minBinId + 1)\n .accounts({\n payer: user,\n position: positionPubKey,\n lbPair: this.pubkey,\n owner: user,\n })\n .instruction();\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(maxBinId))\n );\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n\n const instructions = [createPositionIx, ...createBinArrayIxs];\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(setCUIx, ...instructions);\n }\n\n /**\n * The function `getPosition` retrieves position information for a given public key and processes it\n * using various data to return a `LbPosition` object.\n * @param {PublicKey} positionPubKey - The `getPosition` function you provided is an asynchronous\n * function that fetches position information based on a given public key. Here's a breakdown of the\n * parameters used in the function:\n * @returns The `getPosition` function returns a Promise that resolves to an object of type\n * `LbPosition`. The object contains the following properties:\n * - `publicKey`: The public key of the position account\n * - `positionData`: Position Object\n * - `version`: The version of the position (in this case, `Position.V2`)\n */\n public async getPosition(positionPubKey: PublicKey): Promise<LbPosition> {\n const positionAccountInfo = await this.program.account.positionV2.fetch(positionPubKey);\n if (!positionAccountInfo) {\n throw new Error(`Position account ${positionPubKey.toBase58()} not found`);\n }\n\n const { lowerBinId, upperBinId, feeOwner } = positionAccountInfo;\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n const [lowerBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [upperBinArrayPubKey] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const [clockAccInfo, lowerBinArrayAccInfo, upperBinArrayAccInfo] = await chunkedGetMultipleAccountInfos(\n this.program.provider.connection,\n [\n SYSVAR_CLOCK_PUBKEY,\n lowerBinArrayPubKey,\n upperBinArrayPubKey,\n ]\n );\n\n if (!lowerBinArrayAccInfo || !upperBinArrayAccInfo) {\n return {\n publicKey: positionPubKey,\n positionData: {\n totalXAmount: '0',\n totalYAmount: '0',\n positionBinData: [],\n lastUpdatedAt: new BN(0),\n upperBinId,\n lowerBinId,\n feeX: new BN(0),\n feeY: new BN(0),\n rewardOne: new BN(0),\n rewardTwo: new BN(0),\n feeOwner,\n totalClaimedFeeXAmount: new BN(0),\n totalClaimedFeeYAmount: new BN(0),\n },\n version: PositionVersion.V2,\n }\n }\n\n const onChainTimestamp = new BN(\n clockAccInfo.data.readBigInt64LE(32).toString()\n ).toNumber();\n\n const lowerBinArray = this.program.coder.accounts.decode(\n \"binArray\",\n lowerBinArrayAccInfo.data\n )\n const upperBinArray = this.program.coder.accounts.decode(\n \"binArray\",\n upperBinArrayAccInfo.data\n )\n\n return {\n publicKey: positionPubKey,\n positionData: await DLMM.processPosition(\n this.program,\n PositionVersion.V2,\n this.lbPair,\n onChainTimestamp,\n positionAccountInfo,\n this.tokenX.decimal,\n this.tokenY.decimal,\n lowerBinArray,\n upperBinArray,\n feeOwner\n ),\n version: PositionVersion.V2,\n }\n }\n\n /**\n * The function `initializePositionAndAddLiquidityByStrategy` function is used to initializes a position and adds liquidity\n * @param {TInitializePositionAndAddLiquidityParamsByStrategy}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `strategy`: The strategy parameters to be used for the liquidity pool (Can use `calculateStrategyParameter` to calculate).\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction>} The function `initializePositionAndAddLiquidityByWeight` returns a `Promise` that\n * resolves to either a single `Transaction` object.\n */\n public async initializePositionAndAddLiquidityByStrategy({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n strategy,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParamsByStrategy) {\n const { maxBinId, minBinId } = strategy;\n\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n const preInstructions: TransactionInstruction[] = [];\n const initializePositionIx = await this.program.methods\n .initializePosition(minBinId, maxBinId - minBinId + 1)\n .accounts({\n payer: user,\n position: positionPubKey,\n lbPair: this.pubkey,\n owner: user,\n })\n .instruction();\n preInstructions.push(initializePositionIx);\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(maxBinId))\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const activeId = this.lbPair.activeId;\n\n const strategyParameters: LiquidityParameterByStrategy[\"strategyParameters\"] =\n toStrategyParameters(strategy) as ProgramStrategyParameter;\n\n const liquidityParams: LiquidityParameterByStrategy = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n activeId,\n maxActiveBinSlippage,\n strategyParameters,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const programMethod =\n this.program.methods.addLiquidityByStrategy(liquidityParams);\n\n const addLiquidityIx = await programMethod\n .accounts(addLiquidityAccounts)\n .instruction();\n\n const instructions = [\n ...preInstructions,\n addLiquidityIx,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * The function `initializePositionAndAddLiquidityByWeight` function is used to initializes a position and adds liquidity\n * @param {TInitializePositionAndAddLiquidityParams}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `xYAmountDistribution`: An array of objects of type `XYAmountDistribution` that represents (can use `calculateSpotDistribution`, `calculateBidAskDistribution` & `calculateNormalDistribution`)\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction|Transaction[]>} The function `initializePositionAndAddLiquidityByWeight` returns a `Promise` that\n * resolves to either a single `Transaction` object (if less than 26bin involved) or an array of `Transaction` objects.\n */\n public async initializePositionAndAddLiquidityByWeight({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n xYAmountDistribution,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParams): Promise<\n Transaction | Transaction[]\n > {\n const { lowerBinId, upperBinId, binIds } =\n this.processXYAmountDistribution(xYAmountDistribution);\n\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n if (upperBinId >= lowerBinId + MAX_BIN_PER_POSITION.toNumber()) {\n throw new Error(\n `Position must be within a range of 1 to ${MAX_BIN_PER_POSITION.toNumber()} bins.`\n );\n }\n\n const preInstructions: Array<TransactionInstruction> = [];\n const initializePositionIx = await this.program.methods\n .initializePosition(lowerBinId, upperBinId - lowerBinId + 1)\n .accounts({\n payer: user,\n position: positionPubKey,\n lbPair: this.pubkey,\n owner: user,\n })\n .instruction();\n preInstructions.push(initializePositionIx);\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(upperBinId))\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const minBinId = Math.min(...binIds);\n const maxBinId = Math.max(...binIds);\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const activeId = this.lbPair.activeId;\n\n const binLiquidityDist: LiquidityParameterByWeight[\"binLiquidityDist\"] =\n toWeightDistribution(\n totalXAmount,\n totalYAmount,\n xYAmountDistribution.map((item) => ({\n binId: item.binId,\n xAmountBpsOfTotal: item.xAmountBpsOfTotal,\n yAmountBpsOfTotal: item.yAmountBpsOfTotal,\n })),\n this.lbPair.binStep\n );\n\n if (binLiquidityDist.length === 0) {\n throw new Error(\"No liquidity to add\");\n }\n\n const liquidityParams: LiquidityParameterByWeight = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n binLiquidityDist,\n activeId,\n maxActiveBinSlippage,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const oneSideLiquidityParams: LiquidityOneSideParameter = {\n amount: totalXAmount.isZero() ? totalYAmount : totalXAmount,\n activeId,\n maxActiveBinSlippage,\n binLiquidityDist,\n };\n\n const oneSideAddLiquidityAccounts = {\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n binArrayBitmapExtension: null,\n sender: user,\n position: positionPubKey,\n reserve: totalXAmount.isZero()\n ? this.lbPair.reserveY\n : this.lbPair.reserveX,\n tokenMint: totalXAmount.isZero()\n ? this.lbPair.tokenYMint\n : this.lbPair.tokenXMint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userToken: totalXAmount.isZero() ? userTokenY : userTokenX,\n };\n\n const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero();\n const programMethod = isOneSideDeposit\n ? this.program.methods.addLiquidityOneSide(oneSideLiquidityParams)\n : this.program.methods.addLiquidityByWeight(liquidityParams);\n\n if (xYAmountDistribution.length < MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX) {\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const instructions = [...preInstructions, addLiqIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n [addLiqIx],\n user,\n DEFAULT_ADD_LIQUIDITY_CU // The function return multiple transactions that dependent on each other, simulation will fail\n );\n\n const mainInstructions = [setCUIx, addLiqIx];\n\n const transactions: Transaction[] = [];\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n if (preInstructions.length) {\n const preInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...preInstructions);\n transactions.push(preInstructionsTx);\n }\n\n const mainTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...mainInstructions);\n transactions.push(mainTx);\n\n if (postInstructions.length) {\n const postInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...postInstructions);\n transactions.push(postInstructionsTx);\n }\n\n return transactions;\n }\n\n /**\n * The `addLiquidityByStrategy` function is used to add liquidity to existing position\n * @param {TInitializePositionAndAddLiquidityParamsByStrategy}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `strategy`: The strategy parameters to be used for the liquidity pool (Can use `calculateStrategyParameter` to calculate).\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction>} The function `addLiquidityByWeight` returns a `Promise` that resolves to either a single\n * `Transaction` object\n */\n public async addLiquidityByStrategy({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n strategy,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParamsByStrategy): Promise<Transaction> {\n const { maxBinId, minBinId } = strategy;\n\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n const preInstructions: TransactionInstruction[] = [];\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const strategyParameters: LiquidityParameterByStrategy[\"strategyParameters\"] =\n toStrategyParameters(strategy) as ProgramStrategyParameter;\n\n const positionAccount = await this.program.account.positionV2.fetch(\n positionPubKey\n );\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(\n new BN(positionAccount.lowerBinId)\n );\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const liquidityParams: LiquidityParameterByStrategy = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n activeId: this.lbPair.activeId,\n maxActiveBinSlippage,\n strategyParameters,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const programMethod =\n this.program.methods.addLiquidityByStrategy(liquidityParams);\n\n const addLiquidityIx = await programMethod\n .accounts(addLiquidityAccounts)\n .instruction();\n\n const instructions = [\n ...preInstructions,\n addLiquidityIx,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * The `addLiquidityByWeight` function is used to add liquidity to existing position\n * @param {TInitializePositionAndAddLiquidityParams}\n * - `positionPubKey`: The public key of the position account. (usually use `new Keypair()`)\n * - `totalXAmount`: The total amount of token X to be added to the liquidity pool.\n * - `totalYAmount`: The total amount of token Y to be added to the liquidity pool.\n * - `xYAmountDistribution`: An array of objects of type `XYAmountDistribution` that represents (can use `calculateSpotDistribution`, `calculateBidAskDistribution` & `calculateNormalDistribution`)\n * - `user`: The public key of the user account.\n * - `slippage`: The slippage percentage to be used for the liquidity pool.\n * @returns {Promise<Transaction|Transaction[]>} The function `addLiquidityByWeight` returns a `Promise` that resolves to either a single\n * `Transaction` object (if less than 26bin involved) or an array of `Transaction` objects.\n */\n public async addLiquidityByWeight({\n positionPubKey,\n totalXAmount,\n totalYAmount,\n xYAmountDistribution,\n user,\n slippage,\n }: TInitializePositionAndAddLiquidityParams): Promise<\n Transaction | Transaction[]\n > {\n const maxActiveBinSlippage = slippage\n ? Math.ceil(slippage / (this.lbPair.binStep / 100))\n : MAX_ACTIVE_BIN_SLIPPAGE;\n\n const positionAccount = await this.program.account.positionV2.fetch(\n positionPubKey\n );\n const { lowerBinId, upperBinId, binIds } =\n this.processXYAmountDistribution(xYAmountDistribution);\n\n if (lowerBinId < positionAccount.lowerBinId)\n throw new Error(\n `Lower Bin ID (${lowerBinId}) lower than Position Lower Bin Id (${positionAccount.lowerBinId})`\n );\n if (upperBinId > positionAccount.upperBinId)\n throw new Error(\n `Upper Bin ID (${upperBinId}) higher than Position Upper Bin Id (${positionAccount.upperBinId})`\n );\n\n const minBinId = Math.min(...binIds);\n const maxBinId = Math.max(...binIds);\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(minBinId));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(maxBinId));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const activeId = this.lbPair.activeId;\n\n const binLiquidityDist: LiquidityParameterByWeight[\"binLiquidityDist\"] =\n toWeightDistribution(\n totalXAmount,\n totalYAmount,\n xYAmountDistribution.map((item) => ({\n binId: item.binId,\n xAmountBpsOfTotal: item.xAmountBpsOfTotal,\n yAmountBpsOfTotal: item.yAmountBpsOfTotal,\n })),\n this.lbPair.binStep\n );\n\n if (binLiquidityDist.length === 0) {\n throw new Error(\"No liquidity to add\");\n }\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(\n new BN(positionAccount.lowerBinId)\n );\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = BN.max(\n lowerBinArrayIndex.add(new BN(1)),\n binIdToBinArrayIndex(new BN(positionAccount.upperBinId))\n );\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const preInstructions: TransactionInstruction[] = [];\n const createBinArrayIxs = await this.createBinArraysIfNeeded(\n upperBinArrayIndex,\n lowerBinArrayIndex,\n user\n );\n preInstructions.push(...createBinArrayIxs);\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n user\n ),\n ]);\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (this.tokenX.publicKey.equals(NATIVE_MINT) && !totalXAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenX,\n BigInt(totalXAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (this.tokenY.publicKey.equals(NATIVE_MINT) && !totalYAmount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenY,\n BigInt(totalYAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const liquidityParams: LiquidityParameterByWeight = {\n amountX: totalXAmount,\n amountY: totalYAmount,\n binLiquidityDist,\n activeId,\n maxActiveBinSlippage,\n };\n\n const addLiquidityAccounts = {\n position: positionPubKey,\n lbPair: this.pubkey,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n sender: user,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n };\n\n const oneSideLiquidityParams: LiquidityOneSideParameter = {\n amount: totalXAmount.isZero() ? totalYAmount : totalXAmount,\n activeId,\n maxActiveBinSlippage,\n binLiquidityDist,\n };\n\n const oneSideAddLiquidityAccounts = {\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n binArrayBitmapExtension: null,\n sender: user,\n position: positionPubKey,\n reserve: totalXAmount.isZero()\n ? this.lbPair.reserveY\n : this.lbPair.reserveX,\n tokenMint: totalXAmount.isZero()\n ? this.lbPair.tokenYMint\n : this.lbPair.tokenXMint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userToken: totalXAmount.isZero() ? userTokenY : userTokenX,\n };\n\n const isOneSideDeposit = totalXAmount.isZero() || totalYAmount.isZero();\n const programMethod = isOneSideDeposit\n ? this.program.methods.addLiquidityOneSide(oneSideLiquidityParams)\n : this.program.methods.addLiquidityByWeight(liquidityParams);\n\n if (xYAmountDistribution.length < MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX) {\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const instructions = [...preInstructions, addLiqIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n const addLiqIx = await programMethod\n .accounts(\n isOneSideDeposit ? oneSideAddLiquidityAccounts : addLiquidityAccounts\n )\n .instruction();\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n [addLiqIx],\n user\n );\n\n const mainInstructions = [setCUIx, addLiqIx];\n\n const transactions: Transaction[] = [];\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n if (preInstructions.length) {\n const preInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...preInstructions);\n transactions.push(preInstructionsTx);\n }\n\n const mainTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...mainInstructions);\n transactions.push(mainTx);\n\n if (postInstructions.length) {\n const postInstructionsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...postInstructions);\n transactions.push(postInstructionsTx);\n }\n\n return transactions;\n }\n\n /**\n * The `removeLiquidity` function is used to remove liquidity from a position,\n * with the option to claim rewards and close the position.\n * @param\n * - `user`: The public key of the user account.\n * - `position`: The public key of the position account.\n * - `binIds`: An array of numbers that represent the bin IDs to remove liquidity from.\n * - `liquiditiesBpsToRemove`: An array of numbers (percentage) that represent the liquidity to remove from each bin.\n * - `shouldClaimAndClose`: A boolean flag that indicates whether to claim rewards and close the position.\n * @returns {Promise<Transaction|Transaction[]>}\n */\n public async removeLiquidity({\n user,\n position,\n binIds,\n bps,\n shouldClaimAndClose = false,\n }: {\n user: PublicKey;\n position: PublicKey;\n binIds: number[];\n bps: BN;\n shouldClaimAndClose?: boolean;\n }): Promise<Transaction | Transaction[]> {\n const lowerBinIdToRemove = Math.min(...binIds);\n const upperBinIdToRemove = Math.max(...binIds);\n const { lbPair, owner, feeOwner, lowerBinId: positionLowerBinId, liquidityShares } = await this.program.account.positionV2.fetch(position);\n\n if (liquidityShares.every((share) => share.isZero())) {\n throw new Error(\"No liquidity to remove\");\n }\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(positionLowerBinId));\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayLower] = deriveBinArray(\n lbPair,\n lowerBinArrayIndex,\n this.program.programId\n );\n const [binArrayUpper] = deriveBinArray(\n lbPair,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const preInstructions: Array<TransactionInstruction> = [];\n\n const walletToReceiveFee = feeOwner.equals(PublicKey.default)\n ? user\n : feeOwner;\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n { ataPubKey: feeOwnerTokenX, ix: createFeeOwnerTokenXIx },\n { ataPubKey: feeOwnerTokenY, ix: createFeeOwnerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n owner,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n owner,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n walletToReceiveFee,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n walletToReceiveFee,\n user\n ),\n ]);\n\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n if (!walletToReceiveFee.equals(owner)) {\n createFeeOwnerTokenXIx && preInstructions.push(createFeeOwnerTokenXIx);\n createFeeOwnerTokenYIx && preInstructions.push(createFeeOwnerTokenYIx);\n }\n\n const secondTransactionsIx: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n if (shouldClaimAndClose) {\n const claimSwapFeeIx = await this.program.methods\n .claimFee()\n .accounts({\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n sender: user,\n position,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenProgram: TOKEN_PROGRAM_ID,\n tokenXMint: this.tokenX.publicKey,\n tokenYMint: this.tokenY.publicKey,\n userTokenX: feeOwnerTokenX,\n userTokenY: feeOwnerTokenY,\n })\n .instruction();\n postInstructions.push(claimSwapFeeIx);\n\n for (let i = 0; i < 2; i++) {\n const rewardInfo = this.lbPair.rewardInfos[i];\n if (!rewardInfo || rewardInfo.mint.equals(PublicKey.default)) continue;\n\n const { ataPubKey, ix: rewardAtaIx } = await getOrCreateATAInstruction(\n this.program.provider.connection,\n rewardInfo.mint,\n user\n );\n rewardAtaIx && preInstructions.push(rewardAtaIx);\n\n const claimRewardIx = await this.program.methods\n .claimReward(new BN(i))\n .accounts({\n lbPair: this.pubkey,\n sender: user,\n position,\n binArrayLower,\n binArrayUpper,\n rewardVault: rewardInfo.vault,\n rewardMint: rewardInfo.mint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userTokenAccount: ataPubKey,\n })\n .instruction();\n secondTransactionsIx.push(claimRewardIx);\n }\n\n const closePositionIx = await this.program.methods\n .closePosition()\n .accounts({\n binArrayLower,\n binArrayUpper,\n rentReceiver: owner, // Must be position owner\n position,\n lbPair: this.pubkey,\n sender: user,\n })\n .instruction();\n if (secondTransactionsIx.length) {\n secondTransactionsIx.push(closePositionIx);\n } else {\n postInstructions.push(closePositionIx);\n }\n }\n\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const minBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinIdToRemove));\n const maxBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinIdToRemove));\n\n const useExtension =\n isOverflowDefaultBinArrayBitmap(minBinArrayIndex) ||\n isOverflowDefaultBinArrayBitmap(maxBinArrayIndex);\n\n const binArrayBitmapExtension = useExtension\n ? deriveBinArrayBitmapExtension(this.pubkey, this.program.programId)[0]\n : null;\n\n const removeLiquidityTx = await this.program.methods\n .removeLiquidityByRange(lowerBinIdToRemove, upperBinIdToRemove, bps.toNumber())\n .accounts({\n position,\n lbPair,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.tokenX.publicKey,\n tokenYMint: this.tokenY.publicKey,\n binArrayLower,\n binArrayUpper,\n binArrayBitmapExtension,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n sender: user,\n })\n .instruction();\n\n const instructions = [\n ...preInstructions,\n removeLiquidityTx,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n if (secondTransactionsIx.length) {\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n secondTransactionsIx,\n user\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n const claimRewardsTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(setCUIx, ...secondTransactionsIx);\n\n const mainTx = new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n\n return [mainTx, claimRewardsTx];\n } else {\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n }\n\n /**\n * The `closePosition` function closes a position\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction>}\n */\n public async closePosition({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction> {\n const { lowerBinId } = await this.program.account.positionV2.fetch(\n position.publicKey\n );\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const closePositionTx = await this.program.methods\n .closePosition()\n .accounts({\n binArrayLower,\n binArrayUpper,\n rentReceiver: owner,\n position: position.publicKey,\n lbPair: this.pubkey,\n sender: owner,\n })\n .transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: owner,\n }).add(closePositionTx);\n }\n\n /**\n * The `swapQuoteExactOut` function returns a quote for a swap\n * @param\n * - `outAmount`: Amount of lamport to swap out\n * - `swapForY`: Swap token X to Y when it is true, else reversed.\n * - `allowedSlippage`: Allowed slippage for the swap. Expressed in BPS. To convert from slippage percentage to BPS unit: SLIPPAGE_PERCENTAGE * 100\n * - `maxExtraBinArrays`: Maximum number of extra binArrays to return\n * @returns {SwapQuote}\n * - `inAmount`: Amount of lamport to swap in\n * - `outAmount`: Amount of lamport to swap out\n * - `fee`: Fee amount\n * - `protocolFee`: Protocol fee amount\n * - `maxInAmount`: Maximum amount of lamport to swap in\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @throws {DlmmSdkError}\n *\n */\n public swapQuoteExactOut(\n outAmount: BN,\n swapForY: boolean,\n allowedSlippage: BN,\n binArrays: BinArrayAccount[],\n maxExtraBinArrays: number = 0\n ): SwapQuoteExactOut {\n // TODO: Should we use onchain clock ? Volatile fee rate is sensitive to time. Caching clock might causes the quoted fee off ...\n const currentTimestamp = Date.now() / 1000;\n let outAmountLeft = outAmount;\n if (maxExtraBinArrays < 0 || maxExtraBinArrays > MAX_EXTRA_BIN_ARRAYS) {\n throw new DlmmSdkError(\"INVALID_MAX_EXTRA_BIN_ARRAYS\", `maxExtraBinArrays must be a value between 0 and ${MAX_EXTRA_BIN_ARRAYS}`);\n }\n\n let vParameterClone = Object.assign({}, this.lbPair.vParameters);\n let activeId = new BN(this.lbPair.activeId);\n\n const binStep = this.lbPair.binStep;\n const sParameters = this.lbPair.parameters;\n\n this.updateReference(\n activeId.toNumber(),\n vParameterClone,\n sParameters,\n currentTimestamp\n );\n\n let startBinId = activeId;\n let binArraysForSwap = new Map();\n let actualInAmount: BN = new BN(0);\n let feeAmount: BN = new BN(0);\n let protocolFeeAmount: BN = new BN(0);\n\n while (!outAmountLeft.isZero()) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n throw new DlmmSdkError(\n \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\",\n \"Insufficient liquidity in binArrays\"\n );\n }\n\n binArraysForSwap.set(binArrayAccountToSwap.publicKey, true);\n\n this.updateVolatilityAccumulator(\n vParameterClone,\n sParameters,\n activeId.toNumber()\n );\n\n if (\n isBinIdWithinBinArray(activeId, binArrayAccountToSwap.account.index)\n ) {\n const bin = getBinFromBinArray(\n activeId.toNumber(),\n binArrayAccountToSwap.account\n );\n const { amountIn, amountOut, fee, protocolFee } =\n swapExactOutQuoteAtBin(\n bin,\n binStep,\n sParameters,\n vParameterClone,\n outAmountLeft,\n swapForY\n );\n\n if (!amountOut.isZero()) {\n outAmountLeft = outAmountLeft.sub(amountOut);\n actualInAmount = actualInAmount.add(amountIn);\n feeAmount = feeAmount.add(fee);\n protocolFeeAmount = protocolFee.add(protocolFee);\n }\n }\n\n if (!outAmountLeft.isZero()) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n }\n }\n\n const startPrice = getPriceOfBinByBinId(\n startBinId.toNumber(),\n this.lbPair.binStep\n );\n const endPrice = getPriceOfBinByBinId(\n activeId.toNumber(),\n this.lbPair.binStep\n );\n\n const priceImpact = startPrice\n .sub(endPrice)\n .abs()\n .div(startPrice)\n .mul(new Decimal(100));\n\n const maxInAmount = actualInAmount\n .mul(new BN(BASIS_POINT_MAX).add(allowedSlippage))\n .div(new BN(BASIS_POINT_MAX));\n\n if (maxExtraBinArrays > 0 && maxExtraBinArrays <= MAX_EXTRA_BIN_ARRAYS) {\n const extraBinArrays: Array<PublicKey> = new Array<PublicKey>();\n\n while (extraBinArrays.length < maxExtraBinArrays) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n break;\n }\n\n const binArrayAccountToSwapExisted = binArraysForSwap.has(binArrayAccountToSwap.publicKey);\n\n if (binArrayAccountToSwapExisted) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n } else {\n extraBinArrays.push(binArrayAccountToSwap.publicKey);\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArrayAccountToSwap.account.index);\n\n if (swapForY) {\n activeId = lowerBinId.sub(new BN(1));\n } else {\n activeId = upperBinId.add(new BN(1));\n }\n }\n }\n\n // save to binArraysForSwap result\n extraBinArrays.forEach(binArrayPubkey => {\n binArraysForSwap.set(binArrayPubkey, true);\n })\n }\n\n const binArraysPubkey = Array.from(binArraysForSwap.keys());\n\n return {\n inAmount: actualInAmount,\n maxInAmount,\n outAmount,\n priceImpact,\n fee: feeAmount,\n protocolFee: protocolFeeAmount,\n binArraysPubkey,\n };\n }\n\n /**\n * The `swapQuote` function returns a quote for a swap\n * @param\n * - `inAmount`: Amount of lamport to swap in\n * - `swapForY`: Swap token X to Y when it is true, else reversed.\n * - `allowedSlippage`: Allowed slippage for the swap. Expressed in BPS. To convert from slippage percentage to BPS unit: SLIPPAGE_PERCENTAGE * 100\n * - `binArrays`: binArrays for swapQuote.\n * - `isPartialFill`: Flag to check whether the the swapQuote is partial fill, default = false.\n * - `maxExtraBinArrays`: Maximum number of extra binArrays to return\n * @returns {SwapQuote}\n * - `consumedInAmount`: Amount of lamport to swap in\n * - `outAmount`: Amount of lamport to swap out\n * - `fee`: Fee amount\n * - `protocolFee`: Protocol fee amount\n * - `minOutAmount`: Minimum amount of lamport to swap out\n * - `priceImpact`: Price impact of the swap\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @throws {DlmmSdkError}\n */\n public swapQuote(\n inAmount: BN,\n swapForY: boolean,\n allowedSlippage: BN,\n binArrays: BinArrayAccount[],\n isPartialFill?: boolean,\n maxExtraBinArrays: number = 0\n ): SwapQuote {\n // TODO: Should we use onchain clock ? Volatile fee rate is sensitive to time. Caching clock might causes the quoted fee off ...\n const currentTimestamp = Date.now() / 1000;\n let inAmountLeft = inAmount;\n if (maxExtraBinArrays < 0 || maxExtraBinArrays > MAX_EXTRA_BIN_ARRAYS) {\n throw new DlmmSdkError(\"INVALID_MAX_EXTRA_BIN_ARRAYS\", `maxExtraBinArrays must be a value between 0 and ${MAX_EXTRA_BIN_ARRAYS}`);\n }\n\n let vParameterClone = Object.assign({}, this.lbPair.vParameters);\n let activeId = new BN(this.lbPair.activeId);\n\n const binStep = this.lbPair.binStep;\n const sParameters = this.lbPair.parameters;\n\n this.updateReference(\n activeId.toNumber(),\n vParameterClone,\n sParameters,\n currentTimestamp\n );\n\n let startBin: Bin | null = null;\n let binArraysForSwap = new Map();\n let actualOutAmount: BN = new BN(0);\n let feeAmount: BN = new BN(0);\n let protocolFeeAmount: BN = new BN(0);\n let lastFilledActiveBinId = activeId;\n\n while (!inAmountLeft.isZero()) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n if (isPartialFill) {\n break;\n } else {\n throw new DlmmSdkError(\n \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\",\n \"Insufficient liquidity in binArrays for swapQuote\"\n );\n }\n }\n\n binArraysForSwap.set(binArrayAccountToSwap.publicKey, true);\n\n this.updateVolatilityAccumulator(\n vParameterClone,\n sParameters,\n activeId.toNumber()\n );\n\n if (\n isBinIdWithinBinArray(activeId, binArrayAccountToSwap.account.index)\n ) {\n const bin = getBinFromBinArray(\n activeId.toNumber(),\n binArrayAccountToSwap.account\n );\n const { amountIn, amountOut, fee, protocolFee } = swapExactInQuoteAtBin(\n bin,\n binStep,\n sParameters,\n vParameterClone,\n inAmountLeft,\n swapForY\n );\n\n if (!amountIn.isZero()) {\n inAmountLeft = inAmountLeft.sub(amountIn);\n actualOutAmount = actualOutAmount.add(amountOut);\n feeAmount = feeAmount.add(fee);\n protocolFeeAmount = protocolFee.add(protocolFee);\n\n if (!startBin) {\n startBin = bin;\n }\n\n lastFilledActiveBinId = activeId;\n }\n }\n\n if (!inAmountLeft.isZero()) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n }\n }\n\n if (!startBin) {\n // The pool insufficient liquidity\n throw new DlmmSdkError(\n \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\",\n \"Insufficient liquidity\"\n );\n }\n\n // in case partialFill is true\n inAmount = inAmount.sub(inAmountLeft);\n\n const outAmountWithoutSlippage = getOutAmount(\n startBin,\n inAmount.sub(\n computeFeeFromAmount(binStep, sParameters, vParameterClone, inAmount)\n ),\n swapForY\n );\n\n const priceImpact = new Decimal(actualOutAmount.toString())\n .sub(new Decimal(outAmountWithoutSlippage.toString()))\n .div(new Decimal(outAmountWithoutSlippage.toString()))\n .mul(new Decimal(100));\n\n const minOutAmount = actualOutAmount\n .mul(new BN(BASIS_POINT_MAX).sub(allowedSlippage))\n .div(new BN(BASIS_POINT_MAX));\n\n const endPrice = getPriceOfBinByBinId(\n lastFilledActiveBinId.toNumber(),\n this.lbPair.binStep\n );\n\n if (maxExtraBinArrays > 0 && maxExtraBinArrays <= MAX_EXTRA_BIN_ARRAYS) {\n const extraBinArrays: Array<PublicKey> = new Array<PublicKey>();\n\n while (extraBinArrays.length < maxExtraBinArrays) {\n let binArrayAccountToSwap = findNextBinArrayWithLiquidity(\n swapForY,\n activeId,\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null,\n binArrays\n );\n\n if (binArrayAccountToSwap == null) {\n break;\n }\n\n const binArrayAccountToSwapExisted = binArraysForSwap.has(binArrayAccountToSwap.publicKey);\n\n if (binArrayAccountToSwapExisted) {\n if (swapForY) {\n activeId = activeId.sub(new BN(1));\n } else {\n activeId = activeId.add(new BN(1));\n }\n } else {\n extraBinArrays.push(binArrayAccountToSwap.publicKey);\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArrayAccountToSwap.account.index);\n\n if (swapForY) {\n activeId = lowerBinId.sub(new BN(1));\n } else {\n activeId = upperBinId.add(new BN(1));\n }\n }\n }\n\n // save to binArraysForSwap result\n extraBinArrays.forEach(binArrayPubkey => {\n binArraysForSwap.set(binArrayPubkey, true);\n })\n }\n\n const binArraysPubkey = Array.from(binArraysForSwap.keys());\n\n return {\n consumedInAmount: inAmount,\n outAmount: actualOutAmount,\n fee: feeAmount,\n protocolFee: protocolFeeAmount,\n minOutAmount,\n priceImpact,\n binArraysPubkey,\n endPrice,\n };\n }\n\n public async swapExactOut({\n inToken,\n outToken,\n outAmount,\n maxInAmount,\n lbPair,\n user,\n binArraysPubkey,\n }: SwapExactOutParams): Promise<Transaction> {\n const { tokenXMint, tokenYMint, reserveX, reserveY, activeId, oracle } =\n await this.program.account.lbPair.fetch(lbPair);\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n const [\n { ataPubKey: userTokenIn, ix: createInTokenAccountIx },\n { ataPubKey: userTokenOut, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n inToken,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n outToken,\n user\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n if (inToken.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenIn,\n BigInt(maxInAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (outToken.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n let swapForY = true;\n if (outToken.equals(tokenXMint)) swapForY = false;\n\n const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n });\n\n const swapIx = await this.program.methods\n .swapExactOut(maxInAmount, outAmount)\n .accounts({\n lbPair,\n reserveX,\n reserveY,\n tokenXMint,\n tokenYMint,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n user,\n userTokenIn,\n userTokenOut,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : null,\n oracle,\n hostFeeIn: null,\n })\n .remainingAccounts(binArrays)\n .instruction();\n\n const instructions = [...preInstructions, swapIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * Returns a transaction to be signed and sent by user performing swap.\n * @param {SwapWithPriceImpactParams}\n * - `inToken`: The public key of the token to be swapped in.\n * - `outToken`: The public key of the token to be swapped out.\n * - `inAmount`: The amount of token to be swapped in.\n * - `priceImpact`: Accepted price impact bps.\n * - `lbPair`: The public key of the liquidity pool.\n * - `user`: The public key of the user account.\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @returns {Promise<Transaction>}\n */\n public async swapWithPriceImpact({\n inToken,\n outToken,\n inAmount,\n lbPair,\n user,\n priceImpact,\n binArraysPubkey,\n }: SwapWithPriceImpactParams): Promise<Transaction> {\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n const [\n { ataPubKey: userTokenIn, ix: createInTokenAccountIx },\n { ataPubKey: userTokenOut, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n inToken,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n outToken,\n user\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n if (inToken.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenIn,\n BigInt(inAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (outToken.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n // TODO: needs some refinement in case binArray not yet initialized\n const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n });\n\n const swapIx = await this.program.methods\n .swapWithPriceImpact(\n inAmount,\n this.lbPair.activeId,\n priceImpact.toNumber()\n )\n .accounts({\n lbPair,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n user,\n userTokenIn,\n userTokenOut,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : null,\n oracle: this.lbPair.oracle,\n hostFeeIn: null,\n })\n .remainingAccounts(binArrays)\n .instruction();\n\n const instructions = [...preInstructions, swapIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * Returns a transaction to be signed and sent by user performing swap.\n * @param {SwapParams}\n * - `inToken`: The public key of the token to be swapped in.\n * - `outToken`: The public key of the token to be swapped out.\n * - `inAmount`: The amount of token to be swapped in.\n * - `minOutAmount`: The minimum amount of token to be swapped out.\n * - `lbPair`: The public key of the liquidity pool.\n * - `user`: The public key of the user account.\n * - `binArraysPubkey`: Array of bin arrays involved in the swap\n * @returns {Promise<Transaction>}\n */\n public async swap({\n inToken,\n outToken,\n inAmount,\n minOutAmount,\n lbPair,\n user,\n binArraysPubkey,\n }: SwapParams): Promise<Transaction> {\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: Array<TransactionInstruction> = [];\n\n const [\n { ataPubKey: userTokenIn, ix: createInTokenAccountIx },\n { ataPubKey: userTokenOut, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n inToken,\n user\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n outToken,\n user\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n if (inToken.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n user,\n userTokenIn,\n BigInt(inAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (outToken.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n\n // TODO: needs some refinement in case binArray not yet initialized\n const binArrays: AccountMeta[] = binArraysPubkey.map((pubkey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n });\n\n const swapIx = await this.program.methods\n .swap(inAmount, minOutAmount)\n .accounts({\n lbPair,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n tokenXProgram: TOKEN_PROGRAM_ID, // dont use 2022 first; lack familiarity\n tokenYProgram: TOKEN_PROGRAM_ID, // dont use 2022 first; lack familiarity\n user,\n userTokenIn,\n userTokenOut,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : null,\n oracle: this.lbPair.oracle,\n hostFeeIn: null,\n })\n .remainingAccounts(binArrays)\n .instruction();\n\n const instructions = [...preInstructions, swapIx, ...postInstructions];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n user\n );\n\n instructions.unshift(setCUIx);\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: user,\n }).add(...instructions);\n }\n\n /**\n * The claimLMReward function is used to claim rewards for a specific position owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction>}\n */\n public async claimLMReward({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction> {\n const claimTransactions = await this.createClaimBuildMethod({\n owner,\n position,\n });\n if (!claimTransactions.length) return;\n\n const instructions = claimTransactions.map((t) => t.instructions).flat();\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n owner\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: owner,\n }).add(setCUIx, ...claimTransactions);\n }\n\n /**\n * The `claimAllLMRewards` function is used to claim all liquidity mining rewards for a given owner\n * and their positions.\n * @param\n * - `owner`: The public key of the owner of the positions.\n * - `positions`: An array of objects of type `PositionData` that represents the positions to claim rewards from.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllLMRewards({\n owner,\n positions,\n }: {\n owner: PublicKey;\n positions: LbPosition[];\n }): Promise<Transaction[]> {\n const claimAllTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { rewardOne, rewardTwo } }) =>\n !rewardOne.isZero() || !rewardTwo.isZero()\n )\n .map(async (position, idx) => {\n return await this.createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx: idx === 0,\n });\n })\n )\n ).flat();\n\n const chunkedClaimAllTx = chunks(claimAllTxs, MAX_CLAIM_ALL_ALLOWED);\n\n if (chunkedClaimAllTx.length === 0) return [];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n // First tx simulation will success because it will create all the ATA. Then, we use the simulated CU as references for the rest\n chunkedClaimAllTx[0].map((t) => t.instructions).flat(),\n owner\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return Promise.all(\n chunkedClaimAllTx.map(async (claimAllTx) => {\n return new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n })\n .add(setCUIx)\n .add(...claimAllTx);\n })\n );\n }\n\n public async setActivationPoint(activationPoint: BN) {\n const setActivationPointTx = await this.program.methods\n .setActivationPoint(activationPoint)\n .accounts({\n lbPair: this.pubkey,\n admin: this.lbPair.creator,\n })\n .transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n feePayer: this.lbPair.creator,\n blockhash,\n lastValidBlockHeight,\n }).add(setActivationPointTx);\n }\n\n public async setPairStatus(\n enabled: boolean,\n ): Promise<Transaction> {\n const pairStatus = enabled ? 0 : 1;\n const tx = await this.program.methods.setPairStatus(pairStatus).accounts(\n {\n lbPair: this.pubkey,\n admin: this.lbPair.creator\n }\n ).transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return new Transaction({\n feePayer: this.lbPair.creator,\n blockhash,\n lastValidBlockHeight,\n }).add(tx);\n }\n\n /**\n * The function `claimSwapFee` is used to claim swap fees for a specific position owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction>}\n */\n public async claimSwapFee({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction> {\n const claimFeeTx = await this.createClaimSwapFeeMethod({ owner, position });\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n blockhash,\n lastValidBlockHeight,\n feePayer: owner,\n }).add(claimFeeTx);\n }\n\n /**\n * The `claimAllSwapFee` function to claim swap fees for multiple positions owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the positions.\n * - `positions`: An array of objects of type `PositionData` that represents the positions to claim swap fees from.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllSwapFee({\n owner,\n positions,\n }: {\n owner: PublicKey;\n positions: LbPosition[];\n }): Promise<Transaction[]> {\n const claimAllTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { feeX, feeY } }) =>\n !feeX.isZero() || !feeY.isZero()\n )\n .map(async (position, idx, positions) => {\n return await this.createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePretIx: idx === 0,\n shouldIncludePostIx: idx === positions.length - 1,\n });\n })\n )\n ).flat();\n\n const chunkedClaimAllTx = chunks(claimAllTxs, MAX_CLAIM_ALL_ALLOWED);\n\n if (chunkedClaimAllTx.length === 0) return [];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n // First tx simulation will success because it will create all the ATA. Then, we use the simulated CU as references for the rest\n chunkedClaimAllTx[0].map((t) => t.instructions).flat(),\n owner\n );\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n\n return Promise.all(\n chunkedClaimAllTx.map(async (claimAllTx) => {\n return new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n })\n .add(setCUIx)\n .add(...claimAllTx);\n })\n );\n }\n\n /**\n * The function `claimAllRewardsByPosition` allows a user to claim all rewards for a specific\n * position.\n * @param\n * - `owner`: The public key of the owner of the position.\n * - `position`: The public key of the position account.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllRewardsByPosition({\n owner,\n position,\n }: {\n owner: PublicKey;\n position: LbPosition;\n }): Promise<Transaction[]> {\n const preInstructions: TransactionInstruction[] = [];\n\n const pairTokens = [this.tokenX.publicKey, this.tokenY.publicKey];\n const tokensInvolved = [...pairTokens];\n\n for (let i = 0; i < 2; i++) {\n const rewardMint = this.lbPair.rewardInfos[i].mint;\n if (\n !tokensInvolved.some((pubkey) => rewardMint.equals(pubkey)) &&\n !rewardMint.equals(PublicKey.default)\n ) {\n tokensInvolved.push(this.lbPair.rewardInfos[i].mint);\n }\n }\n\n const feeOwner = position.positionData.feeOwner.equals(PublicKey.default)\n ? owner\n : position.positionData.feeOwner;\n\n const createATAAccAndIx = await Promise.all(\n tokensInvolved.map((token) => {\n // Single position. Swap fee only belongs to owner, or the customized fee owner.\n\n if (pairTokens.some((t) => t.equals(token))) {\n return getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n feeOwner,\n owner\n );\n }\n\n // Reward\n return getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n owner\n );\n })\n );\n createATAAccAndIx.forEach(({ ix }) => ix && preInstructions.push(ix));\n\n const claimAllSwapFeeTxs = await this.createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePostIx: false,\n shouldIncludePretIx: false,\n });\n const claimAllLMTxs = await this.createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx: false,\n });\n\n const claimAllTxs = chunks(\n [claimAllSwapFeeTxs, ...claimAllLMTxs],\n MAX_CLAIM_ALL_ALLOWED\n );\n\n const postInstructions: TransactionInstruction[] = [];\n if (tokensInvolved.some((pubkey) => pubkey.equals(NATIVE_MINT))) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return Promise.all(\n claimAllTxs.map(async (claimAllTx) => {\n const mainInstructions = claimAllTx.map((t) => t.instructions).flat();\n const instructions = [\n ...preInstructions,\n ...mainInstructions,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n owner\n );\n\n const tx = new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n }).add(setCUIx);\n\n if (preInstructions.length) tx.add(...preInstructions);\n tx.add(...claimAllTx);\n if (postInstructions.length) tx.add(...postInstructions);\n\n return tx;\n })\n );\n }\n\n /**\n * The `seedLiquidity` function create multiple grouped instructions. The grouped instructions will be either [initialize bin array + initialize position instructions] or [deposit instruction] combination.\n * @param\n * - `owner`: The public key of the positions owner.\n * - `seedAmount`: Lamport amount to be seeded to the pool.\n * - `minPrice`: Start price in UI format\n * - `maxPrice`: End price in UI format\n * - `base`: Base key\n * - `txPayer`: Account rental fee payer\n * - `feeOwner`: Fee owner key. Default to position owner\n * - `operator`: Operator key\n * - `lockReleasePoint`: Timelock. Point (slot/timestamp) the position can withdraw the liquidity,\n * - `shouldSeedPositionOwner` (optional): Whether to send 1 lamport amount of token X to the position owner to prove ownership.\n * @returns {Promise<SeedLiquidityResponse>}\n */\n public async seedLiquidity(\n owner: PublicKey,\n seedAmount: BN,\n curvature: number,\n minPrice: number,\n maxPrice: number,\n base: PublicKey,\n payer: PublicKey,\n feeOwner: PublicKey,\n operator: PublicKey,\n lockReleasePoint: BN,\n shouldSeedPositionOwner: boolean = false\n ): Promise<SeedLiquidityResponse> {\n const toLamportMultiplier = new Decimal(\n 10 ** (this.tokenY.decimal - this.tokenX.decimal)\n );\n\n const minPricePerLamport = new Decimal(minPrice).mul(toLamportMultiplier);\n const maxPricePerLamport = new Decimal(maxPrice).mul(toLamportMultiplier);\n\n const minBinId = new BN(\n DLMM.getBinIdFromPrice(minPricePerLamport, this.lbPair.binStep, false)\n );\n\n const maxBinId = new BN(\n DLMM.getBinIdFromPrice(maxPricePerLamport, this.lbPair.binStep, true)\n );\n\n if (minBinId.toNumber() < this.lbPair.activeId) {\n throw new Error(\"minPrice < current pair price\");\n }\n\n if (minBinId.toNumber() >= maxBinId.toNumber()) {\n throw new Error(\"Price range too small\");\n }\n\n // Generate amount for each bin\n const k = 1.0 / curvature;\n\n const binDepositAmount = generateAmountForBinRange(\n seedAmount,\n this.lbPair.binStep,\n this.tokenX.decimal,\n this.tokenY.decimal,\n minBinId,\n maxBinId,\n k\n );\n\n const decompressMultiplier = new BN(10 ** this.tokenX.decimal);\n\n let { compressedBinAmount, compressionLoss } = compressBinAmount(\n binDepositAmount,\n decompressMultiplier\n );\n\n // Distribute loss after compression back to bins based on bin ratio with total deposited amount\n let {\n newCompressedBinAmount: compressedBinDepositAmount,\n loss: finalLoss,\n } = distributeAmountToCompressedBinsByRatio(\n compressedBinAmount,\n compressionLoss,\n decompressMultiplier,\n new BN(2 ** 32 - 1) // u32\n );\n\n // This amount will be deposited to the last bin without compression\n const positionCount = getPositionCount(minBinId, maxBinId.sub(new BN(1)));\n\n const seederTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n operator,\n false\n );\n\n const seederTokenY = getAssociatedTokenAddressSync(\n this.lbPair.tokenYMint,\n operator,\n false,\n );\n\n const ownerTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n owner, \n false\n );\n\n const sendPositionOwnerTokenProveIxs = [];\n const initializeBinArraysAndPositionIxs = [];\n const addLiquidityIxs = [];\n const appendedInitBinArrayIx = new Set();\n\n if (shouldSeedPositionOwner) {\n const positionOwnerTokenX =\n await this.program.provider.connection.getAccountInfo(ownerTokenX);\n\n let requireTokenProve = false;\n\n if (positionOwnerTokenX) {\n const ownerTokenXState = unpackAccount(\n ownerTokenX,\n positionOwnerTokenX,\n TOKEN_PROGRAM_ID,\n );\n\n requireTokenProve = ownerTokenXState.amount == 0n;\n } else {\n requireTokenProve = true;\n }\n\n if (requireTokenProve) {\n const initPositionOwnerTokenX =\n createAssociatedTokenAccountIdempotentInstruction(\n payer,\n ownerTokenX,\n owner,\n this.lbPair.tokenXMint,\n TOKEN_PROGRAM_ID\n );\n\n sendPositionOwnerTokenProveIxs.push(initPositionOwnerTokenX);\n sendPositionOwnerTokenProveIxs.push(\n createTransferInstruction(\n seederTokenX,\n ownerTokenX,\n operator,\n 1n\n )\n );\n }\n }\n\n for (let i = 0; i < positionCount.toNumber(); i++) {\n const lowerBinId = minBinId.add(MAX_BIN_PER_POSITION.mul(new BN(i)));\n const upperBinId = lowerBinId.add(MAX_BIN_PER_POSITION).sub(new BN(1));\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(lowerBinId);\n const upperBinArrayIndex = binIdToBinArrayIndex(upperBinId);\n\n const [positionPda, _bump] = derivePosition(\n this.pubkey,\n base,\n lowerBinId,\n MAX_BIN_PER_POSITION,\n this.program.programId\n );\n\n const [lowerBinArray] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const [upperBinArray] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const accounts =\n await this.program.provider.connection.getMultipleAccountsInfo([\n lowerBinArray,\n upperBinArray,\n positionPda,\n ]);\n\n let instructions: TransactionInstruction[] = [];\n\n const lowerBinArrayAccount = accounts[0];\n if (\n !lowerBinArrayAccount &&\n !appendedInitBinArrayIx.has(lowerBinArray.toBase58())\n ) {\n instructions.push(\n await this.program.methods\n .initializeBinArray(lowerBinArrayIndex)\n .accounts({\n lbPair: this.pubkey,\n binArray: lowerBinArray,\n funder: payer,\n })\n .instruction()\n );\n\n appendedInitBinArrayIx.add(lowerBinArray.toBase58());\n }\n\n const upperBinArrayAccount = accounts[1];\n if (\n !upperBinArrayAccount &&\n !appendedInitBinArrayIx.has(upperBinArray.toBase58())\n ) {\n instructions.push(\n await this.program.methods\n .initializeBinArray(upperBinArrayIndex)\n .accounts({\n lbPair: this.pubkey,\n binArray: upperBinArray,\n funder: payer,\n })\n .instruction()\n );\n\n appendedInitBinArrayIx.add(upperBinArray.toBase58());\n }\n\n const positionAccount = accounts[2];\n if (!positionAccount) {\n instructions.push(\n await this.program.methods\n .initializePositionByOperator(\n lowerBinId.toNumber(),\n MAX_BIN_PER_POSITION.toNumber(),\n feeOwner,\n lockReleasePoint\n )\n .accounts({\n lbPair: this.pubkey,\n position: positionPda,\n base,\n owner,\n payer,\n operator,\n operatorTokenX: seederTokenX,\n ownerTokenX,\n systemProgram: SystemProgram.programId,\n })\n .instruction()\n );\n }\n\n // Initialize bin arrays and initialize position account in 1 tx\n if (instructions.length > 1) {\n initializeBinArraysAndPositionIxs.push(instructions);\n instructions = [];\n }\n\n const positionDeposited =\n positionAccount &&\n this.program.coder.accounts\n .decode<PositionV2>(\"positionV2\", positionAccount.data)\n .liquidityShares.reduce((total, cur) => total.add(cur), new BN(0))\n .gt(new BN(0));\n\n if (!positionDeposited) {\n const cappedUpperBinId = Math.min(\n upperBinId.toNumber(),\n maxBinId.toNumber() - 1\n );\n\n const bins: CompressedBinDepositAmounts = [];\n\n for (let i = lowerBinId.toNumber(); i <= cappedUpperBinId; i++) {\n bins.push({\n binId: i,\n amount: compressedBinDepositAmount.get(i).toNumber(),\n });\n }\n\n instructions.push(\n await this.program.methods\n .addLiquidityOneSidePrecise({\n bins,\n decompressMultiplier,\n })\n .accounts({\n position: positionPda,\n lbPair: this.pubkey,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : this.program.programId,\n userToken: seederTokenX,\n reserve: this.lbPair.reserveX,\n tokenMint: this.lbPair.tokenXMint,\n binArrayLower: lowerBinArray,\n binArrayUpper: upperBinArray,\n sender: operator,\n })\n .instruction()\n );\n\n // Last position\n if (i + 1 >= positionCount.toNumber() && !finalLoss.isZero()) {\n instructions.push(\n await this.program.methods\n .addLiquidityOneSide({\n amount: finalLoss,\n activeId: this.lbPair.activeId,\n maxActiveBinSlippage: 0,\n binLiquidityDist: [\n {\n binId: cappedUpperBinId,\n weight: 1,\n },\n ],\n })\n .accounts({\n position: positionPda,\n lbPair: this.pubkey,\n binArrayBitmapExtension: this.binArrayBitmapExtension\n ? this.binArrayBitmapExtension.publicKey\n : this.program.programId,\n userToken: seederTokenX,\n reserve: this.lbPair.reserveX,\n tokenMint: this.lbPair.tokenXMint,\n binArrayLower: lowerBinArray,\n binArrayUpper: upperBinArray,\n sender: operator,\n })\n .instruction()\n );\n }\n\n addLiquidityIxs.push([\n ComputeBudgetProgram.setComputeUnitLimit({\n units: DEFAULT_ADD_LIQUIDITY_CU,\n }),\n ...instructions,\n ]);\n }\n }\n\n return {\n sendPositionOwnerTokenProveIxs,\n initializeBinArraysAndPositionIxs,\n addLiquidityIxs,\n };\n }\n\n /**\n * The `seedLiquidity` function create multiple grouped instructions. The grouped instructions will be either [initialize bin array + initialize position instructions] or [deposit instruction] combination.\n * @param\n * - `payer`: The public key of the tx payer.\n * - `base`: Base key\n * - `seedAmount`: Token X lamport amount to be seeded to the pool.\n * - `price`: TokenX/TokenY Price in UI format\n * - `roundingUp`: Whether to round up the price\n * - `positionOwner`: The owner of the position\n * - `feeOwner`: Position fee owner\n * - `operator`: Operator of the position. Operator able to manage the position on behalf of the position owner. However, liquidity withdrawal issue by the operator can only send to the position owner.\n * - `lockReleasePoint`: The lock release point of the position.\n * - `shouldSeedPositionOwner` (optional): Whether to send 1 lamport amount of token X to the position owner to prove ownership.\n * \n * The returned instructions need to be executed sequentially if it was separated into multiple transactions.\n * @returns {Promise<TransactionInstruction[]>}\n */\n public async seedLiquiditySingleBin(\n payer: PublicKey,\n base: PublicKey,\n seedAmount: BN,\n price: number,\n roundingUp: boolean,\n positionOwner: PublicKey,\n feeOwner: PublicKey,\n operator: PublicKey,\n lockReleasePoint: BN,\n shouldSeedPositionOwner: boolean = false\n ): Promise<TransactionInstruction[]> {\n const pricePerLamport = DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n price\n );\n const binIdNumber = DLMM.getBinIdFromPrice(\n pricePerLamport,\n this.lbPair.binStep,\n !roundingUp\n );\n\n const binId = new BN(binIdNumber);\n const lowerBinArrayIndex = binIdToBinArrayIndex(binId);\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n\n const [lowerBinArray] = deriveBinArray(this.pubkey, lowerBinArrayIndex, this.program.programId);\n const [upperBinArray] = deriveBinArray(this.pubkey, upperBinArrayIndex, this.program.programId);\n const [positionPda] = derivePosition(this.pubkey, base, binId, new BN(1), this.program.programId);\n\n const preInstructions = [];\n\n const [\n { ataPubKey: userTokenX, ix: createPayerTokenXIx },\n { ataPubKey: userTokenY, ix: createPayerTokenYIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n operator,\n payer\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n operator,\n payer\n ),\n ]);\n\n // create userTokenX and userTokenY accounts\n createPayerTokenXIx && preInstructions.push(createPayerTokenXIx);\n createPayerTokenYIx && preInstructions.push(createPayerTokenYIx);\n\n let [binArrayBitmapExtension] = deriveBinArrayBitmapExtension(\n this.pubkey,\n this.program.programId\n );\n const accounts =\n await this.program.provider.connection.getMultipleAccountsInfo([\n lowerBinArray,\n upperBinArray,\n positionPda,\n binArrayBitmapExtension,\n ]);\n\n if (isOverflowDefaultBinArrayBitmap(lowerBinArrayIndex)) {\n const bitmapExtensionAccount = accounts[3];\n if (!bitmapExtensionAccount) {\n preInstructions.push(await this.program.methods.initializeBinArrayBitmapExtension().accounts({\n binArrayBitmapExtension,\n funder: payer,\n lbPair: this.pubkey\n }).instruction());\n }\n } else {\n binArrayBitmapExtension = this.program.programId;\n }\n\n const operatorTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n operator,\n true\n );\n const positionOwnerTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n positionOwner,\n true\n );\n\n if (shouldSeedPositionOwner) {\n const positionOwnerTokenXAccount = await this.program.provider.connection.getAccountInfo(positionOwnerTokenX);\n if (positionOwnerTokenXAccount) {\n const account = AccountLayout.decode(positionOwnerTokenXAccount.data);\n if (account.amount == BigInt(0)) {\n // send 1 lamport to position owner token X to prove ownership\n const transferIx = createTransferInstruction(operatorTokenX, positionOwnerTokenX, payer, 1);\n preInstructions.push(transferIx);\n }\n } else {\n const createPositionOwnerTokenXIx = createAssociatedTokenAccountInstruction(payer, positionOwnerTokenX, positionOwner, this.lbPair.tokenXMint);\n preInstructions.push(createPositionOwnerTokenXIx);\n\n // send 1 lamport to position owner token X to prove ownership\n const transferIx = createTransferInstruction(operatorTokenX, positionOwnerTokenX, payer, 1);\n preInstructions.push(transferIx);\n }\n }\n\n const lowerBinArrayAccount = accounts[0];\n const upperBinArrayAccount = accounts[1];\n const positionAccount = accounts[2];\n\n if (!lowerBinArrayAccount) {\n preInstructions.push(\n await this.program.methods\n .initializeBinArray(lowerBinArrayIndex)\n .accounts({\n binArray: lowerBinArray,\n funder: payer,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n\n if (!upperBinArrayAccount) {\n preInstructions.push(\n await this.program.methods\n .initializeBinArray(upperBinArrayIndex)\n .accounts({\n binArray: upperBinArray,\n funder: payer,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n\n if (!positionAccount) {\n preInstructions.push(\n await this.program.methods\n .initializePositionByOperator(\n binId.toNumber(),\n 1,\n feeOwner,\n lockReleasePoint\n )\n .accounts({\n payer,\n base,\n position: positionPda,\n lbPair: this.pubkey,\n owner: positionOwner,\n operator,\n operatorTokenX,\n ownerTokenX: positionOwnerTokenX,\n })\n .instruction()\n );\n }\n\n const binLiquidityDist: BinLiquidityDistribution = {\n binId: binIdNumber,\n distributionX: BASIS_POINT_MAX,\n distributionY: 0,\n };\n\n const addLiquidityParams: LiquidityParameter = {\n amountX: seedAmount,\n amountY: new BN(0),\n binLiquidityDist: [binLiquidityDist],\n };\n\n const depositLiquidityIx = await this.program.methods.addLiquidity(addLiquidityParams).accounts({\n position: positionPda,\n lbPair: this.pubkey,\n binArrayBitmapExtension,\n userTokenX,\n userTokenY,\n reserveX: this.lbPair.reserveX,\n reserveY: this.lbPair.reserveY,\n tokenXMint: this.lbPair.tokenXMint,\n tokenYMint: this.lbPair.tokenYMint,\n binArrayLower: lowerBinArray,\n binArrayUpper: upperBinArray,\n sender: operator,\n tokenXProgram: TOKEN_PROGRAM_ID,\n tokenYProgram: TOKEN_PROGRAM_ID,\n }).instruction();\n\n return [...preInstructions, depositLiquidityIx];\n }\n\n /**\n * Initializes bin arrays for the given bin array indexes if it wasn't initialized.\n *\n * @param {BN[]} binArrayIndexes - An array of bin array indexes to initialize.\n * @param {PublicKey} funder - The public key of the funder.\n * @return {Promise<TransactionInstruction[]>} An array of transaction instructions to initialize the bin arrays.\n */\n public async initializeBinArrays(binArrayIndexes: BN[], funder: PublicKey) {\n const ixs: TransactionInstruction[] = [];\n\n for (const idx of binArrayIndexes) {\n const [binArray] = deriveBinArray(\n this.pubkey,\n idx,\n this.program.programId\n );\n\n const binArrayAccount =\n await this.program.provider.connection.getAccountInfo(binArray);\n\n if (binArrayAccount === null) {\n ixs.push(\n await this.program.methods\n .initializeBinArray(idx)\n .accounts({\n binArray,\n funder,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n }\n\n return ixs;\n }\n\n /**\n *\n * @param\n * - `lowerBinId`: Lower bin ID of the position. This represent the lowest price of the position\n * - `positionWidth`: Width of the position. This will decide the upper bin id of the position, which represents the highest price of the position. UpperBinId = lowerBinId + positionWidth\n * - `owner`: Owner of the position.\n * - `operator`: Operator of the position. Operator able to manage the position on behalf of the position owner. However, liquidity withdrawal issue by the operator can only send to the position owner.\n * - `base`: Base key\n * - `feeOwner`: Owner of the fees earned by the position.\n * - `payer`: Payer for the position account rental.\n * - `lockReleasePoint`: The lock release point of the position.\n * @returns\n */\n public async initializePositionByOperator({\n lowerBinId,\n positionWidth,\n owner,\n feeOwner,\n base,\n operator,\n payer,\n lockReleasePoint,\n }: {\n lowerBinId: BN;\n positionWidth: BN;\n owner: PublicKey;\n feeOwner: PublicKey;\n operator: PublicKey;\n payer: PublicKey;\n base: PublicKey;\n lockReleasePoint: BN;\n }): Promise<Transaction> {\n const [positionPda, _bump] = derivePosition(\n this.pubkey,\n base,\n lowerBinId,\n positionWidth,\n this.program.programId\n );\n\n const operatorTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n operator,\n true\n );\n\n const ownerTokenX = getAssociatedTokenAddressSync(\n this.lbPair.tokenXMint,\n owner,\n true\n );\n\n const initializePositionByOperatorTx = await this.program.methods\n .initializePositionByOperator(\n lowerBinId.toNumber(),\n MAX_BIN_PER_POSITION.toNumber(),\n feeOwner,\n lockReleasePoint\n )\n .accounts({\n lbPair: this.pubkey,\n position: positionPda,\n base,\n operator,\n owner,\n ownerTokenX,\n operatorTokenX,\n payer,\n })\n .transaction();\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return new Transaction({\n feePayer: operator,\n blockhash,\n lastValidBlockHeight,\n }).add(initializePositionByOperatorTx);\n }\n\n /**\n * The `claimAllRewards` function to claim swap fees and LM rewards for multiple positions owned by a specific owner.\n * @param\n * - `owner`: The public key of the owner of the positions.\n * - `positions`: An array of objects of type `PositionData` that represents the positions to claim swap fees and LM rewards from.\n * @returns {Promise<Transaction[]>}\n */\n public async claimAllRewards({\n owner,\n positions,\n }: {\n owner: PublicKey;\n positions: LbPosition[];\n }): Promise<Transaction[]> {\n const preInstructions: TransactionInstruction[] = [];\n const pairsToken = [this.tokenX.publicKey, this.tokenY.publicKey];\n const tokensInvolved = [...pairsToken];\n for (let i = 0; i < 2; i++) {\n const rewardMint = this.lbPair.rewardInfos[i].mint;\n if (\n !tokensInvolved.some((pubkey) => rewardMint.equals(pubkey)) &&\n !rewardMint.equals(PublicKey.default)\n ) {\n tokensInvolved.push(this.lbPair.rewardInfos[i].mint);\n }\n }\n\n // Filter only position with fees and/or rewards\n positions = positions.filter(\n ({ positionData: { feeX, feeY, rewardOne, rewardTwo } }) =>\n !feeX.isZero() ||\n !feeY.isZero() ||\n !rewardOne.isZero() ||\n !rewardTwo.isZero()\n );\n\n const feeOwners = [\n ...new Set([\n owner.toBase58(),\n ...positions\n .filter((p) => !p.positionData.feeOwner.equals(PublicKey.default))\n .map((p) => p.positionData.feeOwner.toBase58()),\n ]),\n ].map((pk) => new PublicKey(pk));\n\n const createATAAccAndIx = await Promise.all(\n tokensInvolved\n .map((token) => {\n // There's multiple positions, therefore swap fee ATA might includes account from owner, and customized fee owners\n if (pairsToken.some((p) => p.equals(token))) {\n return feeOwners.map((customOwner) =>\n getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n customOwner,\n owner\n )\n );\n }\n //\n return [\n getOrCreateATAInstruction(\n this.program.provider.connection,\n token,\n owner\n ),\n ];\n })\n .flat()\n );\n\n createATAAccAndIx.forEach(({ ix }) => ix && preInstructions.push(ix));\n\n const claimAllSwapFeeTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { feeX, feeY } }) =>\n !feeX.isZero() || !feeY.isZero()\n )\n .map(async (position) => {\n return await this.createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePretIx: false,\n shouldIncludePostIx: false,\n });\n })\n )\n ).flat();\n\n const claimAllLMTxs = (\n await Promise.all(\n positions\n .filter(\n ({ positionData: { rewardOne, rewardTwo } }) =>\n !rewardOne.isZero() || !rewardTwo.isZero()\n )\n .map(async (position) => {\n return await this.createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx: false,\n });\n })\n )\n ).flat();\n\n const chunkedClaimAllTx = chunks(\n [...claimAllSwapFeeTxs, ...claimAllLMTxs],\n MAX_CLAIM_ALL_ALLOWED\n );\n\n const postInstructions: TransactionInstruction[] = [];\n if (tokensInvolved.some((pubkey) => pubkey.equals(NATIVE_MINT))) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n return Promise.all(\n chunkedClaimAllTx.map(async (claimAllTx) => {\n const mainIxs = claimAllTx.map((t) => t.instructions).flat();\n const instructions = [\n ...preInstructions,\n ...mainIxs,\n ...postInstructions,\n ];\n\n const setCUIx = await getEstimatedComputeUnitIxWithBuffer(\n this.program.provider.connection,\n instructions,\n owner\n );\n\n const tx = new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n }).add(setCUIx);\n\n if (preInstructions.length) tx.add(...preInstructions);\n tx.add(...claimAllTx);\n if (postInstructions.length) tx.add(...postInstructions);\n\n return tx;\n })\n );\n }\n\n public canSyncWithMarketPrice(marketPrice: number, activeBinId: number) {\n const marketPriceBinId = this.getBinIdFromPrice(\n Number(\n DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n marketPrice\n )\n ),\n false\n );\n\n const marketPriceBinArrayIndex = binIdToBinArrayIndex(\n new BN(marketPriceBinId)\n );\n\n const swapForY = marketPriceBinId < activeBinId;\n const toBinArrayIndex = findNextBinArrayIndexWithLiquidity(\n swapForY,\n new BN(activeBinId),\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null\n );\n if (toBinArrayIndex === null) return true;\n\n return swapForY\n ? marketPriceBinArrayIndex.gt(toBinArrayIndex)\n : marketPriceBinArrayIndex.lt(toBinArrayIndex);\n }\n\n /**\n * The `syncWithMarketPrice` function is used to sync the liquidity pool with the market price.\n * @param\n * - `marketPrice`: The market price to sync with.\n * - `owner`: The public key of the owner of the liquidity pool.\n * @returns {Promise<Transaction>}\n */\n public async syncWithMarketPrice(marketPrice: number, owner: PublicKey) {\n const marketPriceBinId = this.getBinIdFromPrice(\n Number(\n DLMM.getPricePerLamport(\n this.tokenX.decimal,\n this.tokenY.decimal,\n marketPrice\n )\n ),\n false\n );\n const activeBin = await this.getActiveBin();\n const activeBinId = activeBin.binId;\n\n if (!this.canSyncWithMarketPrice(marketPrice, activeBinId)) {\n throw new Error(\n \"Unable to sync with market price due to bin with liquidity between current and market price bin\"\n );\n }\n\n const fromBinArrayIndex = binIdToBinArrayIndex(new BN(activeBinId));\n\n const swapForY = marketPriceBinId < activeBinId;\n const toBinArrayIndex = findNextBinArrayIndexWithLiquidity(\n swapForY,\n new BN(activeBinId),\n this.lbPair,\n this.binArrayBitmapExtension?.account ?? null\n );\n const accountsToFetch = [];\n const [binArrayBitMapExtensionPubkey] = deriveBinArrayBitmapExtension(\n this.pubkey,\n this.program.programId\n );\n accountsToFetch.push(binArrayBitMapExtensionPubkey);\n const [fromBinArrayPubkey] = deriveBinArray(\n this.pubkey,\n fromBinArrayIndex,\n this.program.programId\n );\n accountsToFetch.push(fromBinArrayPubkey);\n const toBinArrayPubkey = (() => {\n if (!toBinArrayIndex) return null;\n\n const [toBinArrayPubkey] = deriveBinArray(\n this.pubkey,\n toBinArrayIndex,\n this.program.programId\n );\n\n accountsToFetch.push(toBinArrayPubkey);\n\n return toBinArrayPubkey;\n })();\n\n const binArrayAccounts =\n await this.program.provider.connection.getMultipleAccountsInfo(\n accountsToFetch\n );\n\n let fromBinArray: PublicKey | null = null;\n let toBinArray: PublicKey | null = null;\n let binArrayBitmapExtension: PublicKey | null = null;\n if (!!binArrayAccounts?.[0]) {\n binArrayBitmapExtension = binArrayBitMapExtensionPubkey;\n }\n if (!!binArrayAccounts?.[1]) {\n fromBinArray = fromBinArrayPubkey;\n }\n\n if (!!binArrayAccounts?.[2] && !!toBinArrayIndex) {\n toBinArray = toBinArrayPubkey;\n }\n\n const { blockhash, lastValidBlockHeight } =\n await this.program.provider.connection.getLatestBlockhash(\"confirmed\");\n const syncWithMarketPriceTx = await this.program.methods\n .goToABin(marketPriceBinId)\n .accounts({\n lbPair: this.pubkey,\n binArrayBitmapExtension,\n fromBinArray,\n toBinArray,\n })\n .transaction();\n\n return new Transaction({\n feePayer: owner,\n blockhash,\n lastValidBlockHeight,\n }).add(syncWithMarketPriceTx);\n }\n\n public async getMaxPriceInBinArrays(\n binArrayAccounts: BinArrayAccount[]\n ): Promise<string> {\n // Don't mutate\n const sortedBinArrays = [...binArrayAccounts].sort(\n ({ account: { index: indexA } }, { account: { index: indexB } }) =>\n indexA.toNumber() - indexB.toNumber()\n );\n let count = sortedBinArrays.length - 1;\n let binPriceWithLastLiquidity;\n while (count >= 0) {\n const binArray = sortedBinArrays[count];\n if (binArray) {\n const bins = binArray.account.bins;\n if (bins.every(({ amountX }) => amountX.isZero())) {\n count--;\n } else {\n const lastBinWithLiquidityIndex = bins.findLastIndex(\n ({ amountX }) => !amountX.isZero()\n );\n binPriceWithLastLiquidity =\n bins[lastBinWithLiquidityIndex].price.toString();\n count = -1;\n }\n }\n }\n\n return this.fromPricePerLamport(\n Number(binPriceWithLastLiquidity) / (2 ** 64 - 1)\n );\n }\n\n public getAmountOutWithdrawSingleSide(\n maxLiquidityShare: BN,\n price: BN,\n bin: Bin,\n isWithdrawForY: boolean\n ) {\n const amountX = mulDiv(\n maxLiquidityShare,\n bin.amountX,\n bin.liquiditySupply,\n Rounding.Down\n );\n const amountY = mulDiv(\n maxLiquidityShare,\n bin.amountY,\n bin.liquiditySupply,\n Rounding.Down\n );\n\n const amount0 = isWithdrawForY ? amountX : amountY;\n const amount1 = isWithdrawForY ? amountY : amountX;\n const remainAmountX = bin.amountX.sub(amountX);\n const remainAmountY = bin.amountY.sub(amountY);\n\n if (amount0.eq(new BN(0))) {\n return {\n withdrawAmount: amount1,\n };\n }\n\n let maxAmountOut = isWithdrawForY ? remainAmountY : remainAmountX;\n let maxAmountIn = isWithdrawForY\n ? shlDiv(remainAmountY, price, SCALE_OFFSET, Rounding.Up)\n : mulShr(remainAmountX, price, SCALE_OFFSET, Rounding.Up);\n\n let maxFee = computeFee(\n this.lbPair.binStep,\n this.lbPair.parameters,\n this.lbPair.vParameters,\n maxAmountIn\n );\n\n maxAmountIn = maxAmountIn.add(maxFee);\n\n if (amount0.gt(maxAmountIn)) {\n return {\n withdrawAmount: amount1.add(maxAmountOut),\n };\n }\n const fee = computeFeeFromAmount(\n this.lbPair.binStep,\n this.lbPair.parameters,\n this.lbPair.vParameters,\n amount0\n );\n const amount0AfterFee = amount0.sub(fee);\n const amountOut = isWithdrawForY\n ? mulShr(price, amount0AfterFee, SCALE_OFFSET, Rounding.Down)\n : shlDiv(amount0AfterFee, price, SCALE_OFFSET, Rounding.Down);\n\n return {\n withdrawAmount: amount1.add(amountOut),\n };\n }\n\n public async getWithdrawSingleSideAmount(\n positionPubkey: PublicKey,\n isWithdrawForY: boolean\n ) {\n let totalWithdrawAmount = new BN(0);\n let lowerBinArray: BinArray | undefined | null;\n let upperBinArray: BinArray | undefined | null;\n\n const position = await this.program.account.positionV2.fetch(\n positionPubkey\n );\n const lowerBinArrayIdx = binIdToBinArrayIndex(new BN(position.lowerBinId));\n const [lowerBinArrayPubKey] = deriveBinArray(\n position.lbPair,\n lowerBinArrayIdx,\n this.program.programId\n );\n const upperBinArrayIdx = lowerBinArrayIdx.add(new BN(1));\n const [upperBinArrayPubKey] = deriveBinArray(\n position.lbPair,\n upperBinArrayIdx,\n this.program.programId\n );\n\n [lowerBinArray, upperBinArray] =\n await this.program.account.binArray.fetchMultiple([\n lowerBinArrayPubKey,\n upperBinArrayPubKey,\n ]);\n\n for (let idx = 0; idx < position.liquidityShares.length; idx++) {\n const shareToRemove = position.liquidityShares[idx];\n\n if (shareToRemove.eq(new BN(0))) {\n continue;\n }\n\n const binId = new BN(position.lowerBinId).add(new BN(idx));\n const binArrayIndex = binIdToBinArrayIndex(binId);\n const binArray = binArrayIndex.eq(lowerBinArrayIdx)\n ? lowerBinArray\n : upperBinArray;\n\n if (!binArray) {\n throw new Error(\"BinArray not found\");\n }\n\n const bin = getBinFromBinArray(binId.toNumber(), binArray);\n\n if (isWithdrawForY) {\n if (binId.gt(new BN(this.lbPair.activeId))) {\n break;\n }\n } else {\n if (binId.lt(new BN(this.lbPair.activeId))) {\n continue;\n }\n }\n\n const price = getQPriceFromId(binId, new BN(this.lbPair.binStep));\n const { withdrawAmount } = this.getAmountOutWithdrawSingleSide(\n shareToRemove,\n price,\n bin,\n isWithdrawForY\n );\n\n totalWithdrawAmount = totalWithdrawAmount.add(withdrawAmount);\n }\n return totalWithdrawAmount;\n }\n\n /**\n *\n * @param swapInitiator Address of the swap initiator\n * @returns\n */\n public isSwapDisabled(swapInitiator: PublicKey) {\n if (this.lbPair.status == PairStatus.Disabled) {\n return true;\n }\n\n if (this.lbPair.pairType == PairType.Permissioned) {\n const currentPoint =\n this.lbPair.activationType == ActivationType.Slot\n ? this.clock.slot\n : this.clock.unixTimestamp;\n\n const preActivationSwapPoint = this.lbPair.activationPoint.sub(\n this.lbPair.preActivationDuration\n );\n\n const activationPoint =\n !this.lbPair.preActivationSwapAddress.equals(PublicKey.default) &&\n this.lbPair.preActivationSwapAddress.equals(swapInitiator)\n ? preActivationSwapPoint\n : this.lbPair.activationPoint;\n\n if (currentPoint < activationPoint) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Private static method */\n\n private static async getBinArrays(\n program: ClmmProgram,\n lbPairPubkey: PublicKey\n ): Promise<Array<BinArrayAccount>> {\n return program.account.binArray.all([\n {\n memcmp: {\n bytes: bs58.encode(lbPairPubkey.toBuffer()),\n offset: 8 + 16,\n },\n },\n ]);\n }\n\n private static async getClaimableLMReward(\n program: ClmmProgram,\n positionVersion: PositionVersion,\n lbPair: LbPair,\n onChainTimestamp: number,\n position: Position,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ): Promise<LMRewards> {\n const lowerBinArrayIdx = binIdToBinArrayIndex(new BN(position.lowerBinId));\n\n let rewards = [new BN(0), new BN(0)];\n\n let _lowerBinArray: BinArray | undefined | null = lowerBinArray;\n let _upperBinArray: BinArray | undefined | null = upperBinArray;\n if (!lowerBinArray || !upperBinArray) {\n const lowerBinArrayIdx = binIdToBinArrayIndex(\n new BN(position.lowerBinId)\n );\n const [lowerBinArray] = deriveBinArray(\n position.lbPair,\n lowerBinArrayIdx,\n program.programId\n );\n\n const upperBinArrayIdx = lowerBinArrayIdx.add(new BN(1));\n const [upperBinArray] = deriveBinArray(\n position.lbPair,\n upperBinArrayIdx,\n program.programId\n );\n\n [_lowerBinArray, _upperBinArray] =\n await program.account.binArray.fetchMultiple([\n lowerBinArray,\n upperBinArray,\n ]);\n }\n\n if (!_lowerBinArray || !_upperBinArray)\n throw new Error(\"BinArray not found\");\n\n for (let i = position.lowerBinId; i <= position.upperBinId; i++) {\n const binArrayIdx = binIdToBinArrayIndex(new BN(i));\n const binArray = binArrayIdx.eq(lowerBinArrayIdx)\n ? _lowerBinArray\n : _upperBinArray;\n const binState = getBinFromBinArray(i, binArray);\n const binIdxInPosition = i - position.lowerBinId;\n\n const positionRewardInfo = position.rewardInfos[binIdxInPosition];\n const liquidityShare =\n positionVersion === PositionVersion.V1\n ? position.liquidityShares[binIdxInPosition]\n : position.liquidityShares[binIdxInPosition].shrn(64);\n\n for (let j = 0; j < 2; j++) {\n const pairRewardInfo = lbPair.rewardInfos[j];\n\n if (!pairRewardInfo.mint.equals(PublicKey.default)) {\n let rewardPerTokenStored = binState.rewardPerTokenStored[j];\n\n if (i == lbPair.activeId && !binState.liquiditySupply.isZero()) {\n const currentTime = new BN(\n Math.min(\n onChainTimestamp,\n pairRewardInfo.rewardDurationEnd.toNumber()\n )\n );\n const delta = currentTime.sub(pairRewardInfo.lastUpdateTime);\n const liquiditySupply =\n binArray.version == 0\n ? binState.liquiditySupply\n : binState.liquiditySupply.shrn(64);\n const rewardPerTokenStoredDelta = pairRewardInfo.rewardRate\n .mul(delta)\n .div(new BN(15))\n .div(liquiditySupply);\n rewardPerTokenStored = rewardPerTokenStored.add(\n rewardPerTokenStoredDelta\n );\n }\n\n const delta = rewardPerTokenStored.sub(\n positionRewardInfo.rewardPerTokenCompletes[j]\n );\n const newReward = mulShr(\n delta,\n liquidityShare,\n SCALE_OFFSET,\n Rounding.Down\n );\n rewards[j] = rewards[j]\n .add(newReward)\n .add(positionRewardInfo.rewardPendings[j]);\n }\n }\n }\n\n return {\n rewardOne: rewards[0],\n rewardTwo: rewards[1],\n };\n }\n\n private static async getClaimableSwapFee(\n program: ClmmProgram,\n positionVersion: PositionVersion,\n position: Position,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ): Promise<SwapFee> {\n const lowerBinArrayIdx = binIdToBinArrayIndex(new BN(position.lowerBinId));\n\n let feeX = new BN(0);\n let feeY = new BN(0);\n\n let _lowerBinArray: BinArray | undefined | null = lowerBinArray;\n let _upperBinArray: BinArray | undefined | null = upperBinArray;\n if (!lowerBinArray || !upperBinArray) {\n const lowerBinArrayIdx = binIdToBinArrayIndex(\n new BN(position.lowerBinId)\n );\n const [lowerBinArray] = deriveBinArray(\n position.lbPair,\n lowerBinArrayIdx,\n program.programId\n );\n\n const upperBinArrayIdx = lowerBinArrayIdx.add(new BN(1));\n const [upperBinArray] = deriveBinArray(\n position.lbPair,\n upperBinArrayIdx,\n program.programId\n );\n\n [_lowerBinArray, _upperBinArray] =\n await program.account.binArray.fetchMultiple([\n lowerBinArray,\n upperBinArray,\n ]);\n }\n\n if (!_lowerBinArray || !_upperBinArray)\n throw new Error(\"BinArray not found\");\n\n for (let i = position.lowerBinId; i <= position.upperBinId; i++) {\n const binArrayIdx = binIdToBinArrayIndex(new BN(i));\n const binArray = binArrayIdx.eq(lowerBinArrayIdx)\n ? _lowerBinArray\n : _upperBinArray;\n const binState = getBinFromBinArray(i, binArray);\n const binIdxInPosition = i - position.lowerBinId;\n\n const feeInfos = position.feeInfos[binIdxInPosition];\n const liquidityShare =\n positionVersion === PositionVersion.V1\n ? position.liquidityShares[binIdxInPosition]\n : position.liquidityShares[binIdxInPosition].shrn(64);\n\n const newFeeX = mulShr(\n liquidityShare,\n binState.feeAmountXPerTokenStored.sub(feeInfos.feeXPerTokenComplete),\n SCALE_OFFSET,\n Rounding.Down\n );\n\n const newFeeY = mulShr(\n liquidityShare,\n binState.feeAmountYPerTokenStored.sub(feeInfos.feeYPerTokenComplete),\n SCALE_OFFSET,\n Rounding.Down\n );\n\n feeX = feeX.add(newFeeX).add(feeInfos.feeXPending);\n feeY = feeY.add(newFeeY).add(feeInfos.feeYPending);\n }\n\n return { feeX, feeY };\n }\n\n private static async processPosition(\n program: ClmmProgram,\n version: PositionVersion,\n lbPair: LbPair,\n onChainTimestamp: number,\n position: Position,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n lowerBinArray: BinArray,\n upperBinArray: BinArray,\n feeOwner: PublicKey\n ): Promise<PositionData | null> {\n const {\n lowerBinId,\n upperBinId,\n liquidityShares: posShares,\n lastUpdatedAt,\n totalClaimedFeeXAmount,\n totalClaimedFeeYAmount,\n } = position;\n\n const bins = this.getBinsBetweenLowerAndUpperBound(\n lbPair,\n lowerBinId,\n upperBinId,\n baseTokenDecimal,\n quoteTokenDecimal,\n lowerBinArray,\n upperBinArray\n );\n\n if (!bins.length) return null;\n\n /// assertion\n if (\n bins[0].binId !== lowerBinId ||\n bins[bins.length - 1].binId !== upperBinId\n )\n throw new Error(\"Bin ID mismatch\");\n\n const positionData: PositionBinData[] = [];\n let totalXAmount = new Decimal(0);\n let totalYAmount = new Decimal(0);\n\n bins.forEach((bin, idx) => {\n const binSupply = new Decimal(bin.supply.toString());\n\n const posShare = new Decimal(posShares[idx].toString());\n const positionXAmount = binSupply.eq(new Decimal(\"0\"))\n ? new Decimal(\"0\")\n : posShare.mul(bin.xAmount.toString()).div(binSupply);\n const positionYAmount = binSupply.eq(new Decimal(\"0\"))\n ? new Decimal(\"0\")\n : posShare.mul(bin.yAmount.toString()).div(binSupply);\n\n totalXAmount = totalXAmount.add(positionXAmount);\n totalYAmount = totalYAmount.add(positionYAmount);\n\n positionData.push({\n binId: bin.binId,\n price: bin.price,\n pricePerToken: bin.pricePerToken,\n binXAmount: bin.xAmount.toString(),\n binYAmount: bin.yAmount.toString(),\n binLiquidity: binSupply.toString(),\n positionLiquidity: posShare.toString(),\n positionXAmount: positionXAmount.toString(),\n positionYAmount: positionYAmount.toString(),\n });\n });\n\n const { feeX, feeY } = await this.getClaimableSwapFee(\n program,\n version,\n position,\n lowerBinArray,\n upperBinArray\n );\n const { rewardOne, rewardTwo } = await this.getClaimableLMReward(\n program,\n version,\n lbPair,\n onChainTimestamp,\n position,\n lowerBinArray,\n upperBinArray\n );\n\n return {\n totalXAmount: totalXAmount.toString(),\n totalYAmount: totalYAmount.toString(),\n positionBinData: positionData,\n lastUpdatedAt,\n lowerBinId,\n upperBinId,\n feeX,\n feeY,\n rewardOne,\n rewardTwo,\n feeOwner,\n totalClaimedFeeXAmount,\n totalClaimedFeeYAmount,\n };\n }\n\n private static getBinsBetweenLowerAndUpperBound(\n lbPair: LbPair,\n lowerBinId: number,\n upperBinId: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n lowerBinArrays: BinArray,\n upperBinArrays: BinArray\n ): BinLiquidity[] {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n let bins: BinLiquidity[] = [];\n if (lowerBinArrayIndex.eq(upperBinArrayIndex)) {\n const binArray = lowerBinArrays;\n\n const [lowerBinIdForBinArray] = getBinArrayLowerUpperBinId(\n binArray.index\n );\n\n binArray.bins.forEach((bin, idx) => {\n const binId = lowerBinIdForBinArray.toNumber() + idx;\n\n if (binId >= lowerBinId && binId <= upperBinId) {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n lbPair.binStep\n ).toString();\n bins.push({\n binId,\n xAmount: bin.amountX,\n yAmount: bin.amountY,\n supply: bin.liquiditySupply,\n price: pricePerLamport,\n version: binArray.version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n });\n }\n });\n } else {\n const binArrays = [lowerBinArrays, upperBinArrays];\n\n binArrays.forEach((binArray) => {\n const [lowerBinIdForBinArray] = getBinArrayLowerUpperBinId(\n binArray.index\n );\n binArray.bins.forEach((bin, idx) => {\n const binId = lowerBinIdForBinArray.toNumber() + idx;\n if (binId >= lowerBinId && binId <= upperBinId) {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n lbPair.binStep\n ).toString();\n bins.push({\n binId,\n xAmount: bin.amountX,\n yAmount: bin.amountY,\n supply: bin.liquiditySupply,\n price: pricePerLamport,\n version: binArray.version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n });\n }\n });\n });\n }\n\n return bins;\n }\n\n /** Private method */\n\n private processXYAmountDistribution(xYAmountDistribution: BinAndAmount[]) {\n let currentBinId: number | null = null;\n const xAmountDistribution: BN[] = [];\n const yAmountDistribution: BN[] = [];\n const binIds: number[] = [];\n\n xYAmountDistribution.forEach((binAndAmount) => {\n xAmountDistribution.push(binAndAmount.xAmountBpsOfTotal);\n yAmountDistribution.push(binAndAmount.yAmountBpsOfTotal);\n binIds.push(binAndAmount.binId);\n\n if (currentBinId && binAndAmount.binId !== currentBinId + 1) {\n throw new Error(\"Discontinuous Bin ID\");\n } else {\n currentBinId = binAndAmount.binId;\n }\n });\n\n return {\n lowerBinId: xYAmountDistribution[0].binId,\n upperBinId: xYAmountDistribution[xYAmountDistribution.length - 1].binId,\n xAmountDistribution,\n yAmountDistribution,\n binIds,\n };\n }\n\n private async getBins(\n lbPairPubKey: PublicKey,\n lowerBinId: number,\n upperBinId: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n lowerBinArray?: BinArray,\n upperBinArray?: BinArray\n ) {\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const upperBinArrayIndex = binIdToBinArrayIndex(new BN(upperBinId));\n\n const hasCachedLowerBinArray = lowerBinArray != null;\n const hasCachedUpperBinArray = upperBinArray != null;\n const isSingleBinArray = lowerBinArrayIndex.eq(upperBinArrayIndex);\n\n const lowerBinArrayIndexOffset = hasCachedLowerBinArray ? 1 : 0;\n const upperBinArrayIndexOffset = hasCachedUpperBinArray ? -1 : 0;\n\n const binArrayPubkeys = range(\n lowerBinArrayIndex.toNumber() + lowerBinArrayIndexOffset,\n upperBinArrayIndex.toNumber() + upperBinArrayIndexOffset,\n i => deriveBinArray(lbPairPubKey, new BN(i), this.program.programId)[0]\n );\n const fetchedBinArrays = binArrayPubkeys.length !== 0 ?\n await this.program.account.binArray.fetchMultiple(binArrayPubkeys) : [];\n const binArrays = [\n ...(hasCachedLowerBinArray ? [lowerBinArray] : []),\n ...fetchedBinArrays,\n ...((hasCachedUpperBinArray && !isSingleBinArray) ? [upperBinArray] : [])\n ];\n\n const binsById = new Map(binArrays\n .filter(x => x != null)\n .flatMap(({ bins, index }) => {\n const [lowerBinId] = getBinArrayLowerUpperBinId(index);\n return bins.map((b, i) => [lowerBinId.toNumber() + i, b] as [number, Bin]);\n }));\n const version = binArrays.find(binArray => binArray != null)?.version ?? 1;\n\n return Array.from(enumerateBins(\n binsById,\n lowerBinId,\n upperBinId,\n this.lbPair.binStep,\n baseTokenDecimal,\n quoteTokenDecimal,\n version,\n ));\n }\n\n private async binArraysToBeCreate(\n lowerBinArrayIndex: BN,\n upperBinArrayIndex: BN\n ) {\n const binArrayIndexes: BN[] = Array.from(\n { length: upperBinArrayIndex.sub(lowerBinArrayIndex).toNumber() + 1 },\n (_, index) => index + lowerBinArrayIndex.toNumber()\n ).map((idx) => new BN(idx));\n\n const binArrays: PublicKey[] = [];\n for (const idx of binArrayIndexes) {\n const [binArrayPubKey] = deriveBinArray(\n this.pubkey,\n idx,\n this.program.programId\n );\n binArrays.push(binArrayPubKey);\n }\n\n const binArrayAccounts =\n await this.program.provider.connection.getMultipleAccountsInfo(binArrays);\n\n return binArrayAccounts\n .filter((binArray) => binArray === null)\n .map((_, index) => binArrays[index]);\n }\n\n private async createBinArraysIfNeeded(\n upperBinArrayIndex: BN,\n lowerBinArrayIndex: BN,\n funder: PublicKey\n ): Promise<TransactionInstruction[]> {\n const ixs: TransactionInstruction[] = [];\n\n const binArrayIndexes: BN[] = Array.from(\n { length: upperBinArrayIndex.sub(lowerBinArrayIndex).toNumber() + 1 },\n (_, index) => index + lowerBinArrayIndex.toNumber()\n ).map((idx) => new BN(idx));\n\n for (const idx of binArrayIndexes) {\n const [binArray] = deriveBinArray(\n this.pubkey,\n idx,\n this.program.programId\n );\n\n const binArrayAccount =\n await this.program.provider.connection.getAccountInfo(binArray);\n\n if (binArrayAccount === null) {\n ixs.push(\n await this.program.methods\n .initializeBinArray(idx)\n .accounts({\n binArray,\n funder,\n lbPair: this.pubkey,\n })\n .instruction()\n );\n }\n }\n return ixs;\n }\n\n private updateVolatilityAccumulator(\n vParameter: vParameters,\n sParameter: sParameters,\n activeId: number\n ) {\n const deltaId = Math.abs(vParameter.indexReference - activeId);\n const newVolatilityAccumulator =\n vParameter.volatilityReference + deltaId * BASIS_POINT_MAX;\n\n vParameter.volatilityAccumulator = Math.min(\n newVolatilityAccumulator,\n sParameter.maxVolatilityAccumulator\n );\n }\n\n private updateReference(\n activeId: number,\n vParameter: vParameters,\n sParameter: sParameters,\n currentTimestamp: number\n ) {\n const elapsed =\n currentTimestamp - vParameter.lastUpdateTimestamp.toNumber();\n\n if (elapsed >= sParameter.filterPeriod) {\n vParameter.indexReference = activeId;\n if (elapsed < sParameter.decayPeriod) {\n const decayedVolatilityReference = Math.floor(\n (vParameter.volatilityAccumulator * sParameter.reductionFactor) /\n BASIS_POINT_MAX\n );\n vParameter.volatilityReference = decayedVolatilityReference;\n } else {\n vParameter.volatilityReference = 0;\n }\n }\n }\n\n private async createClaimBuildMethod({\n owner,\n position,\n shouldIncludePreIx = true,\n }: {\n owner: PublicKey;\n position: LbPosition;\n shouldIncludePreIx?: boolean;\n }) {\n const lowerBinArrayIndex = binIdToBinArrayIndex(\n new BN(position.positionData.lowerBinId)\n );\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const claimTransactions: Transaction[] = [];\n for (let i = 0; i < 2; i++) {\n const rewardInfo = this.lbPair.rewardInfos[i];\n if (!rewardInfo || rewardInfo.mint.equals(PublicKey.default)) continue;\n\n const preInstructions = [];\n const { ataPubKey, ix } = await getOrCreateATAInstruction(\n this.program.provider.connection,\n rewardInfo.mint,\n owner\n );\n ix && preInstructions.push(ix);\n const claimTransaction = await this.program.methods\n .claimReward(new BN(i))\n .accounts({\n lbPair: this.pubkey,\n sender: owner,\n position: position.publicKey,\n binArrayLower,\n binArrayUpper,\n rewardVault: rewardInfo.vault,\n rewardMint: rewardInfo.mint,\n tokenProgram: TOKEN_PROGRAM_ID,\n userTokenAccount: ataPubKey,\n })\n .preInstructions(shouldIncludePreIx ? preInstructions : [])\n .transaction();\n claimTransactions.push(claimTransaction);\n }\n\n return claimTransactions;\n }\n\n private async createClaimSwapFeeMethod({\n owner,\n position,\n shouldIncludePretIx = true,\n shouldIncludePostIx = true,\n }: {\n owner: PublicKey;\n position: LbPosition;\n shouldIncludePretIx?: boolean;\n shouldIncludePostIx?: boolean;\n }) {\n const { lowerBinId, feeOwner } = position.positionData;\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(new BN(lowerBinId));\n const [binArrayLower] = deriveBinArray(\n this.pubkey,\n lowerBinArrayIndex,\n this.program.programId\n );\n\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n const [binArrayUpper] = deriveBinArray(\n this.pubkey,\n upperBinArrayIndex,\n this.program.programId\n );\n\n const [reserveX] = deriveReserve(\n this.tokenX.publicKey,\n this.pubkey,\n this.program.programId\n );\n const [reserveY] = deriveReserve(\n this.tokenY.publicKey,\n this.pubkey,\n this.program.programId\n );\n\n const walletToReceiveFee = feeOwner.equals(PublicKey.default)\n ? owner\n : feeOwner;\n\n const preInstructions: TransactionInstruction[] = [];\n const [\n { ataPubKey: userTokenX, ix: createInTokenAccountIx },\n { ataPubKey: userTokenY, ix: createOutTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenX.publicKey,\n walletToReceiveFee,\n owner\n ),\n getOrCreateATAInstruction(\n this.program.provider.connection,\n this.tokenY.publicKey,\n walletToReceiveFee,\n owner\n ),\n ]);\n createInTokenAccountIx && preInstructions.push(createInTokenAccountIx);\n createOutTokenAccountIx && preInstructions.push(createOutTokenAccountIx);\n\n const postInstructions: Array<TransactionInstruction> = [];\n if (\n [\n this.tokenX.publicKey.toBase58(),\n this.tokenY.publicKey.toBase58(),\n ].includes(NATIVE_MINT.toBase58())\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const claimFeeTx = await this.program.methods\n .claimFee()\n .accounts({\n binArrayLower,\n binArrayUpper,\n lbPair: this.pubkey,\n sender: owner,\n position: position.publicKey,\n reserveX,\n reserveY,\n tokenProgram: TOKEN_PROGRAM_ID,\n tokenXMint: this.tokenX.publicKey,\n tokenYMint: this.tokenY.publicKey,\n userTokenX,\n userTokenY,\n })\n .preInstructions(shouldIncludePretIx ? preInstructions : [])\n .postInstructions(shouldIncludePostIx ? postInstructions : [])\n .transaction();\n\n return claimFeeTx;\n }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { IDL } from \"../idl\";\nimport { BN } from \"@coral-xyz/anchor\";\n\nexport const LBCLMM_PROGRAM_IDS = {\n devnet: \"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo\",\n localhost: \"LbVRzDTvBDEcrthxfZ4RL6yiq3uZw8bS6MwtdY6UhFQ\",\n \"mainnet-beta\": \"LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo\",\n};\n\nexport const ADMIN = {\n devnet: \"6WaLrrRfReGKBYUSkmx2K6AuT21ida4j8at2SUiZdXu8\",\n localhost: \"bossj3JvwiNK7pvjr149DqdtJxf2gdygbcmEPTkb2F1\",\n};\n\nexport enum Network {\n MAINNET = \"mainnet-beta\",\n TESTNET = \"testnet\",\n DEVNET = \"devnet\",\n LOCAL = \"localhost\",\n}\n\nexport const BASIS_POINT_MAX = 10000;\nexport const SCALE_OFFSET = 64;\nexport const SCALE = new BN(1).shln(SCALE_OFFSET);\n\nexport const FEE_PRECISION = new BN(1_000_000_000);\nexport const MAX_FEE_RATE = new BN(100_000_000);\nexport const BIN_ARRAY_FEE = 0.07054656;\nexport const POSITION_FEE = 0.0565152;\n\nconst CONSTANTS = Object.entries(IDL.constants);\n\nexport const MAX_BIN_ARRAY_SIZE = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"MAX_BIN_PER_ARRAY\")?.[1].value ?? 0\n);\nexport const MAX_BIN_PER_POSITION = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"MAX_BIN_PER_POSITION\")?.[1].value ?? 0\n);\nexport const BIN_ARRAY_BITMAP_SIZE = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"BIN_ARRAY_BITMAP_SIZE\")?.[1].value ?? 0\n);\nexport const EXTENSION_BINARRAY_BITMAP_SIZE = new BN(\n CONSTANTS.find(([k, v]) => v.name == \"EXTENSION_BINARRAY_BITMAP_SIZE\")?.[1]\n .value ?? 0\n);\n\nexport const SIMULATION_USER = new PublicKey(\n \"HrY9qR5TiB2xPzzvbBu5KrBorMfYGQXh9osXydz4jy9s\"\n);\n\nexport const PRECISION = 18446744073709551616;\n\nexport const MAX_CLAIM_ALL_ALLOWED = 3;\n\nexport const MAX_BIN_LENGTH_ALLOWED_IN_ONE_TX = 26;\nexport const MAX_BIN_PER_TX = 69;\n\nexport const MAX_ACTIVE_BIN_SLIPPAGE = 3;\n\nexport const ILM_BASE = new PublicKey(\n \"MFGQxwAmB91SwuYX36okv2Qmdc9aMuHTwWGUrp4AtB1\"\n);\n\nexport const MAX_EXTRA_BIN_ARRAYS = 3;\n","export type LbClmm = {\n \"version\": \"0.8.6\",\n \"name\": \"lb_clmm\",\n \"constants\": [\n {\n \"name\": \"BASIS_POINT_MAX\",\n \"type\": \"i32\",\n \"value\": \"10000\"\n },\n {\n \"name\": \"MAX_BIN_PER_ARRAY\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MAX_BIN_PER_POSITION\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MIN_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"- 443636\"\n },\n {\n \"name\": \"MAX_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"443636\"\n },\n {\n \"name\": \"MAX_FEE_RATE\",\n \"type\": \"u64\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"FEE_PRECISION\",\n \"type\": \"u64\",\n \"value\": \"1_000_000_000\"\n },\n {\n \"name\": \"MAX_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2_500\"\n },\n {\n \"name\": \"HOST_FEE_BPS\",\n \"type\": \"u16\",\n \"value\": \"2_000\"\n },\n {\n \"name\": \"NUM_REWARDS\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"2\"\n },\n {\n \"name\": \"MIN_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"1\"\n },\n {\n \"name\": \"MAX_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"31536000\"\n },\n {\n \"name\": \"EXTENSION_BINARRAY_BITMAP_SIZE\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"12\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SIZE\",\n \"type\": \"i32\",\n \"value\": \"512\"\n },\n {\n \"name\": \"MAX_REWARD_BIN_SPLIT\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"15\"\n },\n {\n \"name\": \"ILM_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2000\"\n },\n {\n \"name\": \"PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"500\"\n },\n {\n \"name\": \"MAX_BIN_STEP\",\n \"type\": \"u16\",\n \"value\": \"400\"\n },\n {\n \"name\": \"MAX_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"MIN_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000\"\n },\n {\n \"name\": \"MINIMUM_LIQUIDITY\",\n \"type\": \"u128\",\n \"value\": \"1_000_000\"\n },\n {\n \"name\": \"BIN_ARRAY\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 110, 95, 97, 114, 114, 97, 121]\"\n },\n {\n \"name\": \"ORACLE\",\n \"type\": \"bytes\",\n \"value\": \"[111, 114, 97, 99, 108, 101]\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SEED\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 116, 109, 97, 112]\"\n },\n {\n \"name\": \"PRESET_PARAMETER\",\n \"type\": \"bytes\",\n \"value\": \"[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]\"\n },\n {\n \"name\": \"POSITION\",\n \"type\": \"bytes\",\n \"value\": \"[112, 111, 115, 105, 116, 105, 111, 110]\"\n }\n ],\n \"instructions\": [\n {\n \"name\": \"initializeLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"presetParameter\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"initializePermissionLbPair\",\n \"accounts\": [\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ixData\",\n \"type\": {\n \"defined\": \"InitPermissionPairIx\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeCustomizablePermissionlessLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": \"CustomizableParams\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeBinArrayBitmapExtension\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"docs\": [\n \"Initialize an account to store if a bin array is initialized.\"\n ]\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"initializeBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n }\n ]\n },\n {\n \"name\": \"addLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByWeight\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByWeight\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategy\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategy\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategyOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategyOneSide\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityOneSideParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"removeLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binLiquidityRemoval\",\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityReduction\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initializePosition\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionPda\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"owner\"\n ]\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionByOperator\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"operator\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"operator\"\n ]\n },\n {\n \"name\": \"operatorTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"ownerTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"feeOwner\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"updatePositionOperator\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"operator\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"swap\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"minAmountOut\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapExactOut\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"maxInAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"outAmount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapWithPriceImpact\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"type\": {\n \"option\": \"i32\"\n }\n },\n {\n \"name\": \"maxPriceImpactBps\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"withdrawProtocolFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializeReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"fundReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"carryForward\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"updateRewardFunder\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"updateRewardDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"closePosition\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateBaseFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"BaseFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"updateDynamicFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"DynamicFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"increaseOracleLength\",\n \"accounts\": [\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lengthToAdd\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ix\",\n \"type\": {\n \"defined\": \"InitPresetParametersIx\"\n }\n }\n ]\n },\n {\n \"name\": \"closePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"removeAllLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"setPairStatus\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"migratePosition\",\n \"accounts\": [\n {\n \"name\": \"positionV2\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"positionV1\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"migrateBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateFeesAndRewards\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"withdrawIneligibleReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setActivationPoint\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"activationPoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"removeLiquidityByRange\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSidePrecise\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"parameter\",\n \"type\": {\n \"defined\": \"AddLiquiditySingleSidePreciseParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"goToABin\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"fromBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"toBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationSwapAddress\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationSwapAddress\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"setPairStatusPermissionless\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"binArrayBitmapExtension\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"positiveBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is positive\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n },\n {\n \"name\": \"negativeBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is negative\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"binArray\",\n \"docs\": [\n \"An account to contain a range of bin. For example: Bin 100 <-> 200.\",\n \"For example:\",\n \"BinArray index: 0 contains bin 0 <-> 599\",\n \"index: 2 contains bin 600 <-> 1199, ...\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"Version of binArray\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"bins\",\n \"type\": {\n \"array\": [\n {\n \"defined\": \"Bin\"\n },\n 70\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"parameters\",\n \"type\": {\n \"defined\": \"StaticParameters\"\n }\n },\n {\n \"name\": \"vParameters\",\n \"type\": {\n \"defined\": \"VariableParameters\"\n }\n },\n {\n \"name\": \"bumpSeed\",\n \"type\": {\n \"array\": [\n \"u8\",\n 1\n ]\n }\n },\n {\n \"name\": \"binStepSeed\",\n \"docs\": [\n \"Bin step signer seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"pairType\",\n \"docs\": [\n \"Type of the pair\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"status\",\n \"docs\": [\n \"Status of the pair. Check PairStatus enum.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"requireBaseFactorSeed\",\n \"docs\": [\n \"Require base factor seed\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"baseFactorSeed\",\n \"docs\": [\n \"Base factor seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Allow pool creator to enable/disable pool with restricted validation. Only applicable for customizable permissionless pair type.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenXMint\",\n \"docs\": [\n \"Token X mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"tokenYMint\",\n \"docs\": [\n \"Token Y mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveX\",\n \"docs\": [\n \"LB token X vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveY\",\n \"docs\": [\n \"LB token Y vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"protocolFee\",\n \"docs\": [\n \"Uncollected protocol fee\"\n ],\n \"type\": {\n \"defined\": \"ProtocolFee\"\n }\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"RewardInfo\"\n },\n 2\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle pubkey\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"binArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 16\n ]\n }\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last time the pool fee parameter was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding2\",\n \"docs\": [\n \"_padding_2, previous whitelisted_wallet, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"preActivationSwapAddress\",\n \"docs\": [\n \"Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"baseKey\",\n \"docs\": [\n \"Base keypair. Only required for permission pair\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Time point to enable the pair. Only applicable for permission pair.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"preActivationDuration\",\n \"docs\": [\n \"Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding3\",\n \"docs\": [\n \"_padding 3 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"padding4\",\n \"docs\": [\n \"_padding_4, previous lock_duration, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"creator\",\n \"docs\": [\n \"Pool creator\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 24\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"idx\",\n \"docs\": [\n \"Index of latest observation\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeSize\",\n \"docs\": [\n \"Size of active sample. Active sample is initialized observation.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"length\",\n \"docs\": [\n \"Number of observations\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"position\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 160\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"positionV2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"operator\",\n \"docs\": [\n \"Operator of position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"docs\": [\n \"Time point which the locked liquidity can be withdraw\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding0\",\n \"docs\": [\n \"_padding_0, previous subjected_to_bootstrap_liquidity_locking, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"feeOwner\",\n \"docs\": [\n \"Address is able to claim fee in this position, only valid for bootstrap_liquidity_position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 87\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"presetParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n }\n ],\n \"types\": [\n {\n \"name\": \"InitPresetParametersIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor for base fee rate\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategyOneSide\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategy\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"min bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"max bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyType\",\n \"docs\": [\n \"strategy type\"\n ],\n \"type\": {\n \"defined\": \"StrategyType\"\n }\n },\n {\n \"name\": \"parameteres\",\n \"docs\": [\n \"parameters\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityOneSideParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistributionByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"weight\",\n \"docs\": [\n \"weight of liquidity distributed for this bin id\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"AddLiquiditySingleSidePreciseParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bins\",\n \"type\": {\n \"vec\": {\n \"defined\": \"CompressedBinDepositAmount\"\n }\n }\n },\n {\n \"name\": \"decompressMultiplier\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"CompressedBinDepositAmount\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistribution\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"distributionX\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"distributionY\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistribution\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CustomizableParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Pool price\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type. 0 = Slot, 1 = Time. Check ActivationType enum\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"hasAlphaVault\",\n \"docs\": [\n \"Whether the pool has an alpha vault\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Decide when does the pool start trade. None = Now\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Pool creator have permission to enable/disable pool with restricted program validation. Only applicable for customizable permissionless pool.\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding, for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 63\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"InitPermissionPairIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"minBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"activationType\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityReduction\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"Bin\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of token X in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of token Y in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Bin price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquiditySupply\",\n \"docs\": [\n \"Liquidities of the bin. This is the same as LP mint supply. q-number\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"rewardPerTokenStored\",\n \"docs\": [\n \"reward_a_per_token_stored\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"feeAmountXPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token X per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeAmountYPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token Y per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountXIn\",\n \"docs\": [\n \"Total token X swap into the bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountYIn\",\n \"docs\": [\n \"Total token Y swap into he bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"RewardInfo\",\n \"docs\": [\n \"Stores the state relevant for tracking liquidity mining rewards\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"Reward token mint.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"vault\",\n \"docs\": [\n \"Reward vault token account.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"funder\",\n \"docs\": [\n \"Authority account that allows to fund rewards\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"rewardDuration\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDurationEnd\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardRate\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"lastUpdateTime\",\n \"docs\": [\n \"The last time reward states were updated.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"cumulativeSecondsWithEmptyLiquidityReward\",\n \"docs\": [\n \"Accumulated seconds where when farm distribute rewards, but the bin is empty. The reward will be accumulated for next reward time window.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Observation\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cumulativeActiveBinId\",\n \"docs\": [\n \"Cumulative active bin ID\"\n ],\n \"type\": \"i128\"\n },\n {\n \"name\": \"createdAt\",\n \"docs\": [\n \"Observation sample created timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Observation sample last updated timestamp\"\n ],\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"StaticParameters\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"VariableParameters\",\n \"docs\": [\n \"Parameters that changes based on dynamic of the market\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"volatilityAccumulator\",\n \"docs\": [\n \"Volatility accumulator measure the number of bin crossed since reference bin ID. Normally (without filter period taken into consideration), reference bin ID is the active bin of last swap.\",\n \"It affects the variable fee rate\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"volatilityReference\",\n \"docs\": [\n \"Volatility reference is decayed volatility accumulator. It is always <= volatility_accumulator\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"indexReference\",\n \"docs\": [\n \"Active bin id of last swap.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"lastUpdateTimestamp\",\n \"docs\": [\n \"Last timestamp the variable parameters was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"FeeInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"feeXPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeYPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeXPending\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"feeYPending\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"UserRewardInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"rewardPerTokenCompletes\",\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"rewardPendings\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyType\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"SpotOneSide\"\n },\n {\n \"name\": \"CurveOneSide\"\n },\n {\n \"name\": \"BidAskOneSide\"\n },\n {\n \"name\": \"SpotBalanced\"\n },\n {\n \"name\": \"CurveBalanced\"\n },\n {\n \"name\": \"BidAskBalanced\"\n },\n {\n \"name\": \"SpotImBalanced\"\n },\n {\n \"name\": \"CurveImBalanced\"\n },\n {\n \"name\": \"BidAskImBalanced\"\n }\n ]\n }\n },\n {\n \"name\": \"Rounding\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Up\"\n },\n {\n \"name\": \"Down\"\n }\n ]\n }\n },\n {\n \"name\": \"ActivationType\",\n \"docs\": [\n \"Type of the activation\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Slot\"\n },\n {\n \"name\": \"Timestamp\"\n }\n ]\n }\n },\n {\n \"name\": \"LayoutVersion\",\n \"docs\": [\n \"Layout version\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"V0\"\n },\n {\n \"name\": \"V1\"\n }\n ]\n }\n },\n {\n \"name\": \"PairType\",\n \"docs\": [\n \"Type of the Pair. 0 = Permissionless, 1 = Permission, 2 = CustomizablePermissionless. Putting 0 as permissionless for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Permissionless\"\n },\n {\n \"name\": \"Permission\"\n },\n {\n \"name\": \"CustomizablePermissionless\"\n }\n ]\n }\n },\n {\n \"name\": \"PairStatus\",\n \"docs\": [\n \"Pair status. 0 = Enabled, 1 = Disabled. Putting 0 as enabled for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Enabled\"\n },\n {\n \"name\": \"Disabled\"\n }\n ]\n }\n }\n ],\n \"events\": [\n {\n \"name\": \"CompositionFee\",\n \"fields\": [\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binId\",\n \"type\": \"i16\",\n \"index\": false\n },\n {\n \"name\": \"tokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"tokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"AddLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"RemoveLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"Swap\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"startBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"endBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amountOut\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"swapForY\",\n \"type\": \"bool\",\n \"index\": false\n },\n {\n \"name\": \"fee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolFee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeBps\",\n \"type\": \"u128\",\n \"index\": false\n },\n {\n \"name\": \"hostFee\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"totalReward\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FundReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"InitializeReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardDuration\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardFunder\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionClose\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimFee\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"feeX\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeY\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"LbPairCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"tokenX\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"tokenY\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"protocolShare\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"DynamicFeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"filterPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"decayPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"reductionFactor\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"variableFeeControl\",\n \"type\": \"u32\",\n \"index\": false\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"type\": \"u32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"IncreaseObservation\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newObservationLength\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"WithdrawIneligibleReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionOperator\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"oldOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionLockReleasePoint\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"currentPoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"sender\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"GoToABin\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"InvalidStartBinIndex\",\n \"msg\": \"Invalid start bin index\"\n },\n {\n \"code\": 6001,\n \"name\": \"InvalidBinId\",\n \"msg\": \"Invalid bin id\"\n },\n {\n \"code\": 6002,\n \"name\": \"InvalidInput\",\n \"msg\": \"Invalid input data\"\n },\n {\n \"code\": 6003,\n \"name\": \"ExceededAmountSlippageTolerance\",\n \"msg\": \"Exceeded amount slippage tolerance\"\n },\n {\n \"code\": 6004,\n \"name\": \"ExceededBinSlippageTolerance\",\n \"msg\": \"Exceeded bin slippage tolerance\"\n },\n {\n \"code\": 6005,\n \"name\": \"CompositionFactorFlawed\",\n \"msg\": \"Composition factor flawed\"\n },\n {\n \"code\": 6006,\n \"name\": \"NonPresetBinStep\",\n \"msg\": \"Non preset bin step\"\n },\n {\n \"code\": 6007,\n \"name\": \"ZeroLiquidity\",\n \"msg\": \"Zero liquidity\"\n },\n {\n \"code\": 6008,\n \"name\": \"InvalidPosition\",\n \"msg\": \"Invalid position\"\n },\n {\n \"code\": 6009,\n \"name\": \"BinArrayNotFound\",\n \"msg\": \"Bin array not found\"\n },\n {\n \"code\": 6010,\n \"name\": \"InvalidTokenMint\",\n \"msg\": \"Invalid token mint\"\n },\n {\n \"code\": 6011,\n \"name\": \"InvalidAccountForSingleDeposit\",\n \"msg\": \"Invalid account for single deposit\"\n },\n {\n \"code\": 6012,\n \"name\": \"PairInsufficientLiquidity\",\n \"msg\": \"Pair insufficient liquidity\"\n },\n {\n \"code\": 6013,\n \"name\": \"InvalidFeeOwner\",\n \"msg\": \"Invalid fee owner\"\n },\n {\n \"code\": 6014,\n \"name\": \"InvalidFeeWithdrawAmount\",\n \"msg\": \"Invalid fee withdraw amount\"\n },\n {\n \"code\": 6015,\n \"name\": \"InvalidAdmin\",\n \"msg\": \"Invalid admin\"\n },\n {\n \"code\": 6016,\n \"name\": \"IdenticalFeeOwner\",\n \"msg\": \"Identical fee owner\"\n },\n {\n \"code\": 6017,\n \"name\": \"InvalidBps\",\n \"msg\": \"Invalid basis point\"\n },\n {\n \"code\": 6018,\n \"name\": \"MathOverflow\",\n \"msg\": \"Math operation overflow\"\n },\n {\n \"code\": 6019,\n \"name\": \"TypeCastFailed\",\n \"msg\": \"Type cast error\"\n },\n {\n \"code\": 6020,\n \"name\": \"InvalidRewardIndex\",\n \"msg\": \"Invalid reward index\"\n },\n {\n \"code\": 6021,\n \"name\": \"InvalidRewardDuration\",\n \"msg\": \"Invalid reward duration\"\n },\n {\n \"code\": 6022,\n \"name\": \"RewardInitialized\",\n \"msg\": \"Reward already initialized\"\n },\n {\n \"code\": 6023,\n \"name\": \"RewardUninitialized\",\n \"msg\": \"Reward not initialized\"\n },\n {\n \"code\": 6024,\n \"name\": \"IdenticalFunder\",\n \"msg\": \"Identical funder\"\n },\n {\n \"code\": 6025,\n \"name\": \"RewardCampaignInProgress\",\n \"msg\": \"Reward campaign in progress\"\n },\n {\n \"code\": 6026,\n \"name\": \"IdenticalRewardDuration\",\n \"msg\": \"Reward duration is the same\"\n },\n {\n \"code\": 6027,\n \"name\": \"InvalidBinArray\",\n \"msg\": \"Invalid bin array\"\n },\n {\n \"code\": 6028,\n \"name\": \"NonContinuousBinArrays\",\n \"msg\": \"Bin arrays must be continuous\"\n },\n {\n \"code\": 6029,\n \"name\": \"InvalidRewardVault\",\n \"msg\": \"Invalid reward vault\"\n },\n {\n \"code\": 6030,\n \"name\": \"NonEmptyPosition\",\n \"msg\": \"Position is not empty\"\n },\n {\n \"code\": 6031,\n \"name\": \"UnauthorizedAccess\",\n \"msg\": \"Unauthorized access\"\n },\n {\n \"code\": 6032,\n \"name\": \"InvalidFeeParameter\",\n \"msg\": \"Invalid fee parameter\"\n },\n {\n \"code\": 6033,\n \"name\": \"MissingOracle\",\n \"msg\": \"Missing oracle account\"\n },\n {\n \"code\": 6034,\n \"name\": \"InsufficientSample\",\n \"msg\": \"Insufficient observation sample\"\n },\n {\n \"code\": 6035,\n \"name\": \"InvalidLookupTimestamp\",\n \"msg\": \"Invalid lookup timestamp\"\n },\n {\n \"code\": 6036,\n \"name\": \"BitmapExtensionAccountIsNotProvided\",\n \"msg\": \"Bitmap extension account is not provided\"\n },\n {\n \"code\": 6037,\n \"name\": \"CannotFindNonZeroLiquidityBinArrayId\",\n \"msg\": \"Cannot find non-zero liquidity binArrayId\"\n },\n {\n \"code\": 6038,\n \"name\": \"BinIdOutOfBound\",\n \"msg\": \"Bin id out of bound\"\n },\n {\n \"code\": 6039,\n \"name\": \"InsufficientOutAmount\",\n \"msg\": \"Insufficient amount in for minimum out\"\n },\n {\n \"code\": 6040,\n \"name\": \"InvalidPositionWidth\",\n \"msg\": \"Invalid position width\"\n },\n {\n \"code\": 6041,\n \"name\": \"ExcessiveFeeUpdate\",\n \"msg\": \"Excessive fee update\"\n },\n {\n \"code\": 6042,\n \"name\": \"PoolDisabled\",\n \"msg\": \"Pool disabled\"\n },\n {\n \"code\": 6043,\n \"name\": \"InvalidPoolType\",\n \"msg\": \"Invalid pool type\"\n },\n {\n \"code\": 6044,\n \"name\": \"ExceedMaxWhitelist\",\n \"msg\": \"Whitelist for wallet is full\"\n },\n {\n \"code\": 6045,\n \"name\": \"InvalidIndex\",\n \"msg\": \"Invalid index\"\n },\n {\n \"code\": 6046,\n \"name\": \"RewardNotEnded\",\n \"msg\": \"Reward not ended\"\n },\n {\n \"code\": 6047,\n \"name\": \"MustWithdrawnIneligibleReward\",\n \"msg\": \"Must withdraw ineligible reward\"\n },\n {\n \"code\": 6048,\n \"name\": \"UnauthorizedAddress\",\n \"msg\": \"Unauthorized address\"\n },\n {\n \"code\": 6049,\n \"name\": \"OperatorsAreTheSame\",\n \"msg\": \"Cannot update because operators are the same\"\n },\n {\n \"code\": 6050,\n \"name\": \"WithdrawToWrongTokenAccount\",\n \"msg\": \"Withdraw to wrong token account\"\n },\n {\n \"code\": 6051,\n \"name\": \"WrongRentReceiver\",\n \"msg\": \"Wrong rent receiver\"\n },\n {\n \"code\": 6052,\n \"name\": \"AlreadyPassActivationPoint\",\n \"msg\": \"Already activated\"\n },\n {\n \"code\": 6053,\n \"name\": \"ExceedMaxSwappedAmount\",\n \"msg\": \"Swapped amount is exceeded max swapped amount\"\n },\n {\n \"code\": 6054,\n \"name\": \"InvalidStrategyParameters\",\n \"msg\": \"Invalid strategy parameters\"\n },\n {\n \"code\": 6055,\n \"name\": \"LiquidityLocked\",\n \"msg\": \"Liquidity locked\"\n },\n {\n \"code\": 6056,\n \"name\": \"BinRangeIsNotEmpty\",\n \"msg\": \"Bin range is not empty\"\n },\n {\n \"code\": 6057,\n \"name\": \"NotExactAmountOut\",\n \"msg\": \"Amount out is not matched with exact amount out\"\n },\n {\n \"code\": 6058,\n \"name\": \"InvalidActivationType\",\n \"msg\": \"Invalid activation type\"\n },\n {\n \"code\": 6059,\n \"name\": \"InvalidActivationDuration\",\n \"msg\": \"Invalid activation duration\"\n },\n {\n \"code\": 6060,\n \"name\": \"MissingTokenAmountAsTokenLaunchProof\",\n \"msg\": \"Missing token amount as token launch owner proof\"\n },\n {\n \"code\": 6061,\n \"name\": \"InvalidQuoteToken\",\n \"msg\": \"Quote token must be SOL or USDC\"\n },\n {\n \"code\": 6062,\n \"name\": \"InvalidBinStep\",\n \"msg\": \"Invalid bin step\"\n },\n {\n \"code\": 6063,\n \"name\": \"InvalidBaseFee\",\n \"msg\": \"Invalid base fee\"\n },\n {\n \"code\": 6064,\n \"name\": \"InvalidPreActivationDuration\",\n \"msg\": \"Invalid pre-activation duration\"\n },\n {\n \"code\": 6065,\n \"name\": \"AlreadyPassPreActivationSwapPoint\",\n \"msg\": \"Already pass pre-activation swap point\"\n },\n {\n \"code\": 6066,\n \"name\": \"InvalidStatus\",\n \"msg\": \"Invalid status\"\n },\n {\n \"code\": 6067,\n \"name\": \"ExceededMaxOracleLength\",\n \"msg\": \"Exceed max oracle length\"\n },\n {\n \"code\": 6068,\n \"name\": \"InvalidMinimumLiquidity\",\n \"msg\": \"Invalid minimum liquidity\"\n }\n ]\n};\n\nexport const IDL: LbClmm = {\n \"version\": \"0.8.6\",\n \"name\": \"lb_clmm\",\n \"constants\": [\n {\n \"name\": \"BASIS_POINT_MAX\",\n \"type\": \"i32\",\n \"value\": \"10000\"\n },\n {\n \"name\": \"MAX_BIN_PER_ARRAY\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MAX_BIN_PER_POSITION\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"70\"\n },\n {\n \"name\": \"MIN_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"- 443636\"\n },\n {\n \"name\": \"MAX_BIN_ID\",\n \"type\": \"i32\",\n \"value\": \"443636\"\n },\n {\n \"name\": \"MAX_FEE_RATE\",\n \"type\": \"u64\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"FEE_PRECISION\",\n \"type\": \"u64\",\n \"value\": \"1_000_000_000\"\n },\n {\n \"name\": \"MAX_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2_500\"\n },\n {\n \"name\": \"HOST_FEE_BPS\",\n \"type\": \"u16\",\n \"value\": \"2_000\"\n },\n {\n \"name\": \"NUM_REWARDS\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"2\"\n },\n {\n \"name\": \"MIN_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"1\"\n },\n {\n \"name\": \"MAX_REWARD_DURATION\",\n \"type\": \"u64\",\n \"value\": \"31536000\"\n },\n {\n \"name\": \"EXTENSION_BINARRAY_BITMAP_SIZE\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"12\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SIZE\",\n \"type\": \"i32\",\n \"value\": \"512\"\n },\n {\n \"name\": \"MAX_REWARD_BIN_SPLIT\",\n \"type\": {\n \"defined\": \"usize\"\n },\n \"value\": \"15\"\n },\n {\n \"name\": \"ILM_PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"2000\"\n },\n {\n \"name\": \"PROTOCOL_SHARE\",\n \"type\": \"u16\",\n \"value\": \"500\"\n },\n {\n \"name\": \"MAX_BIN_STEP\",\n \"type\": \"u16\",\n \"value\": \"400\"\n },\n {\n \"name\": \"MAX_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000_000\"\n },\n {\n \"name\": \"MIN_BASE_FEE\",\n \"type\": \"u128\",\n \"value\": \"100_000\"\n },\n {\n \"name\": \"MINIMUM_LIQUIDITY\",\n \"type\": \"u128\",\n \"value\": \"1_000_000\"\n },\n {\n \"name\": \"BIN_ARRAY\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 110, 95, 97, 114, 114, 97, 121]\"\n },\n {\n \"name\": \"ORACLE\",\n \"type\": \"bytes\",\n \"value\": \"[111, 114, 97, 99, 108, 101]\"\n },\n {\n \"name\": \"BIN_ARRAY_BITMAP_SEED\",\n \"type\": \"bytes\",\n \"value\": \"[98, 105, 116, 109, 97, 112]\"\n },\n {\n \"name\": \"PRESET_PARAMETER\",\n \"type\": \"bytes\",\n \"value\": \"[112, 114, 101, 115, 101, 116, 95, 112, 97, 114, 97, 109, 101, 116, 101, 114]\"\n },\n {\n \"name\": \"POSITION\",\n \"type\": \"bytes\",\n \"value\": \"[112, 111, 115, 105, 116, 105, 111, 110]\"\n }\n ],\n \"instructions\": [\n {\n \"name\": \"initializeLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"presetParameter\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"initializePermissionLbPair\",\n \"accounts\": [\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ixData\",\n \"type\": {\n \"defined\": \"InitPermissionPairIx\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeCustomizablePermissionlessLbPair\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"tokenMintX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMintY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": \"CustomizableParams\"\n }\n }\n ]\n },\n {\n \"name\": \"initializeBinArrayBitmapExtension\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"docs\": [\n \"Initialize an account to store if a bin array is initialized.\"\n ]\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"initializeBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n }\n ]\n },\n {\n \"name\": \"addLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByWeight\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByWeight\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategy\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategy\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityByStrategyOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityParameterByStrategyOneSide\"\n }\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSide\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"liquidityParameter\",\n \"type\": {\n \"defined\": \"LiquidityOneSideParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"removeLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binLiquidityRemoval\",\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityReduction\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initializePosition\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionPda\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"owner\"\n ]\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"initializePositionByOperator\",\n \"accounts\": [\n {\n \"name\": \"payer\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"base\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"operator\",\n \"isMut\": false,\n \"isSigner\": true,\n \"docs\": [\n \"operator\"\n ]\n },\n {\n \"name\": \"operatorTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"ownerTokenX\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lowerBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"width\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"feeOwner\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"updatePositionOperator\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"operator\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"swap\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"minAmountOut\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapExactOut\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"maxInAmount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"outAmount\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"swapWithPriceImpact\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenIn\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenOut\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"hostFeeIn\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"user\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"type\": {\n \"option\": \"i32\"\n }\n },\n {\n \"name\": \"maxPriceImpactBps\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"withdrawProtocolFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"receiverTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializeReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"fundReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"carryForward\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"updateRewardFunder\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"updateRewardDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"newDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claimFee\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"closePosition\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateBaseFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"BaseFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"updateDynamicFeeParameters\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"feeParameter\",\n \"type\": {\n \"defined\": \"DynamicFeeParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"increaseOracleLength\",\n \"accounts\": [\n {\n \"name\": \"oracle\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"lengthToAdd\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"initializePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rent\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"ix\",\n \"type\": {\n \"defined\": \"InitPresetParametersIx\"\n }\n }\n ]\n },\n {\n \"name\": \"closePresetParameter\",\n \"accounts\": [\n {\n \"name\": \"presetParameter\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"removeAllLiquidity\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"setPairStatus\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"migratePosition\",\n \"accounts\": [\n {\n \"name\": \"positionV2\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"positionV1\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": true,\n \"isSigner\": true\n },\n {\n \"name\": \"systemProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"rentReceiver\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"migrateBinArray\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"updateFeesAndRewards\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"owner\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"withdrawIneligibleReward\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardVault\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"rewardMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"funderTokenAccount\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"funder\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"binArray\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setActivationPoint\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"admin\",\n \"isMut\": true,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"activationPoint\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"removeLiquidityByRange\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userTokenX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"userTokenY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveX\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserveY\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenXMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenXProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenYProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n },\n {\n \"name\": \"addLiquidityOneSidePrecise\",\n \"accounts\": [\n {\n \"name\": \"position\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": true,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"userToken\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"reserve\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"tokenMint\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayLower\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayUpper\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"sender\",\n \"isMut\": false,\n \"isSigner\": true\n },\n {\n \"name\": \"tokenProgram\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"parameter\",\n \"type\": {\n \"defined\": \"AddLiquiditySingleSidePreciseParameter\"\n }\n }\n ]\n },\n {\n \"name\": \"goToABin\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"binArrayBitmapExtension\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"fromBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"toBinArray\",\n \"isMut\": false,\n \"isSigner\": false,\n \"isOptional\": true\n },\n {\n \"name\": \"eventAuthority\",\n \"isMut\": false,\n \"isSigner\": false\n },\n {\n \"name\": \"program\",\n \"isMut\": false,\n \"isSigner\": false\n }\n ],\n \"args\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationDuration\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationDuration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"setPreActivationSwapAddress\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"preActivationSwapAddress\",\n \"type\": \"publicKey\"\n }\n ]\n },\n {\n \"name\": \"setPairStatusPermissionless\",\n \"accounts\": [\n {\n \"name\": \"lbPair\",\n \"isMut\": true,\n \"isSigner\": false\n },\n {\n \"name\": \"creator\",\n \"isMut\": false,\n \"isSigner\": true\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"binArrayBitmapExtension\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"positiveBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is positive\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n },\n {\n \"name\": \"negativeBinArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state for start_bin_index is negative\"\n ],\n \"type\": {\n \"array\": [\n {\n \"array\": [\n \"u64\",\n 8\n ]\n },\n 12\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"binArray\",\n \"docs\": [\n \"An account to contain a range of bin. For example: Bin 100 <-> 200.\",\n \"For example:\",\n \"BinArray index: 0 contains bin 0 <-> 599\",\n \"index: 2 contains bin 600 <-> 1199, ...\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"index\",\n \"type\": \"i64\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"Version of binArray\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"bins\",\n \"type\": {\n \"array\": [\n {\n \"defined\": \"Bin\"\n },\n 70\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"lbPair\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"parameters\",\n \"type\": {\n \"defined\": \"StaticParameters\"\n }\n },\n {\n \"name\": \"vParameters\",\n \"type\": {\n \"defined\": \"VariableParameters\"\n }\n },\n {\n \"name\": \"bumpSeed\",\n \"type\": {\n \"array\": [\n \"u8\",\n 1\n ]\n }\n },\n {\n \"name\": \"binStepSeed\",\n \"docs\": [\n \"Bin step signer seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"pairType\",\n \"docs\": [\n \"Type of the pair\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"status\",\n \"docs\": [\n \"Status of the pair. Check PairStatus enum.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"requireBaseFactorSeed\",\n \"docs\": [\n \"Require base factor seed\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"baseFactorSeed\",\n \"docs\": [\n \"Base factor seed\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 2\n ]\n }\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Allow pool creator to enable/disable pool with restricted validation. Only applicable for customizable permissionless pair type.\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"tokenXMint\",\n \"docs\": [\n \"Token X mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"tokenYMint\",\n \"docs\": [\n \"Token Y mint\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveX\",\n \"docs\": [\n \"LB token X vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserveY\",\n \"docs\": [\n \"LB token Y vault\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"protocolFee\",\n \"docs\": [\n \"Uncollected protocol fee\"\n ],\n \"type\": {\n \"defined\": \"ProtocolFee\"\n }\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"_padding_1, previous Fee owner, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"RewardInfo\"\n },\n 2\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"docs\": [\n \"Oracle pubkey\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"binArrayBitmap\",\n \"docs\": [\n \"Packed initialized bin array state\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 16\n ]\n }\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last time the pool fee parameter was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding2\",\n \"docs\": [\n \"_padding_2, previous whitelisted_wallet, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"preActivationSwapAddress\",\n \"docs\": [\n \"Address allowed to swap when the current point is greater than or equal to the pre-activation point. The pre-activation point is calculated as `activation_point - pre_activation_duration`.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"baseKey\",\n \"docs\": [\n \"Base keypair. Only required for permission pair\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Time point to enable the pair. Only applicable for permission pair.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"preActivationDuration\",\n \"docs\": [\n \"Duration before activation activation_point. Used to calculate pre-activation time point for pre_activation_swap_address\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding3\",\n \"docs\": [\n \"_padding 3 is reclaimed free space from swap_cap_deactivate_point and swap_cap_amount before, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"padding4\",\n \"docs\": [\n \"_padding_4, previous lock_duration, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"creator\",\n \"docs\": [\n \"Pool creator\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 24\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"oracle\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"idx\",\n \"docs\": [\n \"Index of latest observation\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeSize\",\n \"docs\": [\n \"Size of active sample. Active sample is initialized observation.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"length\",\n \"docs\": [\n \"Number of observations\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"position\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 160\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"positionV2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"docs\": [\n \"The LB pair of this position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of the position. Client rely on this to to fetch their positions.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"liquidityShares\",\n \"docs\": [\n \"Liquidity shares of this position in bins (lower_bin_id <-> upper_bin_id). This is the same as LP concept.\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 70\n ]\n }\n },\n {\n \"name\": \"rewardInfos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"UserRewardInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"feeInfos\",\n \"docs\": [\n \"Swap fee to claim information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": \"FeeInfo\"\n },\n 70\n ]\n }\n },\n {\n \"name\": \"lowerBinId\",\n \"docs\": [\n \"Lower bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"upperBinId\",\n \"docs\": [\n \"Upper bin ID\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Last updated timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"totalClaimedFeeXAmount\",\n \"docs\": [\n \"Total claimed token fee X\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedFeeYAmount\",\n \"docs\": [\n \"Total claimed token fee Y\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"totalClaimedRewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n },\n {\n \"name\": \"operator\",\n \"docs\": [\n \"Operator of position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"lockReleasePoint\",\n \"docs\": [\n \"Time point which the locked liquidity can be withdraw\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding0\",\n \"docs\": [\n \"_padding_0, previous subjected_to_bootstrap_liquidity_locking, BE CAREFUL FOR TOMBSTONE WHEN REUSE !!\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"feeOwner\",\n \"docs\": [\n \"Address is able to claim fee in this position, only valid for bootstrap_liquidity_position\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"reserved\",\n \"docs\": [\n \"Reserved space for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 87\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"presetParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n }\n ],\n \"types\": [\n {\n \"name\": \"InitPresetParametersIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step. Represent the price increment / decrement.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor for base fee rate\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategyOneSide\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByStrategy\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyParameters\",\n \"docs\": [\n \"strategy parameters\"\n ],\n \"type\": {\n \"defined\": \"StrategyParameters\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"min bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"max bin id\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"strategyType\",\n \"docs\": [\n \"strategy type\"\n ],\n \"type\": {\n \"defined\": \"StrategyType\"\n }\n },\n {\n \"name\": \"parameteres\",\n \"docs\": [\n \"parameters\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 64\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityOneSideParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount\",\n \"docs\": [\n \"Amount of X token or Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistributionByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"weight\",\n \"docs\": [\n \"weight of liquidity distributed for this bin id\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameterByWeight\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Active bin that integrator observe off-chain\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxActiveBinSlippage\",\n \"docs\": [\n \"max active bin slippage allowed\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistributionByWeight\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"AddLiquiditySingleSidePreciseParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bins\",\n \"type\": {\n \"vec\": {\n \"defined\": \"CompressedBinDepositAmount\"\n }\n }\n },\n {\n \"name\": \"decompressMultiplier\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"CompressedBinDepositAmount\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityDistribution\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"docs\": [\n \"Define the bin ID wish to deposit to.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"distributionX\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"distributionY\",\n \"docs\": [\n \"DistributionX (or distributionY) is the percentages of amountX (or amountY) you want to add to each bin.\"\n ],\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"LiquidityParameter\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of X token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of Y token to deposit\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"binLiquidityDist\",\n \"docs\": [\n \"Liquidity distribution to each bins\"\n ],\n \"type\": {\n \"vec\": {\n \"defined\": \"BinLiquidityDistribution\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"CustomizableParams\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"docs\": [\n \"Pool price\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"docs\": [\n \"Bin step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Base factor\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"activationType\",\n \"docs\": [\n \"Activation type. 0 = Slot, 1 = Time. Check ActivationType enum\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"hasAlphaVault\",\n \"docs\": [\n \"Whether the pool has an alpha vault\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"activationPoint\",\n \"docs\": [\n \"Decide when does the pool start trade. None = Now\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"creatorPoolOnOffControl\",\n \"docs\": [\n \"Pool creator have permission to enable/disable pool with restricted program validation. Only applicable for customizable permissionless pool.\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding, for future use\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 63\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"InitPermissionPairIx\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"activeId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"minBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"activationType\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"BinLiquidityReduction\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"binId\",\n \"type\": \"i32\"\n },\n {\n \"name\": \"bpsToRemove\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"Bin\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"docs\": [\n \"Amount of token X in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"docs\": [\n \"Amount of token Y in the bin. This already excluded protocol fees.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"price\",\n \"docs\": [\n \"Bin price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquiditySupply\",\n \"docs\": [\n \"Liquidities of the bin. This is the same as LP mint supply. q-number\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"rewardPerTokenStored\",\n \"docs\": [\n \"reward_a_per_token_stored\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"feeAmountXPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token X per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeAmountYPerTokenStored\",\n \"docs\": [\n \"Swap fee amount of token Y per liquidity deposited.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountXIn\",\n \"docs\": [\n \"Total token X swap into the bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"amountYIn\",\n \"docs\": [\n \"Total token Y swap into he bin. Only used for tracking purpose.\"\n ],\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"ProtocolFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amountX\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amountY\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"RewardInfo\",\n \"docs\": [\n \"Stores the state relevant for tracking liquidity mining rewards\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"mint\",\n \"docs\": [\n \"Reward token mint.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"vault\",\n \"docs\": [\n \"Reward vault token account.\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"funder\",\n \"docs\": [\n \"Authority account that allows to fund rewards\"\n ],\n \"type\": \"publicKey\"\n },\n {\n \"name\": \"rewardDuration\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardDurationEnd\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"rewardRate\",\n \"docs\": [\n \"TODO check whether we need to store it in pool\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"lastUpdateTime\",\n \"docs\": [\n \"The last time reward states were updated.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"cumulativeSecondsWithEmptyLiquidityReward\",\n \"docs\": [\n \"Accumulated seconds where when farm distribute rewards, but the bin is empty. The reward will be accumulated for next reward time window.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Observation\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cumulativeActiveBinId\",\n \"docs\": [\n \"Cumulative active bin ID\"\n ],\n \"type\": \"i128\"\n },\n {\n \"name\": \"createdAt\",\n \"docs\": [\n \"Observation sample created timestamp\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"lastUpdatedAt\",\n \"docs\": [\n \"Observation sample last updated timestamp\"\n ],\n \"type\": \"i64\"\n }\n ]\n }\n },\n {\n \"name\": \"StaticParameters\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"baseFactor\",\n \"docs\": [\n \"Used for base fee calculation. base_fee_rate = base_factor * bin_step\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"filterPeriod\",\n \"docs\": [\n \"Filter period determine high frequency trading time window.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"decayPeriod\",\n \"docs\": [\n \"Decay period determine when the volatile fee start decay / decrease.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"reductionFactor\",\n \"docs\": [\n \"Reduction factor controls the volatile fee rate decrement rate.\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"variableFeeControl\",\n \"docs\": [\n \"Used to scale the variable fee component depending on the dynamic of the market\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"docs\": [\n \"Maximum number of bin crossed can be accumulated. Used to cap volatile fee rate.\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"minBinId\",\n \"docs\": [\n \"Min bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"maxBinId\",\n \"docs\": [\n \"Max bin id supported by the pool based on the configured bin step.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"protocolShare\",\n \"docs\": [\n \"Portion of swap fees retained by the protocol by controlling protocol_share parameter. protocol_swap_fee = protocol_share * total_swap_fee\"\n ],\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"VariableParameters\",\n \"docs\": [\n \"Parameters that changes based on dynamic of the market\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"volatilityAccumulator\",\n \"docs\": [\n \"Volatility accumulator measure the number of bin crossed since reference bin ID. Normally (without filter period taken into consideration), reference bin ID is the active bin of last swap.\",\n \"It affects the variable fee rate\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"volatilityReference\",\n \"docs\": [\n \"Volatility reference is decayed volatility accumulator. It is always <= volatility_accumulator\"\n ],\n \"type\": \"u32\"\n },\n {\n \"name\": \"indexReference\",\n \"docs\": [\n \"Active bin id of last swap.\"\n ],\n \"type\": \"i32\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 4\n ]\n }\n },\n {\n \"name\": \"lastUpdateTimestamp\",\n \"docs\": [\n \"Last timestamp the variable parameters was updated\"\n ],\n \"type\": \"i64\"\n },\n {\n \"name\": \"padding1\",\n \"docs\": [\n \"Padding for bytemuck safe alignment\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"FeeInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"feeXPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeYPerTokenComplete\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"feeXPending\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"feeYPending\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"UserRewardInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"rewardPerTokenCompletes\",\n \"type\": {\n \"array\": [\n \"u128\",\n 2\n ]\n }\n },\n {\n \"name\": \"rewardPendings\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"StrategyType\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"SpotOneSide\"\n },\n {\n \"name\": \"CurveOneSide\"\n },\n {\n \"name\": \"BidAskOneSide\"\n },\n {\n \"name\": \"SpotBalanced\"\n },\n {\n \"name\": \"CurveBalanced\"\n },\n {\n \"name\": \"BidAskBalanced\"\n },\n {\n \"name\": \"SpotImBalanced\"\n },\n {\n \"name\": \"CurveImBalanced\"\n },\n {\n \"name\": \"BidAskImBalanced\"\n }\n ]\n }\n },\n {\n \"name\": \"Rounding\",\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Up\"\n },\n {\n \"name\": \"Down\"\n }\n ]\n }\n },\n {\n \"name\": \"ActivationType\",\n \"docs\": [\n \"Type of the activation\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Slot\"\n },\n {\n \"name\": \"Timestamp\"\n }\n ]\n }\n },\n {\n \"name\": \"LayoutVersion\",\n \"docs\": [\n \"Layout version\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"V0\"\n },\n {\n \"name\": \"V1\"\n }\n ]\n }\n },\n {\n \"name\": \"PairType\",\n \"docs\": [\n \"Type of the Pair. 0 = Permissionless, 1 = Permission, 2 = CustomizablePermissionless. Putting 0 as permissionless for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Permissionless\"\n },\n {\n \"name\": \"Permission\"\n },\n {\n \"name\": \"CustomizablePermissionless\"\n }\n ]\n }\n },\n {\n \"name\": \"PairStatus\",\n \"docs\": [\n \"Pair status. 0 = Enabled, 1 = Disabled. Putting 0 as enabled for backward compatibility.\"\n ],\n \"type\": {\n \"kind\": \"enum\",\n \"variants\": [\n {\n \"name\": \"Enabled\"\n },\n {\n \"name\": \"Disabled\"\n }\n ]\n }\n }\n ],\n \"events\": [\n {\n \"name\": \"CompositionFee\",\n \"fields\": [\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binId\",\n \"type\": \"i16\",\n \"index\": false\n },\n {\n \"name\": \"tokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"tokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenXFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolTokenYFeeAmount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"AddLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"RemoveLiquidity\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amounts\",\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n },\n \"index\": false\n },\n {\n \"name\": \"activeBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"Swap\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"from\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"startBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"endBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"amountIn\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amountOut\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"swapForY\",\n \"type\": \"bool\",\n \"index\": false\n },\n {\n \"name\": \"fee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"protocolFee\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeBps\",\n \"type\": \"u128\",\n \"index\": false\n },\n {\n \"name\": \"hostFee\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"totalReward\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FundReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"InitializeReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"funder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"rewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardDuration\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newRewardDuration\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdateRewardFunder\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardIndex\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newFunder\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionClose\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"ClaimFee\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"feeX\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"feeY\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"LbPairCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"binStep\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"tokenX\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"tokenY\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"PositionCreate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"owner\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"FeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"protocolShare\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"baseFactor\",\n \"type\": \"u16\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"DynamicFeeParameterUpdate\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"filterPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"decayPeriod\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"reductionFactor\",\n \"type\": \"u16\",\n \"index\": false\n },\n {\n \"name\": \"variableFeeControl\",\n \"type\": \"u32\",\n \"index\": false\n },\n {\n \"name\": \"maxVolatilityAccumulator\",\n \"type\": \"u32\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"IncreaseObservation\",\n \"fields\": [\n {\n \"name\": \"oracle\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newObservationLength\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"WithdrawIneligibleReward\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"rewardMint\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionOperator\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"oldOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"newOperator\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"UpdatePositionLockReleasePoint\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"currentPoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"newLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"oldLockReleasePoint\",\n \"type\": \"u64\",\n \"index\": false\n },\n {\n \"name\": \"sender\",\n \"type\": \"publicKey\",\n \"index\": false\n }\n ]\n },\n {\n \"name\": \"GoToABin\",\n \"fields\": [\n {\n \"name\": \"lbPair\",\n \"type\": \"publicKey\",\n \"index\": false\n },\n {\n \"name\": \"fromBinId\",\n \"type\": \"i32\",\n \"index\": false\n },\n {\n \"name\": \"toBinId\",\n \"type\": \"i32\",\n \"index\": false\n }\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"InvalidStartBinIndex\",\n \"msg\": \"Invalid start bin index\"\n },\n {\n \"code\": 6001,\n \"name\": \"InvalidBinId\",\n \"msg\": \"Invalid bin id\"\n },\n {\n \"code\": 6002,\n \"name\": \"InvalidInput\",\n \"msg\": \"Invalid input data\"\n },\n {\n \"code\": 6003,\n \"name\": \"ExceededAmountSlippageTolerance\",\n \"msg\": \"Exceeded amount slippage tolerance\"\n },\n {\n \"code\": 6004,\n \"name\": \"ExceededBinSlippageTolerance\",\n \"msg\": \"Exceeded bin slippage tolerance\"\n },\n {\n \"code\": 6005,\n \"name\": \"CompositionFactorFlawed\",\n \"msg\": \"Composition factor flawed\"\n },\n {\n \"code\": 6006,\n \"name\": \"NonPresetBinStep\",\n \"msg\": \"Non preset bin step\"\n },\n {\n \"code\": 6007,\n \"name\": \"ZeroLiquidity\",\n \"msg\": \"Zero liquidity\"\n },\n {\n \"code\": 6008,\n \"name\": \"InvalidPosition\",\n \"msg\": \"Invalid position\"\n },\n {\n \"code\": 6009,\n \"name\": \"BinArrayNotFound\",\n \"msg\": \"Bin array not found\"\n },\n {\n \"code\": 6010,\n \"name\": \"InvalidTokenMint\",\n \"msg\": \"Invalid token mint\"\n },\n {\n \"code\": 6011,\n \"name\": \"InvalidAccountForSingleDeposit\",\n \"msg\": \"Invalid account for single deposit\"\n },\n {\n \"code\": 6012,\n \"name\": \"PairInsufficientLiquidity\",\n \"msg\": \"Pair insufficient liquidity\"\n },\n {\n \"code\": 6013,\n \"name\": \"InvalidFeeOwner\",\n \"msg\": \"Invalid fee owner\"\n },\n {\n \"code\": 6014,\n \"name\": \"InvalidFeeWithdrawAmount\",\n \"msg\": \"Invalid fee withdraw amount\"\n },\n {\n \"code\": 6015,\n \"name\": \"InvalidAdmin\",\n \"msg\": \"Invalid admin\"\n },\n {\n \"code\": 6016,\n \"name\": \"IdenticalFeeOwner\",\n \"msg\": \"Identical fee owner\"\n },\n {\n \"code\": 6017,\n \"name\": \"InvalidBps\",\n \"msg\": \"Invalid basis point\"\n },\n {\n \"code\": 6018,\n \"name\": \"MathOverflow\",\n \"msg\": \"Math operation overflow\"\n },\n {\n \"code\": 6019,\n \"name\": \"TypeCastFailed\",\n \"msg\": \"Type cast error\"\n },\n {\n \"code\": 6020,\n \"name\": \"InvalidRewardIndex\",\n \"msg\": \"Invalid reward index\"\n },\n {\n \"code\": 6021,\n \"name\": \"InvalidRewardDuration\",\n \"msg\": \"Invalid reward duration\"\n },\n {\n \"code\": 6022,\n \"name\": \"RewardInitialized\",\n \"msg\": \"Reward already initialized\"\n },\n {\n \"code\": 6023,\n \"name\": \"RewardUninitialized\",\n \"msg\": \"Reward not initialized\"\n },\n {\n \"code\": 6024,\n \"name\": \"IdenticalFunder\",\n \"msg\": \"Identical funder\"\n },\n {\n \"code\": 6025,\n \"name\": \"RewardCampaignInProgress\",\n \"msg\": \"Reward campaign in progress\"\n },\n {\n \"code\": 6026,\n \"name\": \"IdenticalRewardDuration\",\n \"msg\": \"Reward duration is the same\"\n },\n {\n \"code\": 6027,\n \"name\": \"InvalidBinArray\",\n \"msg\": \"Invalid bin array\"\n },\n {\n \"code\": 6028,\n \"name\": \"NonContinuousBinArrays\",\n \"msg\": \"Bin arrays must be continuous\"\n },\n {\n \"code\": 6029,\n \"name\": \"InvalidRewardVault\",\n \"msg\": \"Invalid reward vault\"\n },\n {\n \"code\": 6030,\n \"name\": \"NonEmptyPosition\",\n \"msg\": \"Position is not empty\"\n },\n {\n \"code\": 6031,\n \"name\": \"UnauthorizedAccess\",\n \"msg\": \"Unauthorized access\"\n },\n {\n \"code\": 6032,\n \"name\": \"InvalidFeeParameter\",\n \"msg\": \"Invalid fee parameter\"\n },\n {\n \"code\": 6033,\n \"name\": \"MissingOracle\",\n \"msg\": \"Missing oracle account\"\n },\n {\n \"code\": 6034,\n \"name\": \"InsufficientSample\",\n \"msg\": \"Insufficient observation sample\"\n },\n {\n \"code\": 6035,\n \"name\": \"InvalidLookupTimestamp\",\n \"msg\": \"Invalid lookup timestamp\"\n },\n {\n \"code\": 6036,\n \"name\": \"BitmapExtensionAccountIsNotProvided\",\n \"msg\": \"Bitmap extension account is not provided\"\n },\n {\n \"code\": 6037,\n \"name\": \"CannotFindNonZeroLiquidityBinArrayId\",\n \"msg\": \"Cannot find non-zero liquidity binArrayId\"\n },\n {\n \"code\": 6038,\n \"name\": \"BinIdOutOfBound\",\n \"msg\": \"Bin id out of bound\"\n },\n {\n \"code\": 6039,\n \"name\": \"InsufficientOutAmount\",\n \"msg\": \"Insufficient amount in for minimum out\"\n },\n {\n \"code\": 6040,\n \"name\": \"InvalidPositionWidth\",\n \"msg\": \"Invalid position width\"\n },\n {\n \"code\": 6041,\n \"name\": \"ExcessiveFeeUpdate\",\n \"msg\": \"Excessive fee update\"\n },\n {\n \"code\": 6042,\n \"name\": \"PoolDisabled\",\n \"msg\": \"Pool disabled\"\n },\n {\n \"code\": 6043,\n \"name\": \"InvalidPoolType\",\n \"msg\": \"Invalid pool type\"\n },\n {\n \"code\": 6044,\n \"name\": \"ExceedMaxWhitelist\",\n \"msg\": \"Whitelist for wallet is full\"\n },\n {\n \"code\": 6045,\n \"name\": \"InvalidIndex\",\n \"msg\": \"Invalid index\"\n },\n {\n \"code\": 6046,\n \"name\": \"RewardNotEnded\",\n \"msg\": \"Reward not ended\"\n },\n {\n \"code\": 6047,\n \"name\": \"MustWithdrawnIneligibleReward\",\n \"msg\": \"Must withdraw ineligible reward\"\n },\n {\n \"code\": 6048,\n \"name\": \"UnauthorizedAddress\",\n \"msg\": \"Unauthorized address\"\n },\n {\n \"code\": 6049,\n \"name\": \"OperatorsAreTheSame\",\n \"msg\": \"Cannot update because operators are the same\"\n },\n {\n \"code\": 6050,\n \"name\": \"WithdrawToWrongTokenAccount\",\n \"msg\": \"Withdraw to wrong token account\"\n },\n {\n \"code\": 6051,\n \"name\": \"WrongRentReceiver\",\n \"msg\": \"Wrong rent receiver\"\n },\n {\n \"code\": 6052,\n \"name\": \"AlreadyPassActivationPoint\",\n \"msg\": \"Already activated\"\n },\n {\n \"code\": 6053,\n \"name\": \"ExceedMaxSwappedAmount\",\n \"msg\": \"Swapped amount is exceeded max swapped amount\"\n },\n {\n \"code\": 6054,\n \"name\": \"InvalidStrategyParameters\",\n \"msg\": \"Invalid strategy parameters\"\n },\n {\n \"code\": 6055,\n \"name\": \"LiquidityLocked\",\n \"msg\": \"Liquidity locked\"\n },\n {\n \"code\": 6056,\n \"name\": \"BinRangeIsNotEmpty\",\n \"msg\": \"Bin range is not empty\"\n },\n {\n \"code\": 6057,\n \"name\": \"NotExactAmountOut\",\n \"msg\": \"Amount out is not matched with exact amount out\"\n },\n {\n \"code\": 6058,\n \"name\": \"InvalidActivationType\",\n \"msg\": \"Invalid activation type\"\n },\n {\n \"code\": 6059,\n \"name\": \"InvalidActivationDuration\",\n \"msg\": \"Invalid activation duration\"\n },\n {\n \"code\": 6060,\n \"name\": \"MissingTokenAmountAsTokenLaunchProof\",\n \"msg\": \"Missing token amount as token launch owner proof\"\n },\n {\n \"code\": 6061,\n \"name\": \"InvalidQuoteToken\",\n \"msg\": \"Quote token must be SOL or USDC\"\n },\n {\n \"code\": 6062,\n \"name\": \"InvalidBinStep\",\n \"msg\": \"Invalid bin step\"\n },\n {\n \"code\": 6063,\n \"name\": \"InvalidBaseFee\",\n \"msg\": \"Invalid base fee\"\n },\n {\n \"code\": 6064,\n \"name\": \"InvalidPreActivationDuration\",\n \"msg\": \"Invalid pre-activation duration\"\n },\n {\n \"code\": 6065,\n \"name\": \"AlreadyPassPreActivationSwapPoint\",\n \"msg\": \"Already pass pre-activation swap point\"\n },\n {\n \"code\": 6066,\n \"name\": \"InvalidStatus\",\n \"msg\": \"Invalid status\"\n },\n {\n \"code\": 6067,\n \"name\": \"ExceededMaxOracleLength\",\n \"msg\": \"Exceed max oracle length\"\n },\n {\n \"code\": 6068,\n \"name\": \"InvalidMinimumLiquidity\",\n \"msg\": \"Invalid minimum liquidity\"\n }\n ]\n};\n","import { IDL } from \"./idl\";\nimport { AnchorError, ProgramError } from \"@coral-xyz/anchor\";\nimport { LBCLMM_PROGRAM_IDS } from \"./constants\";\n\ntype Codes = (typeof IDL.errors)[number][\"code\"];\n\n// ProgramError error parser\nexport class DLMMError extends Error {\n public errorCode: number;\n public errorName: string;\n public errorMessage: string;\n\n constructor(error: object | Codes) {\n let _errorCode = 0;\n let _errorName = \"Something went wrong\";\n let _errorMessage = \"Something went wrong\";\n\n if (error instanceof Error) {\n const anchorError = AnchorError.parse(\n JSON.parse(JSON.stringify(error)).logs as string[]\n );\n\n if (\n anchorError?.program.toBase58() === LBCLMM_PROGRAM_IDS[\"mainnet-beta\"]\n ) {\n _errorCode = anchorError.error.errorCode.number;\n _errorName = anchorError.error.errorCode.code;\n _errorMessage = anchorError.error.errorMessage;\n }\n } else {\n const idlError = IDL.errors.find((err) => err.code === error);\n\n if (idlError) {\n _errorCode = idlError.code;\n _errorName = idlError.name;\n _errorMessage = idlError.msg;\n }\n }\n\n super(_errorMessage);\n\n this.errorCode = _errorCode;\n this.errorName = _errorName;\n this.errorMessage = _errorMessage;\n }\n}\n\n// SDK error\ntype ErrorName = \"SWAP_QUOTE_INSUFFICIENT_LIQUIDITY\" | \"INVALID_MAX_EXTRA_BIN_ARRAYS\";\n\nexport class DlmmSdkError extends Error {\n name: ErrorName;\n message: string;\n\n constructor(name: ErrorName, message: string) {\n super();\n this.name = name;\n this.message = message;\n }\n}\n","import { BN, EventParser } from \"@coral-xyz/anchor\";\nimport {\n NATIVE_MINT,\n TOKEN_PROGRAM_ID,\n TokenAccountNotFoundError,\n TokenInvalidAccountOwnerError,\n createAssociatedTokenAccountIdempotentInstruction,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n getAccount,\n getAssociatedTokenAddressSync,\n getMint,\n} from \"@solana/spl-token\";\nimport { SCALE_OFFSET } from \"../constants\";\nimport {\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { Bin, ClmmProgram, GetOrCreateATAResponse } from \"../types\";\nimport { Rounding, mulShr, shlDiv } from \"./math\";\nimport { getSimulationComputeUnits, MAX_CU_BUFFER, MIN_CU_BUFFER } from \"./computeUnit\";\n\nexport * from \"./derive\";\nexport * from \"./binArray\";\nexport * from \"./weight\";\nexport * from \"./fee\";\nexport * from \"./weightToAmounts\";\nexport * from \"./strategy\";\nexport * from \"./lbPair\";\n\nexport function chunks<T>(array: T[], size: number): T[][] {\n return Array.apply(0, new Array(Math.ceil(array.length / size))).map(\n (_, index) => array.slice(index * size, (index + 1) * size)\n );\n}\n\nexport function range<T>(\n min: number,\n max: number,\n mapfn: (i: number) => T\n) {\n const length = max - min + 1;\n return Array.from({ length }, (_, i) => mapfn(min + i));\n}\n\nexport async function chunkedFetchMultiplePoolAccount(\n program: ClmmProgram,\n pks: PublicKey[],\n chunkSize: number = 100\n) {\n const accounts = (\n await Promise.all(\n chunks(pks, chunkSize).map((chunk) =>\n program.account.lbPair.fetchMultiple(chunk)\n )\n )\n ).flat();\n\n return accounts.filter(Boolean);\n}\n\nexport async function chunkedFetchMultipleBinArrayBitmapExtensionAccount(\n program: ClmmProgram,\n pks: PublicKey[],\n chunkSize: number = 100\n) {\n const accounts = (\n await Promise.all(\n chunks(pks, chunkSize).map((chunk) =>\n program.account.binArrayBitmapExtension.fetchMultiple(chunk)\n )\n )\n ).flat();\n\n return accounts;\n}\n\nexport function getOutAmount(bin: Bin, inAmount: BN, swapForY: boolean) {\n return swapForY\n ? mulShr(inAmount, bin.price, SCALE_OFFSET, Rounding.Down)\n : shlDiv(inAmount, bin.price, SCALE_OFFSET, Rounding.Down);\n}\n\nexport async function getTokenDecimals(conn: Connection, mint: PublicKey) {\n const token = await getMint(conn, mint);\n return await token.decimals;\n}\n\nexport const getOrCreateATAInstruction = async (\n connection: Connection,\n tokenMint: PublicKey,\n owner: PublicKey,\n payer: PublicKey = owner,\n allowOwnerOffCurve = true\n): Promise<GetOrCreateATAResponse> => {\n const toAccount = getAssociatedTokenAddressSync(\n tokenMint,\n owner,\n allowOwnerOffCurve\n );\n\n try {\n await getAccount(connection, toAccount);\n\n return { ataPubKey: toAccount, ix: undefined };\n } catch (e) {\n if (\n e instanceof TokenAccountNotFoundError ||\n e instanceof TokenInvalidAccountOwnerError\n ) {\n const ix = createAssociatedTokenAccountIdempotentInstruction(\n payer,\n toAccount,\n owner,\n tokenMint\n );\n\n return { ataPubKey: toAccount, ix };\n } else {\n /* handle error */\n console.error(\"Error::getOrCreateATAInstruction\", e);\n throw e;\n }\n }\n};\n\nexport async function getTokenBalance(\n conn: Connection,\n tokenAccount: PublicKey\n): Promise<bigint> {\n const acc = await getAccount(conn, tokenAccount);\n return acc.amount;\n}\n\nexport const parseLogs = <T>(eventParser: EventParser, logs: string[]) => {\n if (!logs.length) throw new Error(\"No logs found\");\n\n for (const event of eventParser?.parseLogs(logs)) {\n return event.data as T;\n }\n\n throw new Error(\"No events found\");\n};\n\nexport const wrapSOLInstruction = (\n from: PublicKey,\n to: PublicKey,\n amount: bigint\n): TransactionInstruction[] => {\n return [\n SystemProgram.transfer({\n fromPubkey: from,\n toPubkey: to,\n lamports: amount,\n }),\n new TransactionInstruction({\n keys: [\n {\n pubkey: to,\n isSigner: false,\n isWritable: true,\n },\n ],\n data: Buffer.from(new Uint8Array([17])),\n programId: TOKEN_PROGRAM_ID,\n }),\n ];\n};\n\nexport const unwrapSOLInstruction = async (\n owner: PublicKey,\n allowOwnerOffCurve = true\n) => {\n const wSolATAAccount = getAssociatedTokenAddressSync(\n NATIVE_MINT,\n owner,\n allowOwnerOffCurve\n );\n if (wSolATAAccount) {\n const closedWrappedSolInstruction = createCloseAccountInstruction(\n wSolATAAccount,\n owner,\n owner,\n [],\n TOKEN_PROGRAM_ID\n );\n return closedWrappedSolInstruction;\n }\n return null;\n};\n\nexport async function chunkedGetMultipleAccountInfos(\n connection: Connection,\n pks: PublicKey[],\n chunkSize: number = 100\n) {\n const accountInfos = (\n await Promise.all(\n chunks(pks, chunkSize).map((chunk) =>\n connection.getMultipleAccountsInfo(chunk)\n )\n )\n ).flat();\n\n return accountInfos;\n}\n\n/**\n * Gets the estimated compute unit usage with a buffer.\n * @param connection A Solana connection object.\n * @param instructions The instructions of the transaction to simulate.\n * @param feePayer The public key of the fee payer.\n * @param buffer The buffer to add to the estimated compute unit usage. Max value is 1. Default value is 0.1 if not provided, and will be capped between 50k - 200k.\n * @returns The estimated compute unit usage with the buffer.\n */\nexport const getEstimatedComputeUnitUsageWithBuffer = async (\n connection: Connection,\n instructions: TransactionInstruction[],\n feePayer: PublicKey,\n buffer?: number\n) => {\n if (!buffer) {\n buffer = 0.1;\n }\n // Avoid negative value\n buffer = Math.max(0, buffer);\n // Limit buffer to 1\n buffer = Math.min(1, buffer);\n\n const estimatedComputeUnitUsage = await getSimulationComputeUnits(\n connection,\n instructions,\n feePayer,\n []\n );\n\n let extraComputeUnitBuffer = estimatedComputeUnitUsage * buffer;\n if (extraComputeUnitBuffer > MAX_CU_BUFFER) {\n extraComputeUnitBuffer = MAX_CU_BUFFER;\n } else if (extraComputeUnitBuffer < MIN_CU_BUFFER) {\n extraComputeUnitBuffer = MIN_CU_BUFFER;\n }\n\n return estimatedComputeUnitUsage + extraComputeUnitBuffer;\n};\n\n/**\n * Gets the estimated compute unit usage with a buffer and converts it to a SetComputeUnitLimit instruction.\n * If the estimated compute unit usage cannot be retrieved, returns a SetComputeUnitLimit instruction with the fallback unit.\n * @param connection A Solana connection object.\n * @param instructions The instructions of the transaction to simulate.\n * @param feePayer The public key of the fee payer.\n * @param buffer The buffer to add to the estimated compute unit usage. Max value is 1. Default value is 0.1 if not provided, and will be capped between 50k - 200k.\n * @returns A SetComputeUnitLimit instruction with the estimated compute unit usage.\n */\nexport const getEstimatedComputeUnitIxWithBuffer = async (\n connection: Connection,\n instructions: TransactionInstruction[],\n feePayer: PublicKey,\n buffer?: number\n) => {\n const units = await getEstimatedComputeUnitUsageWithBuffer(\n connection,\n instructions,\n feePayer,\n buffer\n ).catch((error) => {\n console.error(\"Error::getEstimatedComputeUnitUsageWithBuffer\", error);\n return 1_400_000;\n });\n\n return ComputeBudgetProgram.setComputeUnitLimit({ units });\n};\n","import { BN } from \"@coral-xyz/anchor\";\nimport {\n BASIS_POINT_MAX,\n MAX_BIN_PER_POSITION,\n SCALE_OFFSET,\n} from \"../constants\";\nimport Decimal from \"decimal.js\";\nimport { ONE, pow } from \"./u64xu64_math\";\nimport { DLMM } from \"..\";\nimport { getPriceOfBinByBinId } from \"./weight\";\n\nexport enum Rounding {\n Up,\n Down,\n}\n\nexport function mulShr(x: BN, y: BN, offset: number, rounding: Rounding) {\n const denominator = new BN(1).shln(offset);\n return mulDiv(x, y, denominator, rounding);\n}\n\nexport function shlDiv(x: BN, y: BN, offset: number, rounding: Rounding) {\n const scale = new BN(1).shln(offset);\n return mulDiv(x, scale, y, rounding);\n}\n\nexport function mulDiv(x: BN, y: BN, denominator: BN, rounding: Rounding) {\n const { div, mod } = x.mul(y).divmod(denominator);\n\n if (rounding == Rounding.Up && !mod.isZero()) {\n return div.add(new BN(1));\n }\n return div;\n}\n\nexport function computeBaseFactorFromFeeBps(binStep: BN, feeBps: BN) {\n const U16_MAX = 65535;\n const computedBaseFactor =\n (feeBps.toNumber() * BASIS_POINT_MAX) / binStep.toNumber();\n\n // Sanity check\n const computedBaseFactorFloor = Math.floor(computedBaseFactor);\n if (computedBaseFactor != computedBaseFactorFloor) {\n if (computedBaseFactorFloor >= U16_MAX) {\n throw \"base factor for the give fee bps overflow u16\";\n }\n\n if (computedBaseFactorFloor == 0) {\n throw \"base factor for the give fee bps underflow\";\n }\n\n if (computedBaseFactor % 1 != 0) {\n throw \"couldn't compute base factor for the exact fee bps\";\n }\n }\n\n return new BN(computedBaseFactor);\n}\n\nexport function getQPriceFromId(binId: BN, binStep: BN): BN {\n const bps = binStep.shln(SCALE_OFFSET).div(new BN(BASIS_POINT_MAX));\n const base = ONE.add(bps);\n return pow(base, binId);\n}\n\nexport function findSwappableMinMaxBinId(binStep: BN) {\n const base = 1 + binStep.toNumber() / BASIS_POINT_MAX;\n const maxQPriceSupported = new Decimal(\"18446744073709551615\");\n const n = maxQPriceSupported.log(10).div(new Decimal(base).log(10)).floor();\n\n let minBinId = new BN(n.neg().toString());\n let maxBinId = new BN(n.toString());\n\n let minQPrice = new BN(1);\n let maxQPrice = new BN(\"340282366920938463463374607431768211455\");\n\n while (true) {\n const qPrice = getQPriceFromId(minBinId, binStep);\n if (qPrice.gt(minQPrice) && !qPrice.isZero()) {\n break;\n } else {\n minBinId = minBinId.add(new BN(1));\n }\n }\n\n while (true) {\n const qPrice = getQPriceFromId(maxBinId, binStep);\n if (qPrice.lt(maxQPrice) && !qPrice.isZero()) {\n break;\n } else {\n maxBinId = maxBinId.sub(new BN(1));\n }\n }\n\n return {\n minBinId,\n maxBinId,\n };\n}\n\nexport function getC(\n amount: BN,\n binStep: number,\n binId: BN,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n minPrice: Decimal,\n maxPrice: Decimal,\n k: number\n) {\n const currentPricePerLamport = new Decimal(1 + binStep / 10000).pow(\n binId.toNumber()\n );\n const currentPricePerToken = currentPricePerLamport.mul(\n new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal))\n );\n const priceRange = maxPrice.sub(minPrice);\n const currentPriceDeltaFromMin = currentPricePerToken.sub(\n new Decimal(minPrice)\n );\n\n const c = new Decimal(amount.toString()).mul(\n currentPriceDeltaFromMin.div(priceRange).pow(k)\n );\n\n return c.floor();\n}\n\nexport function distributeAmountToCompressedBinsByRatio(\n compressedBinAmount: Map<number, BN>,\n uncompressedAmount: BN,\n multiplier: BN,\n binCapAmount: BN\n) {\n const newCompressedBinAmount = new Map<number, BN>();\n let totalCompressedAmount = new BN(0);\n\n for (const compressedAmount of compressedBinAmount.values()) {\n totalCompressedAmount = totalCompressedAmount.add(compressedAmount);\n }\n\n let totalDepositedAmount = new BN(0);\n\n for (const [binId, compressedAmount] of compressedBinAmount.entries()) {\n const depositAmount = compressedAmount\n .mul(uncompressedAmount)\n .div(totalCompressedAmount);\n\n let compressedDepositAmount = depositAmount.div(multiplier);\n\n let newCompressedAmount = compressedAmount.add(compressedDepositAmount);\n if (newCompressedAmount.gt(binCapAmount)) {\n compressedDepositAmount = compressedDepositAmount.sub(\n newCompressedAmount.sub(binCapAmount)\n );\n newCompressedAmount = binCapAmount;\n }\n newCompressedBinAmount.set(binId, newCompressedAmount);\n\n totalDepositedAmount = totalDepositedAmount.add(\n compressedDepositAmount.mul(multiplier)\n );\n }\n\n const loss = uncompressedAmount.sub(totalDepositedAmount);\n\n return {\n newCompressedBinAmount,\n loss,\n };\n}\n\nexport function getPositionCount(minBinId: BN, maxBinId: BN) {\n const binDelta = maxBinId.sub(minBinId);\n const positionCount = binDelta.div(MAX_BIN_PER_POSITION);\n return positionCount.add(new BN(1));\n}\n\nexport function compressBinAmount(binAmount: Map<number, BN>, multiplier: BN) {\n const compressedBinAmount = new Map<number, BN>();\n\n let totalAmount = new BN(0);\n let compressionLoss = new BN(0);\n\n for (const [binId, amount] of binAmount) {\n totalAmount = totalAmount.add(amount);\n const compressedAmount = amount.div(multiplier);\n\n compressedBinAmount.set(binId, compressedAmount);\n let loss = amount.sub(compressedAmount.mul(multiplier));\n compressionLoss = compressionLoss.add(loss);\n }\n\n return {\n compressedBinAmount,\n compressionLoss,\n };\n}\n\nexport function generateAmountForBinRange(\n amount: BN,\n binStep: number,\n tokenXDecimal: number,\n tokenYDecimal: number,\n minBinId: BN,\n maxBinId: BN,\n k: number\n) {\n const toTokenMultiplier = new Decimal(10 ** (tokenXDecimal - tokenYDecimal));\n const minPrice = getPriceOfBinByBinId(minBinId.toNumber(), binStep).mul(\n toTokenMultiplier\n );\n const maxPrice = getPriceOfBinByBinId(maxBinId.toNumber(), binStep).mul(\n toTokenMultiplier\n );\n const binAmounts = new Map<number, BN>();\n\n for (let i = minBinId.toNumber(); i < maxBinId.toNumber(); i++) {\n const binAmount = generateBinAmount(\n amount,\n binStep,\n new BN(i),\n tokenXDecimal,\n tokenYDecimal,\n minPrice,\n maxPrice,\n k\n );\n\n binAmounts.set(i, binAmount);\n }\n\n return binAmounts;\n}\n\nexport function generateBinAmount(\n amount: BN,\n binStep: number,\n binId: BN,\n tokenXDecimal: number,\n tokenYDecimal: number,\n minPrice: Decimal,\n maxPrice: Decimal,\n k: number\n) {\n const c1 = getC(\n amount,\n binStep,\n binId.add(new BN(1)),\n tokenXDecimal,\n tokenYDecimal,\n minPrice,\n maxPrice,\n k\n );\n\n const c0 = getC(\n amount,\n binStep,\n binId,\n tokenXDecimal,\n tokenYDecimal,\n minPrice,\n maxPrice,\n k\n );\n\n return new BN(c1.sub(c0).floor().toString());\n}\n","import BN from \"bn.js\";\nimport { SCALE_OFFSET } from \"../constants\";\n\nconst MAX_EXPONENTIAL = new BN(0x80000);\n\nexport const ONE = new BN(1).shln(SCALE_OFFSET);\nconst MAX = new BN(2).pow(new BN(128)).sub(new BN(1));\n\nexport function pow(base: BN, exp: BN): BN {\n let invert = exp.isNeg();\n\n if (exp.isZero()) {\n return ONE;\n }\n\n exp = invert ? exp.abs() : exp;\n\n if (exp.gt(MAX_EXPONENTIAL)) {\n return new BN(0);\n }\n\n let squaredBase = base;\n let result = ONE;\n\n if (squaredBase.gte(result)) {\n squaredBase = MAX.div(squaredBase);\n invert = !invert;\n }\n\n if (!exp.and(new BN(0x1)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x2)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x4)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x8)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x10)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x20)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x40)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x80)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x100)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x200)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x400)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x800)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x1000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x2000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x4000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x8000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x10000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x20000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n squaredBase = squaredBase.mul(squaredBase).shrn(SCALE_OFFSET);\n\n if (!exp.and(new BN(0x40000)).isZero()) {\n result = result.mul(squaredBase).shrn(SCALE_OFFSET);\n }\n\n if (result.isZero()) {\n return new BN(0);\n }\n\n if (invert) {\n result = MAX.div(result);\n }\n\n return result;\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport gaussian, { Gaussian } from \"gaussian\";\nimport { BASIS_POINT_MAX } from \"../constants\";\nimport Decimal from \"decimal.js\";\nimport { toAmountAskSide, toAmountBidSide, toAmountBothSide } from \"./weightToAmounts\";\n\nexport function getPriceOfBinByBinId(binId: number, binStep: number): Decimal {\n const binStepNum = new Decimal(binStep).div(new Decimal(BASIS_POINT_MAX));\n return new Decimal(1).add(new Decimal(binStepNum)).pow(new Decimal(binId));\n}\n\n/// Build a gaussian distribution from the bins, with active bin as the mean.\nfunction buildGaussianFromBins(activeBin: number, binIds: number[]) {\n const smallestBin = Math.min(...binIds);\n const largestBin = Math.max(...binIds);\n\n // Define the Gaussian distribution. The mean will be active bin when active bin is within the bin ids. Else, use left or right most bin id as the mean.\n let mean = 0;\n const isAroundActiveBin = binIds.find((bid) => bid == activeBin);\n // The liquidity will be distributed surrounding active bin\n if (isAroundActiveBin) {\n mean = activeBin;\n }\n // The liquidity will be distributed to the right side of the active bin.\n else if (activeBin < smallestBin) {\n mean = smallestBin;\n }\n // The liquidity will be distributed to the left side of the active bin.\n else {\n mean = largestBin;\n }\n\n const TWO_STANDARD_DEVIATION = 4;\n const stdDev = (largestBin - smallestBin) / TWO_STANDARD_DEVIATION;\n const variance = Math.max(stdDev ** 2, 1);\n\n return gaussian(mean, variance);\n}\n\n/// Find the probability of the bin id over the gaussian. The probability ranged from 0 - 1 and will be used as liquidity allocation for that particular bin.\nfunction generateBinLiquidityAllocation(\n gaussian: Gaussian,\n binIds: number[],\n invert: boolean\n) {\n const allocations = binIds.map((bid) =>\n invert ? 1 / gaussian.pdf(bid) : gaussian.pdf(bid)\n );\n const totalAllocations = allocations.reduce((acc, v) => acc + v, 0);\n // Gaussian impossible to cover 100%, normalized it to have total of 100%\n return allocations.map((a) => a / totalAllocations);\n}\n\n/// Convert liquidity allocation from 0..1 to 0..10000 bps unit. The sum of allocations must be 1. Return BPS and the loss after conversion.\nfunction computeAllocationBps(allocations: number[]): {\n bpsAllocations: BN[];\n pLoss: BN;\n} {\n let totalAllocation = new BN(0);\n const bpsAllocations: BN[] = [];\n\n for (const allocation of allocations) {\n const allocBps = new BN(allocation * 10000);\n bpsAllocations.push(allocBps);\n totalAllocation = totalAllocation.add(allocBps);\n }\n\n const pLoss = new BN(10000).sub(totalAllocation);\n return {\n bpsAllocations,\n pLoss,\n };\n}\n/** private */\n\nexport function toWeightDistribution(\n amountX: BN,\n amountY: BN,\n distributions: {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n }[],\n binStep: number\n): { binId: number; weight: number }[] {\n // get all quote amount\n let totalQuote = new BN(0);\n const precision = 1_000_000_000_000;\n const quoteDistributions = distributions.map((bin) => {\n const price = new BN(\n getPriceOfBinByBinId(bin.binId, binStep).mul(precision).floor().toString()\n );\n const quoteValue = amountX\n .mul(new BN(bin.xAmountBpsOfTotal))\n .mul(new BN(price))\n .div(new BN(BASIS_POINT_MAX))\n .div(new BN(precision));\n const quoteAmount = quoteValue.add(\n amountY.mul(new BN(bin.yAmountBpsOfTotal)).div(new BN(BASIS_POINT_MAX))\n );\n totalQuote = totalQuote.add(quoteAmount);\n return {\n binId: bin.binId,\n quoteAmount,\n };\n });\n\n if (totalQuote.eq(new BN(0))) {\n return [];\n }\n\n const distributionWeights = quoteDistributions\n .map((bin) => {\n const weight = Math.floor(\n bin.quoteAmount.mul(new BN(65535)).div(totalQuote).toNumber()\n );\n return {\n binId: bin.binId,\n weight,\n };\n })\n .filter((item) => item.weight > 0);\n\n return distributionWeights;\n}\n\nexport function calculateSpotDistribution(\n activeBin: number,\n binIds: number[]\n): { binId: number; xAmountBpsOfTotal: BN; yAmountBpsOfTotal: BN }[] {\n if (!binIds.includes(activeBin)) {\n const { div: dist, mod: rem } = new BN(10_000).divmod(\n new BN(binIds.length)\n );\n const loss = rem.isZero() ? new BN(0) : new BN(1);\n\n const distributions =\n binIds[0] < activeBin\n ? binIds.map((binId) => ({\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: dist,\n }))\n : binIds.map((binId) => ({\n binId,\n xAmountBpsOfTotal: dist,\n yAmountBpsOfTotal: new BN(0),\n }));\n\n // Add the loss to the left most bin\n if (binIds[0] < activeBin) {\n distributions[0].yAmountBpsOfTotal.add(loss);\n }\n // Add the loss to the right most bin\n else {\n distributions[binIds.length - 1].xAmountBpsOfTotal.add(loss);\n }\n\n return distributions;\n }\n\n const binYCount = binIds.filter((binId) => binId < activeBin).length;\n const binXCount = binIds.filter((binId) => binId > activeBin).length;\n\n const totalYBinCapacity = binYCount + 0.5;\n const totalXBinCapacity = binXCount + 0.5;\n\n const yBinBps = new BN(10_000 / totalYBinCapacity);\n const yActiveBinBps = new BN(10_000).sub(yBinBps.mul(new BN(binYCount)));\n\n const xBinBps = new BN(10_000 / totalXBinCapacity);\n const xActiveBinBps = new BN(10_000).sub(xBinBps.mul(new BN(binXCount)));\n\n return binIds.map((binId) => {\n const isYBin = binId < activeBin;\n const isXBin = binId > activeBin;\n const isActiveBin = binId === activeBin;\n\n if (isYBin) {\n return {\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: yBinBps,\n };\n }\n\n if (isXBin) {\n return {\n binId,\n xAmountBpsOfTotal: xBinBps,\n yAmountBpsOfTotal: new BN(0),\n };\n }\n\n if (isActiveBin) {\n return {\n binId,\n xAmountBpsOfTotal: xActiveBinBps,\n yAmountBpsOfTotal: yActiveBinBps,\n };\n }\n });\n}\n\nexport function calculateBidAskDistribution(\n activeBin: number,\n binIds: number[]\n): {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n}[] {\n const smallestBin = Math.min(...binIds);\n const largestBin = Math.max(...binIds);\n\n const rightOnly = activeBin < smallestBin;\n const leftOnly = activeBin > largestBin;\n\n const gaussian = buildGaussianFromBins(activeBin, binIds);\n const allocations = generateBinLiquidityAllocation(gaussian, binIds, true);\n\n // To the right of active bin, liquidity distribution consists of only token X.\n if (rightOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: bpsAllocations[idx],\n yAmountBpsOfTotal: new BN(0),\n }));\n const idx = binDistributions.length - 1;\n binDistributions[idx].xAmountBpsOfTotal =\n binDistributions[idx].xAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // To the left of active bin, liquidity distribution consists of only token Y.\n if (leftOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: bpsAllocations[idx],\n }));\n binDistributions[0].yAmountBpsOfTotal =\n binDistributions[0].yAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // Find total X, and Y bps allocations for normalization.\n const [totalXAllocation, totalYAllocation] = allocations.reduce(\n ([xAcc, yAcc], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n return [xAcc + allocation, yAcc];\n } else if (binId < activeBin) {\n return [xAcc, yAcc + allocation];\n } else {\n const half = allocation / 2;\n return [xAcc + half, yAcc + half];\n }\n },\n [0, 0]\n );\n\n // Normalize and convert to BPS\n const [normXAllocations, normYAllocations] = allocations.reduce<[BN[], BN[]]>(\n ([xAllocations, yAllocations], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n const distX = new BN((allocation * 10000) / totalXAllocation);\n xAllocations.push(distX);\n }\n if (binId < activeBin) {\n const distY = new BN((allocation * 10000) / totalYAllocation);\n yAllocations.push(distY);\n }\n if (binId == activeBin) {\n const half = allocation / 2;\n const distX = new BN((half * 10000) / totalXAllocation);\n const distY = new BN((half * 10000) / totalYAllocation);\n xAllocations.push(distX);\n yAllocations.push(distY);\n }\n return [xAllocations, yAllocations];\n },\n [[], []]\n );\n\n const totalXNormAllocations = normXAllocations.reduce(\n (acc, v) => acc.add(v),\n new BN(0)\n );\n const totalYNormAllocations = normYAllocations.reduce(\n (acc, v) => acc.add(v),\n new BN(0)\n );\n\n const xPLoss = new BN(10000).sub(totalXNormAllocations);\n const yPLoss = new BN(10000).sub(totalYNormAllocations);\n\n const distributions = binIds.map((binId) => {\n if (binId === activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXAllocations.shift(),\n yAmountBpsOfTotal: normYAllocations.shift(),\n };\n }\n\n if (binId > activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXAllocations.shift(),\n yAmountBpsOfTotal: new BN(0),\n };\n }\n\n if (binId < activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: normYAllocations.shift(),\n };\n }\n });\n\n if (!yPLoss.isZero()) {\n distributions[0].yAmountBpsOfTotal =\n distributions[0].yAmountBpsOfTotal.add(yPLoss);\n }\n\n if (!xPLoss.isZero()) {\n const last = distributions.length - 1;\n distributions[last].xAmountBpsOfTotal =\n distributions[last].xAmountBpsOfTotal.add(xPLoss);\n }\n\n return distributions;\n}\n\nexport function calculateNormalDistribution(\n activeBin: number,\n binIds: number[]\n): {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n}[] {\n const smallestBin = Math.min(...binIds);\n const largestBin = Math.max(...binIds);\n\n const rightOnly = activeBin < smallestBin;\n const leftOnly = activeBin > largestBin;\n\n const gaussian = buildGaussianFromBins(activeBin, binIds);\n const allocations = generateBinLiquidityAllocation(gaussian, binIds, false);\n\n // To the right of active bin, liquidity distribution consists of only token X.\n if (rightOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: bpsAllocations[idx],\n yAmountBpsOfTotal: new BN(0),\n }));\n // When contains only X token, bin closest to active bin will be index 0.\n // Add back the precision loss\n binDistributions[0].xAmountBpsOfTotal =\n binDistributions[0].xAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // To the left of active bin, liquidity distribution consists of only token Y.\n if (leftOnly) {\n const { bpsAllocations, pLoss } = computeAllocationBps(allocations);\n const binDistributions = binIds.map((bid, idx) => ({\n binId: bid,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: bpsAllocations[idx],\n }));\n // When contains only Y token, bin closest to active bin will be last index.\n // Add back the precision loss\n const idx = binDistributions.length - 1;\n binDistributions[idx].yAmountBpsOfTotal =\n binDistributions[idx].yAmountBpsOfTotal.add(pLoss);\n return binDistributions;\n }\n\n // The liquidity distribution consists of token X and Y. Allocations from gaussian only says how much liquidity percentage per bin over the full bin range.\n // Normalize liquidity allocation percentage into X - 100%, Y - 100%.\n\n // Find total X, and Y bps allocations for normalization.\n const [totalXAllocation, totalYAllocation] = allocations.reduce(\n ([xAcc, yAcc], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n return [xAcc + allocation, yAcc];\n } else if (binId < activeBin) {\n return [xAcc, yAcc + allocation];\n } else {\n const half = allocation / 2;\n return [xAcc + half, yAcc + half];\n }\n },\n [0, 0]\n );\n\n // Normalize and convert to BPS\n const [normXAllocations, normYAllocations] = allocations.reduce(\n ([xAllocations, yAllocations], allocation, idx) => {\n const binId = binIds[idx];\n if (binId > activeBin) {\n const distX = new BN((allocation * 10000) / totalXAllocation);\n xAllocations.push(distX);\n }\n if (binId < activeBin) {\n const distY = new BN((allocation * 10000) / totalYAllocation);\n yAllocations.push(distY);\n }\n return [xAllocations, yAllocations];\n },\n [[], []]\n );\n\n const normXActiveBinAllocation = normXAllocations.reduce(\n (maxBps, bps) => maxBps.sub(bps),\n new BN(10_000)\n );\n const normYActiveBinAllocation = normYAllocations.reduce(\n (maxBps, bps) => maxBps.sub(bps),\n new BN(10_000)\n );\n\n return binIds.map((binId) => {\n if (binId === activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXActiveBinAllocation,\n yAmountBpsOfTotal: normYActiveBinAllocation,\n };\n }\n\n if (binId > activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: normXAllocations.shift(),\n yAmountBpsOfTotal: new BN(0),\n };\n }\n\n if (binId < activeBin) {\n return {\n binId,\n xAmountBpsOfTotal: new BN(0),\n yAmountBpsOfTotal: normYAllocations.shift(),\n };\n }\n });\n}\n\nexport function fromWeightDistributionToAmountOneSide(\n amount: BN,\n distributions: { binId: number; weight: number }[],\n binStep: number,\n activeId: number,\n depositForY: boolean,\n): { binId: number; amount: BN }[] {\n if (depositForY) {\n return toAmountBidSide(activeId, amount, distributions);\n } else {\n return toAmountAskSide(activeId, binStep, amount, distributions);\n }\n}\n\nexport function fromWeightDistributionToAmount(\n amountX: BN,\n amountY: BN,\n distributions: { binId: number; weight: number }[],\n binStep: number,\n activeId: number,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN\n): { binId: number; amountX: BN; amountY: BN }[] {\n // sort distribution\n var distributions = distributions.sort((n1, n2) => {\n return n1.binId - n2.binId;\n });\n\n if (distributions.length == 0) {\n return [];\n }\n\n // only bid side\n if (activeId > distributions[distributions.length - 1].binId) {\n let amounts = toAmountBidSide(activeId, amountY, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(bin.amount.toString()),\n };\n });\n }\n\n // only ask side\n if (activeId < distributions[0].binId) {\n let amounts = toAmountAskSide(activeId, binStep, amountX, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(bin.amount.toString()),\n amountY: new BN(0),\n };\n });\n }\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, distributions);\n}","\nimport Decimal from \"decimal.js\";\nimport { BN } from \"@coral-xyz/anchor\";\nimport { getPriceOfBinByBinId } from \"./weight\";\n\nexport function toAmountBidSide(\n activeId: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[],\n): {\n binId: number,\n amount: BN\n}[] {\n // get sum of weight\n const totalWeight = distributions.reduce(function (sum, el) {\n return el.binId > activeId ? sum : sum.add(el.weight); // skip all ask side\n }, new Decimal(0));\n\n if (totalWeight.cmp(new Decimal(0)) != 1) {\n throw Error(\"Invalid parameteres\");\n }\n return distributions.map((bin) => {\n if (bin.binId > activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n };\n } else {\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString())\n .mul(new Decimal(bin.weight).div(totalWeight))\n .floor().toString()),\n };\n }\n });\n}\n\nexport function toAmountAskSide(activeId: number,\n binStep: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[]): {\n binId: number,\n amount: BN\n }[] {\n // get sum of weight\n const totalWeight: Decimal = distributions.reduce(function (sum, el) {\n if (el.binId < activeId) {\n return sum;\n } else {\n const price = getPriceOfBinByBinId(el.binId, binStep);\n const weightPerPrice = new Decimal(el.weight).div(price);\n return sum.add(weightPerPrice);\n }\n }, new Decimal(0));\n\n if (totalWeight.cmp(new Decimal(0)) != 1) {\n throw Error(\"Invalid parameteres\");\n }\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n };\n } else {\n const price = getPriceOfBinByBinId(bin.binId, binStep);\n const weightPerPrice = new Decimal(bin.weight).div(price);\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString()).mul(weightPerPrice).div(totalWeight).floor().toString()),\n };\n }\n })\n}\n\nexport function toAmountBothSide(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]): {\n binId: number,\n amountX: BN,\n amountY: BN\n }[] {\n // only bid side\n if (activeId > distributions[distributions.length - 1].binId) {\n let amounts = toAmountBidSide(activeId, amountY, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n };\n })\n }\n // only ask side\n if (activeId < distributions[0].binId) {\n let amounts = toAmountAskSide(activeId, binStep, amountX, distributions);\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n };\n })\n }\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId;\n });\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep);\n let wx0 = new Decimal(0);\n let wy0 = new Decimal(0);\n const activeBin = activeBins[0];\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)));\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2));\n } else {\n let amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString());\n let amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString());\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(\n p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec))\n );\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(\n new Decimal(1).add(\n p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)\n )\n );\n }\n }\n\n let totalWeightX = wx0;\n let totalWeightY = wy0;\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n }\n if (element.binId > activeId) {\n let price = getPriceOfBinByBinId(element.binId, binStep);\n let weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const kx = new Decimal(amountX.toString()).div(totalWeightX);\n const ky = new Decimal(amountY.toString()).div(totalWeightY);\n let k = (kx.lessThan(ky) ? kx : ky);\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight));\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n };\n }\n if (bin.binId > activeId) {\n const price = getPriceOfBinByBinId(bin.binId, binStep);\n const weighPerPrice = new Decimal(bin.weight).div(price);\n const amount = k.mul(weighPerPrice);\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n };\n }\n\n const amountXActiveBin = k.mul(wx0);\n const amountYActiveBin = k.mul(wy0);\n return {\n binId: bin.binId,\n amountX: new BN(amountXActiveBin.floor().toString()),\n amountY: new BN(amountYActiveBin.floor().toString()),\n };\n });\n } else {\n let totalWeightX = new Decimal(0);\n let totalWeightY = new Decimal(0);\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n } else {\n let price = getPriceOfBinByBinId(element.binId, binStep);\n let weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n\n let kx = new Decimal(amountX.toString()).div(totalWeightX);\n let ky = new Decimal(amountY.toString()).div(totalWeightY);\n let k = kx.lessThan(ky) ? kx : ky;\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight));\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n };\n } else {\n let price = getPriceOfBinByBinId(bin.binId, binStep);\n let weighPerPrice = new Decimal(bin.weight).div(price);\n const amount = k.mul(weighPerPrice);\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n };\n }\n });\n }\n}\n\n\nexport function autoFillYByWeight(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId;\n });\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep);\n let wx0 = new Decimal(0);\n let wy0 = new Decimal(0);\n const activeBin = activeBins[0];\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)));\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2));\n } else {\n let amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString());\n let amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString());\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(\n p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec))\n );\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(\n new Decimal(1).add(\n p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)\n )\n );\n }\n }\n\n let totalWeightX = wx0;\n let totalWeightY = wy0;\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX);\n const amountY = kx.mul(totalWeightY);\n return new BN(amountY.floor().toString())\n } else {\n let totalWeightX = new Decimal(0);\n let totalWeightY = new Decimal(0);\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX);\n const amountY = kx.mul(totalWeightY);\n return new BN(amountY.floor().toString())\n }\n}\n\n\nexport function autoFillXByWeight(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId;\n });\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep);\n let wx0 = new Decimal(0);\n let wy0 = new Decimal(0);\n const activeBin = activeBins[0];\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)));\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2));\n } else {\n let amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString());\n let amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString());\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(\n p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec))\n );\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(\n new Decimal(1).add(\n p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)\n )\n );\n }\n }\n\n let totalWeightX = wx0;\n let totalWeightY = wy0;\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY);\n const amountX = ky.mul(totalWeightX);\n return new BN(amountX.floor().toString())\n } else {\n let totalWeightX = new Decimal(0);\n let totalWeightY = new Decimal(0);\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight));\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep);\n const weighPerPrice = new Decimal(element.weight).div(price);\n totalWeightX = totalWeightX.add(weighPerPrice);\n }\n });\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY);\n const amountX = ky.mul(totalWeightX);\n return new BN(amountX.floor().toString())\n }\n}","import { AddressLookupTableAccount, Commitment, ComputeBudgetProgram, Connection, PublicKey, TransactionInstruction, TransactionMessage, VersionedTransaction } from \"@solana/web3.js\";\n\n// https://solscan.io/tx/4ryJKTB1vYmGU6YnUWwbLps18FaJjiTwgRozcgdP8RFcwp7zUZi85vgWE7rARNx2NvzDJiM9CUWArqzY7LHv38WL\nexport const DEFAULT_ADD_LIQUIDITY_CU = 800_000;\n\nexport const MIN_CU_BUFFER = 50_000;\nexport const MAX_CU_BUFFER = 200_000;\n\nexport const getSimulationComputeUnits = async (\n connection: Connection,\n instructions: Array<TransactionInstruction>,\n payer: PublicKey,\n lookupTables: Array<AddressLookupTableAccount> | [],\n commitment: Commitment = \"confirmed\",\n ): Promise<number | null> => {\n const testInstructions = [\n // Set an arbitrarily high number in simulation\n // so we can be sure the transaction will succeed\n // and get the real compute units used\n ComputeBudgetProgram.setComputeUnitLimit({ units: 1_400_000 }),\n ...instructions,\n ];\n \n const testTransaction = new VersionedTransaction(\n new TransactionMessage({\n instructions: testInstructions,\n payerKey: payer,\n // RecentBlockhash can by any public key during simulation\n // since 'replaceRecentBlockhash' is set to 'true' below\n recentBlockhash: PublicKey.default.toString(),\n }).compileToV0Message(lookupTables),\n );\n \n const rpcResponse = await connection.simulateTransaction(testTransaction, {\n replaceRecentBlockhash: true,\n sigVerify: false,\n commitment,\n });\n \n if (rpcResponse?.value?.err) {\n const logs = rpcResponse.value.logs?.join(\"\\n • \") || \"No logs available\";\n throw new Error(\n `Transaction simulation failed:\\n •${logs}` +\n JSON.stringify(rpcResponse?.value?.err),\n );\n }\n \n return rpcResponse.value.unitsConsumed || null;\n };\n","import { BN } from \"@coral-xyz/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { DLMM } from \"..\";\nimport { ILM_BASE } from \"../constants\";\n\n/** private */\nfunction sortTokenMints(tokenX: PublicKey, tokenY: PublicKey) {\n const [minKey, maxKey] =\n tokenX.toBuffer().compare(tokenY.toBuffer()) == 1\n ? [tokenY, tokenX]\n : [tokenX, tokenY];\n return [minKey, maxKey];\n}\n/** private */\n\n/**\n *\n * @deprecated Use derivePresetParameter2\n */\nexport function derivePresetParameter(binStep: BN, programId: PublicKey) {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"preset_parameter\"),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function derivePresetParameter2(\n binStep: BN,\n baseFactor: BN,\n programId: PublicKey\n) {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"preset_parameter\"),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n new Uint8Array(baseFactor.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function deriveLbPair2(\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n baseFactor: BN,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [\n minKey.toBuffer(),\n maxKey.toBuffer(),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n new Uint8Array(baseFactor.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\n/**\n *\n * @deprecated Use deriveLbPair2\n */\n\nexport function deriveLbPair(\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [\n minKey.toBuffer(),\n maxKey.toBuffer(),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function deriveCustomizablePermissionlessLbPair(\n tokenX: PublicKey,\n tokenY: PublicKey,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [ILM_BASE.toBuffer(), minKey.toBuffer(), maxKey.toBuffer()],\n programId\n );\n}\n\nexport function derivePermissionLbPair(\n baseKey: PublicKey,\n tokenX: PublicKey,\n tokenY: PublicKey,\n binStep: BN,\n programId: PublicKey\n) {\n const [minKey, maxKey] = sortTokenMints(tokenX, tokenY);\n return PublicKey.findProgramAddressSync(\n [\n baseKey.toBuffer(),\n minKey.toBuffer(),\n maxKey.toBuffer(),\n new Uint8Array(binStep.toArrayLike(Buffer, \"le\", 2)),\n ],\n programId\n );\n}\n\nexport function deriveOracle(lbPair: PublicKey, programId: PublicKey) {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"oracle\"), lbPair.toBytes()],\n programId\n );\n}\n\nexport function derivePosition(\n lbPair: PublicKey,\n base: PublicKey,\n lowerBinId: BN,\n width: BN,\n programId: PublicKey\n) {\n let lowerBinIdBytes: Uint8Array;\n if (lowerBinId.isNeg()) {\n lowerBinIdBytes = new Uint8Array(\n lowerBinId.toTwos(32).toArrayLike(Buffer, \"le\", 4)\n );\n } else {\n lowerBinIdBytes = new Uint8Array(lowerBinId.toArrayLike(Buffer, \"le\", 4));\n }\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"position\"),\n lbPair.toBuffer(),\n base.toBuffer(),\n lowerBinIdBytes,\n new Uint8Array(width.toArrayLike(Buffer, \"le\", 4)),\n ],\n programId\n );\n}\n\nexport function deriveBinArray(\n lbPair: PublicKey,\n index: BN,\n programId: PublicKey\n) {\n let binArrayBytes: Uint8Array;\n if (index.isNeg()) {\n binArrayBytes = new Uint8Array(\n index.toTwos(64).toArrayLike(Buffer, \"le\", 8)\n );\n } else {\n binArrayBytes = new Uint8Array(index.toArrayLike(Buffer, \"le\", 8));\n }\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"bin_array\"), lbPair.toBytes(), binArrayBytes],\n programId\n );\n}\n\nexport function deriveReserve(\n token: PublicKey,\n lbPair: PublicKey,\n programId: PublicKey\n) {\n return PublicKey.findProgramAddressSync(\n [lbPair.toBuffer(), token.toBuffer()],\n programId\n );\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { MAX_BIN_ARRAY_SIZE, MAX_BIN_PER_POSITION } from \"../constants\";\nimport {\n Bin,\n BinArray,\n BinArrayAccount,\n BinArrayBitmapExtension,\n BinLiquidity,\n BitmapType,\n LbPair,\n} from \"../types\";\nimport {\n EXTENSION_BINARRAY_BITMAP_SIZE,\n BIN_ARRAY_BITMAP_SIZE,\n} from \"../constants\";\nimport { getPositionCount } from \"./math\";\nimport { deriveBinArray } from \"./derive\";\n\n/** private */\nfunction internalBitmapRange() {\n const lowerBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.neg();\n const upperBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.sub(new BN(1));\n return [lowerBinArrayIndex, upperBinArrayIndex];\n}\n\nfunction buildBitmapFromU64Arrays(u64Arrays: BN[], type: BitmapType) {\n const buffer = Buffer.concat(\n u64Arrays.map((b) => {\n return b.toArrayLike(Buffer, \"le\", 8);\n })\n );\n\n return new BN(buffer, \"le\");\n}\n\nfunction bitmapTypeDetail(type: BitmapType) {\n if (type == BitmapType.U1024) {\n return {\n bits: 1024,\n bytes: 1024 / 8,\n };\n } else {\n return {\n bits: 512,\n bytes: 512 / 8,\n };\n }\n}\n\nfunction mostSignificantBit(number: BN, bitLength: number) {\n const highestIndex = bitLength - 1;\n if (number.isZero()) {\n return null;\n }\n\n for (let i = highestIndex; i >= 0; i--) {\n if (number.testn(i)) {\n return highestIndex - i;\n }\n }\n return null;\n}\n\nfunction leastSignificantBit(number: BN, bitLength: number) {\n if (number.isZero()) {\n return null;\n }\n for (let i = 0; i < bitLength; i++) {\n if (number.testn(i)) {\n return i;\n }\n }\n return null;\n}\n\nfunction extensionBitmapRange() {\n return [\n BIN_ARRAY_BITMAP_SIZE.neg().mul(\n EXTENSION_BINARRAY_BITMAP_SIZE.add(new BN(1))\n ),\n BIN_ARRAY_BITMAP_SIZE.mul(\n EXTENSION_BINARRAY_BITMAP_SIZE.add(new BN(1))\n ).sub(new BN(1)),\n ];\n}\n\nfunction findSetBit(\n startIndex: number,\n endIndex: number,\n binArrayBitmapExtension: BinArrayBitmapExtension\n): number | null {\n const getBinArrayOffset = (binArrayIndex: BN) => {\n return binArrayIndex.gt(new BN(0))\n ? binArrayIndex.mod(BIN_ARRAY_BITMAP_SIZE)\n : binArrayIndex.add(new BN(1)).neg().mod(BIN_ARRAY_BITMAP_SIZE);\n };\n\n const getBitmapOffset = (binArrayIndex: BN) => {\n return binArrayIndex.gt(new BN(0))\n ? binArrayIndex.div(BIN_ARRAY_BITMAP_SIZE).sub(new BN(1))\n : binArrayIndex\n .add(new BN(1))\n .neg()\n .div(BIN_ARRAY_BITMAP_SIZE)\n .sub(new BN(1));\n };\n\n if (startIndex <= endIndex) {\n for (let i = startIndex; i <= endIndex; i++) {\n const binArrayOffset = getBinArrayOffset(new BN(i)).toNumber();\n const bitmapOffset = getBitmapOffset(new BN(i)).toNumber();\n const bitmapChunks =\n i > 0\n ? binArrayBitmapExtension.positiveBinArrayBitmap[bitmapOffset]\n : binArrayBitmapExtension.negativeBinArrayBitmap[bitmapOffset];\n const bitmap = buildBitmapFromU64Arrays(bitmapChunks, BitmapType.U512);\n if (bitmap.testn(binArrayOffset)) {\n return i;\n }\n }\n } else {\n for (let i = startIndex; i >= endIndex; i--) {\n const binArrayOffset = getBinArrayOffset(new BN(i)).toNumber();\n const bitmapOffset = getBitmapOffset(new BN(i)).toNumber();\n const bitmapChunks =\n i > 0\n ? binArrayBitmapExtension.positiveBinArrayBitmap[bitmapOffset]\n : binArrayBitmapExtension.negativeBinArrayBitmap[bitmapOffset];\n const bitmap = buildBitmapFromU64Arrays(bitmapChunks, BitmapType.U512);\n if (bitmap.testn(binArrayOffset)) {\n return i;\n }\n }\n }\n\n return null;\n}\n/** private */\n\nexport function isOverflowDefaultBinArrayBitmap(binArrayIndex: BN) {\n const [minBinArrayIndex, maxBinArrayIndex] = internalBitmapRange();\n return (\n binArrayIndex.gt(maxBinArrayIndex) || binArrayIndex.lt(minBinArrayIndex)\n );\n}\n\nexport function deriveBinArrayBitmapExtension(\n lbPair: PublicKey,\n programId: PublicKey\n) {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"bitmap\"), lbPair.toBytes()],\n programId\n );\n}\n\nexport function binIdToBinArrayIndex(binId: BN): BN {\n const { div: idx, mod } = binId.divmod(MAX_BIN_ARRAY_SIZE);\n return binId.isNeg() && !mod.isZero() ? idx.sub(new BN(1)) : idx;\n}\n\nexport function getBinArrayLowerUpperBinId(binArrayIndex: BN) {\n const lowerBinId = binArrayIndex.mul(MAX_BIN_ARRAY_SIZE);\n const upperBinId = lowerBinId.add(MAX_BIN_ARRAY_SIZE).sub(new BN(1));\n\n return [lowerBinId, upperBinId];\n}\n\nexport function isBinIdWithinBinArray(activeId: BN, binArrayIndex: BN) {\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArrayIndex);\n return activeId.gte(lowerBinId) && activeId.lte(upperBinId);\n}\n\nexport function getBinFromBinArray(binId: number, binArray: BinArray): Bin {\n const [lowerBinId, upperBinId] = getBinArrayLowerUpperBinId(binArray.index);\n\n let index = 0;\n if (binId > 0) {\n index = binId - lowerBinId.toNumber();\n } else {\n const delta = upperBinId.toNumber() - binId;\n index = MAX_BIN_ARRAY_SIZE.toNumber() - delta - 1;\n }\n\n return binArray.bins[index];\n}\n\nexport function findNextBinArrayIndexWithLiquidity(\n swapForY: boolean,\n activeId: BN,\n lbPairState: LbPair,\n binArrayBitmapExtension: BinArrayBitmapExtension | null\n): BN | null {\n const [lowerBinArrayIndex, upperBinArrayIndex] = internalBitmapRange();\n let startBinArrayIndex = binIdToBinArrayIndex(activeId);\n\n while (true) {\n if (isOverflowDefaultBinArrayBitmap(startBinArrayIndex)) {\n if (binArrayBitmapExtension === null) {\n return null;\n }\n // When bin array index is negative, the MSB is smallest bin array index.\n\n const [minBinArrayIndex, maxBinArrayIndex] = extensionBitmapRange();\n\n if (startBinArrayIndex.isNeg()) {\n if (swapForY) {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n minBinArrayIndex.toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n return null;\n }\n } else {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n BIN_ARRAY_BITMAP_SIZE.neg().sub(new BN(1)).toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n // Move to internal bitmap\n startBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.neg();\n }\n }\n } else {\n if (swapForY) {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n BIN_ARRAY_BITMAP_SIZE.toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n // Move to internal bitmap\n startBinArrayIndex = BIN_ARRAY_BITMAP_SIZE.sub(new BN(1));\n }\n } else {\n const binArrayIndex = findSetBit(\n startBinArrayIndex.toNumber(),\n maxBinArrayIndex.toNumber(),\n binArrayBitmapExtension\n );\n\n if (binArrayIndex !== null) {\n return new BN(binArrayIndex);\n } else {\n return null;\n }\n }\n }\n } else {\n // Internal bitmap\n const bitmapType = BitmapType.U1024;\n const bitmapDetail = bitmapTypeDetail(bitmapType);\n const offset = startBinArrayIndex.add(BIN_ARRAY_BITMAP_SIZE);\n\n const bitmap = buildBitmapFromU64Arrays(\n lbPairState.binArrayBitmap,\n bitmapType\n );\n\n if (swapForY) {\n const upperBitRange = new BN(bitmapDetail.bits - 1).sub(offset);\n const croppedBitmap = bitmap.shln(upperBitRange.toNumber());\n\n const msb = mostSignificantBit(croppedBitmap, bitmapDetail.bits);\n\n if (msb !== null) {\n return startBinArrayIndex.sub(new BN(msb));\n } else {\n // Move to extension\n startBinArrayIndex = lowerBinArrayIndex.sub(new BN(1));\n }\n } else {\n const lowerBitRange = offset;\n const croppedBitmap = bitmap.shrn(lowerBitRange.toNumber());\n const lsb = leastSignificantBit(croppedBitmap, bitmapDetail.bits);\n if (lsb !== null) {\n return startBinArrayIndex.add(new BN(lsb));\n } else {\n // Move to extension\n startBinArrayIndex = upperBinArrayIndex.add(new BN(1));\n }\n }\n }\n }\n}\n\nexport function findNextBinArrayWithLiquidity(\n swapForY: boolean,\n activeBinId: BN,\n lbPairState: LbPair,\n binArrayBitmapExtension: BinArrayBitmapExtension | null,\n binArrays: BinArrayAccount[]\n): BinArrayAccount | null {\n const nearestBinArrayIndexWithLiquidity = findNextBinArrayIndexWithLiquidity(\n swapForY,\n activeBinId,\n lbPairState,\n binArrayBitmapExtension\n );\n\n if (nearestBinArrayIndexWithLiquidity == null) {\n return null;\n }\n\n const binArrayAccount = binArrays.find((ba) =>\n ba.account.index.eq(nearestBinArrayIndexWithLiquidity)\n );\n if (!binArrayAccount) {\n // Cached bin array couldn't cover more bins, partial quoted.\n return null;\n }\n\n return binArrayAccount;\n}\n\n/**\n * Retrieves the bin arrays required to initialize multiple positions in continuous range.\n *\n * @param {PublicKey} pair - The public key of the pair.\n * @param {BN} fromBinId - The starting bin ID.\n * @param {BN} toBinId - The ending bin ID.\n * @return {[{key: PublicKey, index: BN }]} An array of bin arrays required for the given position range.\n */\nexport function getBinArraysRequiredByPositionRange(\n pair: PublicKey,\n fromBinId: BN,\n toBinId: BN,\n programId: PublicKey\n): { key: PublicKey; index: BN }[] {\n const [minBinId, maxBinId] = fromBinId.lt(toBinId)\n ? [fromBinId, toBinId]\n : [toBinId, fromBinId];\n\n const positionCount = getPositionCount(minBinId, maxBinId);\n const binArrays = new Map<String, BN>();\n\n for (let i = 0; i < positionCount.toNumber(); i++) {\n const lowerBinId = minBinId.add(MAX_BIN_PER_POSITION.mul(new BN(i)));\n\n const lowerBinArrayIndex = binIdToBinArrayIndex(lowerBinId);\n const upperBinArrayIndex = lowerBinArrayIndex.add(new BN(1));\n\n const [lowerBinArray] = deriveBinArray(pair, lowerBinArrayIndex, programId);\n const [upperBinArray] = deriveBinArray(pair, upperBinArrayIndex, programId);\n\n binArrays.set(lowerBinArray.toBase58(), lowerBinArrayIndex);\n binArrays.set(upperBinArray.toBase58(), upperBinArrayIndex);\n }\n\n return Array.from(binArrays, ([key, index]) => ({\n key: new PublicKey(key),\n index,\n }));\n}\n\nexport function* enumerateBins(\n binsById: Map<number, Bin>,\n lowerBinId: number,\n upperBinId: number,\n binStep: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n version: number\n) {\n for (let currentBinId = lowerBinId; currentBinId <= upperBinId; currentBinId++) {\n const bin = binsById.get(currentBinId);\n if (bin != null) {\n yield BinLiquidity.fromBin(bin, currentBinId, binStep, baseTokenDecimal, quoteTokenDecimal, version);\n } else {\n yield BinLiquidity.empty(currentBinId, binStep, baseTokenDecimal, quoteTokenDecimal, version);\n }\n }\n}","import {\n BN,\n IdlAccounts,\n IdlTypes,\n Program,\n ProgramAccount,\n} from \"@coral-xyz/anchor\";\nimport { LbClmm } from \"../idl\";\nimport { getPriceOfBinByBinId } from \"../helpers\";\nimport { PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport Decimal from \"decimal.js\";\nimport { u64, i64, struct } from \"@coral-xyz/borsh\";\n\nexport interface FeeInfo {\n baseFeeRatePercentage: Decimal;\n maxFeeRatePercentage: Decimal;\n protocolFeePercentage: Decimal;\n}\n\nexport interface BinAndAmount {\n binId: number;\n xAmountBpsOfTotal: BN;\n yAmountBpsOfTotal: BN;\n}\n\nexport interface TokenReserve {\n publicKey: PublicKey;\n reserve: PublicKey;\n amount: bigint;\n decimal: number;\n}\n\nexport type ClmmProgram = Program<LbClmm>;\n\nexport type LbPair = IdlAccounts<LbClmm>[\"lbPair\"];\nexport type LbPairAccount = ProgramAccount<IdlAccounts<LbClmm>[\"lbPair\"]>;\n\nexport type Bin = IdlTypes<LbClmm>[\"Bin\"];\nexport type BinArray = IdlAccounts<LbClmm>[\"binArray\"];\nexport type BinArrayAccount = ProgramAccount<IdlAccounts<LbClmm>[\"binArray\"]>;\n\nexport type Position = IdlAccounts<LbClmm>[\"position\"];\nexport type PositionV2 = IdlAccounts<LbClmm>[\"positionV2\"];\n\nexport type vParameters = IdlAccounts<LbClmm>[\"lbPair\"][\"vParameters\"];\nexport type sParameters = IdlAccounts<LbClmm>[\"lbPair\"][\"parameters\"];\n\nexport type InitPermissionPairIx = IdlTypes<LbClmm>[\"InitPermissionPairIx\"];\nexport type InitCustomizablePermissionlessPairIx =\n IdlTypes<LbClmm>[\"CustomizableParams\"];\n\nexport type BinLiquidityDistribution =\n IdlTypes<LbClmm>[\"BinLiquidityDistribution\"];\nexport type BinLiquidityReduction = IdlTypes<LbClmm>[\"BinLiquidityReduction\"];\n\nexport type BinArrayBitmapExtensionAccount = ProgramAccount<\n IdlAccounts<LbClmm>[\"binArrayBitmapExtension\"]\n>;\nexport type BinArrayBitmapExtension =\n IdlAccounts<LbClmm>[\"binArrayBitmapExtension\"];\n\nexport type LiquidityParameterByWeight =\n IdlTypes<LbClmm>[\"LiquidityParameterByWeight\"];\nexport type LiquidityOneSideParameter =\n IdlTypes<LbClmm>[\"LiquidityOneSideParameter\"];\n\nexport type LiquidityParameterByStrategy =\n IdlTypes<LbClmm>[\"LiquidityParameterByStrategy\"];\nexport type LiquidityParameterByStrategyOneSide =\n IdlTypes<LbClmm>[\"LiquidityParameterByStrategyOneSide\"];\nexport type LiquidityParameter = IdlTypes<LbClmm>[\"LiquidityParameter\"];\n\nexport type ProgramStrategyParameter = IdlTypes<LbClmm>[\"StrategyParameters\"];\nexport type ProgramStrategyType = IdlTypes<LbClmm>[\"StrategyType\"];\n\nexport type CompressedBinDepositAmount =\n IdlTypes<LbClmm>[\"CompressedBinDepositAmount\"];\nexport type CompressedBinDepositAmounts = CompressedBinDepositAmount[];\n\nexport interface LbPosition {\n publicKey: PublicKey;\n positionData: PositionData;\n version: PositionVersion;\n}\n\nexport interface PositionInfo {\n publicKey: PublicKey;\n lbPair: LbPair;\n tokenX: TokenReserve;\n tokenY: TokenReserve;\n lbPairPositionsData: Array<LbPosition>;\n}\n\nexport interface FeeInfo {\n baseFeeRatePercentage: Decimal;\n maxFeeRatePercentage: Decimal;\n protocolFeePercentage: Decimal;\n}\n\nexport interface EmissionRate {\n rewardOne: Decimal | undefined;\n rewardTwo: Decimal | undefined;\n}\n\nexport interface SwapFee {\n feeX: BN;\n feeY: BN;\n}\n\nexport interface LMRewards {\n rewardOne: BN;\n rewardTwo: BN;\n}\n\nexport enum PositionVersion {\n V1,\n V2,\n}\n\nexport enum PairType {\n Permissionless,\n Permissioned,\n}\n\nexport const Strategy = {\n SpotBalanced: { spotBalanced: {} },\n CurveBalanced: { curveBalanced: {} },\n BidAskBalanced: { bidAskBalanced: {} },\n SpotImBalanced: { spotImBalanced: {} },\n CurveImBalanced: { curveImBalanced: {} },\n BidAskImBalanced: { bidAskImBalanced: {} },\n};\n\nexport enum StrategyType {\n Spot,\n Curve,\n BidAsk,\n}\n\nexport enum ActivationType {\n Slot,\n Timestamp,\n}\n\nexport interface StrategyParameters {\n maxBinId: number;\n minBinId: number;\n strategyType: StrategyType;\n singleSidedX?: boolean;\n}\n\nexport interface TQuoteCreatePositionParams {\n strategy: StrategyParameters;\n}\n\nexport interface TInitializePositionAndAddLiquidityParams {\n positionPubKey: PublicKey;\n totalXAmount: BN;\n totalYAmount: BN;\n xYAmountDistribution: BinAndAmount[];\n user: PublicKey;\n slippage?: number;\n}\n\nexport interface TInitializePositionAndAddLiquidityParamsByStrategy {\n positionPubKey: PublicKey;\n totalXAmount: BN;\n totalYAmount: BN;\n strategy: StrategyParameters;\n user: PublicKey;\n slippage?: number;\n}\n\nexport interface BinLiquidity {\n binId: number;\n xAmount: BN;\n yAmount: BN;\n supply: BN;\n version: number;\n price: string;\n pricePerToken: string;\n}\n\nexport module BinLiquidity {\n export function fromBin(\n bin: Bin,\n binId: number,\n binStep: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n version: number\n ): BinLiquidity {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n binStep\n ).toString();\n return {\n binId,\n xAmount: bin.amountX,\n yAmount: bin.amountY,\n supply: bin.liquiditySupply,\n price: pricePerLamport,\n version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n };\n }\n\n export function empty(\n binId: number,\n binStep: number,\n baseTokenDecimal: number,\n quoteTokenDecimal: number,\n version: number\n ): BinLiquidity {\n const pricePerLamport = getPriceOfBinByBinId(\n binId,\n binStep\n ).toString();\n return {\n binId,\n xAmount: new BN(0),\n yAmount: new BN(0),\n supply: new BN(0),\n price: pricePerLamport,\n version,\n pricePerToken: new Decimal(pricePerLamport)\n .mul(new Decimal(10 ** (baseTokenDecimal - quoteTokenDecimal)))\n .toString(),\n };\n }\n}\n\nexport interface SwapQuote {\n consumedInAmount: BN;\n outAmount: BN;\n fee: BN;\n protocolFee: BN;\n minOutAmount: BN;\n priceImpact: Decimal;\n binArraysPubkey: any[];\n endPrice: Decimal;\n}\n\nexport interface SwapQuoteExactOut {\n inAmount: BN;\n outAmount: BN;\n fee: BN;\n priceImpact: Decimal;\n protocolFee: BN;\n maxInAmount: BN;\n binArraysPubkey: any[];\n}\n\nexport interface IAccountsCache {\n binArrays: Map<String, BinArray>;\n lbPair: LbPair;\n}\n\nexport interface PositionBinData {\n binId: number;\n price: string;\n pricePerToken: string;\n binXAmount: string;\n binYAmount: string;\n binLiquidity: string;\n positionLiquidity: string;\n positionXAmount: string;\n positionYAmount: string;\n}\n\nexport interface PositionData {\n totalXAmount: string;\n totalYAmount: string;\n positionBinData: PositionBinData[];\n lastUpdatedAt: BN;\n upperBinId: number;\n lowerBinId: number;\n feeX: BN;\n feeY: BN;\n rewardOne: BN;\n rewardTwo: BN;\n feeOwner: PublicKey;\n totalClaimedFeeXAmount: BN;\n totalClaimedFeeYAmount: BN;\n}\n\nexport interface SwapWithPriceImpactParams {\n /**\n * mint of in token\n */\n inToken: PublicKey;\n /**\n * mint of out token\n */\n outToken: PublicKey;\n /**\n * in token amount\n */\n inAmount: BN;\n /**\n * price impact in bps\n */\n priceImpact: BN;\n /**\n * desired lbPair to swap against\n */\n lbPair: PublicKey;\n /**\n * user\n */\n user: PublicKey;\n binArraysPubkey: PublicKey[];\n}\n\nexport interface SwapParams {\n /**\n * mint of in token\n */\n inToken: PublicKey;\n /**\n * mint of out token\n */\n outToken: PublicKey;\n /**\n * in token amount\n */\n inAmount: BN;\n /**\n * minimum out with slippage\n */\n minOutAmount: BN;\n /**\n * desired lbPair to swap against\n */\n lbPair: PublicKey;\n /**\n * user\n */\n user: PublicKey;\n binArraysPubkey: PublicKey[];\n}\n\nexport interface SwapExactOutParams {\n /**\n * mint of in token\n */\n inToken: PublicKey;\n /**\n * mint of out token\n */\n outToken: PublicKey;\n /**\n * out token amount\n */\n outAmount: BN;\n /**\n * maximum in amount, also known as slippage\n */\n maxInAmount: BN;\n /**\n * desired lbPair to swap against\n */\n lbPair: PublicKey;\n /**\n * user\n */\n user: PublicKey;\n binArraysPubkey: PublicKey[];\n}\n\nexport interface GetOrCreateATAResponse {\n ataPubKey: PublicKey;\n ix?: TransactionInstruction;\n}\n\nexport enum BitmapType {\n U1024,\n U512,\n}\n\nexport interface SeedLiquidityResponse {\n sendPositionOwnerTokenProveIxs: TransactionInstruction[];\n initializeBinArraysAndPositionIxs: TransactionInstruction[][];\n addLiquidityIxs: TransactionInstruction[][];\n}\n\nexport interface Clock {\n slot: BN;\n epochStartTimestamp: BN;\n epoch: BN;\n leaderScheduleEpoch: BN;\n unixTimestamp: BN;\n}\n\nexport const ClockLayout = struct([\n u64(\"slot\"),\n i64(\"epochStartTimestamp\"),\n u64(\"epoch\"),\n u64(\"leaderScheduleEpoch\"),\n i64(\"unixTimestamp\"),\n]);\n\nexport enum PairStatus {\n Enabled,\n Disabled,\n}\n\nexport interface PairLockInfo {\n positions: Array<PositionLockInfo>;\n}\n\nexport interface PositionLockInfo {\n positionAddress: PublicKey,\n owner: PublicKey,\n tokenXAmount: string,\n tokenYAmount: string,\n lockReleasePoint: number\n}","import { BN } from \"@coral-xyz/anchor\";\nimport {\n BASIS_POINT_MAX,\n FEE_PRECISION,\n MAX_FEE_RATE,\n SCALE_OFFSET,\n} from \"../constants\";\nimport { Bin, sParameters, vParameters } from \"../types\";\nimport { Rounding, mulShr, shlDiv } from \"./math\";\nimport { getOutAmount } from \".\";\n\nexport function getBaseFee(binStep: number, sParameter: sParameters) {\n return new BN(sParameter.baseFactor).mul(new BN(binStep)).mul(new BN(10));\n}\n\nexport function getVariableFee(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters\n) {\n if (sParameter.variableFeeControl > 0) {\n const square_vfa_bin = new BN(vParameter.volatilityAccumulator)\n .mul(new BN(binStep))\n .pow(new BN(2));\n const v_fee = new BN(sParameter.variableFeeControl).mul(square_vfa_bin);\n\n return v_fee.add(new BN(99_999_999_999)).div(new BN(100_000_000_000));\n }\n return new BN(0);\n}\n\nexport function getTotalFee(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters\n) {\n const totalFee = getBaseFee(binStep, sParameter).add(\n getVariableFee(binStep, sParameter, vParameter)\n );\n return totalFee.gt(MAX_FEE_RATE) ? MAX_FEE_RATE : totalFee;\n}\n\nexport function computeFee(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n inAmount: BN\n) {\n const totalFee = getTotalFee(binStep, sParameter, vParameter);\n const denominator = FEE_PRECISION.sub(totalFee);\n\n return inAmount\n .mul(totalFee)\n .add(denominator)\n .sub(new BN(1))\n .div(denominator);\n}\n\nexport function computeFeeFromAmount(\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n inAmountWithFees: BN\n) {\n const totalFee = getTotalFee(binStep, sParameter, vParameter);\n return inAmountWithFees\n .mul(totalFee)\n .add(FEE_PRECISION.sub(new BN(1)))\n .div(FEE_PRECISION);\n}\n\nexport function computeProtocolFee(feeAmount: BN, sParameter: sParameters) {\n return feeAmount\n .mul(new BN(sParameter.protocolShare))\n .div(new BN(BASIS_POINT_MAX));\n}\n\nexport function swapExactOutQuoteAtBin(\n bin: Bin,\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n outAmount: BN,\n swapForY: boolean\n): {\n amountIn: BN;\n amountOut: BN;\n fee: BN;\n protocolFee: BN;\n} {\n if (swapForY && bin.amountY.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n if (!swapForY && bin.amountX.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n let maxAmountOut: BN;\n let maxAmountIn: BN;\n\n if (swapForY) {\n maxAmountOut = bin.amountY;\n maxAmountIn = shlDiv(bin.amountY, bin.price, SCALE_OFFSET, Rounding.Up);\n } else {\n maxAmountOut = bin.amountX;\n maxAmountIn = mulShr(bin.amountX, bin.price, SCALE_OFFSET, Rounding.Up);\n }\n\n if (outAmount.gte(maxAmountOut)) {\n const maxFee = computeFee(binStep, sParameter, vParameter, maxAmountIn);\n const protocolFee = computeProtocolFee(maxFee, sParameter);\n return {\n amountIn: maxAmountIn,\n amountOut: maxAmountOut,\n fee: maxFee,\n protocolFee,\n };\n } else {\n const amountIn = getAmountIn(outAmount, bin.price, swapForY);\n const fee = computeFee(binStep, sParameter, vParameter, amountIn);\n const protocolFee = computeProtocolFee(fee, sParameter);\n return {\n amountIn,\n amountOut: outAmount,\n fee,\n protocolFee,\n };\n }\n}\n\nexport function swapExactInQuoteAtBin(\n bin: Bin,\n binStep: number,\n sParameter: sParameters,\n vParameter: vParameters,\n inAmount: BN,\n swapForY: boolean\n): {\n amountIn: BN;\n amountOut: BN;\n fee: BN;\n protocolFee: BN;\n} {\n if (swapForY && bin.amountY.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n if (!swapForY && bin.amountX.isZero()) {\n return {\n amountIn: new BN(0),\n amountOut: new BN(0),\n fee: new BN(0),\n protocolFee: new BN(0),\n };\n }\n\n let maxAmountOut: BN;\n let maxAmountIn: BN;\n\n if (swapForY) {\n maxAmountOut = bin.amountY;\n maxAmountIn = shlDiv(bin.amountY, bin.price, SCALE_OFFSET, Rounding.Up);\n } else {\n maxAmountOut = bin.amountX;\n maxAmountIn = mulShr(bin.amountX, bin.price, SCALE_OFFSET, Rounding.Up);\n }\n\n const maxFee = computeFee(binStep, sParameter, vParameter, maxAmountIn);\n maxAmountIn = maxAmountIn.add(maxFee);\n\n let amountInWithFees: BN;\n let amountOut: BN;\n let fee: BN;\n let protocolFee: BN;\n\n if (inAmount.gt(maxAmountIn)) {\n amountInWithFees = maxAmountIn;\n amountOut = maxAmountOut;\n fee = maxFee;\n protocolFee = computeProtocolFee(maxFee, sParameter);\n } else {\n fee = computeFeeFromAmount(binStep, sParameter, vParameter, inAmount);\n const amountInAfterFee = inAmount.sub(fee);\n const computedOutAmount = getOutAmount(bin, amountInAfterFee, swapForY);\n\n amountOut = computedOutAmount.gt(maxAmountOut)\n ? maxAmountOut\n : computedOutAmount;\n protocolFee = computeProtocolFee(fee, sParameter);\n amountInWithFees = inAmount;\n }\n\n return {\n amountIn: amountInWithFees,\n amountOut,\n fee,\n protocolFee,\n };\n}\n\nfunction getAmountIn(amountOut: BN, price: BN, swapForY: Boolean): BN {\n if (swapForY) {\n return shlDiv(amountOut, price, SCALE_OFFSET, Rounding.Up);\n } else {\n return mulShr(amountOut, price, SCALE_OFFSET, Rounding.Up);\n }\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport { StrategyType, StrategyParameters } from \"../types\";\nimport {\n autoFillXByWeight,\n autoFillYByWeight,\n toAmountAskSide,\n toAmountBidSide,\n toAmountBothSide,\n} from \"./weightToAmounts\";\nimport Decimal from \"decimal.js\";\nconst DEFAULT_MAX_WEIGHT = 2000;\nconst DEFAULT_MIN_WEIGHT = 200;\n\nfunction toWeightSpotBalanced(\n minBinId: number,\n maxBinId: number\n): {\n binId: number;\n weight: number;\n}[] {\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: 1,\n });\n }\n return distributions;\n}\n\nfunction toWeightDecendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number;\n weight: number;\n}[] {\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: maxBinId - i + 1,\n });\n }\n return distributions;\n}\n\nfunction toWeightAscendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number;\n weight: number;\n}[] {\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: i - minBinId + 1,\n });\n }\n return distributions;\n}\n\nfunction toWeightCurve(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number;\n weight: number;\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw \"Invalid strategy params\";\n }\n let maxWeight = DEFAULT_MAX_WEIGHT;\n let minWeight = DEFAULT_MIN_WEIGHT;\n\n let diffWeight = maxWeight - minWeight;\n let diffMinWeight =\n activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0;\n let diffMaxWeight =\n maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0;\n\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (activeId - i) * diffMinWeight,\n });\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (i - activeId) * diffMaxWeight,\n });\n } else {\n distributions.push({\n binId: i,\n weight: maxWeight,\n });\n }\n }\n return distributions;\n}\n\nfunction toWeightBidAsk(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number;\n weight: number;\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw \"Invalid strategy params\";\n }\n let maxWeight = DEFAULT_MAX_WEIGHT;\n let minWeight = DEFAULT_MIN_WEIGHT;\n\n let diffWeight = maxWeight - minWeight;\n let diffMinWeight =\n activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0;\n let diffMaxWeight =\n maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0;\n\n let distributions = [];\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (activeId - i) * diffMinWeight,\n });\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (i - activeId) * diffMaxWeight,\n });\n } else {\n distributions.push({\n binId: i,\n weight: minWeight,\n });\n }\n }\n return distributions;\n}\n\nexport function toAmountsBothSideByStrategy(\n activeId: number,\n binStep: number,\n minBinId: number,\n maxBinId: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n strategyType: StrategyType\n): {\n binId: number;\n amountX: BN;\n amountY: BN;\n}[] {\n const isSingleSideX = amountY.isZero();\n switch (strategyType) {\n case StrategyType.Spot: {\n if (activeId < minBinId || activeId > maxBinId) {\n const weights = toWeightSpotBalanced(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n const amountsInBin = [];\n if (!isSingleSideX) {\n if (minBinId <= activeId) {\n const weights = toWeightSpotBalanced(minBinId, activeId);\n const amounts = toAmountBidSide(activeId, amountY, weights);\n\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId < maxBinId) {\n const weights = toWeightSpotBalanced(activeId + 1, maxBinId);\n const amounts = toAmountAskSide(activeId, binStep, amountX, weights);\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n } else {\n if (minBinId < activeId) {\n const weights = toWeightSpotBalanced(minBinId, activeId - 1);\n const amountsIntoBidSide = toAmountBidSide(\n activeId,\n amountY,\n weights\n );\n for (let bin of amountsIntoBidSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId <= maxBinId) {\n const weights = toWeightSpotBalanced(activeId, maxBinId);\n const amountsIntoAskSide = toAmountAskSide(\n activeId,\n binStep,\n amountX,\n weights\n );\n for (let bin of amountsIntoAskSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n }\n return amountsInBin;\n }\n case StrategyType.Curve: {\n // ask side\n if (activeId < minBinId) {\n let weights = toWeightDecendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n // bid side\n if (activeId > maxBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n const amountsInBin = [];\n if (!isSingleSideX) {\n if (minBinId <= activeId) {\n const weights = toWeightAscendingOrder(minBinId, activeId);\n const amounts = toAmountBidSide(activeId, amountY, weights);\n\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId < maxBinId) {\n const weights = toWeightDecendingOrder(activeId + 1, maxBinId);\n const amounts = toAmountAskSide(activeId, binStep, amountX, weights);\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n } else {\n if (minBinId < activeId) {\n const weights = toWeightAscendingOrder(minBinId, activeId - 1);\n const amountsIntoBidSide = toAmountBidSide(\n activeId,\n amountY,\n weights\n );\n for (let bin of amountsIntoBidSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId <= maxBinId) {\n const weights = toWeightDecendingOrder(activeId, maxBinId);\n const amountsIntoAskSide = toAmountAskSide(\n activeId,\n binStep,\n amountX,\n weights\n );\n for (let bin of amountsIntoAskSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n }\n return amountsInBin;\n }\n case StrategyType.BidAsk: {\n // ask side\n if (activeId < minBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n // bid side\n if (activeId > maxBinId) {\n const weights = toWeightDecendingOrder(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n const amountsInBin = [];\n if (!isSingleSideX) {\n if (minBinId <= activeId) {\n const weights = toWeightDecendingOrder(minBinId, activeId);\n const amounts = toAmountBidSide(activeId, amountY, weights);\n\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId < maxBinId) {\n const weights = toWeightAscendingOrder(activeId + 1, maxBinId);\n const amounts = toAmountAskSide(activeId, binStep, amountX, weights);\n for (let bin of amounts) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n } else {\n if (minBinId < activeId) {\n const weights = toWeightDecendingOrder(minBinId, activeId - 1);\n const amountsIntoBidSide = toAmountBidSide(\n activeId,\n amountY,\n weights\n );\n for (let bin of amountsIntoBidSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n });\n }\n }\n if (activeId <= maxBinId) {\n const weights = toWeightAscendingOrder(activeId, maxBinId);\n const amountsIntoAskSide = toAmountAskSide(\n activeId,\n binStep,\n amountX,\n weights\n );\n for (let bin of amountsIntoAskSide) {\n amountsInBin.push({\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n });\n }\n }\n }\n return amountsInBin;\n }\n case StrategyType.Spot: {\n let weights = toWeightSpotBalanced(minBinId, maxBinId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.Curve: {\n let weights = toWeightCurve(minBinId, maxBinId, activeId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.BidAsk: {\n let weights = toWeightBidAsk(minBinId, maxBinId, activeId);\n return toAmountBothSide(\n activeId,\n binStep,\n amountX,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n }\n}\n\n// only apply for\nexport function autoFillYByStrategy(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n let weights = toWeightSpotBalanced(minBinId, maxBinId);\n return autoFillYByWeight(\n activeId,\n binStep,\n amountX,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.Curve: {\n let weights = toWeightCurve(minBinId, maxBinId, activeId);\n return autoFillYByWeight(\n activeId,\n binStep,\n amountX,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.BidAsk: {\n let weights = toWeightBidAsk(minBinId, maxBinId, activeId);\n return autoFillYByWeight(\n activeId,\n binStep,\n amountX,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n }\n}\n\n// only apply for balanced deposit\nexport function autoFillXByStrategy(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n let weights = toWeightSpotBalanced(minBinId, maxBinId);\n return autoFillXByWeight(\n activeId,\n binStep,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.Curve: {\n let weights = toWeightCurve(minBinId, maxBinId, activeId);\n return autoFillXByWeight(\n activeId,\n binStep,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n case StrategyType.BidAsk: {\n let weights = toWeightBidAsk(minBinId, maxBinId, activeId);\n return autoFillXByWeight(\n activeId,\n binStep,\n amountY,\n amountXInActiveBin,\n amountYInActiveBin,\n weights\n );\n }\n }\n}\n\n// this this function to convert correct type for program\nexport function toStrategyParameters({\n maxBinId,\n minBinId,\n strategyType,\n singleSidedX,\n}: StrategyParameters) {\n const parameters = [singleSidedX ? 1 : 0, ...new Array<number>(63).fill(0)];\n switch (strategyType) {\n case StrategyType.Spot: {\n return {\n minBinId,\n maxBinId,\n strategyType: { spotImBalanced: {} },\n parameteres: Buffer.from(parameters).toJSON().data,\n };\n }\n case StrategyType.Curve: {\n return {\n minBinId,\n maxBinId,\n strategyType: { curveImBalanced: {} },\n parameteres: Buffer.from(parameters).toJSON().data,\n };\n }\n case StrategyType.BidAsk: {\n return {\n minBinId,\n maxBinId,\n strategyType: { bidAskImBalanced: {} },\n parameteres: Buffer.from(parameters).toJSON().data,\n };\n }\n }\n}\n","import { AnchorProvider, Program } from \"@coral-xyz/anchor\";\nimport { Cluster, Connection, PublicKey } from \"@solana/web3.js\";\nimport { IDL } from \"../idl\";\nimport { LBCLMM_PROGRAM_IDS } from \"../constants\";\n\n/**\n * It fetches the pool account from the AMM program, and returns the mint addresses for the two tokens\n * @param {Connection} connection - Connection - The connection to the Solana cluster\n * @param {string} poolAddress - The address of the pool account.\n * @returns The tokenAMint and tokenBMint addresses for the pool.\n */\nexport async function getTokensMintFromPoolAddress(\n connection: Connection,\n poolAddress: string,\n opt?: {\n cluster?: Cluster;\n }\n) {\n const provider = new AnchorProvider(\n connection,\n {} as any,\n AnchorProvider.defaultOptions()\n );\n const program = new Program(\n IDL,\n LBCLMM_PROGRAM_IDS[opt?.cluster ?? \"mainnet-beta\"],\n provider\n );\n\n const poolAccount = await program.account.lbPair.fetchNullable(\n new PublicKey(poolAddress)\n );\n\n if (!poolAccount) throw new Error(\"Pool account not found\");\n\n return {\n tokenXMint: poolAccount.tokenXMint,\n tokenYMint: poolAccount.tokenYMint,\n };\n}\n","import { DLMM } from \"./dlmm\";\n\nexport default DLMM;\nexport * from \"./dlmm/helpers\";\nexport * from \"./dlmm/types\";\nexport * from \"./dlmm/error\";\nexport * from \"./dlmm/constants\";\nexport * from \"./dlmm/idl\";\n"]}
|