@meteora-ag/cp-amm-sdk 1.2.2 → 1.2.4
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.mts +110 -5
- package/dist/index.d.ts +110 -5
- package/dist/index.js +252 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +254 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/dann/Documents/GitHub/damm-v2-sdk/dist/index.js","../src/CpAmm.ts","../src/idl/cp_amm.json","../src/types.ts","../src/pda.ts","../src/constants.ts","../src/helpers/token.ts","../src/helpers/computeUnits.ts","../src/helpers/utils.ts","../src/helpers/accountFilters.ts","../src/helpers/token2022.ts","../src/helpers/vestings.ts","../src/helpers/validation.ts","../src/math/poolFees/baseFee.ts","../src/math/poolFees/rateLimiter.ts","../src/math/feeMath.ts","../src/math/utilsMath.ts","../src/math/poolFees/feeScheduler.ts","../src/math/poolFees/dynamicFee.ts","../src/math/quote.ts","../src/math/curve.ts","../src/math/priceMath.ts","../src/helpers/common.ts"],"names":["Rounding","ActivationPoint","BaseFeeMode","CollectFeeMode","TradeDirection","ActivationType","PoolVersion","PoolStatus","SwapMode","PublicKey","BN","Decimal","hasPartner","tradeFeeNumerator","min","NATIVE_MINT"],"mappings":"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A,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AAED,MAAA;AACC,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AAED,MAAA;AACL,IAAA;AAAA,EAAA;AAEM,EAAA;AAAwD,IAAA;AACtD,MAAA;AACJ,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACE,MAAA;AAEG,MAAA;AAGH,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AAED,MAAA;AACL,IAAA;AAAA,EAAA;AACF;ADyoSe;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/dann/Documents/GitHub/damm-v2-sdk/dist/index.js","sourcesContent":[null,"import { Program } from \"@coral-xyz/anchor\";\nimport { NATIVE_MINT, TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport invariant from \"invariant\";\n\nimport CpAmmIDL from \"./idl/cp_amm.json\";\nimport type { CpAmm as CpAmmTypes } from \"./idl/cp_amm\";\nimport {\n Connection,\n Transaction,\n PublicKey,\n TransactionInstruction,\n SystemProgram,\n AccountMeta,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n} from \"@solana/web3.js\";\nimport {\n AddLiquidityParams,\n AmmProgram,\n BuildAddLiquidityParams,\n BuildLiquidatePositionInstructionParams,\n BuildRemoveAllLiquidityInstructionParams,\n ClaimPartnerFeeParams,\n ClaimPositionFeeInstructionParams,\n ClaimPositionFeeParams,\n ClaimPositionFeeParams2,\n ClaimRewardParams,\n ClosePositionInstructionParams,\n ClosePositionParams,\n ConfigState,\n CreatePoolParams,\n CreatePositionAndAddLiquidity,\n CreatePositionParams,\n DepositQuote,\n FundRewardParams,\n GetDepositQuoteParams,\n GetQuoteParams,\n GetWithdrawQuoteParams,\n InitializeCustomizeablePoolParams,\n InitializeCustomizeablePoolWithDynamicConfigParams,\n LiquidityDeltaParams,\n LockPositionParams,\n MergePositionParams,\n PermanentLockParams,\n PoolState,\n PositionState,\n PrepareCustomizablePoolParams,\n PreparedPoolCreation,\n PreparePoolCreationParams,\n PreparePoolCreationSingleSide,\n PrepareTokenAccountParams,\n RefreshVestingParams,\n RemoveAllLiquidityAndClosePositionParams,\n RemoveAllLiquidityParams,\n RemoveLiquidityParams,\n Rounding,\n SetupFeeClaimAccountsParams,\n SwapParams,\n TradeDirection,\n TxBuilder,\n UpdateRewardDurationParams,\n UpdateRewardFunderParams,\n VestingState,\n WithdrawIneligibleRewardParams,\n WithdrawQuote,\n SplitPositionParams,\n SplitPosition2Params,\n Quote2Result,\n Swap2Params,\n SwapMode,\n GetQuote2Params,\n} from \"./types\";\nimport {\n deriveCustomizablePoolAddress,\n derivePoolAddress,\n derivePoolAuthority,\n derivePositionAddress,\n derivePositionNftAccount,\n deriveTokenBadgeAddress,\n deriveTokenVaultAddress,\n} from \"./pda\";\n\nimport {\n getOrCreateATAInstruction,\n getTokenProgram,\n unwrapSOLInstruction,\n wrapSOLInstruction,\n positionByPoolFilter,\n vestingByPositionFilter,\n calculateTransferFeeExcludedAmount,\n calculateTransferFeeIncludedAmount,\n getAvailableVestingLiquidity,\n isVestingComplete,\n getAllPositionNftAccountByOwner,\n parseRateLimiterSecondFactor,\n getCurrentPoint,\n} from \"./helpers\";\nimport BN, { min, max } from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport {\n calculateInitSqrtPrice,\n getAmountAFromLiquidityDelta,\n getAmountBFromLiquidityDelta,\n getLiquidityDeltaFromAmountA,\n getLiquidityDeltaFromAmountB,\n isRateLimiterApplied,\n swapQuoteExactInput,\n swapQuoteExactOutput,\n swapQuotePartialInput,\n} from \"./math\";\n\n/**\n * CpAmm SDK class to interact with the DAMM-V2\n */\nexport class CpAmm {\n _program: AmmProgram;\n private poolAuthority: PublicKey;\n constructor(connection: Connection) {\n this._program = new Program(CpAmmIDL as CpAmmTypes, {\n connection: connection,\n });\n this.poolAuthority = derivePoolAuthority();\n }\n\n //// ANCHOR: PRIVATE FUNCTIONS //////\n /**\n * Prepares token accounts for a transaction by retrieving or creating associated token accounts.\n * @private\n * @param {PublicKey} owner - The owner of the token accounts\n * @param {PublicKey} tokenAMint - Mint address of token A\n * @param {PublicKey} tokenBMint - Mint address of token B\n * @param {PublicKey} tokenAProgram - Program ID for token A (Token or Token2022)\n * @param {PublicKey} tokenBProgram - Program ID for token B (Token or Token2022)\n * @returns {Promise<{tokenAAta: PublicKey, tokenBAta: PublicKey, instructions: TransactionInstruction[]}>}\n * The token account addresses and any instructions needed to create them\n */\n private async prepareTokenAccounts(\n params: PrepareTokenAccountParams\n ): Promise<{\n tokenAAta: PublicKey;\n tokenBAta: PublicKey;\n instructions: TransactionInstruction[];\n }> {\n const {\n payer,\n tokenAOwner,\n tokenBOwner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n const instructions: TransactionInstruction[] = [];\n const [\n { ataPubkey: tokenAAta, ix: createInputTokenAccountIx },\n { ataPubkey: tokenBAta, ix: createOutputTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this._program.provider.connection,\n tokenAMint,\n tokenAOwner,\n payer,\n true,\n tokenAProgram\n ),\n getOrCreateATAInstruction(\n this._program.provider.connection,\n tokenBMint,\n tokenBOwner,\n payer,\n true,\n tokenBProgram\n ),\n ]);\n createInputTokenAccountIx && instructions.push(createInputTokenAccountIx);\n createOutputTokenAccountIx && instructions.push(createOutputTokenAccountIx);\n\n return { tokenAAta, tokenBAta, instructions };\n }\n\n /**\n * Derives token badge account metadata\n * @param tokenAMint - Public key of token A mint\n * @param tokenBMint - Public key of token B mint\n * @returns Array of account metadata for token badges\n */\n private getTokenBadgeAccounts(\n tokenAMint: PublicKey,\n tokenBMint: PublicKey\n ): AccountMeta[] {\n return [\n {\n pubkey: deriveTokenBadgeAddress(tokenAMint),\n isWritable: false,\n isSigner: false,\n },\n {\n pubkey: deriveTokenBadgeAddress(tokenBMint),\n isWritable: false,\n isSigner: false,\n },\n ];\n }\n\n /**\n * Builds an instruction to add liquidity to a position.\n * @private\n * @param {BuildAddLiquidityParams} params - Parameters for adding liquidity\n * @returns {Promise<TransactionInstruction>} Instruction to add liquidity\n */\n private async buildAddLiquidityInstruction(\n params: BuildAddLiquidityParams\n ): Promise<TransactionInstruction> {\n const {\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n } = params;\n return await this._program.methods\n .addLiquidity({\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n })\n .accountsPartial({\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to remove all liquidity from a position.\n * @private\n * @param {BuildRemoveAllLiquidityInstructionParams} params - Parameters for removing all liquidity\n * @returns {Promise<TransactionInstruction>} Instruction to remove all liquidity\n */\n private async buildRemoveAllLiquidityInstruction(\n params: BuildRemoveAllLiquidityInstructionParams\n ): Promise<TransactionInstruction> {\n const {\n poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n } = params;\n return await this._program.methods\n .removeAllLiquidity(tokenAAmountThreshold, tokenBAmountThreshold)\n .accountsPartial({\n poolAuthority,\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to claim fees accumulated by a position.\n * @private\n * @param {ClaimPositionFeeInstructionParams} params - Parameters for claiming position fees\n * @returns {Promise<TransactionInstruction>} Instruction to claim position fees\n */\n private async buildClaimPositionFeeInstruction(\n params: ClaimPositionFeeInstructionParams\n ): Promise<TransactionInstruction> {\n const {\n owner,\n poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n return await this._program.methods\n .claimPositionFee()\n .accountsPartial({\n poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to close a position.\n * @private\n * @param {ClosePositionInstructionParams} params - Parameters for closing a position\n * @returns {Promise<TransactionInstruction>} Instruction to close the position\n */\n private async buildClosePositionInstruction(\n params: ClosePositionInstructionParams\n ): Promise<TransactionInstruction> {\n const {\n owner,\n poolAuthority,\n pool,\n position,\n positionNftAccount,\n positionNftMint,\n } = params;\n\n return await this._program.methods\n .closePosition()\n .accountsPartial({\n positionNftMint,\n positionNftAccount,\n pool,\n position,\n poolAuthority,\n rentReceiver: owner,\n owner,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to refresh vesting for a position\n * @param params Parameters required for the refresh vesting instruction\n * @returns Transaction instruction or null if no vestings to refresh\n */\n private async buildRefreshVestingInstruction(\n params: RefreshVestingParams\n ): Promise<TransactionInstruction | null> {\n const { owner, position, positionNftAccount, pool, vestingAccounts } =\n params;\n\n if (vestingAccounts.length == 0) {\n return null;\n }\n\n return await this._program.methods\n .refreshVesting()\n .accountsPartial({\n position,\n positionNftAccount,\n pool,\n owner,\n })\n .remainingAccounts(\n vestingAccounts.map((pubkey: PublicKey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n })\n )\n .instruction();\n }\n\n /**\n * Helper function that builds instructions to claim fees, remove liquidity, and close a position\n * @param {BuildLiquidatePositionInstructionParams} params - Parameters for liquidating a position\n * @returns {Promise<TransactionInstruction[]>} Array of instructions\n * @private\n */\n private async buildLiquidatePositionInstruction(\n params: BuildLiquidatePositionInstructionParams\n ): Promise<TransactionInstruction[]> {\n const {\n owner,\n position,\n positionNftAccount,\n positionState,\n poolState,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n } = params;\n\n const { nftMint: positionNftMint, pool } = positionState;\n const { tokenAMint, tokenBMint, tokenAVault, tokenBVault } = poolState;\n\n const tokenAProgram = getTokenProgram(poolState.tokenAFlag);\n const tokenBProgram = getTokenProgram(poolState.tokenBFlag);\n\n const instructions: TransactionInstruction[] = [];\n\n // 1. claim position fee\n const claimPositionFeeInstruction =\n await this.buildClaimPositionFeeInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n instructions.push(claimPositionFeeInstruction);\n\n // 2. remove all liquidity\n const removeAllLiquidityInstruction =\n await this.buildRemoveAllLiquidityInstruction({\n poolAuthority: this.poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n });\n instructions.push(removeAllLiquidityInstruction);\n // 3. close position\n const closePositionInstruction = await this.buildClosePositionInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftMint,\n positionNftAccount,\n });\n instructions.push(closePositionInstruction);\n\n return instructions;\n }\n\n /**\n * Builds a instruction to create a position.\n * @param {CreatePositionParams} params - Parameters for position creation.\n * @returns Transaction instruction.\n */\n private async buildCreatePositionInstruction(\n params: CreatePositionParams\n ): Promise<{\n ix: TransactionInstruction;\n position: PublicKey;\n positionNftAccount: PublicKey;\n }> {\n const { owner, payer, pool, positionNft } = params;\n\n const position = derivePositionAddress(positionNft);\n const positionNftAccount = derivePositionNftAccount(positionNft);\n\n const ix = await this._program.methods\n .createPosition()\n .accountsPartial({\n owner,\n positionNftMint: positionNft,\n poolAuthority: this.poolAuthority,\n positionNftAccount,\n payer: payer,\n pool,\n position,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n\n return {\n ix,\n position,\n positionNftAccount,\n };\n }\n\n /**\n * Private helper method to prepare common customizable pool creation logic\n * @param {PrepareCustomizablePoolParams} params - Common parameters for pool creation\n * @returns Prepared transaction data including instructions and accounts\n */\n private async prepareCreatePoolParams(params: PrepareCustomizablePoolParams) {\n const {\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const position = derivePositionAddress(positionNft);\n const positionNftAccount = derivePositionNftAccount(positionNft);\n\n const tokenAVault = deriveTokenVaultAddress(tokenAMint, pool);\n const tokenBVault = deriveTokenVaultAddress(tokenBMint, pool);\n\n const {\n tokenAAta: payerTokenA,\n tokenBAta: payerTokenB,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner: payer,\n tokenBOwner: payer,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n payerTokenA,\n BigInt(tokenAAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n payerTokenB,\n BigInt(tokenBAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n const tokenBadgeAccounts = this.getTokenBadgeAccounts(\n tokenAMint,\n tokenBMint\n );\n\n return {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n };\n }\n\n /**\n * Sets up token accounts and instructions for fee claim operations.\n * @private\n * @param {SetupFeeClaimAccountsParams} params - Parameters for setting up fee claim accounts.\n * @returns Token accounts and instructions for fee claiming.\n */\n private async setupFeeClaimAccounts(\n params: SetupFeeClaimAccountsParams\n ): Promise<{\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n preInstructions: TransactionInstruction[];\n postInstructions: TransactionInstruction[];\n }> {\n const {\n payer,\n owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n receiver,\n tempWSolAccount,\n } = params;\n\n const tokenAIsSOL = tokenAMint.equals(NATIVE_MINT);\n const tokenBIsSOL = tokenBMint.equals(NATIVE_MINT);\n const hasSolToken = tokenAIsSOL || tokenBIsSOL;\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: TransactionInstruction[] = [];\n let tokenAAccount: PublicKey;\n let tokenBAccount: PublicKey;\n\n let tokenAOwner = owner;\n let tokenBOwner = owner;\n if (receiver) {\n tokenAOwner = tokenAIsSOL ? tempWSolAccount : receiver;\n tokenBOwner = tokenBIsSOL ? tempWSolAccount : receiver;\n }\n\n const { tokenAAta, tokenBAta, instructions } =\n await this.prepareTokenAccounts({\n payer,\n tokenAOwner,\n tokenBOwner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n tokenAAccount = tokenAAta;\n tokenBAccount = tokenBAta;\n preInstructions.push(...instructions);\n\n if (hasSolToken) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(\n tempWSolAccount ?? owner,\n receiver ?? owner\n );\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n return {\n tokenAAccount,\n tokenBAccount,\n preInstructions,\n postInstructions,\n };\n }\n\n //// ANCHOR: GETTER/FETCHER FUNCTIONS //////\n\n /**\n * Fetches the Config state of the program.\n * @param config - Public key of the config account.\n * @returns Parsed ConfigState.\n */\n async fetchConfigState(config: PublicKey): Promise<ConfigState> {\n const configState = await this._program.account.config.fetchNullable(\n config\n );\n invariant(configState, `Config account: ${config} not found`);\n\n return configState;\n }\n\n /**\n * Fetches the Pool state.\n * @param pool - Public key of the pool.\n * @returns Parsed PoolState.\n */\n async fetchPoolState(pool: PublicKey): Promise<PoolState> {\n const poolState = await this._program.account.pool.fetchNullable(pool);\n invariant(poolState, `Pool account: ${pool} not found`);\n\n return poolState;\n }\n\n /**\n * Fetches the Position state.\n * @param position - Public key of the position.\n * @returns Parsed PositionState.\n */\n async fetchPositionState(position: PublicKey): Promise<PositionState> {\n const positionState = await this._program.account.position.fetchNullable(\n position\n );\n invariant(positionState, `Position account: ${position} not found`);\n\n return positionState;\n }\n\n /**\n * Retrieves all config accounts.\n * @returns Array of config public keys and their states.\n */\n async getAllConfigs(): Promise<\n Array<{ publicKey: PublicKey; account: ConfigState }>\n > {\n const configAccounts = await this._program.account.config.all();\n\n return configAccounts;\n }\n\n /**\n * Retrieves all pool accounts.\n * @returns Array of pool public keys and their states.\n */\n async getAllPools(): Promise<\n Array<{ publicKey: PublicKey; account: PoolState }>\n > {\n const poolAccounts = await this._program.account.pool.all();\n\n return poolAccounts;\n }\n\n /**\n * Retrieves all position accounts.\n * @returns Array of position public keys and their states.\n */\n async getAllPositions(): Promise<\n Array<{\n publicKey: PublicKey;\n account: PositionState;\n }>\n > {\n const poolAccounts = await this._program.account.position.all();\n\n return poolAccounts;\n }\n\n /**\n * Gets all positions a specific pool.\n * @param pool - Public key of the pool.\n * @returns List of user positions for the pool.\n */\n async getAllPositionsByPool(pool: PublicKey): Promise<\n Array<{\n publicKey: PublicKey;\n account: PositionState;\n }>\n > {\n return await this._program.account.position.all([\n positionByPoolFilter(pool),\n ]);\n }\n\n /**\n * Gets all positions of a user for a specific pool.\n * @param pool - Public key of the pool.\n * @param user - Public key of the user.\n * @returns List of user positions for the pool.\n */\n async getUserPositionByPool(\n pool: PublicKey,\n user: PublicKey\n ): Promise<\n Array<{\n positionNftAccount: PublicKey;\n position: PublicKey;\n positionState: PositionState;\n }>\n > {\n const allUserPositions = await this.getPositionsByUser(user);\n return allUserPositions.filter((position) =>\n position.positionState.pool.equals(pool)\n );\n }\n\n /**\n * Gets all positions of a user across all pools.\n * @param user - Public key of the user.\n * @returns Array of user positions already sorted by liquidity\n */\n async getPositionsByUser(user: PublicKey): Promise<\n Array<{\n positionNftAccount: PublicKey;\n position: PublicKey;\n positionState: PositionState;\n }>\n > {\n const userPositionAccounts = await getAllPositionNftAccountByOwner(\n this._program.provider.connection,\n user\n );\n if (userPositionAccounts.length === 0) {\n return [];\n }\n\n const positionAddresses = userPositionAccounts.map((account) =>\n derivePositionAddress(account.positionNft)\n );\n\n const positionStates = await this._program.account.position.fetchMultiple(\n positionAddresses\n );\n const positionResult = userPositionAccounts\n .map((account, index) => {\n const positionState = positionStates[index];\n if (!positionState) return null;\n\n return {\n positionNftAccount: account.positionNftAccount,\n position: positionAddresses[index],\n positionState,\n };\n })\n .filter(Boolean);\n\n // in-place sort\n positionResult.sort((a, b) => {\n const totalLiquidityA = a.positionState.vestedLiquidity\n .add(a.positionState.permanentLockedLiquidity)\n .add(a.positionState.unlockedLiquidity);\n\n const totalLiquidityB = b.positionState.vestedLiquidity\n .add(b.positionState.permanentLockedLiquidity)\n .add(b.positionState.unlockedLiquidity);\n\n return totalLiquidityB.cmp(totalLiquidityA);\n });\n\n return positionResult;\n }\n\n async getAllVestingsByPosition(position: PublicKey): Promise<\n Array<{\n publicKey: PublicKey;\n account: VestingState;\n }>\n > {\n const vestings = await this._program.account.vesting.all([\n vestingByPositionFilter(position),\n ]);\n\n return vestings;\n }\n\n isLockedPosition(position: PositionState): boolean {\n const totalLockedLiquidity = position.vestedLiquidity.add(\n position.permanentLockedLiquidity\n );\n\n return totalLockedLiquidity.gtn(0);\n }\n\n isPermanentLockedPosition(positionState: PositionState): boolean {\n return positionState.permanentLockedLiquidity.gtn(0);\n }\n\n /**\n * Checks if a position can be unlocked based on its locking state and vesting schedules.\n *\n * This method evaluates whether a position is eligible for operations that require\n * unlocked liquidity, such as removing all liquidity or closing the position. It checks both\n * permanent locks and time-based vesting schedules.\n *\n * @private\n * @param {PositionState} positionState - The current state of the position\n * @param {Array<{account: PublicKey; vestingState: VestingState}>} vestings - Array of vesting accounts and their states\n * @param {BN} currentPoint - Current timestamp or slot number (depending on activation type of pool)\n *\n * @returns {Object} Result object containing unlock status and reason\n * @returns {boolean} result.canUnlock - Whether the position can be unlocked\n * @returns {string|undefined} result.reason - Reason why position cannot be unlocked (if applicable)\n */\n canUnlockPosition(\n positionState: PositionState,\n vestings: Array<{ account: PublicKey; vestingState: VestingState }>,\n currentPoint: BN\n ): { canUnlock: boolean; reason?: string } {\n if (vestings.length > 0) {\n // Check if permanently locked\n if (this.isPermanentLockedPosition(positionState)) {\n return {\n canUnlock: false,\n reason: \"Position is permanently locked\",\n };\n }\n\n // Check each vesting\n // We expect that should have only one vesting per position\n for (const vesting of vestings) {\n if (!isVestingComplete(vesting.vestingState, currentPoint)) {\n return {\n canUnlock: false,\n reason: \"Position has incomplete vesting schedule\",\n };\n }\n }\n }\n\n return { canUnlock: true };\n }\n\n async isPoolExist(pool: PublicKey): Promise<boolean> {\n const poolState = await this._program.account.pool.fetchNullable(pool);\n return poolState !== null;\n }\n\n /**\n * Computes the liquidity delta based on the provided token amounts and sqrt price\n *\n * @param {LiquidityDeltaParams} params - The parameters for liquidity calculation\n * @returns {Promise<BN>} - The computed liquidity delta in Q64 value.\n */\n getLiquidityDelta(params: LiquidityDeltaParams): BN {\n const {\n maxAmountTokenA,\n maxAmountTokenB,\n sqrtMaxPrice,\n sqrtMinPrice,\n sqrtPrice,\n } = params;\n\n const liquidityDeltaFromAmountA = getLiquidityDeltaFromAmountA(\n maxAmountTokenA,\n sqrtPrice,\n sqrtMaxPrice\n );\n\n const liquidityDeltaFromAmountB = getLiquidityDeltaFromAmountB(\n maxAmountTokenB,\n sqrtMinPrice,\n sqrtPrice\n );\n\n return min(liquidityDeltaFromAmountA, liquidityDeltaFromAmountB);\n }\n\n /**\n * Calculates swap quote based on input amount and pool state.\n * @param params - Swap parameters including input amount, pool state, slippage, etc.\n * @returns Swap quote including expected output amount, fee, and price impact.\n */\n getQuote(params: GetQuoteParams): {\n swapInAmount: BN;\n consumedInAmount: BN;\n swapOutAmount: BN;\n minSwapOutAmount: BN;\n totalFee: BN;\n priceImpact: Decimal;\n } {\n const {\n inAmount,\n inputTokenMint,\n slippage,\n poolState,\n currentTime,\n currentSlot,\n inputTokenInfo,\n outputTokenInfo,\n tokenADecimal,\n tokenBDecimal,\n hasReferral,\n } = params;\n const { activationType } = poolState;\n\n const aToB = poolState.tokenAMint.equals(inputTokenMint);\n\n // because for a DAMM v2 pool, the activation type can either be slot (0) or timestamp (1).\n // if it is slot, we use the currentSlot from blockchain slot.\n // if it is timestamp, we use the currentTime from blockTime.\n const currentPoint = activationType\n ? new BN(currentTime)\n : new BN(currentSlot);\n\n const swapResult = swapQuoteExactInput(\n poolState,\n currentPoint,\n inAmount,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n\n return {\n swapInAmount: inAmount,\n consumedInAmount: swapResult.includedFeeInputAmount,\n swapOutAmount: swapResult.outputAmount,\n minSwapOutAmount: swapResult.minimumAmountOut,\n totalFee: swapResult.tradingFee\n .add(swapResult.protocolFee)\n .add(swapResult.partnerFee)\n .add(swapResult.referralFee),\n priceImpact: swapResult.priceImpact,\n };\n }\n\n getQuote2(params: GetQuote2Params): Quote2Result {\n const {\n inputTokenMint,\n slippage,\n poolState,\n currentPoint,\n inputTokenInfo,\n outputTokenInfo,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n swapMode,\n } = params;\n\n const aToB = poolState.tokenAMint.equals(inputTokenMint);\n\n switch (swapMode) {\n case SwapMode.ExactIn:\n if (\"amountIn\" in params) {\n return swapQuoteExactInput(\n poolState,\n currentPoint,\n params.amountIn,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n }\n throw new Error(\"amountIn is required for ExactIn swap mode\");\n\n case SwapMode.ExactOut:\n if (\"amountOut\" in params) {\n return swapQuoteExactOutput(\n poolState,\n currentPoint,\n params.amountOut,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n }\n throw new Error(\"outAmount is required for ExactOut swap mode\");\n\n case SwapMode.PartialFill:\n if (\"amountIn\" in params) {\n return swapQuotePartialInput(\n poolState,\n currentPoint,\n params.amountIn,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n }\n throw new Error(\"amountIn is required for PartialFill swap mode\");\n\n default:\n throw new Error(`Unsupported swap mode: ${swapMode}`);\n }\n }\n\n /**\n * Calculates the deposit quote for liquidity pool.\n *\n * @param {GetDepositQuoteParams} params - The parameters for calculating the deposit quote.\n *\n * @returns {Promise<Object>} Deposit quote results\n * @returns {BN} returns.actualInputAmount - The actual amount used as input (after deducting transfer fees).\n * @returns {BN} returns.outputAmount - The calculated corresponding amount of the other token.\n * @returns {BN} returns.liquidityDelta - The amount of liquidity that will be added to the pool.\n */\n getDepositQuote(params: GetDepositQuoteParams): DepositQuote {\n const {\n inAmount,\n isTokenA,\n inputTokenInfo,\n outputTokenInfo,\n minSqrtPrice,\n maxSqrtPrice,\n sqrtPrice,\n } = params;\n\n const actualAmountIn = inputTokenInfo\n ? calculateTransferFeeExcludedAmount(\n inAmount,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount\n : inAmount;\n\n const { liquidityDelta, rawAmount } = isTokenA\n ? {\n liquidityDelta: getLiquidityDeltaFromAmountA(\n actualAmountIn,\n sqrtPrice,\n maxSqrtPrice\n ),\n rawAmount: (delta: BN) =>\n getAmountBFromLiquidityDelta(\n minSqrtPrice,\n sqrtPrice,\n delta,\n Rounding.Up\n ),\n }\n : {\n liquidityDelta: getLiquidityDeltaFromAmountB(\n actualAmountIn,\n minSqrtPrice,\n sqrtPrice\n ),\n rawAmount: (delta: BN) =>\n getAmountAFromLiquidityDelta(\n sqrtPrice,\n maxSqrtPrice,\n delta,\n Rounding.Up\n ),\n };\n\n const rawOutputAmount = new BN(rawAmount(liquidityDelta));\n const outputAmount = outputTokenInfo\n ? calculateTransferFeeIncludedAmount(\n rawOutputAmount,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount\n : rawOutputAmount;\n\n return {\n actualInputAmount: actualAmountIn,\n consumedInputAmount: inAmount,\n liquidityDelta,\n outputAmount,\n };\n }\n\n /**\n * Calculates the withdrawal quote for removing liquidity from a concentrated liquidity pool.\n *\n * @param {GetWithdrawQuoteParams} params - The parameters for calculating the withdraw quote\n *\n * @param {Object|null} params.tokenATokenInfo - must provide if token a is token2022\n * @param {Object|null} params.tokenBTokenInfo - must provide if token b is token2022\n *\n * @returns {Promise<Object>} Withdrawal quote results\n * @returns {BN} returns.liquidityDelta - The amount of liquidity that will be removed from the pool\n * @returns {BN} returns.outAmountA - The calculated amount of token A to be received (after deducting transfer fees)\n * @returns {BN} returns.outAmountB - The calculated amount of token B to be received (after deducting transfer fees)\n */\n getWithdrawQuote(params: GetWithdrawQuoteParams): WithdrawQuote {\n const {\n liquidityDelta,\n sqrtPrice,\n maxSqrtPrice,\n minSqrtPrice,\n tokenATokenInfo,\n tokenBTokenInfo,\n } = params;\n const amountA = getAmountAFromLiquidityDelta(\n sqrtPrice,\n maxSqrtPrice,\n liquidityDelta,\n Rounding.Down\n );\n const amountB = getAmountBFromLiquidityDelta(\n minSqrtPrice,\n sqrtPrice,\n liquidityDelta,\n Rounding.Down\n );\n\n return {\n liquidityDelta,\n outAmountA: tokenATokenInfo\n ? calculateTransferFeeExcludedAmount(\n amountA,\n tokenATokenInfo.mint,\n tokenATokenInfo.currentEpoch\n ).amount\n : amountA,\n outAmountB: tokenBTokenInfo\n ? calculateTransferFeeExcludedAmount(\n amountB,\n tokenBTokenInfo.mint,\n tokenBTokenInfo.currentEpoch\n ).amount\n : amountB,\n };\n }\n\n /**\n * Calculates liquidity and corresponding token amounts for token A single-sided pool creation\n * Only supports initialization where initial price equals min sqrt price\n * @param params Parameters for single-sided pool creation\n * @returns Calculated liquidity delta\n */\n preparePoolCreationSingleSide(params: PreparePoolCreationSingleSide): BN {\n const {\n tokenAAmount,\n initSqrtPrice,\n minSqrtPrice,\n maxSqrtPrice,\n tokenAInfo,\n } = params;\n\n if (!initSqrtPrice.eq(minSqrtPrice)) {\n throw new Error(\"Only support single side for base token.\");\n }\n\n const actualAmountIn = tokenAInfo\n ? tokenAAmount.sub(\n calculateTransferFeeIncludedAmount(\n tokenAAmount,\n tokenAInfo.mint,\n tokenAInfo.currentEpoch\n ).transferFee\n )\n : tokenAAmount;\n\n const liquidityDelta = getLiquidityDeltaFromAmountA(\n actualAmountIn,\n initSqrtPrice,\n maxSqrtPrice\n );\n\n return liquidityDelta;\n }\n\n /**\n * Prepares parameters required for pool creation, including initial sqrt price and liquidity.\n * @private\n * @param {PreparePoolCreationParams} params - Initial token amounts for pool creation.\n * @returns init sqrt price and liquidity in Q64 format.\n */\n preparePoolCreationParams(\n params: PreparePoolCreationParams\n ): PreparedPoolCreation {\n const {\n tokenAAmount,\n tokenBAmount,\n minSqrtPrice,\n maxSqrtPrice,\n tokenAInfo,\n tokenBInfo,\n } = params;\n\n if (tokenAAmount.eq(new BN(0)) && tokenBAmount.eq(new BN(0))) {\n throw new Error(\"Invalid input amount\");\n }\n\n const actualAmountAIn = tokenAInfo\n ? tokenAAmount.sub(\n calculateTransferFeeIncludedAmount(\n tokenAAmount,\n tokenAInfo.mint,\n tokenAInfo.currentEpoch\n ).transferFee\n )\n : tokenAAmount;\n\n const actualAmountBIn = tokenBInfo\n ? tokenBAmount.sub(\n calculateTransferFeeIncludedAmount(\n tokenBAmount,\n tokenBInfo.mint,\n tokenBInfo.currentEpoch\n ).transferFee\n )\n : tokenBAmount;\n\n const initSqrtPrice = calculateInitSqrtPrice(\n tokenAAmount,\n tokenBAmount,\n minSqrtPrice,\n maxSqrtPrice\n );\n\n const liquidityDeltaFromAmountA = getLiquidityDeltaFromAmountA(\n actualAmountAIn,\n initSqrtPrice,\n maxSqrtPrice\n );\n\n const liquidityDeltaFromAmountB = getLiquidityDeltaFromAmountB(\n actualAmountBIn,\n minSqrtPrice,\n initSqrtPrice\n );\n\n const liquidityDelta = min(\n liquidityDeltaFromAmountA,\n liquidityDeltaFromAmountB\n );\n\n return {\n initSqrtPrice,\n liquidityDelta,\n };\n }\n\n //// ANCHOR: MAIN ENDPOINT //////\n /**\n * Builds a transaction to create a permissionless pool.\n * @param params - Parameters for pool creation.\n * @returns Transaction builder.\n */\n async createPool(params: CreatePoolParams): TxBuilder {\n const {\n payer,\n creator,\n config,\n positionNft,\n tokenAMint,\n tokenBMint,\n initSqrtPrice,\n liquidityDelta,\n activationPoint,\n tokenAAmount,\n tokenBAmount,\n tokenAProgram,\n tokenBProgram,\n isLockLiquidity,\n } = params;\n\n const pool = derivePoolAddress(config, tokenAMint, tokenBMint);\n const {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n } = await this.prepareCreatePoolParams({\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstruction: TransactionInstruction[] = [];\n\n if (isLockLiquidity) {\n const permanentLockIx = await this._program.methods\n .permanentLockPosition(liquidityDelta)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: creator,\n })\n .instruction();\n postInstruction.push(permanentLockIx);\n }\n\n const tx = await this._program.methods\n .initializePool({\n liquidity: liquidityDelta,\n sqrtPrice: initSqrtPrice,\n activationPoint: activationPoint,\n })\n .accountsPartial({\n creator,\n positionNftAccount,\n positionNftMint: positionNft,\n payer,\n config,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n tokenAProgram,\n tokenBProgram,\n systemProgram: SystemProgram.programId,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstruction)\n .remainingAccounts(tokenBadgeAccounts)\n .transaction();\n\n return tx;\n }\n\n /**\n * Builds a transaction to create a customizable pool.\n * @param params - Parameters for customizable pool creation.\n * @returns Transaction and related addresses.\n */\n async createCustomPool(params: InitializeCustomizeablePoolParams): Promise<{\n tx: Transaction;\n pool: PublicKey;\n position: PublicKey;\n }> {\n const {\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n sqrtMinPrice,\n sqrtMaxPrice,\n liquidityDelta,\n initSqrtPrice,\n payer,\n creator,\n positionNft,\n poolFees,\n hasAlphaVault,\n collectFeeMode,\n activationPoint,\n activationType,\n tokenAProgram,\n tokenBProgram,\n isLockLiquidity,\n } = params;\n const pool = deriveCustomizablePoolAddress(tokenAMint, tokenBMint);\n const {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n } = await this.prepareCreatePoolParams({\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount: tokenBMint.equals(NATIVE_MINT)\n ? max(tokenBAmount, new BN(1))\n : tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstruction: TransactionInstruction[] = [];\n\n if (isLockLiquidity) {\n const permanentLockIx = await this._program.methods\n .permanentLockPosition(liquidityDelta)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: creator,\n })\n .instruction();\n postInstruction.push(permanentLockIx);\n }\n\n const transaction = await this._program.methods\n .initializeCustomizablePool({\n poolFees,\n sqrtMinPrice,\n sqrtMaxPrice,\n hasAlphaVault,\n liquidity: liquidityDelta,\n sqrtPrice: initSqrtPrice,\n activationType,\n collectFeeMode,\n activationPoint,\n })\n .accountsPartial({\n creator,\n positionNftAccount,\n positionNftMint: positionNft,\n payer: payer,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n tokenAProgram,\n tokenBProgram,\n systemProgram: SystemProgram.programId,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstruction)\n .remainingAccounts(tokenBadgeAccounts)\n .transaction();\n\n return { tx: transaction, pool, position };\n }\n\n async createCustomPoolWithDynamicConfig(\n params: InitializeCustomizeablePoolWithDynamicConfigParams\n ): Promise<{\n tx: Transaction;\n pool: PublicKey;\n position: PublicKey;\n }> {\n const {\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n sqrtMinPrice,\n sqrtMaxPrice,\n liquidityDelta,\n initSqrtPrice,\n payer,\n config,\n poolCreatorAuthority,\n creator,\n positionNft,\n poolFees,\n hasAlphaVault,\n collectFeeMode,\n activationPoint,\n activationType,\n tokenAProgram,\n tokenBProgram,\n isLockLiquidity,\n } = params;\n\n const pool = derivePoolAddress(config, tokenAMint, tokenBMint);\n const {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n } = await this.prepareCreatePoolParams({\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstruction: TransactionInstruction[] = [];\n\n if (isLockLiquidity) {\n const permanentLockIx = await this._program.methods\n .permanentLockPosition(liquidityDelta)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: creator,\n })\n .instruction();\n postInstruction.push(permanentLockIx);\n }\n\n const transaction = await this._program.methods\n .initializePoolWithDynamicConfig({\n poolFees,\n sqrtMinPrice,\n sqrtMaxPrice,\n hasAlphaVault,\n liquidity: liquidityDelta,\n sqrtPrice: initSqrtPrice,\n activationType,\n collectFeeMode,\n activationPoint,\n })\n .accountsPartial({\n creator,\n positionNftAccount,\n positionNftMint: positionNft,\n payer: payer,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n poolCreatorAuthority: poolCreatorAuthority,\n config: config,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n tokenAProgram,\n tokenBProgram,\n systemProgram: SystemProgram.programId,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstruction)\n .remainingAccounts(tokenBadgeAccounts)\n .transaction();\n\n return { tx: transaction, pool, position };\n }\n\n /**\n * Builds a transaction to create a position.\n * @param {CreatePositionParams} params - Parameters for position creation.\n * @returns Transaction builder.\n */\n async createPosition(params: CreatePositionParams): TxBuilder {\n const { ix } = await this.buildCreatePositionInstruction(params);\n return new Transaction().add(ix);\n }\n\n /**\n * Builds a transaction to add liquidity to an existing position.\n * @param {AddLiquidityParams} params - Parameters for adding liquidity.\n * @returns Transaction builder.\n */\n async addLiquidity(params: AddLiquidityParams): TxBuilder {\n const {\n owner,\n pool,\n position,\n positionNftAccount,\n liquidityDelta,\n maxAmountTokenA,\n maxAmountTokenB,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenAAccount,\n BigInt(maxAmountTokenA.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenBAccount,\n BigInt(maxAmountTokenB.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const addLiquidityInstruction = await this.buildAddLiquidityInstruction({\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n addLiquidityInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Creates a new position and add liquidity to position it in a single transaction.\n * Handles both native SOL and other tokens, automatically wrapping/unwrapping SOL as needed.\n *\n * @param {CreatePositionAndAddLiquidity} params - Parameters for creating position and adding liquidity\n *\n * @returns {Transaction} A transaction that creates a position and adds liquidity\n *\n **/\n async createPositionAndAddLiquidity(\n params: CreatePositionAndAddLiquidity\n ): TxBuilder {\n const {\n owner,\n pool,\n positionNft,\n liquidityDelta,\n maxAmountTokenA,\n maxAmountTokenB,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const tokenAVault = deriveTokenVaultAddress(tokenAMint, pool);\n const tokenBVault = deriveTokenVaultAddress(tokenBMint, pool);\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenAAccount,\n BigInt(maxAmountTokenA.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenBAccount,\n BigInt(maxAmountTokenB.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const {\n ix: createPositionIx,\n position,\n positionNftAccount,\n } = await this.buildCreatePositionInstruction({\n owner,\n payer: owner,\n pool,\n positionNft,\n });\n\n const addLiquidityInstruction = await this.buildAddLiquidityInstruction({\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n });\n\n const transaction = new Transaction();\n transaction.add(createPositionIx);\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n addLiquidityInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to remove liquidity from a position.\n * @param {RemoveLiquidityParams} params - Parameters for removing liquidity.\n * @returns Transaction builder.\n */\n async removeLiquidity(params: RemoveLiquidityParams): TxBuilder {\n const {\n owner,\n pool,\n position,\n positionNftAccount,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n vestings,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (vestings.length > 0) {\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position,\n positionNftAccount,\n pool,\n vestingAccounts: vestings.map((item) => item.account),\n });\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n return await this._program.methods\n .removeLiquidity({\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n })\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to remove liquidity from a position.\n * @param {RemoveLiquidityParams} params - Parameters for removing liquidity.\n * @returns Transaction builder.\n */\n async removeAllLiquidity(params: RemoveAllLiquidityParams): TxBuilder {\n const {\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n vestings,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (vestings.length > 0) {\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position,\n positionNftAccount,\n pool,\n vestingAccounts: vestings.map((item) => item.account),\n });\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n const removeAllLiquidityInstruction =\n await this.buildRemoveAllLiquidityInstruction({\n poolAuthority: this.poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n removeAllLiquidityInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to perform a swap in the pool.\n * @param {SwapParams} params - Parameters for swapping tokens.\n * @returns Transaction builder.\n */\n async swap(params: SwapParams): TxBuilder {\n const {\n payer,\n pool,\n inputTokenMint,\n outputTokenMint,\n amountIn,\n minimumAmountOut,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n } = params;\n\n const [inputTokenProgram, outputTokenProgram] = inputTokenMint.equals(\n tokenAMint\n )\n ? [tokenAProgram, tokenBProgram]\n : [tokenBProgram, tokenAProgram];\n\n const tradeDirection = inputTokenMint.equals(tokenAMint)\n ? TradeDirection.AtoB\n : TradeDirection.BtoA;\n\n const {\n tokenAAta: inputTokenAccount,\n tokenBAta: outputTokenAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner: payer,\n tokenBOwner: payer,\n tokenAMint: inputTokenMint,\n tokenBMint: outputTokenMint,\n tokenAProgram: inputTokenProgram,\n tokenBProgram: outputTokenProgram,\n });\n\n if (inputTokenMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n inputTokenAccount,\n BigInt(amountIn.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(payer);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n let { poolState } = params;\n poolState = poolState ?? (await this.fetchPoolState(pool));\n\n const currentPoint = await getCurrentPoint(\n this._program.provider.connection,\n poolState.activationType\n );\n\n const { maxLimiterDuration, maxFeeBps } = parseRateLimiterSecondFactor(\n poolState.poolFees.baseFee.secondFactor\n );\n\n // check if rate limiter is applied\n const rateLimiterApplied = isRateLimiterApplied(\n poolState.poolFees.baseFee.thirdFactor,\n maxLimiterDuration,\n maxFeeBps,\n poolState.poolFees.baseFee.firstFactor,\n currentPoint,\n poolState.activationPoint,\n tradeDirection\n );\n\n // add remaining accounts if rate limiter is applied\n const remainingAccounts = rateLimiterApplied\n ? [\n {\n isSigner: false,\n isWritable: false,\n pubkey: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n ]\n : [];\n\n return await this._program.methods\n .swap({\n amountIn,\n minimumAmountOut,\n })\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n payer,\n inputTokenAccount,\n outputTokenAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n })\n .remainingAccounts(remainingAccounts)\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n async swap2(params: Swap2Params): TxBuilder {\n const {\n payer,\n pool,\n inputTokenMint,\n outputTokenMint,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n swapMode,\n } = params;\n\n const [inputTokenProgram, outputTokenProgram] = inputTokenMint.equals(\n tokenAMint\n )\n ? [tokenAProgram, tokenBProgram]\n : [tokenBProgram, tokenAProgram];\n\n const tradeDirection = inputTokenMint.equals(tokenAMint)\n ? TradeDirection.AtoB\n : TradeDirection.BtoA;\n\n const {\n tokenAAta: inputTokenAccount,\n tokenBAta: outputTokenAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner: payer,\n tokenBOwner: payer,\n tokenAMint: inputTokenMint,\n tokenBMint: outputTokenMint,\n tokenAProgram: inputTokenProgram,\n tokenBProgram: outputTokenProgram,\n });\n\n let amount0: BN;\n let amount1: BN;\n\n if (swapMode === SwapMode.ExactOut) {\n amount0 = params.amountOut;\n amount1 = params.maximumAmountIn;\n } else {\n amount0 = params.amountIn;\n amount1 = params.minimumAmountOut;\n }\n\n if (inputTokenMint.equals(NATIVE_MINT)) {\n const amount =\n swapMode === SwapMode.ExactIn || swapMode === SwapMode.PartialFill\n ? amount0\n : amount1;\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n inputTokenAccount,\n BigInt(amount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(payer);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n let { poolState } = params;\n poolState = poolState ?? (await this.fetchPoolState(pool));\n\n const currentPoint = await getCurrentPoint(\n this._program.provider.connection,\n poolState.activationType\n );\n\n const { maxLimiterDuration, maxFeeBps } = parseRateLimiterSecondFactor(\n poolState.poolFees.baseFee.secondFactor\n );\n\n // check if rate limiter is applied\n const rateLimiterApplied = isRateLimiterApplied(\n poolState.poolFees.baseFee.thirdFactor,\n maxLimiterDuration,\n maxFeeBps,\n poolState.poolFees.baseFee.firstFactor,\n currentPoint,\n poolState.activationPoint,\n tradeDirection\n );\n\n // add remaining accounts if rate limiter is applied\n const remainingAccounts = rateLimiterApplied\n ? [\n {\n isSigner: false,\n isWritable: false,\n pubkey: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n ]\n : [];\n\n return await this._program.methods\n .swap2({\n amount0,\n amount1,\n swapMode,\n })\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n payer,\n inputTokenAccount,\n outputTokenAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n })\n .remainingAccounts(remainingAccounts)\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to lock a position with vesting schedule.\n * @param {LockPositionParams} params - Locking parameters.\n * @returns Transaction builder.\n */\n async lockPosition(params: LockPositionParams): TxBuilder {\n const {\n owner,\n pool,\n payer,\n vestingAccount,\n position,\n positionNftAccount,\n cliffPoint,\n periodFrequency,\n cliffUnlockLiquidity,\n liquidityPerPeriod,\n numberOfPeriod,\n } = params;\n const lockPositionParams = {\n cliffPoint,\n periodFrequency,\n cliffUnlockLiquidity,\n liquidityPerPeriod,\n numberOfPeriod,\n };\n return await this._program.methods\n .lockPosition(lockPositionParams)\n .accountsPartial({\n position,\n positionNftAccount,\n vesting: vestingAccount,\n pool: pool,\n owner: owner,\n payer: payer,\n systemProgram: SystemProgram.programId,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to permanently lock a position.\n * @param {PermanentLockParams} params - Parameters for permanent locking.\n * @returns Transaction builder.\n */\n async permanentLockPosition(params: PermanentLockParams): TxBuilder {\n const { owner, position, positionNftAccount, pool, unlockedLiquidity } =\n params;\n\n return await this._program.methods\n .permanentLockPosition(unlockedLiquidity)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: owner,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to refresh vesting status of a position.\n * @param {RefreshVestingParams} params - Refresh vesting parameters.\n * @returns Transaction builder.\n */\n async refreshVesting(params: RefreshVestingParams): TxBuilder {\n const instruction = await this.buildRefreshVestingInstruction(params);\n\n return new Transaction().add(instruction);\n }\n\n async closePosition(params: ClosePositionParams): TxBuilder {\n const { owner, pool, position, positionNftMint, positionNftAccount } =\n params;\n\n const instruction = await this.buildClosePositionInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftMint,\n positionNftAccount,\n });\n\n return new Transaction().add(instruction);\n }\n\n /**\n * Builds a transaction to remove all liquidity from a position and close it.\n * This combines several operations in a single transaction:\n * 1. Claims any accumulated fees\n * 2. Removes all liquidity\n * 3. Closes the position\n *\n * @param {RemoveAllLiquidityAndClosePositionParams} params - Combined parameters\n * @returns {TxBuilder} Transaction builder with all required instructions\n * @throws {Error} If the position is locked or cannot be closed\n */\n async removeAllLiquidityAndClosePosition(\n params: RemoveAllLiquidityAndClosePositionParams\n ): TxBuilder {\n const {\n owner,\n position,\n positionNftAccount,\n positionState,\n poolState,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n vestings,\n currentPoint,\n } = params;\n\n const { pool } = positionState;\n const { tokenAMint, tokenBMint } = poolState;\n\n const { canUnlock, reason } = this.canUnlockPosition(\n positionState,\n vestings,\n currentPoint\n );\n\n if (!canUnlock) {\n throw new Error(`Cannot remove liquidity: ${reason}`);\n }\n\n const tokenAProgram = getTokenProgram(poolState.tokenAFlag);\n const tokenBProgram = getTokenProgram(poolState.tokenBFlag);\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n // 1. refresh vesting if vesting account provided\n if (vestings.length > 0) {\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position,\n positionNftAccount,\n pool,\n vestingAccounts: vestings.map((item) => item.account),\n });\n\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n const transaction = new Transaction();\n\n if (preInstructions.length > 0) {\n transaction.add(...preInstructions);\n }\n\n // 2. claim fee, remove liquidity and close position\n const liquidatePositionInstructions =\n await this.buildLiquidatePositionInstruction({\n owner,\n position,\n positionNftAccount,\n positionState,\n poolState,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n });\n\n transaction.add(...liquidatePositionInstructions);\n\n if (postInstructions.length > 0) {\n transaction.add(...postInstructions);\n }\n\n return transaction;\n }\n\n /**\n * Builds a transaction to merge liquidity from one position into another.\n * This process:\n * 1. Claims fees from the source position\n * 2. Removes all liquidity from the source position\n * 3. Adds that liquidity to the target position\n * 4. Closes the source position\n *\n * @param {MergePositionParams} params - Parameters for merging positions\n * @returns {TxBuilder} Transaction builder with all required instructions\n * @throws {Error} If either position is locked or incompatible\n */\n async mergePosition(params: MergePositionParams): TxBuilder {\n const {\n owner,\n positionA,\n positionB,\n positionBState,\n poolState,\n positionBNftAccount,\n positionANftAccount,\n tokenAAmountAddLiquidityThreshold,\n tokenBAmountAddLiquidityThreshold,\n tokenAAmountRemoveLiquidityThreshold,\n tokenBAmountRemoveLiquidityThreshold,\n positionBVestings,\n currentPoint,\n } = params;\n\n const { canUnlock, reason } = this.canUnlockPosition(\n positionBState,\n positionBVestings,\n currentPoint\n );\n\n if (!canUnlock) {\n throw new Error(`Cannot remove liquidity: ${reason}`);\n }\n\n const pool = positionBState.pool;\n const { tokenAMint, tokenBMint, tokenAVault, tokenBVault } = poolState;\n\n const tokenAProgram = getTokenProgram(poolState.tokenAFlag);\n const tokenBProgram = getTokenProgram(poolState.tokenBFlag);\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n let positionBLiquidityDelta = positionBState.unlockedLiquidity;\n // 1. refresh vesting position B if vesting account provided\n if (positionBVestings.length > 0) {\n // accumulate all liquidity delta of position b (unlocked + available vesting)\n const totalAvailableVestingLiquidity = positionBVestings.reduce(\n (total, position) => {\n const available = getAvailableVestingLiquidity(\n position.vestingState,\n currentPoint\n );\n return total.add(available);\n },\n new BN(0)\n );\n\n positionBLiquidityDelta = positionBLiquidityDelta.add(\n totalAvailableVestingLiquidity\n );\n\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position: positionB,\n positionNftAccount: positionBNftAccount,\n pool,\n vestingAccounts: positionBVestings.map((item) => item.account),\n });\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n // recalculate liquidity delta\n const tokenAWithdrawAmount = getAmountAFromLiquidityDelta(\n poolState.sqrtPrice,\n poolState.sqrtMaxPrice,\n positionBLiquidityDelta,\n Rounding.Down\n );\n\n const tokenBWithdrawAmount = getAmountBFromLiquidityDelta(\n poolState.sqrtMinPrice,\n poolState.sqrtPrice,\n positionBLiquidityDelta,\n Rounding.Down\n );\n\n const newLiquidityDelta = this.getLiquidityDelta({\n maxAmountTokenA: tokenAWithdrawAmount,\n maxAmountTokenB: tokenBWithdrawAmount,\n sqrtMaxPrice: poolState.sqrtMaxPrice,\n sqrtMinPrice: poolState.sqrtMinPrice,\n sqrtPrice: poolState.sqrtPrice,\n });\n\n const transaction = new Transaction();\n\n if (preInstructions.length > 0) {\n transaction.add(...preInstructions);\n }\n\n // 2. claim fee, remove liquidity and close position\n const liquidatePositionInstructions =\n await this.buildLiquidatePositionInstruction({\n owner,\n position: positionB,\n positionNftAccount: positionBNftAccount,\n positionState: positionBState,\n poolState,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold: tokenAAmountRemoveLiquidityThreshold,\n tokenBAmountThreshold: tokenBAmountRemoveLiquidityThreshold,\n });\n\n transaction.add(...liquidatePositionInstructions);\n\n // 3. add liquidity from position B to positon A\n const addLiquidityInstruction = await this.buildAddLiquidityInstruction({\n pool,\n position: positionA,\n positionNftAccount: positionANftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta: newLiquidityDelta,\n tokenAAmountThreshold: tokenAAmountAddLiquidityThreshold,\n tokenBAmountThreshold: tokenBAmountAddLiquidityThreshold,\n });\n\n transaction.add(addLiquidityInstruction);\n\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && transaction.add(closeWrappedSOLIx);\n }\n\n return transaction;\n }\n\n /**\n * Builds a transaction to update reward duration.\n * @param {UpdateRewardDurationParams} params - Parameters including pool and new duration.\n * @returns Transaction builder.\n */\n async updateRewardDuration(params: UpdateRewardDurationParams): TxBuilder {\n const { pool, admin, rewardIndex, newDuration } = params;\n return await this._program.methods\n .updateRewardDuration(rewardIndex, newDuration)\n .accountsPartial({\n pool,\n signer: admin,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to update reward funder address.\n * @param {UpdateRewardFunderParams} params - Parameters including pool and new funder address.\n * @returns Transaction builder.\n */\n async updateRewardFunder(params: UpdateRewardFunderParams): TxBuilder {\n const { pool, admin, rewardIndex, newFunder } = params;\n return await this._program.methods\n .updateRewardFunder(rewardIndex, newFunder)\n .accountsPartial({\n pool,\n signer: admin,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to fund rewards in a pool.\n * @param {FundRewardParams} params - Funding parameters.\n * @returns Transaction builder.\n */\n async fundReward(params: FundRewardParams): TxBuilder {\n const { rewardIndex, carryForward, pool, funder, amount } = params;\n\n const poolState = await this.fetchPoolState(pool);\n const rewardInfo = poolState.rewardInfos[rewardIndex];\n const { vault, mint } = rewardInfo;\n const tokenProgram = getTokenProgram(rewardIndex);\n\n const preInstructions: TransactionInstruction[] = [];\n\n const { ataPubkey: funderTokenAccount, ix: createFunderTokenAccountIx } =\n await getOrCreateATAInstruction(\n this._program.provider.connection,\n mint,\n funder,\n funder,\n true,\n tokenProgram\n );\n\n createFunderTokenAccountIx &&\n preInstructions.push(createFunderTokenAccountIx);\n\n // TODO: check case reward mint is wSOL && carryForward is true => total amount > amount\n if (mint.equals(NATIVE_MINT) && !amount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n funder,\n funderTokenAccount,\n BigInt(amount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n return await this._program.methods\n .fundReward(rewardIndex, amount, carryForward)\n .accountsPartial({\n pool,\n rewardVault: vault,\n rewardMint: mint,\n funderTokenAccount,\n funder: funder,\n tokenProgram,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to withdraw ineligible rewards from a pool.\n * @param {WithdrawIneligibleRewardParams} params - Parameters for withdrawal.\n * @returns Transaction builder.\n */\n async withdrawIneligibleReward(\n params: WithdrawIneligibleRewardParams\n ): TxBuilder {\n const { rewardIndex, pool, funder } = params;\n const poolState = await this.fetchPoolState(pool);\n\n const rewardInfo = poolState.rewardInfos[rewardIndex];\n const { mint, vault, rewardTokenFlag } = rewardInfo;\n const tokenProgram = getTokenProgram(rewardTokenFlag);\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: TransactionInstruction[] = [];\n const { ataPubkey: funderTokenAccount, ix: createFunderTokenAccountIx } =\n await getOrCreateATAInstruction(\n this._program.provider.connection,\n mint,\n funder,\n funder,\n true,\n tokenProgram\n );\n createFunderTokenAccountIx &&\n preInstructions.push(createFunderTokenAccountIx);\n\n if (mint.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(funder);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n return await this._program.methods\n .withdrawIneligibleReward(rewardIndex)\n .accountsPartial({\n pool,\n rewardVault: vault,\n rewardMint: mint,\n poolAuthority: this.poolAuthority,\n funderTokenAccount,\n funder: funder,\n tokenProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to claim partner fee rewards.\n * @param {ClaimPartnerFeeParams} params - Claim parameters including amounts and partner address.\n * @returns Transaction builder.\n */\n async claimPartnerFee(params: ClaimPartnerFeeParams): TxBuilder {\n const {\n feePayer,\n receiver,\n tempWSolAccount,\n partner,\n pool,\n maxAmountA,\n maxAmountB,\n } = params;\n const poolState = await this.fetchPoolState(pool);\n const {\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAFlag,\n tokenBFlag,\n } = poolState;\n\n const tokenAProgram = getTokenProgram(tokenAFlag);\n const tokenBProgram = getTokenProgram(tokenBFlag);\n\n const payer = feePayer ?? partner;\n const { tokenAAccount, tokenBAccount, preInstructions, postInstructions } =\n await this.setupFeeClaimAccounts({\n payer,\n owner: partner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n receiver,\n tempWSolAccount,\n });\n\n return await this._program.methods\n .claimPartnerFee(maxAmountA, maxAmountB)\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n partner,\n tokenAProgram,\n tokenBProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to claim position fee rewards.\n * @param {ClaimPositionFeeParams} params - Parameters for claiming position fee.\n * @returns Transaction builder.\n */\n async claimPositionFee(params: ClaimPositionFeeParams): TxBuilder {\n const {\n receiver,\n tempWSolAccount,\n feePayer,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const payer = feePayer ?? owner;\n const { tokenAAccount, tokenBAccount, preInstructions, postInstructions } =\n await this.setupFeeClaimAccounts({\n payer,\n owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n receiver,\n tempWSolAccount,\n });\n const claimPositionFeeInstruction =\n await this.buildClaimPositionFeeInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n claimPositionFeeInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to claim position fee rewards.\n * @param {ClaimPositionFeeParams2} params - Parameters for claiming position fee.\n * @returns Transaction builder.\n */\n async claimPositionFee2(params: ClaimPositionFeeParams2): TxBuilder {\n const {\n receiver,\n feePayer,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const payer = feePayer ?? owner;\n\n let tokenAOwner = receiver;\n let tokenBOwner = receiver;\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n tokenAOwner = owner;\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n tokenBOwner = owner;\n }\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstruction,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner,\n tokenBOwner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (tokenAMint.equals(NATIVE_MINT) || tokenBMint.equals(NATIVE_MINT)) {\n // unwarp sol to receiver\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner, receiver);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n const claimPositionFeeInstruction =\n await this.buildClaimPositionFeeInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstruction.length > 0 ? preInstruction : []),\n claimPositionFeeInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to claim reward from a position.\n * @param {ClaimRewardParams} params - Parameters for claiming reward.\n * @returns Transaction builder.\n */\n async claimReward(params: ClaimRewardParams): TxBuilder {\n const {\n feePayer,\n user,\n position,\n positionNftAccount,\n rewardIndex,\n skipReward,\n poolState,\n positionState,\n } = params;\n\n const rewardInfo = poolState.rewardInfos[rewardIndex];\n const tokenProgram = getTokenProgram(rewardInfo.rewardTokenFlag);\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: TransactionInstruction[] = [];\n const { ataPubkey: userTokenAccount, ix: createUserTokenAccountIx } =\n await getOrCreateATAInstruction(\n this._program.provider.connection,\n rewardInfo.mint,\n user,\n feePayer ?? user,\n true,\n tokenProgram\n );\n createUserTokenAccountIx && preInstructions.push(createUserTokenAccountIx);\n\n if (rewardInfo.mint.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n return await this._program.methods\n .claimReward(rewardIndex, skipReward)\n .accountsPartial({\n pool: positionState.pool,\n positionNftAccount,\n rewardVault: rewardInfo.vault,\n rewardMint: rewardInfo.mint,\n poolAuthority: this.poolAuthority,\n position,\n userTokenAccount,\n owner: user,\n tokenProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n async splitPosition(params: SplitPositionParams): TxBuilder {\n const {\n firstPositionOwner,\n secondPositionOwner,\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n permanentLockedLiquidityPercentage,\n unlockedLiquidityPercentage,\n feeAPercentage,\n feeBPercentage,\n reward0Percentage,\n reward1Percentage,\n } = params;\n\n return await this._program.methods\n .splitPosition({\n permanentLockedLiquidityPercentage,\n unlockedLiquidityPercentage,\n feeAPercentage,\n feeBPercentage,\n reward0Percentage,\n reward1Percentage,\n padding: new Array(16).fill(0),\n })\n .accountsPartial({\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n firstOwner: firstPositionOwner,\n secondOwner: secondPositionOwner,\n })\n .transaction();\n }\n\n async splitPosition2(params: SplitPosition2Params): TxBuilder {\n const {\n firstPositionOwner,\n secondPositionOwner,\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n numerator,\n } = params;\n\n return await this._program.methods\n .splitPosition2(numerator)\n .accountsPartial({\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n firstOwner: firstPositionOwner,\n secondOwner: secondPositionOwner,\n })\n .transaction();\n }\n}\n","{\n \"address\": \"cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG\",\n \"metadata\": {\n \"name\": \"cp_amm\",\n \"version\": \"0.1.5\",\n \"spec\": \"0.1.0\",\n \"description\": \"Created with Anchor\"\n },\n \"instructions\": [\n {\n \"name\": \"add_liquidity\",\n \"discriminator\": [\n 181,\n 157,\n 89,\n 67,\n 143,\n 182,\n 52,\n 72\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"AddLiquidityParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"claim_partner_fee\",\n \"discriminator\": [\n 97,\n 206,\n 39,\n 105,\n 94,\n 94,\n 126,\n 148\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The treasury token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The treasury token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"partner\",\n \"signer\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"max_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"max_amount_b\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claim_position_fee\",\n \"discriminator\": [\n 180,\n 38,\n 154,\n 17,\n 133,\n 33,\n 162,\n 211\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"claim_protocol_fee\",\n \"discriminator\": [\n 165,\n 228,\n 133,\n 48,\n 99,\n 249,\n 255,\n 33\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The treasury token a account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 48,\n 9,\n 89,\n 123,\n 106,\n 114,\n 131,\n 251,\n 50,\n 173,\n 254,\n 250,\n 10,\n 80,\n 160,\n 84,\n 143,\n 100,\n 81,\n 249,\n 134,\n 112,\n 30,\n 213,\n 50,\n 166,\n 239,\n 78,\n 53,\n 175,\n 188,\n 85\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The treasury token b account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 48,\n 9,\n 89,\n 123,\n 106,\n 114,\n 131,\n 251,\n 50,\n 173,\n 254,\n 250,\n 10,\n 80,\n 160,\n 84,\n 143,\n 100,\n 81,\n 249,\n 134,\n 112,\n 30,\n 213,\n 50,\n 166,\n 239,\n 78,\n 53,\n 175,\n 188,\n 85\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"claim_fee_operator\",\n \"docs\": [\n \"Claim fee operator\"\n ]\n },\n {\n \"name\": \"operator\",\n \"docs\": [\n \"Operator\"\n ],\n \"signer\": true,\n \"relations\": [\n \"claim_fee_operator\"\n ]\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"max_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"max_amount_b\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claim_reward\",\n \"discriminator\": [\n 149,\n 95,\n 181,\n 242,\n 94,\n 90,\n 158,\n 162\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"docs\": [\n \"The vault token account for reward token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"user_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"skip_reward\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"close_claim_fee_operator\",\n \"discriminator\": [\n 38,\n 134,\n 82,\n 216,\n 95,\n 124,\n 17,\n 99\n ],\n \"accounts\": [\n {\n \"name\": \"claim_fee_operator\",\n \"writable\": true\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"close_config\",\n \"discriminator\": [\n 145,\n 9,\n 72,\n 157,\n 95,\n 125,\n 61,\n 85\n ],\n \"accounts\": [\n {\n \"name\": \"config\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"close_position\",\n \"discriminator\": [\n 123,\n 134,\n 81,\n 0,\n 49,\n 68,\n 98,\n 98\n ],\n \"accounts\": [\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"close_token_badge\",\n \"discriminator\": [\n 108,\n 146,\n 86,\n 110,\n 179,\n 254,\n 10,\n 104\n ],\n \"accounts\": [\n {\n \"name\": \"token_badge\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_claim_fee_operator\",\n \"discriminator\": [\n 169,\n 62,\n 207,\n 107,\n 58,\n 187,\n 162,\n 109\n ],\n \"accounts\": [\n {\n \"name\": \"claim_fee_operator\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 102,\n 95,\n 111,\n 112,\n 101,\n 114,\n 97,\n 116,\n 111,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"operator\"\n }\n ]\n }\n },\n {\n \"name\": \"operator\"\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_config\",\n \"docs\": [\n \"ADMIN FUNCTIONS /////\"\n ],\n \"discriminator\": [\n 201,\n 207,\n 243,\n 114,\n 75,\n 111,\n 47,\n 189\n ],\n \"accounts\": [\n {\n \"name\": \"config\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 111,\n 110,\n 102,\n 105,\n 103\n ]\n },\n {\n \"kind\": \"arg\",\n \"path\": \"index\"\n }\n ]\n }\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"config_parameters\",\n \"type\": {\n \"defined\": {\n \"name\": \"StaticConfigParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_dynamic_config\",\n \"discriminator\": [\n 81,\n 251,\n 122,\n 78,\n 66,\n 57,\n 208,\n 82\n ],\n \"accounts\": [\n {\n \"name\": \"config\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 111,\n 110,\n 102,\n 105,\n 103\n ]\n },\n {\n \"kind\": \"arg\",\n \"path\": \"index\"\n }\n ]\n }\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"config_parameters\",\n \"type\": {\n \"defined\": {\n \"name\": \"DynamicConfigParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_position\",\n \"discriminator\": [\n 48,\n 215,\n 197,\n 153,\n 96,\n 203,\n 180,\n 133\n ],\n \"accounts\": [\n {\n \"name\": \"owner\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the position. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_token_badge\",\n \"discriminator\": [\n 88,\n 206,\n 0,\n 91,\n 60,\n 175,\n 151,\n 118\n ],\n \"accounts\": [\n {\n \"name\": \"token_badge\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 98,\n 97,\n 100,\n 103,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_mint\"\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"fund_reward\",\n \"discriminator\": [\n 188,\n 50,\n 249,\n 165,\n 93,\n 151,\n 38,\n 63\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"writable\": true\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"funder_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"funder\",\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"carry_forward\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"initialize_customizable_pool\",\n \"discriminator\": [\n 20,\n 161,\n 241,\n 24,\n 189,\n 221,\n 180,\n 2\n ],\n \"accounts\": [\n {\n \"name\": \"creator\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the pool. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Initialize an account to store the pool state\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"Token a mint\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"Token b mint\"\n ]\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"Token a vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"Token b vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"payer_token_a\",\n \"docs\": [\n \"payer token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"payer_token_b\",\n \"docs\": [\n \"creator token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_2022_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"InitializeCustomizablePoolParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initialize_pool\",\n \"docs\": [\n \"USER FUNCTIONS ////\"\n ],\n \"discriminator\": [\n 95,\n 180,\n 10,\n 172,\n 84,\n 174,\n 232,\n 40\n ],\n \"accounts\": [\n {\n \"name\": \"creator\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the pool. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"config\",\n \"docs\": [\n \"Which config the pool belongs to.\"\n ]\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Initialize an account to store the pool state\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"Token a mint\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"Token b mint\"\n ]\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"Token a vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"Token b vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"payer_token_a\",\n \"docs\": [\n \"payer token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"payer_token_b\",\n \"docs\": [\n \"creator token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_2022_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"InitializePoolParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initialize_pool_with_dynamic_config\",\n \"discriminator\": [\n 149,\n 82,\n 72,\n 197,\n 253,\n 252,\n 68,\n 15\n ],\n \"accounts\": [\n {\n \"name\": \"creator\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the pool. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_creator_authority\",\n \"signer\": true,\n \"relations\": [\n \"config\"\n ]\n },\n {\n \"name\": \"config\",\n \"docs\": [\n \"Which config the pool belongs to.\"\n ]\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Initialize an account to store the pool state\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"Token a mint\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"Token b mint\"\n ]\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"Token a vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"Token b vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"payer_token_a\",\n \"docs\": [\n \"payer token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"payer_token_b\",\n \"docs\": [\n \"creator token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_2022_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"InitializeCustomizablePoolParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initialize_reward\",\n \"discriminator\": [\n 95,\n 135,\n 192,\n 196,\n 242,\n 129,\n 230,\n 68\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 119,\n 97,\n 114,\n 100,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n },\n {\n \"kind\": \"arg\",\n \"path\": \"reward_index\"\n }\n ]\n }\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_duration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"pubkey\"\n }\n ]\n },\n {\n \"name\": \"lock_position\",\n \"discriminator\": [\n 227,\n 62,\n 2,\n 252,\n 247,\n 10,\n 171,\n 185\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"vesting\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"VestingParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"permanent_lock_position\",\n \"discriminator\": [\n 165,\n 176,\n 125,\n 6,\n 231,\n 171,\n 186,\n 213\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"permanent_lock_liquidity\",\n \"type\": \"u128\"\n }\n ]\n },\n {\n \"name\": \"refresh_vesting\",\n \"discriminator\": [\n 9,\n 94,\n 216,\n 14,\n 116,\n 204,\n 247,\n 0\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"remove_all_liquidity\",\n \"discriminator\": [\n 10,\n 51,\n 61,\n 35,\n 112,\n 105,\n 24,\n 85\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"token_a_amount_threshold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"remove_liquidity\",\n \"discriminator\": [\n 80,\n 85,\n 209,\n 72,\n 24,\n 206,\n 177,\n 108\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"RemoveLiquidityParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"set_pool_status\",\n \"discriminator\": [\n 112,\n 87,\n 135,\n 223,\n 83,\n 204,\n 132,\n 53\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"split_position\",\n \"discriminator\": [\n 172,\n 241,\n 221,\n 138,\n 161,\n 29,\n 253,\n 42\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"first_position\",\n \"second_position\"\n ]\n },\n {\n \"name\": \"first_position\",\n \"docs\": [\n \"The first position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"first_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"second_position\",\n \"docs\": [\n \"The second position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"second_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"first_owner\",\n \"docs\": [\n \"Owner of first position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"second_owner\",\n \"docs\": [\n \"Owner of second position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"split_position2\",\n \"discriminator\": [\n 221,\n 147,\n 228,\n 207,\n 140,\n 212,\n 17,\n 119\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"first_position\",\n \"second_position\"\n ]\n },\n {\n \"name\": \"first_position\",\n \"docs\": [\n \"The first position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"first_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"second_position\",\n \"docs\": [\n \"The second position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"second_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"first_owner\",\n \"docs\": [\n \"Owner of first position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"second_owner\",\n \"docs\": [\n \"Owner of second position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"numerator\",\n \"type\": \"u32\"\n }\n ]\n },\n {\n \"name\": \"swap\",\n \"discriminator\": [\n 248,\n 198,\n 158,\n 145,\n 225,\n 117,\n 135,\n 200\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Pool account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"input_token_account\",\n \"docs\": [\n \"The user token account for input token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"output_token_account\",\n \"docs\": [\n \"The user token account for output token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ]\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"The user performing the swap\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"referral_token_account\",\n \"docs\": [\n \"referral token account\"\n ],\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"swap2\",\n \"discriminator\": [\n 65,\n 75,\n 63,\n 76,\n 235,\n 91,\n 91,\n 136\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Pool account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"input_token_account\",\n \"docs\": [\n \"The user token account for input token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"output_token_account\",\n \"docs\": [\n \"The user token account for output token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ]\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"The user performing the swap\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"referral_token_account\",\n \"docs\": [\n \"referral token account\"\n ],\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters2\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"update_reward_duration\",\n \"discriminator\": [\n 138,\n 174,\n 196,\n 169,\n 213,\n 235,\n 254,\n 107\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"new_duration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"update_reward_funder\",\n \"discriminator\": [\n 211,\n 28,\n 48,\n 32,\n 215,\n 160,\n 35,\n 23\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"new_funder\",\n \"type\": \"pubkey\"\n }\n ]\n },\n {\n \"name\": \"withdraw_ineligible_reward\",\n \"discriminator\": [\n 148,\n 206,\n 42,\n 195,\n 247,\n 49,\n 103,\n 8\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"writable\": true\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"funder_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"funder\",\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"ClaimFeeOperator\",\n \"discriminator\": [\n 166,\n 48,\n 134,\n 86,\n 34,\n 200,\n 188,\n 150\n ]\n },\n {\n \"name\": \"Config\",\n \"discriminator\": [\n 155,\n 12,\n 170,\n 224,\n 30,\n 250,\n 204,\n 130\n ]\n },\n {\n \"name\": \"Pool\",\n \"discriminator\": [\n 241,\n 154,\n 109,\n 4,\n 17,\n 177,\n 109,\n 188\n ]\n },\n {\n \"name\": \"Position\",\n \"discriminator\": [\n 170,\n 188,\n 143,\n 228,\n 122,\n 64,\n 247,\n 208\n ]\n },\n {\n \"name\": \"TokenBadge\",\n \"discriminator\": [\n 116,\n 219,\n 204,\n 229,\n 249,\n 116,\n 255,\n 150\n ]\n },\n {\n \"name\": \"Vesting\",\n \"discriminator\": [\n 100,\n 149,\n 66,\n 138,\n 95,\n 200,\n 128,\n 241\n ]\n }\n ],\n \"events\": [\n {\n \"name\": \"EvtAddLiquidity\",\n \"discriminator\": [\n 175,\n 242,\n 8,\n 157,\n 30,\n 247,\n 185,\n 169\n ]\n },\n {\n \"name\": \"EvtClaimPartnerFee\",\n \"discriminator\": [\n 118,\n 99,\n 77,\n 10,\n 226,\n 1,\n 1,\n 87\n ]\n },\n {\n \"name\": \"EvtClaimPositionFee\",\n \"discriminator\": [\n 198,\n 182,\n 183,\n 52,\n 97,\n 12,\n 49,\n 56\n ]\n },\n {\n \"name\": \"EvtClaimProtocolFee\",\n \"discriminator\": [\n 186,\n 244,\n 75,\n 251,\n 188,\n 13,\n 25,\n 33\n ]\n },\n {\n \"name\": \"EvtClaimReward\",\n \"discriminator\": [\n 218,\n 86,\n 147,\n 200,\n 235,\n 188,\n 215,\n 231\n ]\n },\n {\n \"name\": \"EvtCloseClaimFeeOperator\",\n \"discriminator\": [\n 111,\n 39,\n 37,\n 55,\n 110,\n 216,\n 194,\n 23\n ]\n },\n {\n \"name\": \"EvtCloseConfig\",\n \"discriminator\": [\n 36,\n 30,\n 239,\n 45,\n 58,\n 132,\n 14,\n 5\n ]\n },\n {\n \"name\": \"EvtClosePosition\",\n \"discriminator\": [\n 20,\n 145,\n 144,\n 68,\n 143,\n 142,\n 214,\n 178\n ]\n },\n {\n \"name\": \"EvtCreateClaimFeeOperator\",\n \"discriminator\": [\n 21,\n 6,\n 153,\n 120,\n 68,\n 116,\n 28,\n 177\n ]\n },\n {\n \"name\": \"EvtCreateConfig\",\n \"discriminator\": [\n 131,\n 207,\n 180,\n 174,\n 180,\n 73,\n 165,\n 54\n ]\n },\n {\n \"name\": \"EvtCreateDynamicConfig\",\n \"discriminator\": [\n 231,\n 197,\n 13,\n 164,\n 248,\n 213,\n 133,\n 152\n ]\n },\n {\n \"name\": \"EvtCreatePosition\",\n \"discriminator\": [\n 156,\n 15,\n 119,\n 198,\n 29,\n 181,\n 221,\n 55\n ]\n },\n {\n \"name\": \"EvtCreateTokenBadge\",\n \"discriminator\": [\n 141,\n 120,\n 134,\n 116,\n 34,\n 28,\n 114,\n 160\n ]\n },\n {\n \"name\": \"EvtFundReward\",\n \"discriminator\": [\n 104,\n 233,\n 237,\n 122,\n 199,\n 191,\n 121,\n 85\n ]\n },\n {\n \"name\": \"EvtInitializePool\",\n \"discriminator\": [\n 228,\n 50,\n 246,\n 85,\n 203,\n 66,\n 134,\n 37\n ]\n },\n {\n \"name\": \"EvtInitializeReward\",\n \"discriminator\": [\n 129,\n 91,\n 188,\n 3,\n 246,\n 52,\n 185,\n 249\n ]\n },\n {\n \"name\": \"EvtLiquidityChange\",\n \"discriminator\": [\n 197,\n 171,\n 78,\n 127,\n 224,\n 211,\n 87,\n 13\n ]\n },\n {\n \"name\": \"EvtLockPosition\",\n \"discriminator\": [\n 168,\n 63,\n 108,\n 83,\n 219,\n 82,\n 2,\n 200\n ]\n },\n {\n \"name\": \"EvtPermanentLockPosition\",\n \"discriminator\": [\n 145,\n 143,\n 162,\n 218,\n 218,\n 80,\n 67,\n 11\n ]\n },\n {\n \"name\": \"EvtRemoveLiquidity\",\n \"discriminator\": [\n 87,\n 46,\n 88,\n 98,\n 175,\n 96,\n 34,\n 91\n ]\n },\n {\n \"name\": \"EvtSetPoolStatus\",\n \"discriminator\": [\n 100,\n 213,\n 74,\n 3,\n 95,\n 91,\n 228,\n 146\n ]\n },\n {\n \"name\": \"EvtSplitPosition2\",\n \"discriminator\": [\n 165,\n 32,\n 203,\n 174,\n 72,\n 100,\n 233,\n 103\n ]\n },\n {\n \"name\": \"EvtSwap\",\n \"discriminator\": [\n 27,\n 60,\n 21,\n 213,\n 138,\n 170,\n 187,\n 147\n ]\n },\n {\n \"name\": \"EvtSwap2\",\n \"discriminator\": [\n 189,\n 66,\n 51,\n 168,\n 38,\n 80,\n 117,\n 153\n ]\n },\n {\n \"name\": \"EvtUpdateRewardDuration\",\n \"discriminator\": [\n 149,\n 135,\n 65,\n 231,\n 129,\n 153,\n 65,\n 57\n ]\n },\n {\n \"name\": \"EvtUpdateRewardFunder\",\n \"discriminator\": [\n 76,\n 154,\n 208,\n 13,\n 40,\n 115,\n 246,\n 146\n ]\n },\n {\n \"name\": \"EvtWithdrawIneligibleReward\",\n \"discriminator\": [\n 248,\n 215,\n 184,\n 78,\n 31,\n 180,\n 179,\n 168\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"MathOverflow\",\n \"msg\": \"Math operation overflow\"\n },\n {\n \"code\": 6001,\n \"name\": \"InvalidFee\",\n \"msg\": \"Invalid fee setup\"\n },\n {\n \"code\": 6002,\n \"name\": \"ExceededSlippage\",\n \"msg\": \"Exceeded slippage tolerance\"\n },\n {\n \"code\": 6003,\n \"name\": \"PoolDisabled\",\n \"msg\": \"Pool disabled\"\n },\n {\n \"code\": 6004,\n \"name\": \"ExceedMaxFeeBps\",\n \"msg\": \"Exceeded max fee bps\"\n },\n {\n \"code\": 6005,\n \"name\": \"InvalidAdmin\",\n \"msg\": \"Invalid admin\"\n },\n {\n \"code\": 6006,\n \"name\": \"AmountIsZero\",\n \"msg\": \"Amount is zero\"\n },\n {\n \"code\": 6007,\n \"name\": \"TypeCastFailed\",\n \"msg\": \"Type cast error\"\n },\n {\n \"code\": 6008,\n \"name\": \"UnableToModifyActivationPoint\",\n \"msg\": \"Unable to modify activation point\"\n },\n {\n \"code\": 6009,\n \"name\": \"InvalidAuthorityToCreateThePool\",\n \"msg\": \"Invalid authority to create the pool\"\n },\n {\n \"code\": 6010,\n \"name\": \"InvalidActivationType\",\n \"msg\": \"Invalid activation type\"\n },\n {\n \"code\": 6011,\n \"name\": \"InvalidActivationPoint\",\n \"msg\": \"Invalid activation point\"\n },\n {\n \"code\": 6012,\n \"name\": \"InvalidQuoteMint\",\n \"msg\": \"Quote token must be SOL,USDC\"\n },\n {\n \"code\": 6013,\n \"name\": \"InvalidFeeCurve\",\n \"msg\": \"Invalid fee curve\"\n },\n {\n \"code\": 6014,\n \"name\": \"InvalidPriceRange\",\n \"msg\": \"Invalid Price Range\"\n },\n {\n \"code\": 6015,\n \"name\": \"PriceRangeViolation\",\n \"msg\": \"Trade is over price range\"\n },\n {\n \"code\": 6016,\n \"name\": \"InvalidParameters\",\n \"msg\": \"Invalid parameters\"\n },\n {\n \"code\": 6017,\n \"name\": \"InvalidCollectFeeMode\",\n \"msg\": \"Invalid collect fee mode\"\n },\n {\n \"code\": 6018,\n \"name\": \"InvalidInput\",\n \"msg\": \"Invalid input\"\n },\n {\n \"code\": 6019,\n \"name\": \"CannotCreateTokenBadgeOnSupportedMint\",\n \"msg\": \"Cannot create token badge on supported mint\"\n },\n {\n \"code\": 6020,\n \"name\": \"InvalidTokenBadge\",\n \"msg\": \"Invalid token badge\"\n },\n {\n \"code\": 6021,\n \"name\": \"InvalidMinimumLiquidity\",\n \"msg\": \"Invalid minimum liquidity\"\n },\n {\n \"code\": 6022,\n \"name\": \"InvalidVestingInfo\",\n \"msg\": \"Invalid vesting information\"\n },\n {\n \"code\": 6023,\n \"name\": \"InsufficientLiquidity\",\n \"msg\": \"Insufficient liquidity\"\n },\n {\n \"code\": 6024,\n \"name\": \"InvalidVestingAccount\",\n \"msg\": \"Invalid vesting account\"\n },\n {\n \"code\": 6025,\n \"name\": \"InvalidPoolStatus\",\n \"msg\": \"Invalid pool status\"\n },\n {\n \"code\": 6026,\n \"name\": \"UnsupportNativeMintToken2022\",\n \"msg\": \"Unsupported native mint token2022\"\n },\n {\n \"code\": 6027,\n \"name\": \"InvalidRewardIndex\",\n \"msg\": \"Invalid reward index\"\n },\n {\n \"code\": 6028,\n \"name\": \"InvalidRewardDuration\",\n \"msg\": \"Invalid reward duration\"\n },\n {\n \"code\": 6029,\n \"name\": \"RewardInitialized\",\n \"msg\": \"Reward already initialized\"\n },\n {\n \"code\": 6030,\n \"name\": \"RewardUninitialized\",\n \"msg\": \"Reward not initialized\"\n },\n {\n \"code\": 6031,\n \"name\": \"InvalidRewardVault\",\n \"msg\": \"Invalid reward vault\"\n },\n {\n \"code\": 6032,\n \"name\": \"MustWithdrawnIneligibleReward\",\n \"msg\": \"Must withdraw ineligible reward\"\n },\n {\n \"code\": 6033,\n \"name\": \"IdenticalRewardDuration\",\n \"msg\": \"Reward duration is the same\"\n },\n {\n \"code\": 6034,\n \"name\": \"RewardCampaignInProgress\",\n \"msg\": \"Reward campaign in progress\"\n },\n {\n \"code\": 6035,\n \"name\": \"IdenticalFunder\",\n \"msg\": \"Identical funder\"\n },\n {\n \"code\": 6036,\n \"name\": \"InvalidFunder\",\n \"msg\": \"Invalid funder\"\n },\n {\n \"code\": 6037,\n \"name\": \"RewardNotEnded\",\n \"msg\": \"Reward not ended\"\n },\n {\n \"code\": 6038,\n \"name\": \"FeeInverseIsIncorrect\",\n \"msg\": \"Fee inverse is incorrect\"\n },\n {\n \"code\": 6039,\n \"name\": \"PositionIsNotEmpty\",\n \"msg\": \"Position is not empty\"\n },\n {\n \"code\": 6040,\n \"name\": \"InvalidPoolCreatorAuthority\",\n \"msg\": \"Invalid pool creator authority\"\n },\n {\n \"code\": 6041,\n \"name\": \"InvalidConfigType\",\n \"msg\": \"Invalid config type\"\n },\n {\n \"code\": 6042,\n \"name\": \"InvalidPoolCreator\",\n \"msg\": \"Invalid pool creator\"\n },\n {\n \"code\": 6043,\n \"name\": \"RewardVaultFrozenSkipRequired\",\n \"msg\": \"Reward vault is frozen, must skip reward to proceed\"\n },\n {\n \"code\": 6044,\n \"name\": \"InvalidSplitPositionParameters\",\n \"msg\": \"Invalid parameters for split position\"\n },\n {\n \"code\": 6045,\n \"name\": \"UnsupportPositionHasVestingLock\",\n \"msg\": \"Unsupported split position has vesting lock\"\n },\n {\n \"code\": 6046,\n \"name\": \"SamePosition\",\n \"msg\": \"Same position\"\n },\n {\n \"code\": 6047,\n \"name\": \"InvalidBaseFeeMode\",\n \"msg\": \"Invalid base fee mode\"\n },\n {\n \"code\": 6048,\n \"name\": \"InvalidFeeRateLimiter\",\n \"msg\": \"Invalid fee rate limiter\"\n },\n {\n \"code\": 6049,\n \"name\": \"FailToValidateSingleSwapInstruction\",\n \"msg\": \"Fail to validate single swap instruction in rate limiter\"\n },\n {\n \"code\": 6050,\n \"name\": \"InvalidFeeScheduler\",\n \"msg\": \"Invalid fee scheduler\"\n },\n {\n \"code\": 6051,\n \"name\": \"UndeterminedError\",\n \"msg\": \"Undetermined error\"\n },\n {\n \"code\": 6052,\n \"name\": \"InvalidPoolVersion\",\n \"msg\": \"Invalid pool version\"\n }\n ],\n \"types\": [\n {\n \"name\": \"AddLiquidityParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity_delta\",\n \"docs\": [\n \"delta liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"token_a_amount_threshold\",\n \"docs\": [\n \"maximum token a amount\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"docs\": [\n \"maximum token b amount\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_fee_numerator\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"base_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"first_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"second_factor\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"third_factor\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_fee_numerator\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"first_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"second_factor\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"third_factor\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"base_fee_mode\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeStruct\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_fee_numerator\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"base_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding_0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"first_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"second_factor\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"third_factor\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding_1\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"ClaimFeeOperator\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"operator\",\n \"docs\": [\n \"operator\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"_padding\",\n \"docs\": [\n \"Reserve\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 128\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"Config\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"vault_config_key\",\n \"docs\": [\n \"Vault config key\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"docs\": [\n \"Only pool_creator_authority can use the current config to initialize new pool. When it's Pubkey::default, it's a public config.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_fees\",\n \"docs\": [\n \"Pool fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeesConfig\"\n }\n }\n },\n {\n \"name\": \"activation_type\",\n \"docs\": [\n \"Activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"docs\": [\n \"Collect fee mode\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"config_type\",\n \"docs\": [\n \"Config type mode, 0 for static, 1 for dynamic\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding_0\",\n \"docs\": [\n \"padding 0\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"index\",\n \"docs\": [\n \"config index\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"sqrt_min_price\",\n \"docs\": [\n \"sqrt min price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"docs\": [\n \"sqrt max price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"_padding_1\",\n \"docs\": [\n \"Fee curve point\",\n \"Padding for further use\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 10\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"DynamicConfigParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"initialized\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"max_volatility_accumulator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"variable_fee_control\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"bin_step\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"filter_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"decay_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reduction_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding_1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"bin_step_u128\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bin_step\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"bin_step_u128\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"filter_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"decay_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reduction_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_volatility_accumulator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"variable_fee_control\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeStruct\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"initialized\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"max_volatility_accumulator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"variable_fee_control\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"bin_step\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"filter_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"decay_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reduction_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"last_update_timestamp\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"bin_step_u128\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price_reference\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"volatility_accumulator\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"volatility_reference\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtAddLiquidity\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"AddLiquidityParameters\"\n }\n }\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_b\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimPartnerFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimPositionFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"fee_a_claimed\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b_claimed\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimProtocolFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"mint_reward\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"total_reward\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCloseClaimFeeOperator\",\n \"docs\": [\n \"Close claim fee operator\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"claim_fee_operator\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"operator\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCloseConfig\",\n \"docs\": [\n \"Close config\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"docs\": [\n \"Config pubkey\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"admin\",\n \"docs\": [\n \"admin pk\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClosePosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateClaimFeeOperator\",\n \"docs\": [\n \"Create claim fee operator\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"operator\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateConfig\",\n \"docs\": [\n \"Create static config\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"vault_config_key\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"activation_type\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"sqrt_min_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"config\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateDynamicConfig\",\n \"docs\": [\n \"Create dynamic config\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreatePosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateTokenBadge\",\n \"docs\": [\n \"Create token badge\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token_mint\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtFundReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"mint_reward\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"transfer_fee_excluded_amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_duration_end\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"pre_reward_rate\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"post_reward_rate\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtInitializePool\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_b_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"creator\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"payer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"alpha_vault\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"sqrt_min_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_type\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_point\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_a_flag\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_b_flag\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_b\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"pool_type\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtInitializeReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"creator\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_duration\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtLiquidityChange\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"transfer_fee_included_token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"transfer_fee_included_token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"liquidity_delta\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"token_a_amount_threshold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"change_type\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtLockPosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"vesting\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cliff_point\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"period_frequency\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"cliff_unlock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquidity_per_period\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"number_of_period\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtPermanentLockPosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"lock_liquidity_amount\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_permanent_locked_liquidity\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtRemoveLiquidity\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"RemoveLiquidityParameters\"\n }\n }\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtSetPoolStatus\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtSplitPosition2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"first_owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"second_owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"first_position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"second_position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"current_sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"amount_splits\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitAmountInfo\"\n }\n }\n },\n {\n \"name\": \"first_position_info\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionInfo\"\n }\n }\n },\n {\n \"name\": \"second_position_info\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionInfo\"\n }\n }\n },\n {\n \"name\": \"split_position_parameters\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionParameters2\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"EvtSwap\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"trade_direction\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"has_referral\",\n \"type\": \"bool\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters\"\n }\n }\n },\n {\n \"name\": \"swap_result\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapResult\"\n }\n }\n },\n {\n \"name\": \"actual_amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"current_timestamp\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtSwap2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"trade_direction\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"has_referral\",\n \"type\": \"bool\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters2\"\n }\n }\n },\n {\n \"name\": \"swap_result\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapResult2\"\n }\n }\n },\n {\n \"name\": \"included_transfer_fee_amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"included_transfer_fee_amount_out\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"excluded_transfer_fee_amount_out\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"current_timestamp\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtUpdateRewardDuration\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"old_reward_duration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"new_reward_duration\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtUpdateRewardFunder\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"old_funder\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"new_funder\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtWithdrawIneligibleReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"InitializeCustomizablePoolParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"docs\": [\n \"pool fees\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"sqrt_min_price\",\n \"docs\": [\n \"sqrt min price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"docs\": [\n \"sqrt max price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"has_alpha_vault\",\n \"docs\": [\n \"has alpha vault\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"liquidity\",\n \"docs\": [\n \"initialize liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"docs\": [\n \"The init price of the pool as a sqrt(token_b/token_a) Q64.64 value\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_type\",\n \"docs\": [\n \"activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"docs\": [\n \"collect fee mode\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"activation_point\",\n \"docs\": [\n \"activation point\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"InitializePoolParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity\",\n \"docs\": [\n \"initialize liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"docs\": [\n \"The init price of the pool as a sqrt(token_b/token_a) Q64.64 value\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_point\",\n \"docs\": [\n \"activation point\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"Pool\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"docs\": [\n \"Pool fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeesStruct\"\n }\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"token a mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"token b mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"token a vault\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"token b vault\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"whitelisted_vault\",\n \"docs\": [\n \"Whitelisted vault to be able to buy pool before activation_point\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"partner\",\n \"docs\": [\n \"partner\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"liquidity\",\n \"docs\": [\n \"liquidity share\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"_padding\",\n \"docs\": [\n \"padding, previous reserve amount, be careful to use that field\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"protocol_a_fee\",\n \"docs\": [\n \"protocol a fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocol_b_fee\",\n \"docs\": [\n \"protocol b fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_a_fee\",\n \"docs\": [\n \"partner a fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_b_fee\",\n \"docs\": [\n \"partner b fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"sqrt_min_price\",\n \"docs\": [\n \"min price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"docs\": [\n \"max price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"docs\": [\n \"current price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_point\",\n \"docs\": [\n \"Activation point, can be slot or timestamp\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activation_type\",\n \"docs\": [\n \"Activation type, 0 means by slot, 1 means by timestamp\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"pool_status\",\n \"docs\": [\n \"pool status, 0: enable, 1 disable\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_a_flag\",\n \"docs\": [\n \"token a flag\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_b_flag\",\n \"docs\": [\n \"token b flag\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"docs\": [\n \"0 is collect fee in both token, 1 only collect fee in token a, 2 only collect fee in token b\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"pool_type\",\n \"docs\": [\n \"pool type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"pool version, 0: max_fee is still capped at 50%, 1: max_fee is capped at 99%\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding_0\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"fee_a_per_liquidity\",\n \"docs\": [\n \"cumulative\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"fee_b_per_liquidity\",\n \"docs\": [\n \"cumulative\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"permanent_lock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"metrics\",\n \"docs\": [\n \"metrics\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolMetrics\"\n }\n }\n },\n {\n \"name\": \"creator\",\n \"docs\": [\n \"pool creator\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"_padding_1\",\n \"docs\": [\n \"Padding for further use\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 6\n ]\n }\n },\n {\n \"name\": \"reward_infos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"RewardInfo\"\n }\n },\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolFeeParameters\",\n \"docs\": [\n \"Information regarding fee charges\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"base_fee\",\n \"docs\": [\n \"Base fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"BaseFeeParameters\"\n }\n }\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 3\n ]\n }\n },\n {\n \"name\": \"dynamic_fee\",\n \"docs\": [\n \"dynamic fee\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"DynamicFeeParameters\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolFeesConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"base_fee\",\n \"type\": {\n \"defined\": {\n \"name\": \"BaseFeeConfig\"\n }\n }\n },\n {\n \"name\": \"dynamic_fee\",\n \"type\": {\n \"defined\": {\n \"name\": \"DynamicFeeConfig\"\n }\n }\n },\n {\n \"name\": \"protocol_fee_percent\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"partner_fee_percent\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"referral_fee_percent\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding_0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"padding_1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 5\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolFeesStruct\",\n \"docs\": [\n \"Information regarding fee charges\",\n \"trading_fee = amount * trade_fee_numerator / denominator\",\n \"protocol_fee = trading_fee * protocol_fee_percentage / 100\",\n \"referral_fee = protocol_fee * referral_percentage / 100\",\n \"partner_fee = (protocol_fee - referral_fee) * partner_fee_percentage / denominator\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"base_fee\",\n \"docs\": [\n \"Trade fees are extra token amounts that are held inside the token\",\n \"accounts during a trade, making the value of liquidity tokens rise.\",\n \"Trade fee numerator\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"BaseFeeStruct\"\n }\n }\n },\n {\n \"name\": \"protocol_fee_percent\",\n \"docs\": [\n \"Protocol trading fees are extra token amounts that are held inside the token\",\n \"accounts during a trade, with the equivalent in pool tokens minted to\",\n \"the protocol of the program.\",\n \"Protocol trade fee numerator\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"partner_fee_percent\",\n \"docs\": [\n \"partner fee\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"referral_fee_percent\",\n \"docs\": [\n \"referral fee\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding_0\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"dynamic_fee\",\n \"docs\": [\n \"dynamic fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"DynamicFeeStruct\"\n }\n }\n },\n {\n \"name\": \"padding_1\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolMetrics\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"total_lp_a_fee\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_lp_b_fee\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_protocol_a_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_protocol_b_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_partner_a_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_partner_b_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_position\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Position\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"nft_mint\",\n \"docs\": [\n \"nft mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"fee_a_per_token_checkpoint\",\n \"docs\": [\n \"fee a checkpoint\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"fee_b_per_token_checkpoint\",\n \"docs\": [\n \"fee b checkpoint\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"fee_a_pending\",\n \"docs\": [\n \"fee a pending\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b_pending\",\n \"docs\": [\n \"fee b pending\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"unlocked_liquidity\",\n \"docs\": [\n \"unlock liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"vested_liquidity\",\n \"docs\": [\n \"vesting liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"permanent_locked_liquidity\",\n \"docs\": [\n \"permanent locked liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"metrics\",\n \"docs\": [\n \"metrics\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PositionMetrics\"\n }\n }\n },\n {\n \"name\": \"reward_infos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"UserRewardInfo\"\n }\n },\n 2\n ]\n }\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"padding for future usage\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PositionMetrics\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"total_claimed_a_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_claimed_b_fee\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"RemoveLiquidityParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity_delta\",\n \"docs\": [\n \"delta liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"token_a_amount_threshold\",\n \"docs\": [\n \"minimum token a amount\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"docs\": [\n \"minimum token b amount\"\n ],\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 \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"initialized\",\n \"docs\": [\n \"Indicates if the reward has been initialized\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_token_flag\",\n \"docs\": [\n \"reward token flag\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding_0\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"_padding_1\",\n \"docs\": [\n \"Padding to ensure `reward_rate: u128` is 16-byte aligned\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"Reward token mint.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"vault\",\n \"docs\": [\n \"Reward vault token account.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"funder\",\n \"docs\": [\n \"Authority account that allows to fund rewards\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_duration\",\n \"docs\": [\n \"reward duration\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_duration_end\",\n \"docs\": [\n \"reward duration end\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_rate\",\n \"docs\": [\n \"reward rate\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"reward_per_token_stored\",\n \"docs\": [\n \"Reward per token stored\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"last_update_time\",\n \"docs\": [\n \"The last time reward states were updated.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"cumulative_seconds_with_empty_liquidity_reward\",\n \"docs\": [\n \"Accumulated seconds when the farm distributed rewards but the bin was empty.\",\n \"These rewards will be carried over to the next reward time window.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SplitAmountInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"permanent_locked_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"unlocked_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"fee_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_0\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_1\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SplitPositionInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"fee_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_0\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_1\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SplitPositionParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"unlocked_liquidity_percentage\",\n \"docs\": [\n \"Percentage of unlocked liquidity to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"permanent_locked_liquidity_percentage\",\n \"docs\": [\n \"Percentage of permanent locked liquidity to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"fee_a_percentage\",\n \"docs\": [\n \"Percentage of fee A pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"fee_b_percentage\",\n \"docs\": [\n \"Percentage of fee B pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_0_percentage\",\n \"docs\": [\n \"Percentage of reward 0 pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_1_percentage\",\n \"docs\": [\n \"Percentage of reward 1 pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"padding for future\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 16\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"SplitPositionParameters2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"unlocked_liquidity_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"permanent_locked_liquidity_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"fee_a_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"fee_b_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"reward_0_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"reward_1_numerator\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"StaticConfigParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"sqrt_min_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"vault_config_key\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"activation_type\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"minimum_amount_out\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapParameters2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount_0\",\n \"docs\": [\n \"When it's exact in, partial fill, this will be amount_in. When it's exact out, this will be amount_out\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount_1\",\n \"docs\": [\n \"When it's exact in, partial fill, this will be minimum_amount_out. When it's exact out, this will be maximum_amount_in\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"swap_mode\",\n \"docs\": [\n \"Swap mode, refer [SwapMode]\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapResult\",\n \"docs\": [\n \"Encodes all results of swapping\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"output_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"next_sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"lp_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocol_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"referral_fee\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapResult2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"included_fee_input_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"excluded_fee_input_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount_left\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"output_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"next_sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"trading_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocol_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"referral_fee\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenBadge\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token_mint\",\n \"docs\": [\n \"token mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"_padding\",\n \"docs\": [\n \"Reserve\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 128\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"UserRewardInfo\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"reward_per_token_checkpoint\",\n \"docs\": [\n \"The latest update reward checkpoint\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"reward_pendings\",\n \"docs\": [\n \"Current pending rewards\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_claimed_rewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Vesting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cliff_point\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"period_frequency\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"cliff_unlock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquidity_per_period\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_released_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"number_of_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 14\n ]\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u128\",\n 4\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"VestingParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_point\",\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"period_frequency\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"cliff_unlock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquidity_per_period\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"number_of_period\",\n \"type\": \"u16\"\n }\n ]\n }\n }\n ]\n}","import { IdlAccounts, IdlTypes, Program, BN } from \"@coral-xyz/anchor\";\nimport { PublicKey, Transaction } from \"@solana/web3.js\";\nimport type { CpAmm as CpAmmTypes } from \"./idl/cp_amm\";\nimport { Mint } from \"@solana/spl-token\";\nimport Decimal from \"decimal.js\";\n\nexport type AmmProgram = Program<CpAmmTypes>;\n\nexport type TxBuilder = Promise<Transaction>;\n\nexport enum Rounding {\n Up,\n Down,\n}\n\nexport enum ActivationPoint {\n Timestamp,\n Slot,\n}\n\nexport enum BaseFeeMode {\n FeeSchedulerLinear,\n FeeSchedulerExponential,\n RateLimiter,\n}\n\nexport enum CollectFeeMode {\n BothToken,\n OnlyB,\n}\n\nexport enum TradeDirection {\n AtoB,\n BtoA,\n}\n\nexport enum ActivationType {\n Slot,\n Timestamp,\n}\n\nexport enum PoolVersion {\n V0,\n V1,\n}\n\nexport type FeeMode = {\n feesOnInput: boolean;\n feesOnTokenA: boolean;\n hasReferral: boolean;\n};\n\nexport enum PoolStatus {\n Enable,\n Disable,\n}\n\nexport enum SwapMode {\n ExactIn,\n PartialFill,\n ExactOut,\n}\n\n// Account state types\nexport type PoolState = IdlAccounts<CpAmmTypes>[\"pool\"];\nexport type PositionState = IdlAccounts<CpAmmTypes>[\"position\"];\nexport type VestingState = IdlAccounts<CpAmmTypes>[\"vesting\"];\nexport type ConfigState = IdlAccounts<CpAmmTypes>[\"config\"];\nexport type TokenBadgeState = IdlAccounts<CpAmmTypes>[\"tokenBadge\"];\n\n// Program params types\n// export type LockPositionParams = IdlTypes<CpAmm>[\"VestingParameters\"];\n// export type AddLiquidityParams = IdlTypes<CpAmm>[\"AddLiquidityParameters\"];\n// export type RemoveLiquidityParams =\n// IdlTypes<CpAmm>[\"RemoveLiquidityParameters\"];\n// export type SwapParams = IdlTypes<CpAmm>[\"SwapParameters\"];\n// export type InitPoolParams = IdlTypes<CpAmm>[\"InitializePoolParameters\"];\n// export type InitCustomizePoolParams =\n// IdlTypes<CpAmm>[\"InitializeCustomizablePoolParameters\"];\nexport type RewardInfo = IdlTypes<CpAmmTypes>[\"rewardInfo\"];\n\n/**\n * Dynamic fee parameters\n * @param binStep\n * @param binStepU128\n * @param filterPeriod\n * @param decayPeriod\n * @param reductionFactor\n * @param maxVolatilityAccumulator\n * @param variableFeeControl\n */\nexport type DynamicFee = IdlTypes<CpAmmTypes>[\"dynamicFeeParameters\"];\n\n/**\n * Dynamic fee struct\n * @param initialized\n * @param padding\n * @param maxVolatilityAccumulator\n * @param variableFeeControl\n * @param binStep\n * @param filterPeriod\n * @param decayPeriod\n * @param reductionFactor\n * @param lastUpdateTimestamp\n * @param binStepU128\n * @param sqrtPriceReference\n * @param volatilityAccumulator\n * @param volatilityReference\n */\nexport type DynamicFeeStruct = IdlTypes<CpAmmTypes>[\"dynamicFeeStruct\"];\n\n/**\n * Base fee parameters\n * @param cliffFeeNumerator\n * @param firstFactor // feeScheduler: numberOfPeriod, rateLimiter: feeIncrementBps\n * @param secondFactor // feeScheduler: periodFrequency, rateLimiter: maxLimiterDuration\n * @param thirdFactor // feeScheduler: reductionFactor, rateLimiter: referenceAmount\n * @param baseFeeMode\n */\nexport type BaseFee = IdlTypes<CpAmmTypes>[\"baseFeeParameters\"];\n\nexport type PoolFeesStruct = IdlTypes<CpAmmTypes>[\"poolFeesStruct\"];\n\nexport type PoolFeesParams = {\n baseFee: BaseFee;\n padding: number[];\n dynamicFee: DynamicFee | null;\n};\n\nexport type PrepareTokenAccountParams = {\n payer: PublicKey;\n tokenAOwner: PublicKey;\n tokenBOwner: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type PrepareCustomizablePoolParams = {\n pool: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAAmount: BN;\n tokenBAmount: BN;\n payer: PublicKey;\n positionNft: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type InitializeCustomizeablePoolParams = {\n payer: PublicKey;\n creator: PublicKey;\n positionNft: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAAmount: BN;\n tokenBAmount: BN;\n sqrtMinPrice: BN;\n sqrtMaxPrice: BN;\n liquidityDelta: BN;\n initSqrtPrice: BN;\n poolFees: PoolFeesParams;\n hasAlphaVault: boolean;\n activationType: number;\n collectFeeMode: number;\n activationPoint: BN | null;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n isLockLiquidity?: boolean;\n};\n\nexport type InitializeCustomizeablePoolWithDynamicConfigParams =\n InitializeCustomizeablePoolParams & {\n config: PublicKey;\n poolCreatorAuthority: PublicKey;\n };\n\nexport type PreparePoolCreationParams = {\n tokenAAmount: BN;\n tokenBAmount: BN;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n tokenAInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenBInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type PreparedPoolCreation = {\n initSqrtPrice: BN;\n liquidityDelta: BN;\n};\n\nexport type PreparePoolCreationSingleSide = {\n tokenAAmount: BN;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n initSqrtPrice: BN;\n tokenAInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type CreatePoolParams = {\n creator: PublicKey;\n payer: PublicKey;\n config: PublicKey;\n positionNft: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n initSqrtPrice: BN;\n liquidityDelta: BN;\n tokenAAmount: BN;\n tokenBAmount: BN;\n activationPoint: BN | null;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n isLockLiquidity?: boolean;\n};\n\nexport type CreatePositionParams = {\n owner: PublicKey;\n payer: PublicKey;\n pool: PublicKey;\n positionNft: PublicKey;\n};\n\nexport type AddLiquidityParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n liquidityDelta: BN;\n maxAmountTokenA: BN;\n maxAmountTokenB: BN;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type CreatePositionAndAddLiquidity = {\n owner: PublicKey;\n pool: PublicKey;\n positionNft: PublicKey;\n liquidityDelta: BN;\n maxAmountTokenA: BN;\n maxAmountTokenB: BN;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type LiquidityDeltaParams = {\n maxAmountTokenA: BN;\n maxAmountTokenB: BN;\n sqrtPrice: BN;\n sqrtMinPrice: BN;\n sqrtMaxPrice: BN;\n tokenAInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenBInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type RemoveLiquidityParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n liquidityDelta: BN;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n vestings: Array<{\n account: PublicKey;\n vestingState: VestingState;\n }>;\n currentPoint: BN;\n};\n\nexport type RemoveAllLiquidityParams = Omit<\n RemoveLiquidityParams,\n \"liquidityDelta\"\n>;\n\nexport type BuildAddLiquidityParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n liquidityDelta: BN;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type BuildLiquidatePositionInstructionParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n positionState: PositionState;\n poolState: PoolState;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n};\n\nexport type BuildRemoveAllLiquidityInstructionParams = {\n poolAuthority: PublicKey;\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type ClosePositionParams = {\n owner: PublicKey;\n pool: PublicKey;\n position: PublicKey;\n positionNftMint: PublicKey;\n positionNftAccount: PublicKey;\n};\n\nexport type RemoveAllLiquidityAndClosePositionParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n poolState: PoolState;\n positionState: PositionState;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n vestings: Array<{\n account: PublicKey;\n vestingState: VestingState;\n }>;\n currentPoint: BN;\n};\n\nexport type MergePositionParams = {\n owner: PublicKey;\n positionA: PublicKey;\n positionB: PublicKey;\n poolState: PoolState;\n positionBNftAccount: PublicKey;\n positionANftAccount: PublicKey;\n positionBState: PositionState;\n tokenAAmountAddLiquidityThreshold: BN;\n tokenBAmountAddLiquidityThreshold: BN;\n tokenAAmountRemoveLiquidityThreshold: BN;\n tokenBAmountRemoveLiquidityThreshold: BN;\n positionBVestings: Array<{\n account: PublicKey;\n vestingState: VestingState;\n }>;\n currentPoint: BN;\n};\n\nexport type GetQuoteParams = {\n inAmount: BN;\n inputTokenMint: PublicKey;\n slippage: number;\n poolState: PoolState;\n currentTime: number;\n currentSlot: number;\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenADecimal: number;\n tokenBDecimal: number;\n hasReferral?: boolean;\n};\n\nexport type GetQuote2Params = {\n inputTokenMint: PublicKey;\n slippage: number;\n currentPoint: BN;\n poolState: PoolState;\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenADecimal: number;\n tokenBDecimal: number;\n hasReferral: boolean;\n} & (\n | {\n swapMode: SwapMode.ExactIn;\n amountIn: BN;\n }\n | {\n swapMode: SwapMode.PartialFill;\n amountIn: BN;\n }\n | {\n swapMode: SwapMode.ExactOut;\n amountOut: BN;\n }\n);\n\nexport type SwapAmount = {\n outputAmount: BN;\n nextSqrtPrice: BN;\n};\n\nexport type SwapResult = IdlTypes<CpAmmTypes>[\"swapResult\"];\n\nexport type SwapResult2 = IdlTypes<CpAmmTypes>[\"swapResult2\"];\n\nexport interface Quote2Result extends SwapResult2 {\n priceImpact: Decimal;\n minimumAmountOut?: BN;\n maximumAmountIn?: BN;\n}\n\nexport type SwapParams = {\n payer: PublicKey;\n pool: PublicKey;\n inputTokenMint: PublicKey;\n outputTokenMint: PublicKey;\n amountIn: BN;\n minimumAmountOut: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n referralTokenAccount: PublicKey | null;\n poolState?: PoolState;\n};\n\nexport type Swap2Params = {\n payer: PublicKey;\n pool: PublicKey;\n inputTokenMint: PublicKey;\n outputTokenMint: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n referralTokenAccount: PublicKey | null;\n poolState?: PoolState;\n} & (\n | {\n swapMode: SwapMode.ExactIn;\n amountIn: BN;\n minimumAmountOut: BN;\n }\n | {\n swapMode: SwapMode.PartialFill;\n amountIn: BN;\n minimumAmountOut: BN;\n }\n | {\n swapMode: SwapMode.ExactOut;\n amountOut: BN;\n maximumAmountIn: BN;\n }\n);\n\nexport type LockPositionParams = {\n owner: PublicKey;\n payer: PublicKey;\n vestingAccount: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n pool: PublicKey;\n cliffPoint: BN | null;\n periodFrequency: BN;\n cliffUnlockLiquidity: BN;\n liquidityPerPeriod: BN;\n numberOfPeriod: number;\n};\n\nexport type SetupFeeClaimAccountsParams = {\n payer: PublicKey;\n owner: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n receiver?: PublicKey;\n tempWSolAccount?: PublicKey;\n};\n\nexport type ClaimPositionFeeInstructionParams = {\n owner: PublicKey;\n poolAuthority: PublicKey;\n pool: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type ClaimPositionFeeParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n receiver?: PublicKey;\n feePayer?: PublicKey;\n tempWSolAccount?: PublicKey;\n};\n\nexport type ClaimPositionFeeParams2 = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n receiver: PublicKey;\n feePayer?: PublicKey;\n};\n\nexport type ClosePositionInstructionParams = {\n owner: PublicKey;\n poolAuthority: PublicKey;\n pool: PublicKey;\n position: PublicKey;\n positionNftMint: PublicKey;\n positionNftAccount: PublicKey;\n};\n\nexport type InitializeRewardParams = {\n rewardIndex: number;\n rewardDuration: BN;\n pool: PublicKey;\n rewardMint: PublicKey;\n payer: PublicKey;\n};\n\nexport type UpdateRewardDurationParams = {\n pool: PublicKey;\n admin: PublicKey;\n rewardIndex: number;\n newDuration: BN;\n};\n\nexport type UpdateRewardFunderParams = {\n pool: PublicKey;\n admin: PublicKey;\n rewardIndex: number;\n newFunder: PublicKey;\n};\n\nexport type FundRewardParams = {\n funder: PublicKey;\n rewardIndex: number;\n pool: PublicKey;\n carryForward: boolean;\n amount: BN;\n};\n\nexport type WithdrawIneligibleRewardParams = {\n rewardIndex: number;\n pool: PublicKey;\n funder: PublicKey;\n};\n\nexport type ClaimPartnerFeeParams = {\n partner: PublicKey;\n pool: PublicKey;\n maxAmountA: BN;\n maxAmountB: BN;\n receiver?: PublicKey;\n feePayer?: PublicKey;\n tempWSolAccount?: PublicKey;\n};\n\nexport type ClaimRewardParams = {\n user: PublicKey;\n position: PublicKey;\n poolState: PoolState;\n positionState: PositionState;\n positionNftAccount: PublicKey;\n rewardIndex: number;\n skipReward: number;\n feePayer?: PublicKey;\n};\n\nexport type RefreshVestingParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n pool: PublicKey;\n vestingAccounts: PublicKey[];\n};\n\nexport type PermanentLockParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n pool: PublicKey;\n unlockedLiquidity: BN;\n};\n\nexport type GetDepositQuoteParams = {\n inAmount: BN;\n isTokenA: boolean;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n sqrtPrice: BN;\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type GetWithdrawQuoteParams = {\n liquidityDelta: BN;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n sqrtPrice: BN;\n tokenATokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenBTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type DepositQuote = {\n actualInputAmount: BN;\n consumedInputAmount: BN;\n outputAmount: BN;\n liquidityDelta: BN;\n};\n\nexport type WithdrawQuote = {\n liquidityDelta: BN;\n outAmountA: BN;\n outAmountB: BN;\n};\n\nexport type DynamicFeeParams = {\n volatilityAccumulator: BN;\n binStep: number;\n variableFeeControl: number;\n};\n\nexport type SplitPositionParams = {\n firstPositionOwner: PublicKey;\n secondPositionOwner: PublicKey;\n pool: PublicKey;\n firstPosition: PublicKey;\n firstPositionNftAccount: PublicKey;\n secondPosition: PublicKey;\n secondPositionNftAccount: PublicKey;\n permanentLockedLiquidityPercentage: number;\n unlockedLiquidityPercentage: number;\n feeAPercentage: number;\n feeBPercentage: number;\n reward0Percentage: number;\n reward1Percentage: number;\n};\n\nexport type SplitPosition2Params = {\n firstPositionOwner: PublicKey;\n secondPositionOwner: PublicKey;\n pool: PublicKey;\n firstPosition: PublicKey;\n firstPositionNftAccount: PublicKey;\n secondPosition: PublicKey;\n secondPositionNftAccount: PublicKey;\n numerator: number;\n};\n\nexport interface BaseFeeHandler {\n validate(\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n ): boolean;\n getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n includedFeeAmount: BN\n ): BN;\n getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n excludedFeeAmount: BN\n ): BN;\n}\n\nexport interface FeeOnAmountResult {\n amount: BN;\n tradingFee: BN;\n protocolFee: BN;\n partnerFee: BN;\n referralFee: BN;\n}\n\nexport interface SplitFees {\n tradingFee: BN;\n protocolFee: BN;\n referralFee: BN;\n partnerFee: BN;\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { BN } from \"@coral-xyz/anchor\";\nimport { CP_AMM_PROGRAM_ID } from \"./constants\";\n\n// Private function: Only use to derive pool account\nexport function getFirstKey(key1: PublicKey, key2: PublicKey) {\n const buf1 = key1.toBuffer();\n const buf2 = key2.toBuffer();\n // Buf1 > buf2\n if (Buffer.compare(buf1, buf2) === 1) {\n return buf1;\n }\n return buf2;\n}\n\nexport function getSecondKey(key1: PublicKey, key2: PublicKey) {\n const buf1 = key1.toBuffer();\n const buf2 = key2.toBuffer();\n // Buf1 > buf2\n if (Buffer.compare(buf1, buf2) === 1) {\n return buf2;\n }\n return buf1;\n}\n\nexport function derivePoolAuthority(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"pool_authority\")],\n CP_AMM_PROGRAM_ID\n )[0];\n}\nexport function deriveConfigAddress(index: BN): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"config\"), index.toArrayLike(Buffer, \"le\", 8)],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function derivePoolAddress(\n config: PublicKey,\n tokenAMint: PublicKey,\n tokenBMint: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"pool\"),\n config.toBuffer(),\n getFirstKey(tokenAMint, tokenBMint),\n getSecondKey(tokenAMint, tokenBMint),\n ],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function derivePositionAddress(positionNft: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"position\"), positionNft.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveTokenVaultAddress(\n tokenMint: PublicKey,\n pool: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"token_vault\"), tokenMint.toBuffer(), pool.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveRewardVaultAddress(\n pool: PublicKey,\n rewardIndex: number\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"reward_vault\"), pool.toBuffer(), Buffer.from([rewardIndex])],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveCustomizablePoolAddress(\n tokenAMint: PublicKey,\n tokenBMint: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"cpool\"),\n getFirstKey(tokenAMint, tokenBMint),\n getSecondKey(tokenAMint, tokenBMint),\n ],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveTokenBadgeAddress(tokenMint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"token_badge\"), tokenMint.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveClaimFeeOperatorAddress(operator: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"cf_operator\"), operator.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function derivePositionNftAccount(\n positionNftMint: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"position_nft_account\"), positionNftMint.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { PoolVersion } from \"./types\";\n\nexport const CP_AMM_PROGRAM_ID = new PublicKey(\n \"cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG\"\n);\n\nexport const LIQUIDITY_SCALE = 128;\nexport const SCALE_OFFSET = 64;\nexport const BASIS_POINT_MAX = 10_000;\nexport const FEE_DENOMINATOR = 1_000_000_000;\n\nexport const ONE_Q64 = new BN(1).shln(SCALE_OFFSET);\nexport const MAX_EXPONENTIAL = new BN(0x80000);\nexport const MAX = new BN(2).pow(new BN(128)).sub(new BN(1));\n\nexport const MIN_FEE_BPS = 1; // 0.01%\nexport const MIN_FEE_NUMERATOR = 100_000; // 0.01%\n\nexport const MAX_FEE_BPS_V0 = 5000; // 50%\nexport const MAX_FEE_NUMERATOR_V0 = 500_000_000; // 50%\n\nexport const MAX_FEE_BPS_V1 = 9900; // 99%\nexport const MAX_FEE_NUMERATOR_V1 = 990_000_000; // 99%\n\nexport const MIN_SQRT_PRICE = new BN(\"4295048016\");\nexport const MAX_SQRT_PRICE = new BN(\"79226673521066979257578248091\");\nexport const MIN_CU_BUFFER = 50_000;\nexport const MAX_CU_BUFFER = 200_000;\n\nexport const DYNAMIC_FEE_SCALING_FACTOR = new BN(100_000_000_000);\nexport const DYNAMIC_FEE_ROUNDING_OFFSET = new BN(99_999_999_999);\nexport const DYNAMIC_FEE_FILTER_PERIOD_DEFAULT = 10;\nexport const DYNAMIC_FEE_DECAY_PERIOD_DEFAULT = 120;\nexport const DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT = 5000; // 50%\nexport const BIN_STEP_BPS_DEFAULT = 1;\n// bin_step << 64 / BASIS_POINT_MAX\nexport const BIN_STEP_BPS_U128_DEFAULT = new BN(\"1844674407370955\");\nexport const MAX_PRICE_CHANGE_BPS_DEFAULT = 1500; // 15%\n\nexport const U128_MAX = new BN(\"340282366920938463463374607431768211455\");\nexport const U64_MAX = new BN(\"18446744073709551615\");\nexport const U16_MAX = 65535;\n\nexport const MAX_RATE_LIMITER_DURATION_IN_SECONDS = 43200; // 12 hours\nexport const MAX_RATE_LIMITER_DURATION_IN_SLOTS = 108000; // 12 hours\n\nexport const SPLIT_POSITION_DENOMINATOR = 1_000_000_000;\n\nexport const CURRENT_POOL_VERSION = PoolVersion.V0;\n","import { bs58 } from \"@coral-xyz/anchor/dist/cjs/utils/bytes\";\nimport {\n AccountLayout,\n createAssociatedTokenAccountIdempotentInstruction,\n createCloseAccountInstruction,\n getAccount,\n getAssociatedTokenAddressSync,\n getMint,\n NATIVE_MINT,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n TokenAccountNotFoundError,\n TokenInvalidAccountOwnerError,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n GetProgramAccountsFilter,\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from \"@solana/web3.js\";\n\n/**\n * Gets the token program\n * @param flag - The flag\n * @returns The token program\n */\nexport function getTokenProgram(flag: number): PublicKey {\n return flag == 0 ? TOKEN_PROGRAM_ID : TOKEN_2022_PROGRAM_ID;\n}\n\n/**\n * Gets the token decimals\n * @param connection - The connection\n * @param mint - The mint\n * @returns The token decimals\n */\nexport const getTokenDecimals = async (\n connection: Connection,\n mint: PublicKey,\n tokenProgram: PublicKey\n): Promise<number> => {\n return (await getMint(connection, mint, \"confirmed\", tokenProgram)).decimals;\n};\n\n/**\n * Gets the or creates the ATA instruction\n * @param connection - The connection\n * @param tokenMint - The token mint\n * @param owner - The owner\n * @param payer - The payer\n * @param allowOwnerOffCurve - The allow owner off curve\n * @param tokenProgram - The token program\n * @returns The ATA instruction\n */\nexport const getOrCreateATAInstruction = async (\n connection: Connection,\n tokenMint: PublicKey,\n owner: PublicKey,\n payer: PublicKey = owner,\n allowOwnerOffCurve = true,\n tokenProgram: PublicKey\n): Promise<{ ataPubkey: PublicKey; ix?: TransactionInstruction }> => {\n const toAccount = getAssociatedTokenAddressSync(\n tokenMint,\n owner,\n allowOwnerOffCurve,\n tokenProgram\n );\n\n try {\n await getAccount(connection, toAccount);\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 tokenProgram\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\n/**\n * Gets the wrap SOL instruction\n * @param from - The from\n * @param to - The to\n * @param amount - The amount\n * @returns The wrap SOL instruction\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\n/**\n * Gets the unwrap SOL instruction\n * @param owner - The owner\n * @param receiver - The receiver\n * @param allowOwnerOffCurve - The allow owner off curve\n * @returns The unwrap SOL instruction\n */\nexport const unwrapSOLInstruction = async (\n owner: PublicKey,\n receiver: PublicKey = owner,\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 receiver,\n owner,\n [],\n TOKEN_PROGRAM_ID\n );\n return closedWrappedSolInstruction;\n }\n return null;\n};\n\n/**\n * Gets all the user position NFT accounts\n * @param connection - The connection\n * @param user - The user\n * @returns The user position NFT accounts\n */\nexport async function getAllUserPositionNftAccount(\n connection: Connection,\n user: PublicKey\n): Promise<\n Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }>\n> {\n const filters: GetProgramAccountsFilter[] = [\n {\n memcmp: {\n offset: 32,\n bytes: user.toBase58(),\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: bs58.encode(Buffer.from([1, 0, 0, 0, 0, 0, 0, 0])), // 1\n },\n },\n ];\n\n const tokenAccountsRaw = await connection.getProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters,\n }\n );\n\n const userPositionNftAccount: Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }> = [];\n for (const { account, pubkey } of tokenAccountsRaw) {\n const tokenAccountData = AccountLayout.decode(account.data);\n userPositionNftAccount.push({\n positionNft: tokenAccountData.mint,\n positionNftAccount: pubkey,\n });\n }\n\n return userPositionNftAccount;\n}\n\n/**\n * Gets all the position NFT accounts by owner\n * @param connection - The connection\n * @param user - The user\n * @returns The position NFT accounts by owner\n */\nexport async function getAllPositionNftAccountByOwner(\n connection: Connection,\n user: PublicKey\n): Promise<\n Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }>\n> {\n const tokenAccounts = await connection.getTokenAccountsByOwner(user, {\n programId: TOKEN_2022_PROGRAM_ID,\n });\n\n const userPositionNftAccount: Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }> = [];\n for (const { account, pubkey } of tokenAccounts.value) {\n const tokenAccountData = AccountLayout.decode(account.data);\n if (tokenAccountData.amount.toString() === \"1\") {\n userPositionNftAccount.push({\n positionNft: tokenAccountData.mint,\n positionNftAccount: pubkey,\n });\n }\n }\n\n return userPositionNftAccount;\n}\n","import {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { MAX_CU_BUFFER, MIN_CU_BUFFER } from \"../constants\";\n\n/**\n * Gets the estimated compute unit usage for a transaction.\n * @param connection - The connection to the Solana cluster\n * @param instructions - The instructions to simulate\n * @param payer - The public key of the fee payer\n * @param lookupTables - The lookup tables to simulate\n * @param commitment - The commitment level to simulate\n * @returns The estimated compute unit usage\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\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 if (!estimatedComputeUnitUsage) {\n return 0;\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 { BASIS_POINT_MAX, LIQUIDITY_SCALE } from \"../constants\";\nimport Decimal from \"decimal.js\";\nimport { PoolState, PositionState, SwapMode } from \"../types\";\n\n/**\n * It takes an amount and a slippage rate, and returns the maximum amount that can be received with\n * that slippage rate\n * @param {BN} amount - The amount of tokens you want to buy.\n * @param {number} rate - The maximum percentage of slippage you're willing to accept. (Max to 2 decimal place)\n * @returns The maximum amount of tokens that can be bought with the given amount of ETH, given the\n * slippage rate.\n */\nexport const getMaxAmountWithSlippage = (amount: BN, rate: number) => {\n const slippage = ((100 + rate) / 100) * BASIS_POINT_MAX;\n return amount.mul(new BN(slippage)).div(new BN(BASIS_POINT_MAX));\n};\n\n/**\n * Calculates minimum amount out or maximum amount in based on slippage and swap mode.\n * For ExactIn/PartialFill: returns minimum amount out.\n * For ExactOut: returns maximum amount in.\n *\n * @param {BN} amount - The base amount (outputAmount for ExactIn/PartialFill, includedFeeInputAmount for ExactOut)\n * @param {number} slippageBps - Slippage in basis points (1% = 100)\n * @param {SwapMode} swapMode - Swap mode (ExactIn, PartialFill, ExactOut)\n * @returns {BN} - Minimum amount out (for ExactIn/PartialFill) or maximum amount in (for ExactOut)\n */\nexport const getAmountWithSlippage = (\n amount: BN,\n slippageBps: number,\n swapMode: SwapMode\n): BN => {\n let result: BN;\n\n if (slippageBps > 0) {\n if (swapMode === SwapMode.ExactOut) {\n // maximum amount in: amount * (10000 + slippageBps) / 10000\n const slippageFactor = new BN(BASIS_POINT_MAX + slippageBps);\n result = amount.mul(slippageFactor).div(new BN(BASIS_POINT_MAX));\n } else {\n // minimum amount out: amount * (10000 - slippageBps) / 10000\n const slippageFactor = new BN(BASIS_POINT_MAX - slippageBps);\n result = amount.mul(slippageFactor).div(new BN(BASIS_POINT_MAX));\n }\n } else {\n result = amount;\n }\n\n return result;\n};\n\n/**\n * Calculate price impact as a percentage\n * Price impact measures how much worse the user's execution was compared to the current market price\n * @param amountIn - Input amount (in base units)\n * @param amountOut - Output amount (in base units)\n * @param currentSqrtPrice - Current pool sqrt price (spot price)\n * @param aToB - Direction of swap: true for token A to token B, false for token B to token A\n * @param tokenADecimal - Decimal places for token A\n * @param tokenBDecimal - Decimal places for token B\n * @returns Price impact as a percentage (e.g., 1.5 means 1.5% worse than spot price)\n */\nexport const getPriceImpact = (\n amountIn: BN,\n amountOut: BN,\n currentSqrtPrice: BN,\n aToB: boolean,\n tokenADecimal: number,\n tokenBDecimal: number\n): Decimal => {\n if (amountIn.eq(new BN(0))) {\n return new Decimal(0);\n }\n if (amountOut.eq(new BN(0))) {\n throw new Error(\"Amount out must be greater than 0\");\n }\n\n // spot price: (sqrtPrice)^2 * 10^(base_decimal - quote_decimal) / 2^128\n const spotPrice = getPriceFromSqrtPrice(\n currentSqrtPrice,\n tokenADecimal,\n tokenBDecimal\n );\n\n // execution price: amountIn / amountOut\n const executionPrice = new Decimal(amountIn.toString())\n .div(new Decimal(amountOut.toString()))\n .mul(\n Decimal.pow(\n 10,\n aToB ? tokenBDecimal - tokenADecimal : tokenADecimal - tokenBDecimal\n )\n );\n\n let priceImpact: Decimal;\n let actualExecutionPrice: Decimal;\n if (aToB) {\n actualExecutionPrice = new Decimal(1).div(executionPrice);\n } else {\n actualExecutionPrice = executionPrice;\n }\n\n // price impact = abs(execution_price - spot_price) / spot_price * 100%\n priceImpact = actualExecutionPrice\n .sub(spotPrice)\n .abs()\n .div(spotPrice)\n .mul(100);\n\n return priceImpact;\n};\n\n/**\n * Calculate price change as a percentage (old implementation)\n * This measures the percentage change in pool price after a swap\n * @param nextSqrtPrice sqrt price after swap\n * @param currentSqrtPrice current pool sqrt price\n * @returns Price change as a percentage (e.g., 1.5 means 1.5% change)\n */\nexport const getPriceChange = (\n nextSqrtPrice: BN,\n currentSqrtPrice: BN\n): number => {\n // price = (sqrtPrice)^2 * 10 ** (base_decimal - quote_decimal) / 2^128\n // k = 10^(base_decimal - quote_decimal) / 2^128\n // priceA = (sqrtPriceA)^2 * k\n // priceB = (sqrtPriceB)^2 * k\n // => price_change = k * abs ( (sqrtPriceA)^2 - (sqrtPriceB)^2 ) * 100 / (sqrtPriceB)^2 * k\n // => price_change = abs ( (sqrtPriceA)^2 - (sqrtPriceB)^2 ) * 100 / (sqrtPriceB)^2\n const diff = nextSqrtPrice\n .pow(new BN(2))\n .sub(currentSqrtPrice.pow(new BN(2)))\n .abs();\n\n return new Decimal(diff.toString())\n .div(new Decimal(currentSqrtPrice.pow(new BN(2)).toString()))\n .mul(100)\n .toNumber();\n};\n\n/**\n * Converts a sqrt price to a price\n * (sqrtPrice)^2 * 10 ** (base_decimal - quote_decimal) / 2^128\n * @param sqrtPrice - The sqrt price\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @returns The price\n */\nexport const getPriceFromSqrtPrice = (\n sqrtPrice: BN,\n tokenADecimal: number,\n tokenBDecimal: number\n): Decimal => {\n const decimalSqrtPrice = new Decimal(sqrtPrice.toString());\n const price = decimalSqrtPrice\n .mul(decimalSqrtPrice)\n .mul(new Decimal(10 ** (tokenADecimal - tokenBDecimal)))\n .div(Decimal.pow(2, 128));\n\n return price;\n};\n\n/**\n * Converts a price to a sqrt price\n * sqrt(price / 10^(tokenADecimal - tokenBDecimal)) * 2^64\n * @param price - The price\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @returns The sqrt price\n */\nexport const getSqrtPriceFromPrice = (\n price: string,\n tokenADecimal: number,\n tokenBDecimal: number\n): BN => {\n const decimalPrice = new Decimal(price);\n\n const adjustedByDecimals = decimalPrice.div(\n new Decimal(10 ** (tokenADecimal - tokenBDecimal))\n );\n\n const sqrtValue = Decimal.sqrt(adjustedByDecimals);\n\n const sqrtValueQ64 = sqrtValue.mul(Decimal.pow(2, 64));\n\n return new BN(sqrtValueQ64.floor().toFixed());\n};\n\n// fee = totalLiquidity * feePerTokenStore\n// precision: (totalLiquidity * feePerTokenStore) >> 128\n/**\n * Gets the unclaimed reward\n * fee = totalLiquidity * feePerTokenStore\n * precision: (totalLiquidity * feePerTokenStore) >> 128\n * @param poolState - The pool state\n * @param positionState - The position state\n * @returns The unclaimed reward\n */\nexport const getUnClaimReward = (\n poolState: PoolState,\n positionState: PositionState\n): {\n feeTokenA: BN;\n feeTokenB: BN;\n rewards: BN[];\n} => {\n const totalPositionLiquidity = positionState.unlockedLiquidity\n .add(positionState.vestedLiquidity)\n .add(positionState.permanentLockedLiquidity);\n\n const feeAPerTokenStored = new BN(\n Buffer.from(poolState.feeAPerLiquidity).reverse()\n ).sub(new BN(Buffer.from(positionState.feeAPerTokenCheckpoint).reverse()));\n\n const feeBPerTokenStored = new BN(\n Buffer.from(poolState.feeBPerLiquidity).reverse()\n ).sub(new BN(Buffer.from(positionState.feeBPerTokenCheckpoint).reverse()));\n\n const feeA = totalPositionLiquidity\n .mul(feeAPerTokenStored)\n .shrn(LIQUIDITY_SCALE);\n const feeB = totalPositionLiquidity\n .mul(feeBPerTokenStored)\n .shrn(LIQUIDITY_SCALE);\n\n return {\n feeTokenA: positionState.feeAPending.add(feeA),\n feeTokenB: positionState.feeBPending.add(feeB),\n rewards:\n positionState.rewardInfos.length > 0\n ? positionState.rewardInfos.map((item) => item.rewardPendings)\n : [],\n };\n};\n","import { GetProgramAccountsFilter, PublicKey } from \"@solana/web3.js\";\n\n/**\n * Filters for the position by pool\n * @param pool - The pool address\n * @returns The filter for the position by pool\n */\nexport const positionByPoolFilter = (\n pool: PublicKey\n): GetProgramAccountsFilter => {\n return {\n memcmp: {\n bytes: pool.toBase58(),\n offset: 8,\n },\n };\n};\n\n/**\n * Filters for the vesting by position\n * @param position - The position address\n * @returns The filter for the vesting by position\n */\nexport const vestingByPositionFilter = (\n position: PublicKey\n): GetProgramAccountsFilter => {\n return {\n memcmp: {\n bytes: position.toBase58(),\n offset: 8,\n },\n };\n};\n","import { BN } from \"@coral-xyz/anchor\";\nimport {\n calculateFee,\n getEpochFee,\n getTransferFeeConfig,\n MAX_FEE_BASIS_POINTS,\n Mint,\n TransferFee,\n} from \"@solana/spl-token\";\n\ninterface TransferFeeIncludedAmount {\n amount: BN;\n transferFee: BN;\n}\n\n/**\n * Calculates the pre fee amount\n * @param transferFee - The transfer fee\n * @param postFeeAmount - The post fee amount\n * @returns The pre fee amount\n */\nfunction calculatePreFeeAmount(transferFee: TransferFee, postFeeAmount: BN) {\n if (postFeeAmount.isZero()) {\n return new BN(0);\n }\n\n if (transferFee.transferFeeBasisPoints === 0) {\n return postFeeAmount;\n }\n\n const maximumFee = new BN(transferFee.maximumFee.toString());\n\n if (transferFee.transferFeeBasisPoints === MAX_FEE_BASIS_POINTS) {\n return postFeeAmount.add(maximumFee);\n }\n\n const ONE_IN_BASIS_POINTS = new BN(MAX_FEE_BASIS_POINTS);\n const numerator = postFeeAmount.mul(ONE_IN_BASIS_POINTS);\n const denominator = ONE_IN_BASIS_POINTS.sub(\n new BN(transferFee.transferFeeBasisPoints)\n );\n\n const rawPreFeeAmount = numerator\n .add(denominator)\n .sub(new BN(1))\n .div(denominator);\n\n if (rawPreFeeAmount.sub(postFeeAmount).gte(maximumFee)) {\n return postFeeAmount.add(maximumFee);\n }\n\n return rawPreFeeAmount;\n}\n\n/**\n * Calculates the inverse fee\n * @param transferFee - The transfer fee\n * @param postFeeAmount - The post fee amount\n * @returns The inverse fee\n */\nfunction calculateInverseFee(transferFee: TransferFee, postFeeAmount: BN) {\n const preFeeAmount = calculatePreFeeAmount(transferFee, postFeeAmount);\n return new BN(\n calculateFee(transferFee, BigInt(preFeeAmount.toString())).toString()\n );\n}\n\n/**\n * Calculates the transfer fee included amount\n * @param transferFeeExcludedAmount - The transfer fee excluded amount\n * @param mint - The mint\n * @param currentEpoch - The current epoch\n * @returns The transfer fee included amount\n */\nexport function calculateTransferFeeIncludedAmount(\n transferFeeExcludedAmount: BN,\n mint: Mint,\n currentEpoch: number\n): TransferFeeIncludedAmount {\n if (transferFeeExcludedAmount.isZero()) {\n return {\n amount: new BN(0),\n transferFee: new BN(0),\n };\n }\n\n const transferFeeConfig = getTransferFeeConfig(mint);\n\n if (transferFeeConfig === null) {\n return {\n amount: transferFeeExcludedAmount,\n transferFee: new BN(0),\n };\n }\n\n const epochFee = getEpochFee(transferFeeConfig, BigInt(currentEpoch));\n\n const transferFee =\n epochFee.transferFeeBasisPoints == MAX_FEE_BASIS_POINTS\n ? new BN(epochFee.maximumFee.toString())\n : calculateInverseFee(epochFee, transferFeeExcludedAmount);\n\n const transferFeeIncludedAmount = transferFeeExcludedAmount.add(transferFee);\n\n return {\n amount: transferFeeIncludedAmount,\n transferFee,\n };\n}\n\ninterface TransferFeeExcludedAmount {\n amount: BN;\n transferFee: BN;\n}\n\n/**\n * Calculates the transfer fee excluded amount\n * @param transferFeeIncludedAmount - The transfer fee included amount\n * @param mint - The mint\n * @param currentEpoch - The current epoch\n * @returns The transfer fee excluded amount\n */\nexport function calculateTransferFeeExcludedAmount(\n transferFeeIncludedAmount: BN,\n mint: Mint,\n currentEpoch: number\n): TransferFeeExcludedAmount {\n const transferFeeConfig = getTransferFeeConfig(mint);\n if (transferFeeConfig === null) {\n return {\n amount: transferFeeIncludedAmount,\n transferFee: new BN(0),\n };\n }\n\n const transferFeeIncludedAmountN = BigInt(\n transferFeeIncludedAmount.toString()\n );\n\n const transferFee = calculateFee(\n getEpochFee(transferFeeConfig, BigInt(currentEpoch)),\n transferFeeIncludedAmountN\n );\n\n const transferFeeExcludedAmount = new BN(\n (transferFeeIncludedAmountN - transferFee).toString()\n );\n\n return {\n amount: transferFeeExcludedAmount,\n transferFee: new BN(transferFee.toString()),\n };\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport { PositionState, VestingState } from \"../types\";\nimport { min } from \"bn.js\";\n\n/**\n * Checks if a vesting schedule is ready for full release\n * @param vestingData The vesting account data\n * @param currentPoint Current timestamp or slot\n * @returns True if the vesting is complete and all liquidity can be released\n */\nexport function isVestingComplete(\n vestingData: VestingState,\n currentPoint: BN\n): boolean {\n const cliffPoint = vestingData.cliffPoint;\n const periodFrequency = vestingData.periodFrequency;\n const numberOfPeriods = vestingData.numberOfPeriod;\n\n const endPoint = cliffPoint.add(periodFrequency.muln(numberOfPeriods));\n\n return currentPoint.gte(endPoint);\n}\n\n/**\n * Gets the total amount of liquidity in the vesting schedule\n * @param vestingData The vesting account data\n * @returns The total locked liquidity amount\n */\nexport function getTotalLockedLiquidity(vestingData: VestingState): BN {\n return vestingData.cliffUnlockLiquidity.add(\n vestingData.liquidityPerPeriod.mul(new BN(vestingData.numberOfPeriod))\n );\n}\n\n/**\n * Calculates the available liquidity to withdraw based on vesting schedule\n * @param vestingData The vesting account data\n * @param positionData The position account data\n * @param currentPoint Current timestamp or slot\n * @returns The amount of liquidity available to withdraw\n */\nexport function getAvailableVestingLiquidity(\n vestingData: VestingState,\n currentPoint: BN\n): BN {\n const {\n cliffPoint,\n periodFrequency,\n cliffUnlockLiquidity,\n liquidityPerPeriod,\n numberOfPeriod,\n totalReleasedLiquidity,\n } = vestingData;\n\n if (currentPoint.lt(cliffPoint)) {\n return new BN(0);\n }\n\n if (periodFrequency.isZero()) {\n return cliffUnlockLiquidity;\n }\n\n let passedPeriod = new BN(currentPoint).sub(cliffPoint).div(periodFrequency);\n\n passedPeriod = min(passedPeriod, new BN(numberOfPeriod));\n\n // total unlocked liquidity: cliff + (periods * per_period)\n const unlockedLiquidity = cliffUnlockLiquidity.add(\n passedPeriod.mul(liquidityPerPeriod)\n );\n const availableReleasingLiquidity = unlockedLiquidity.sub(\n totalReleasedLiquidity\n );\n\n return availableReleasingLiquidity;\n}\n","import BN from \"bn.js\";\nimport {\n ActivationType,\n BaseFeeMode,\n CollectFeeMode,\n PoolVersion,\n} from \"../types\";\nimport {\n getFeeNumeratorFromIncludedFeeAmount,\n getMaxBaseFeeNumerator,\n getMinBaseFeeNumerator,\n isNonZeroRateLimiter,\n isZeroRateLimiter,\n} from \"../math/poolFees\";\nimport {\n FEE_DENOMINATOR,\n MAX_RATE_LIMITER_DURATION_IN_SECONDS,\n MAX_RATE_LIMITER_DURATION_IN_SLOTS,\n MIN_FEE_NUMERATOR,\n} from \"../constants\";\nimport { toNumerator } from \"../math\";\nimport { getMaxFeeBps, getMaxFeeNumerator } from \"../math\";\n\n/**\n * Validate fee scheduler parameters\n * @param numberOfPeriod Number of periods\n * @param periodFrequency Period frequency\n * @param reductionFactor Reduction factor\n * @param cliffFeeNumerator Cliff fee numerator\n * @returns Validation result\n */\nexport function validateFeeScheduler(\n numberOfPeriod: number,\n periodFrequency: BN,\n reductionFactor: BN,\n cliffFeeNumerator: BN,\n baseFeeMode: BaseFeeMode,\n poolVersion: PoolVersion\n): boolean {\n if (\n !periodFrequency.eq(new BN(0)) ||\n numberOfPeriod !== 0 ||\n !reductionFactor.eq(new BN(0))\n ) {\n if (\n numberOfPeriod === 0 ||\n periodFrequency.eq(new BN(0)) ||\n reductionFactor.eq(new BN(0))\n ) {\n return false;\n }\n }\n\n const minFeeNumerator = getMinBaseFeeNumerator(\n cliffFeeNumerator,\n numberOfPeriod,\n reductionFactor,\n baseFeeMode\n );\n const maxFeeNumerator = getMaxBaseFeeNumerator(cliffFeeNumerator);\n validateFeeFraction(minFeeNumerator, new BN(FEE_DENOMINATOR));\n validateFeeFraction(maxFeeNumerator, new BN(FEE_DENOMINATOR));\n\n if (\n minFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n maxFeeNumerator.gt(getMaxFeeNumerator(poolVersion))\n ) {\n throw new Error(\"PoolError::ExceedMaxFeeBps\");\n }\n\n return true;\n}\n\n/**\n * Validate rate limiter parameters\n * @param cliffFeeNumerator - Cliff fee numerator\n * @param feeIncrementBps - Fee increment bps\n * @param maxLimiterDuration - Max limiter duration\n * @param referenceAmount - Reference amount\n * @param collectFeeMode - Collect fee mode\n * @param activationType - Activation type (slot or timestamp)\n * @returns Validation result\n */\nexport function validateFeeRateLimiter(\n cliffFeeNumerator: BN,\n feeIncrementBps: number,\n maxFeeBps: number,\n maxLimiterDuration: number,\n referenceAmount: BN,\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n): boolean {\n // can only be applied in OnlyB collect fee mode\n if (collectFeeMode !== CollectFeeMode.OnlyB) {\n return false;\n }\n\n // max_fee_numerator_from_bps = to_numerator(maxFeeBps, FEE_DENOMINATOR)\n const maxFeeNumeratorFromBps = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n\n // cliff_fee_numerator >= MIN_FEE_NUMERATOR && cliff_fee_numerator <= max_fee_numerator_from_bps\n if (\n cliffFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n cliffFeeNumerator.gt(maxFeeNumeratorFromBps)\n ) {\n return false;\n }\n\n // is_zero_rate_limiter\n if (\n isZeroRateLimiter(\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n feeIncrementBps\n )\n ) {\n return true;\n }\n\n if (\n isNonZeroRateLimiter(\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n feeIncrementBps\n )\n ) {\n return false;\n }\n\n // max_limiter_duration = match activation_type\n const maxLimiterDurationLimit =\n activationType === ActivationType.Slot\n ? new BN(MAX_RATE_LIMITER_DURATION_IN_SLOTS)\n : new BN(MAX_RATE_LIMITER_DURATION_IN_SECONDS);\n\n if (new BN(maxLimiterDuration).gt(maxLimiterDurationLimit)) {\n return false;\n }\n\n // fee_increment_numerator = to_numerator(feeIncrementBps, FEE_DENOMINATOR)\n const feeIncrementNumerator = toNumerator(\n new BN(feeIncrementBps),\n new BN(FEE_DENOMINATOR)\n );\n if (feeIncrementNumerator.gte(new BN(FEE_DENOMINATOR))) {\n return false;\n }\n\n if (maxFeeBps > getMaxFeeBps(poolVersion)) {\n return false;\n }\n\n // validate max fee (more amount, then more fee)\n const minFeeNumerator = getFeeNumeratorFromIncludedFeeAmount(\n new BN(0),\n cliffFeeNumerator,\n referenceAmount,\n maxFeeBps,\n feeIncrementBps\n );\n const maxFeeNumeratorFromAmount = getFeeNumeratorFromIncludedFeeAmount(\n new BN(Number.MAX_SAFE_INTEGER),\n cliffFeeNumerator,\n referenceAmount,\n maxFeeBps,\n feeIncrementBps\n );\n\n if (\n minFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n maxFeeNumeratorFromAmount.gt(getMaxFeeNumerator(poolVersion))\n ) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validates that the fee fraction is valid (numerator < denominator, denominator != 0)\n * @param numerator - The numerator of the fee fraction\n * @param denominator - The denominator of the fee fraction\n * @throws Error if the fee fraction is invalid\n */\nexport function validateFeeFraction(numerator: BN, denominator: BN): void {\n if (denominator.isZero() || numerator.gte(denominator)) {\n throw new Error(\n \"InvalidFee: Fee numerator must be less than denominator and denominator must be non-zero\"\n );\n }\n}\n","import BN from \"bn.js\";\nimport {\n TradeDirection,\n BaseFeeMode,\n CollectFeeMode,\n ActivationType,\n BaseFeeHandler,\n PoolVersion,\n} from \"../../types\";\nimport {\n getFeeNumeratorFromIncludedFeeAmount,\n getFeeNumeratorFromExcludedFeeAmount,\n isRateLimiterApplied,\n} from \"./rateLimiter\";\nimport { getBaseFeeNumerator } from \"./feeScheduler\";\nimport { validateFeeRateLimiter, validateFeeScheduler } from \"../../helpers\";\n\n/**\n * Fee Rate Limiter class\n */\nexport class FeeRateLimiter implements BaseFeeHandler {\n constructor(\n public cliffFeeNumerator: BN,\n public feeIncrementBps: number,\n public maxFeeBps: number,\n public maxLimiterDuration: number,\n public referenceAmount: BN\n ) {}\n\n validate(\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n ): boolean {\n return validateFeeRateLimiter(\n this.cliffFeeNumerator,\n this.feeIncrementBps,\n this.maxFeeBps,\n this.maxLimiterDuration,\n this.referenceAmount,\n collectFeeMode,\n activationType,\n poolVersion\n );\n }\n\n getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n includedFeeAmount: BN\n ): BN {\n if (\n isRateLimiterApplied(\n this.referenceAmount,\n this.maxLimiterDuration,\n this.maxFeeBps,\n this.feeIncrementBps,\n currentPoint,\n activationPoint,\n tradeDirection\n )\n ) {\n return getFeeNumeratorFromIncludedFeeAmount(\n includedFeeAmount,\n this.referenceAmount,\n this.cliffFeeNumerator,\n this.maxFeeBps,\n this.feeIncrementBps\n );\n } else {\n return this.cliffFeeNumerator;\n }\n }\n\n getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n excludedFeeAmount: BN\n ): BN {\n if (\n isRateLimiterApplied(\n this.referenceAmount,\n this.maxLimiterDuration,\n this.maxFeeBps,\n this.feeIncrementBps,\n currentPoint,\n activationPoint,\n tradeDirection\n )\n ) {\n return getFeeNumeratorFromExcludedFeeAmount(\n excludedFeeAmount,\n this.referenceAmount,\n this.cliffFeeNumerator,\n this.maxFeeBps,\n this.feeIncrementBps\n );\n } else {\n return this.cliffFeeNumerator;\n }\n }\n}\n\n/**\n * Fee Scheduler implementation\n */\nexport class FeeScheduler implements BaseFeeHandler {\n constructor(\n public cliffFeeNumerator: BN,\n public numberOfPeriod: number,\n public periodFrequency: BN,\n public reductionFactor: BN,\n public feeSchedulerMode: BaseFeeMode\n ) {}\n\n validate(\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n ): boolean {\n return validateFeeScheduler(\n this.numberOfPeriod,\n this.periodFrequency,\n this.reductionFactor,\n this.cliffFeeNumerator,\n this.feeSchedulerMode,\n poolVersion\n );\n }\n\n getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN\n ): BN {\n return getBaseFeeNumerator(\n this.cliffFeeNumerator,\n this.numberOfPeriod,\n this.periodFrequency,\n this.reductionFactor,\n this.feeSchedulerMode,\n currentPoint,\n activationPoint\n );\n }\n\n getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN\n ): BN {\n return getBaseFeeNumerator(\n this.cliffFeeNumerator,\n this.numberOfPeriod,\n this.periodFrequency,\n this.reductionFactor,\n this.feeSchedulerMode,\n currentPoint,\n activationPoint\n );\n }\n}\n\n/**\n * Get base fee handler based on base fee mode\n * @param cliffFeeNumerator Cliff fee numerator\n * @param firstFactor First factor (feeScheduler: numberOfPeriod, rateLimiter: feeIncrementBps)\n * @param secondFactor Second factor (feeScheduler: periodFrequency, rateLimiter: maxLimiterDuration)\n * @param thirdFactor Third factor (feeScheduler: reductionFactor, rateLimiter: referenceAmount)\n * @param baseFeeMode Base fee mode\n * @returns Base fee handler instance\n */\nexport function getBaseFeeHandler(\n cliffFeeNumerator: BN,\n firstFactor: number,\n secondFactor: number[],\n thirdFactor: BN,\n baseFeeMode: BaseFeeMode\n): BaseFeeHandler {\n switch (baseFeeMode) {\n case BaseFeeMode.FeeSchedulerLinear:\n case BaseFeeMode.FeeSchedulerExponential: {\n if (secondFactor.length < 8) {\n throw new Error(\n \"TypeCastFailed: secondFactor must be at least 8 bytes\"\n );\n }\n\n // periodFrequency is a u64 little-endian from 8 bytes\n const periodFrequency = new BN(\n Buffer.from(secondFactor.slice(0, 8)),\n \"le\"\n );\n const feeScheduler = new FeeScheduler(\n cliffFeeNumerator,\n firstFactor,\n periodFrequency,\n thirdFactor,\n baseFeeMode\n );\n return feeScheduler;\n }\n case BaseFeeMode.RateLimiter: {\n // secondFactor: first 4 bytes = maxLimiterDuration (u32 LE), next 4 bytes = maxFeeBps (u32 LE)\n if (secondFactor.length < 8) {\n throw new Error(\n \"TypeCastFailed: secondFactor must be at least 8 bytes\"\n );\n }\n const maxLimiterDuration = Buffer.from(\n secondFactor.slice(0, 4)\n ).readUInt32LE(0);\n const maxFeeBps = Buffer.from(secondFactor.slice(4, 8)).readUInt32LE(0);\n\n const feeRateLimiter = new FeeRateLimiter(\n cliffFeeNumerator,\n firstFactor,\n maxFeeBps,\n maxLimiterDuration,\n thirdFactor\n );\n return feeRateLimiter;\n }\n default:\n throw new Error(\"Invalid base fee mode\");\n }\n}\n","import BN from \"bn.js\";\nimport { Rounding, TradeDirection } from \"../../types\";\nimport { FEE_DENOMINATOR, U64_MAX } from \"../../constants\";\nimport { getExcludedFeeAmount, getIncludedFeeAmount } from \"../feeMath\";\nimport { mulDiv, sqrt } from \"../utilsMath\";\nimport { toNumerator } from \"../feeMath\";\n\n/// we denote reference_amount = x0, cliff_fee_numerator = c, fee_increment = i\n/// if input_amount <= x0, then fee = input_amount * c\n///\n/// if input_amount > x0, then input_amount = x0 + (a * x0 + b)\n/// if a < max_index\n/// then fee = x0 * c + x0 * (c + i) + .... + x0 * (c + i*a) + b * (c + i * (a+1))\n/// then fee = x0 * (c + c*a + i*a*(a+1)/2) + b * (c + i * (a+1))\n///\n/// if a >= max_index\n/// if a = max_index + d, input_amount = x0 + max_index * x0 + (d * x0 + b)\n/// then fee = x0 * (c + c*max_index + i*max_index*(max_index+1)/2) + (d * x0 + b) * MAX_FEE\n\n/**\n * Checks if the rate limiter is zero.\n * @param referenceAmount - The reference amount.\n * @param maxLimiterDuration - The maximum rate limiter duration.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns True if the rate limiter is zero, false otherwise.\n */\nexport function isZeroRateLimiter(\n referenceAmount: BN,\n maxLimiterDuration: number,\n maxFeeBps: number,\n feeIncrementBps: number\n): boolean {\n return (\n referenceAmount.isZero() &&\n maxLimiterDuration === 0 &&\n maxFeeBps === 0 &&\n feeIncrementBps === 0\n );\n}\n\n/**\n * Checks if the rate limiter is non-zero.\n * @param referenceAmount - The reference amount.\n * @param maxLimiterDuration - The maximum rate limiter duration.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns True if the rate limiter is non-zero, false otherwise.\n */\nexport function isNonZeroRateLimiter(\n referenceAmount: BN,\n maxLimiterDuration: number,\n maxFeeBps: number,\n feeIncrementBps: number\n): boolean {\n return (\n referenceAmount.isZero() &&\n maxLimiterDuration !== 0 &&\n maxFeeBps !== 0 &&\n feeIncrementBps !== 0\n );\n}\n\n/**\n * Checks if the rate limiter is applied.\n * @param referenceAmount - The reference amount.\n * @param maxLimiterDuration - The maximum rate limiter duration.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @param currentPoint - The current point.\n * @param activationPoint - The activation point.\n * @param tradeDirection - The trade direction.\n * @returns True if the rate limiter is applied, false otherwise.\n */\nexport function isRateLimiterApplied(\n referenceAmount: BN,\n maxLimiterDuration: number,\n maxFeeBps: number,\n feeIncrementBps: number,\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection\n): boolean {\n // if rate limiter is zero, return false\n if (\n isZeroRateLimiter(\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n feeIncrementBps\n )\n ) {\n return false;\n }\n\n // only handle for the case B to A and collect fee mode in token B\n if (tradeDirection === TradeDirection.AtoB) {\n return false;\n }\n\n if (currentPoint.lt(activationPoint)) {\n return false;\n }\n\n // last_effective_rate_limiter_point = activation_point + max_limiter_duration\n const lastEffectiveRateLimiterPoint = activationPoint.add(\n new BN(maxLimiterDuration)\n );\n\n if (currentPoint.gt(lastEffectiveRateLimiterPoint)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Gets the maximum index.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns The maximum index.\n */\nexport function getMaxIndex(\n maxFeeBps: number,\n cliffFeeNumerator: BN,\n feeIncrementBps: number\n): BN {\n // max_fee_numerator = to_numerator(maxFeeBps, FEE_DENOMINATOR)\n const maxFeeNumerator = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n\n // delta_numerator = max_fee_numerator.safe_sub(cliff_fee_numerator)\n if (cliffFeeNumerator.gt(maxFeeNumerator)) {\n throw new Error(\"cliffFeeNumerator cannot be greater than maxFeeNumerator\");\n }\n const deltaNumerator = maxFeeNumerator.sub(cliffFeeNumerator);\n\n // fee_increment_numerator = to_numerator(feeIncrementBps, FEE_DENOMINATOR)\n const feeIncrementNumerator = toNumerator(\n new BN(feeIncrementBps),\n new BN(FEE_DENOMINATOR)\n );\n\n if (feeIncrementNumerator.isZero()) {\n throw new Error(\"feeIncrementNumerator cannot be zero\");\n }\n\n const maxIndex = deltaNumerator.div(feeIncrementNumerator);\n\n return maxIndex;\n}\n\n/**\n * Gets the fee numerator from included fee amount.\n * @param inputAmount - The input amount.\n * @param referenceAmount - The reference amount.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns The fee numerator from included fee amount.\n */\nexport function getFeeNumeratorFromIncludedFeeAmount(\n inputAmount: BN,\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): BN {\n if (inputAmount.lte(referenceAmount)) {\n return cliffFeeNumerator;\n } else {\n // max_fee_numerator = to_numerator(maxFeeBps, FEE_DENOMINATOR)\n const maxFeeNumerator = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n\n const c = cliffFeeNumerator;\n // a = (inputAmount - referenceAmount) / referenceAmount\n // b = (inputAmount - referenceAmount) % referenceAmount\n const inputMinusRef = inputAmount.sub(referenceAmount);\n const a = inputMinusRef.div(referenceAmount);\n const b = inputMinusRef.mod(referenceAmount);\n\n const maxIndex = getMaxIndex(maxFeeBps, cliffFeeNumerator, feeIncrementBps);\n const i = toNumerator(new BN(feeIncrementBps), new BN(FEE_DENOMINATOR));\n const x0 = referenceAmount;\n const one = new BN(1);\n const two = new BN(2);\n\n let tradingFeeNumerator: BN;\n if (a.lt(maxIndex)) {\n // numerator_1 = c + c * a + i * a * (a + one) / two\n const numerator1 = c.add(c.mul(a)).add(i.mul(a).mul(a.add(one)).div(two));\n // numerator_2 = c + i * (a + one)\n const numerator2 = c.add(i.mul(a.add(one)));\n // first_fee = x0 * numerator_1\n const firstFee = x0.mul(numerator1);\n // second_fee = b * numerator_2\n const secondFee = b.mul(numerator2);\n tradingFeeNumerator = firstFee.add(secondFee);\n } else {\n // numerator_1 = c + c * max_index + i * max_index * (max_index + one) / two\n const numerator1 = c\n .add(c.mul(maxIndex))\n .add(i.mul(maxIndex).mul(maxIndex.add(one)).div(two));\n // numerator_2 = maxFeeNumerator\n const numerator2 = maxFeeNumerator;\n // first_fee = x0 * numerator_1\n const firstFee = x0.mul(numerator1);\n\n // d = a - max_index\n const d = a.sub(maxIndex);\n // left_amount = d * x0 + b\n const leftAmount = d.mul(x0).add(b);\n // second_fee = left_amount * numerator_2\n const secondFee = leftAmount.mul(numerator2);\n tradingFeeNumerator = firstFee.add(secondFee);\n }\n\n const denominator = new BN(FEE_DENOMINATOR);\n // trading_fee = (trading_fee_numerator + denominator - one) / denominator\n const tradingFee = tradingFeeNumerator\n .add(denominator)\n .sub(one)\n .div(denominator);\n\n // reverse to fee numerator\n // input_amount * numerator / FEE_DENOMINATOR = trading_fee\n // then numerator = trading_fee * FEE_DENOMINATOR / input_amount (rounded up)\n const numerator = mulDiv(tradingFee, denominator, inputAmount, Rounding.Up);\n\n if (numerator.gt(new BN(U64_MAX))) {\n throw new Error(\"Numerator does not fit in u64\");\n }\n\n return numerator;\n }\n}\n\n/**\n * Gets the excluded fee amount from included fee amount.\n * @param includedFeeAmount - The included fee amount.\n * @param referenceAmount - The reference amount.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns The excluded fee amount.\n */\nexport function getExcludedFeeAmountFromIncludedFeeAmount(\n includedFeeAmount: BN,\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): BN {\n const feeNumerator = getFeeNumeratorFromIncludedFeeAmount(\n includedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n const { excludedFeeAmount } = getExcludedFeeAmount(\n feeNumerator,\n includedFeeAmount\n );\n return excludedFeeAmount;\n}\n\n/**\n * Returns checked output and input amounts, and a flag indicating if the input was capped at u64::MAX.\n * @param referenceAmount - The reference amount\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param maxFeeBps - The maximum fee in basis points\n * @param feeIncrementBps - The fee increment in basis points\n * @returns [checkedOutputAmount: BN, checkedIncludedFeeAmount: BN, capped: boolean]\n */\nexport function getCheckedAmounts(\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): {\n checkedExcludedFeeAmount: BN;\n checkedIncludedFeeAmount: BN;\n isOverflow: boolean;\n} {\n const maxIndex = getMaxIndex(maxFeeBps, cliffFeeNumerator, feeIncrementBps);\n\n const x0 = referenceAmount;\n const one = new BN(1);\n const maxIndexInputAmount = maxIndex.add(one).mul(x0);\n\n if (maxIndexInputAmount.lte(U64_MAX)) {\n const checkedIncludedFeeAmount = maxIndexInputAmount;\n const checkedExcludedFeeAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n checkedIncludedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n return {\n checkedExcludedFeeAmount,\n checkedIncludedFeeAmount,\n isOverflow: false,\n };\n } else {\n const checkedIncludedFeeAmount = U64_MAX;\n const checkedExcludedFeeAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n checkedIncludedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n return {\n checkedExcludedFeeAmount,\n checkedIncludedFeeAmount,\n isOverflow: true,\n };\n }\n}\n\n/**\n * Calculates the fee numerator from an excluded fee amount.\n * @param excludedFeeAmount - The excluded fee amount\n * @param referenceAmount - The reference amount\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param maxFeeBps - The maximum fee in basis points\n * @param feeIncrementBps - The fee increment in basis points\n * @returns The fee numerator\n */\nexport function getFeeNumeratorFromExcludedFeeAmount(\n excludedFeeAmount: BN,\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): BN {\n // get excluded fee reference amount\n const excludedFeeReferenceAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n referenceAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n if (excludedFeeAmount.lte(excludedFeeReferenceAmount)) {\n return cliffFeeNumerator;\n }\n\n // get checked amounts\n const { checkedExcludedFeeAmount, checkedIncludedFeeAmount, isOverflow } =\n getCheckedAmounts(\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n\n if (excludedFeeAmount.eq(checkedExcludedFeeAmount)) {\n return getFeeNumeratorFromIncludedFeeAmount(\n checkedIncludedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n }\n\n let includedFeeAmount: BN;\n if (excludedFeeAmount.lt(checkedExcludedFeeAmount)) {\n const TWO = new BN(2);\n const FOUR = new BN(4);\n // d: fee denominator\n // ex: excluded_fee_amount\n // input_amount = x0 + (a * x0)\n // fee = x0 * (c + c*a + i*a*(a+1)/2) / d\n // fee = x0 * (a+1) * (c + i*a/2) / d\n // fee = input_amount * (c + i * (input_amount/x0-1)/2) / d\n // ex = input_amount - fee\n // ex = input_amount - input_amount * (c + i * (input_amount/x0-1)/2) / d\n // ex * d * 2 = input_amount * d * 2 - input_amount * (2 * c + i * (input_amount/x0-1))\n // ex * d * 2 * x0 = input_amount * d * 2 * x0 - input_amount * (2 * c * x0 + i * (input_amount-x0))\n // ex * d * 2 * x0 = input_amount * d * 2 * x0 - input_amount * (2 * c * x0 + i * input_amount- i*x0)\n // ex * d * 2 * x0 = input_amount * d * 2 * x0 - input_amount * 2 * c * x0 - i * input_amount ^ 2 + input_amount * i*x0\n // i * input_amount ^ 2 - input_amount * (-2 * c * x0 + i*x0 + d * 2 * x0) + ex * d * 2 * x0 = 0\n // equation: x * input_amount ^ 2 - y * input_amount + z = 0\n // x = i, y = (-2 * c * x0 + i*x0 + d * 2 * x0), z = ex * d * 2 * x0\n // input_amount = (y +(-) sqrt(y^2 - 4xz)) / 2x\n const i = toNumerator(new BN(feeIncrementBps), new BN(FEE_DENOMINATOR));\n const x0 = referenceAmount;\n const d = new BN(FEE_DENOMINATOR);\n const c = cliffFeeNumerator;\n const ex = excludedFeeAmount;\n\n // x = i\n const x = i;\n // y = 2*d*x0 + i*x0 - 2*c*x0\n const y = TWO.mul(d).mul(x0).add(i.mul(x0)).sub(TWO.mul(c).mul(x0)); // y is always greater than 0\n // z = 2*ex*d*x0\n const z = TWO.mul(ex).mul(d).mul(x0);\n\n // solve quadratic equation\n // discriminant: y^2 - 4xz\n const discriminant = y.mul(y).sub(FOUR.mul(x).mul(z));\n const sqrtDiscriminant = sqrt(discriminant);\n\n includedFeeAmount = y.sub(sqrtDiscriminant).div(TWO.mul(x));\n\n // included_fee_amount = (y - sqrt(discriminant)) / (2x)\n const numerator = y.sub(sqrtDiscriminant);\n const denominator = TWO.mul(x);\n\n includedFeeAmount = numerator.div(denominator);\n // a_plus_one = included_fee_amount / x0\n const aPlusOne = includedFeeAmount.div(x0);\n\n const firstExcludedFeeAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n includedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n // excluded_fee_remaining_amount = excludedFeeAmount - firstExcludedFeeAmount\n const excludedFeeRemainingAmount = excludedFeeAmount.sub(\n firstExcludedFeeAmount\n );\n\n // remaining_amount_fee_numerator = c + i * a_plus_one\n const remainingAmountFeeNumerator = c.add(i.mul(aPlusOne));\n\n // included_fee_remaining_amount = getIncludedFeeAmount(remainingAmountFeeNumerator, excludedFeeRemainingAmount)\n const { includedFeeAmount: includedFeeRemainingAmount } =\n getIncludedFeeAmount(\n remainingAmountFeeNumerator,\n excludedFeeRemainingAmount\n );\n\n // total_in_amount = includedFeeAmount + includedFeeRemainingAmount\n includedFeeAmount = includedFeeAmount.add(includedFeeRemainingAmount);\n } else {\n // excludedFeeAmount > checkedExcludedFeeAmount\n if (isOverflow) {\n throw new Error(\"Math overflow in getFeeNumeratorFromExcludedFeeAmount\");\n }\n // excluded_fee_remaining_amount = excludedFeeAmount - checkedExcludedFeeAmount\n const excludedFeeRemainingAmount = excludedFeeAmount.sub(\n checkedExcludedFeeAmount\n );\n\n const maxFeeNumerator = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n const { includedFeeAmount: includedFeeRemainingAmount } =\n getIncludedFeeAmount(maxFeeNumerator, excludedFeeRemainingAmount);\n\n // total_amount_in = includedFeeRemainingAmount + checkedIncludedFeeAmount\n includedFeeAmount = includedFeeRemainingAmount.add(\n checkedIncludedFeeAmount\n );\n }\n\n // trading_fee = includedFeeAmount - excludedFeeAmount\n const tradingFee = includedFeeAmount.sub(excludedFeeAmount);\n\n // fee_numerator = mulDiv(tradingFee, FEE_DENOMINATOR, includedFeeAmount, Rounding.Up)\n const feeNumerator = mulDiv(\n tradingFee,\n new BN(FEE_DENOMINATOR),\n includedFeeAmount,\n Rounding.Up\n );\n\n // sanity check\n if (feeNumerator.lt(cliffFeeNumerator)) {\n throw new Error(\"feeNumerator is less than cliffFeeNumerator\");\n }\n\n return feeNumerator;\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport {\n BASIS_POINT_MAX,\n FEE_DENOMINATOR,\n MAX_FEE_BPS_V0,\n MAX_FEE_BPS_V1,\n MAX_FEE_NUMERATOR_V0,\n MAX_FEE_NUMERATOR_V1,\n ONE_Q64,\n SCALE_OFFSET,\n U128_MAX,\n U64_MAX,\n} from \"../constants\";\nimport { mulDiv, pow } from \"./utilsMath\";\nimport {\n CollectFeeMode,\n FeeMode,\n FeeOnAmountResult,\n PoolFeesStruct,\n PoolVersion,\n Rounding,\n SplitFees,\n TradeDirection,\n} from \"../types\";\nimport { getBaseFeeHandler, getDynamicFeeNumerator } from \"./poolFees\";\n\n/**\n * Converts basis points to a numerator\n * @param bps - The basis points\n * @param feeDenominator - The fee denominator\n * @returns The numerator\n */\nexport function toNumerator(bps: BN, feeDenominator: BN): BN {\n const numerator = mulDiv(\n bps,\n feeDenominator,\n new BN(BASIS_POINT_MAX),\n Rounding.Down\n );\n return numerator;\n}\n\n/**\n * Gets the fee in a period\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param reductionFactor - The reduction factor\n * @param passedPeriod - The passed period\n * @returns The fee in a period\n */\nexport function getFeeInPeriod(\n cliffFeeNumerator: BN,\n reductionFactor: BN,\n passedPeriod: number\n): BN {\n if (reductionFactor.isZero()) {\n return cliffFeeNumerator;\n }\n\n // Make bin_step into Q64x64, and divided by BASIS_POINT_MAX. If bin_step = 1, we get 0.0001 in Q64x64\n const bps = reductionFactor.shln(SCALE_OFFSET).div(new BN(BASIS_POINT_MAX));\n const base = ONE_Q64.sub(bps);\n const result = pow(base, new BN(passedPeriod));\n\n if (result.gt(U128_MAX)) {\n throw new Error(\"Math overflow\");\n }\n\n const fee = result.mul(cliffFeeNumerator).shrn(SCALE_OFFSET);\n\n return fee;\n}\n\n/**\n * Gets the fee mode\n * @param collectFeeMode - The collect fee mode\n * @param tradeDirection - The trade direction\n * @param hasReferral - The has referral\n * @returns The fee mode\n */\nexport function getFeeMode(\n collectFeeMode: CollectFeeMode,\n tradeDirection: TradeDirection,\n hasReferral: boolean\n): FeeMode {\n // (CollectFeeMode::BothToken, TradeDirection::AToB) => (false, false)\n // (CollectFeeMode::BothToken, TradeDirection::BtoA) => (false, true)\n // (CollectFeeMode::OnlyB, TradeDirection::AtoB) => (false, false)\n // (CollectFeeMode::OnlyB, TradeDirection::BtoA) => (true, false)\n\n let feesOnInput: boolean;\n let feesOnTokenA: boolean;\n\n if (collectFeeMode === CollectFeeMode.BothToken) {\n if (tradeDirection === TradeDirection.AtoB) {\n feesOnInput = false;\n feesOnTokenA = false;\n } else {\n // TradeDirection::BtoA\n feesOnInput = false;\n feesOnTokenA = true;\n }\n } else {\n // CollectFeeMode::OnlyB\n if (tradeDirection === TradeDirection.AtoB) {\n feesOnInput = false;\n feesOnTokenA = false;\n } else {\n // TradeDirection::BtoA\n feesOnInput = true;\n feesOnTokenA = false;\n }\n }\n\n return {\n feesOnInput,\n feesOnTokenA,\n hasReferral,\n };\n}\n\n/**\n * Gets the total fee numerator\n * @param poolFees - The pool fees\n * @param baseFeeNumerator - The base fee numerator\n * @param maxFeeNumerator - The max fee numerator\n * @returns The total fee numerator\n */\nexport function getTotalFeeNumerator(\n poolFees: PoolFeesStruct,\n baseFeeNumerator: BN,\n maxFeeNumerator: BN\n): BN {\n let dynamicFeeNumerator = new BN(0);\n\n if (poolFees.dynamicFee.initialized !== 0) {\n dynamicFeeNumerator = getDynamicFeeNumerator(\n poolFees.dynamicFee.volatilityAccumulator,\n new BN(poolFees.dynamicFee.binStep),\n new BN(poolFees.dynamicFee.variableFeeControl)\n );\n }\n\n const totalFeeNumerator = dynamicFeeNumerator.add(baseFeeNumerator);\n\n return BN.min(totalFeeNumerator, maxFeeNumerator);\n}\n\n/**\n * Gets the total trading fee from included fee amount\n * @param poolFees - The pool fees\n * @param currentPoint - The current point\n * @param activationPoint - The activation point\n * @param includedFeeAmount - The included fee amount\n * @param tradeDirection - The trade direction\n * @param maxFeeNumerator - The max fee numerator\n * @returns The total trading fee from included fee amount\n */\nexport function getTotalTradingFeeFromIncludedFeeAmount(\n poolFees: PoolFeesStruct,\n currentPoint: BN,\n activationPoint: BN,\n includedFeeAmount: BN,\n tradeDirection: TradeDirection,\n maxFeeNumerator: BN\n): BN {\n const baseFeeHandler = getBaseFeeHandler(\n poolFees.baseFee.cliffFeeNumerator,\n poolFees.baseFee.firstFactor,\n poolFees.baseFee.secondFactor,\n poolFees.baseFee.thirdFactor,\n poolFees.baseFee.baseFeeMode\n );\n\n // get the base fee numerator from the included fee amount\n const baseFeeNumerator =\n baseFeeHandler.getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint,\n activationPoint,\n tradeDirection,\n includedFeeAmount\n );\n\n // get the total fee numerator, capped at maxFeeNumerator\n return getTotalFeeNumerator(poolFees, baseFeeNumerator, maxFeeNumerator);\n}\n\n/**\n * Gets the total trading fee from excluded fee amount\n * @param poolFees - The pool fees\n * @param currentPoint - The current point\n * @param activationPoint - The activation point\n * @param excludedFeeAmount - The excluded fee amount\n * @param tradeDirection - The trade direction\n * @param maxFeeNumerator - The max fee numerator\n * @returns The total trading fee from excluded fee amount\n */\nexport function getTotalTradingFeeFromExcludedFeeAmount(\n poolFees: PoolFeesStruct,\n currentPoint: BN,\n activationPoint: BN,\n excludedFeeAmount: BN,\n tradeDirection: TradeDirection,\n maxFeeNumerator: BN\n): BN {\n const baseFeeHandler = getBaseFeeHandler(\n poolFees.baseFee.cliffFeeNumerator,\n poolFees.baseFee.firstFactor,\n poolFees.baseFee.secondFactor,\n poolFees.baseFee.thirdFactor,\n poolFees.baseFee.baseFeeMode\n );\n\n // get the base fee numerator from the excluded fee amount\n const baseFeeNumerator =\n baseFeeHandler.getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint,\n activationPoint,\n tradeDirection,\n excludedFeeAmount\n );\n\n // get the total fee numerator, capped at maxFeeNumerator\n return getTotalFeeNumerator(poolFees, baseFeeNumerator, maxFeeNumerator);\n}\n\n/**\n * Splits the fees\n * @param poolFees - The pool fees\n * @param feeAmount - The fee amount\n * @param hasReferral - The has referral\n * @param hasPartner - The has partner\n * @returns The split fees\n */\nexport function splitFees(\n poolFees: PoolFeesStruct,\n feeAmount: BN,\n hasReferral: boolean,\n hasPartner: boolean\n): SplitFees {\n // protocol_fee = feeAmount * protocol_fee_percent / 100 (rounded down)\n const protocolFee = feeAmount.muln(poolFees.protocolFeePercent).divn(100);\n\n // trading_fee = feeAmount - protocol_fee\n const tradingFee = feeAmount.sub(protocolFee);\n\n // referral_fee = protocol_fee * referral_fee_percent / 100 (rounded down) if hasReferral else 0\n let referralFee = new BN(0);\n if (hasReferral) {\n referralFee = protocolFee.muln(poolFees.referralFeePercent).divn(100);\n }\n\n // protocol_fee_after_referral_fee = protocol_fee - referral_fee\n const protocolFeeAfterReferral = protocolFee.sub(referralFee);\n\n // partner_fee = protocol_fee_after_referral_fee * partner_fee_percent / 100 (rounded down) if hasPartner && partner_fee_percent > 0 else 0\n let partnerFee = new BN(0);\n if (hasPartner && poolFees.partnerFeePercent > 0) {\n partnerFee = protocolFeeAfterReferral\n .muln(poolFees.partnerFeePercent)\n .divn(100);\n }\n\n // protocol_fee = protocol_fee_after_referral_fee - partner_fee\n const finalProtocolFee = protocolFeeAfterReferral.sub(partnerFee);\n\n return {\n tradingFee,\n protocolFee: finalProtocolFee,\n referralFee,\n partnerFee,\n };\n}\n\n/**\n * Gets the fee on amount\n * @param poolFees - The pool fees\n * @param amount - The amount\n * @param tradeFeeNumerator - The trade fee numerator\n * @param hasReferral - The has referral\n * @param hasPartner - The has partner\n * @returns The fee on amount result\n */\nexport function getFeeOnAmount(\n poolFees: PoolFeesStruct,\n amount: BN,\n tradeFeeNumerator: BN,\n hasReferral: boolean,\n hasPartner: boolean\n): FeeOnAmountResult {\n // get the amount and trading fee after excluding the fee from the amount\n const { excludedFeeAmount, tradingFee } = getExcludedFeeAmount(\n tradeFeeNumerator,\n amount\n );\n\n // split the trading fee into protocol, referral, and partner fees\n const splitFeesResult = splitFees(\n poolFees,\n tradingFee,\n hasReferral,\n hasPartner\n );\n\n return {\n amount: excludedFeeAmount,\n tradingFee: splitFeesResult.tradingFee,\n protocolFee: splitFeesResult.protocolFee,\n partnerFee: splitFeesResult.partnerFee,\n referralFee: splitFeesResult.referralFee,\n };\n}\n\n/**\n * Calculates the excluded fee amount and trading fee from an included fee amount\n * @param tradeFeeNumerator - The fee numerator\n * @param includedFeeAmount - The amount that includes the fee\n * @returns Tuple of [excluded_fee_amount, trading_fee]\n */\nexport function getExcludedFeeAmount(\n tradeFeeNumerator: BN,\n includedFeeAmount: BN\n): { excludedFeeAmount: BN; tradingFee: BN } {\n const tradingFee = mulDiv(\n includedFeeAmount,\n tradeFeeNumerator,\n new BN(FEE_DENOMINATOR),\n Rounding.Up\n );\n const excludedFeeAmount = includedFeeAmount.sub(tradingFee);\n\n return { excludedFeeAmount, tradingFee };\n}\n\n/**\n * Calculates the included fee amount and fee amount from an excluded fee amount\n * @param tradeFeeNumerator - The fee numerator\n * @param excludedFeeAmount - The amount that excludes the fee\n * @returns Tuple of [included_fee_amount, fee_amount]\n */\nexport function getIncludedFeeAmount(\n tradeFeeNumerator: BN,\n excludedFeeAmount: BN\n): { includedFeeAmount: BN; feeAmount: BN } {\n const denominator = new BN(FEE_DENOMINATOR).sub(tradeFeeNumerator);\n if (denominator.isZero() || denominator.isNeg()) {\n throw new Error(\"Invalid fee numerator\");\n }\n\n const includedFeeAmount = mulDiv(\n excludedFeeAmount,\n new BN(FEE_DENOMINATOR),\n denominator,\n Rounding.Up\n );\n\n const feeAmount = includedFeeAmount.sub(excludedFeeAmount);\n\n return { includedFeeAmount, feeAmount };\n}\n\n/**\n * Gets the max fee numerator\n * @param poolVersion - The pool version\n * @returns The max fee numerator\n */\nexport function getMaxFeeNumerator(poolVersion: PoolVersion): BN {\n switch (poolVersion) {\n case PoolVersion.V0:\n return new BN(MAX_FEE_NUMERATOR_V0);\n case PoolVersion.V1:\n return new BN(MAX_FEE_NUMERATOR_V1);\n default:\n throw new Error(\"Invalid pool version\");\n }\n}\n\n/**\n * Gets the max fee bps\n * @param poolVersion - The pool version\n * @returns The max fee bps\n */\nexport function getMaxFeeBps(poolVersion: PoolVersion): number {\n switch (poolVersion) {\n case PoolVersion.V0:\n return MAX_FEE_BPS_V0;\n case PoolVersion.V1:\n return MAX_FEE_BPS_V1;\n default:\n throw new Error(\"Invalid pool version\");\n }\n}\n","import Decimal from \"decimal.js\";\nimport { Rounding } from \"../types\";\nimport { MAX, MAX_EXPONENTIAL, ONE_Q64, SCALE_OFFSET } from \"../constants\";\nimport BN from \"bn.js\";\n\n/**\n * Multiplies two numbers and divides by a denominator, rounding up or down\n * @param x - The first number\n * @param y - The second number\n * @param denominator - The denominator\n * @param rounding - The rounding mode\n * @returns The result of the multiplication and division\n */\nexport function mulDiv(x: BN, y: BN, denominator: BN, rounding: Rounding): BN {\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\n/**\n * Converts a Q64 number to a Decimal\n * @param num - The Q64 number\n * @param decimalPlaces - The number of decimal places\n * @returns The Decimal number\n */\nexport function q64ToDecimal(num: BN, decimalPlaces?: number): Decimal {\n return new Decimal(num.toString())\n .div(Decimal.pow(2, 64))\n .toDecimalPlaces(decimalPlaces);\n}\n\n/**\n * Converts a Decimal number to a Q64 number\n * @param num - The Decimal number\n * @returns The Q64 number\n */\nexport function decimalToQ64(num: Decimal): BN {\n return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed());\n}\n\n/**\n * Calculates the square root of a number\n * @param value - The number\n * @returns The square root of the number\n */\nexport function sqrt(value: BN): BN {\n if (value.isZero()) {\n return new BN(0);\n }\n\n if (value.eq(new BN(1))) {\n return new BN(1);\n }\n\n let x = value;\n let y = value.add(new BN(1)).div(new BN(2));\n\n while (y.lt(x)) {\n x = y;\n y = x.add(value.div(x)).div(new BN(2));\n }\n\n return x;\n}\n\n/**\n * Calculates the power of a number\n * @param base - The base\n * @param exp - The exponent\n * @returns The power of the number\n */\nexport function pow(base: BN, exp: BN): BN {\n let invert = exp.isNeg();\n\n if (exp.isZero()) {\n return ONE_Q64;\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_Q64;\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 \"bn.js\";\nimport { BaseFeeMode } from \"../../types\";\nimport { BASIS_POINT_MAX, ONE_Q64, U16_MAX } from \"../../constants\";\nimport { pow } from \"../utilsMath\";\n\n/**\n * Gets the max base fee numerator.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @returns The max base fee numerator.\n */\nexport function getMaxBaseFeeNumerator(cliffFeeNumerator: BN): BN {\n return cliffFeeNumerator;\n}\n\n/**\n * Gets the min base fee numerator.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param numberOfPeriod - The number of periods.\n * @param periodFrequency - The period frequency.\n * @param reductionFactor - The reduction factor.\n * @param feeSchedulerMode - The fee scheduler mode.\n * @returns The min base fee numerator.\n */\nexport function getMinBaseFeeNumerator(\n cliffFeeNumerator: BN,\n numberOfPeriod: number,\n reductionFactor: BN,\n feeSchedulerMode: BaseFeeMode\n): BN {\n return getBaseFeeNumeratorByPeriod(\n cliffFeeNumerator,\n numberOfPeriod,\n new BN(numberOfPeriod),\n reductionFactor,\n feeSchedulerMode\n );\n}\n\n/**\n * Gets the base fee numerator by period.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param numberOfPeriod - The number of periods.\n * @param period - The period.\n * @param reductionFactor - The reduction factor.\n * @param feeSchedulerMode - The fee scheduler mode.\n * @returns The base fee numerator by period.\n */\nexport function getBaseFeeNumeratorByPeriod(\n cliffFeeNumerator: BN,\n numberOfPeriod: number,\n period: BN,\n reductionFactor: BN,\n feeSchedulerMode: BaseFeeMode\n): BN {\n const periodValue = BN.min(period, new BN(numberOfPeriod));\n const periodNumber = periodValue.toNumber();\n if (periodNumber > U16_MAX) {\n throw new Error(\"Math overflow\");\n }\n\n switch (feeSchedulerMode) {\n case BaseFeeMode.FeeSchedulerLinear: {\n const feeNumerator = getFeeNumeratorOnLinearFeeScheduler(\n cliffFeeNumerator,\n reductionFactor,\n periodNumber\n );\n return feeNumerator;\n }\n case BaseFeeMode.FeeSchedulerExponential: {\n const feeNumerator = getFeeNumeratorOnExponentialFeeScheduler(\n cliffFeeNumerator,\n reductionFactor,\n periodNumber\n );\n return feeNumerator;\n }\n default:\n throw new Error(\"Invalid fee scheduler mode\");\n }\n}\n\n/**\n * Gets the fee numerator on linear fee scheduler.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param reductionFactor - The reduction factor.\n * @param period - The period.\n * @returns The fee numerator on linear fee scheduler.\n */\nexport function getFeeNumeratorOnLinearFeeScheduler(\n cliffFeeNumerator: BN,\n reductionFactor: BN,\n period: number\n): BN {\n const reduction = new BN(period).mul(reductionFactor);\n\n return cliffFeeNumerator.sub(reduction);\n}\n\n/**\n * Gets the fee numerator on exponential fee scheduler.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param reductionFactor - The reduction factor.\n * @param period - The period.\n * @returns The fee numerator on exponential fee scheduler.\n */\nexport function getFeeNumeratorOnExponentialFeeScheduler(\n cliffFeeNumerator: BN,\n reductionFactor: BN,\n period: number\n): BN {\n if (period === 0) {\n return cliffFeeNumerator;\n }\n\n const basisPointMax = new BN(BASIS_POINT_MAX);\n const bps = new BN(reductionFactor).shln(64).div(basisPointMax);\n\n // base = ONE_Q64 - bps (equivalent to 1 - reduction_factor/10_000 in Q64.64)\n const base = ONE_Q64.sub(bps);\n\n const result = pow(base, new BN(period));\n\n // final fee: cliffFeeNumerator * result >> 64\n return cliffFeeNumerator.mul(result).div(ONE_Q64);\n}\n\n/**\n * Gets the base fee numerator.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param numberOfPeriod - The number of periods.\n * @param periodFrequency - The period frequency.\n * @param reductionFactor - The reduction factor.\n * @param feeSchedulerMode - The fee scheduler mode.\n * @param currentPoint - The current point.\n * @param activationPoint - The activation point.\n * @returns The base fee numerator.\n */\nexport function getBaseFeeNumerator(\n cliffFeeNumerator: BN,\n numberOfPeriod: number,\n periodFrequency: BN,\n reductionFactor: BN,\n feeSchedulerMode: BaseFeeMode,\n currentPoint: BN,\n activationPoint: BN\n): BN {\n if (periodFrequency.isZero()) {\n return cliffFeeNumerator;\n }\n\n let period: BN;\n\n if (currentPoint.lt(activationPoint)) {\n period = new BN(numberOfPeriod);\n } else {\n period = currentPoint.sub(activationPoint).div(periodFrequency);\n\n // clamp to maximum period\n if (period.gt(new BN(numberOfPeriod))) {\n period = new BN(numberOfPeriod);\n }\n }\n\n return getBaseFeeNumeratorByPeriod(\n cliffFeeNumerator,\n numberOfPeriod,\n period,\n reductionFactor,\n feeSchedulerMode\n );\n}\n","import {\n DYNAMIC_FEE_ROUNDING_OFFSET,\n DYNAMIC_FEE_SCALING_FACTOR,\n} from \"../../constants\";\nimport { DynamicFeeStruct } from \"../../types\";\nimport BN from \"bn.js\";\n\n/**\n * Check if dynamic fee is enabled\n * @param dynamicFee Dynamic fee parameters\n * @returns True if dynamic fee is enabled\n */\nexport function isDynamicFeeEnabled(dynamicFee: DynamicFeeStruct): boolean {\n return dynamicFee.initialized !== 0;\n}\n\n/**\n * Calculates the dynamic fee numerator based on market volatility metrics\n *\n * @param volatilityAccumulator - A measure of accumulated market volatility (BN)\n * @param binStep - The size of price bins in the liquidity distribution (BN)\n * @param variableFeeControl - Parameter controlling the impact of volatility on fees (BN)\n * @returns The calculated dynamic fee numerator (BN)\n */\nexport function getDynamicFeeNumerator(\n volatilityAccumulator: BN,\n binStep: BN,\n variableFeeControl: BN\n): BN {\n const squareVfaBin = volatilityAccumulator\n .mul(new BN(binStep))\n .pow(new BN(2));\n const vFee = variableFeeControl.mul(squareVfaBin);\n\n return vFee\n .add(new BN(DYNAMIC_FEE_ROUNDING_OFFSET))\n .div(new BN(DYNAMIC_FEE_SCALING_FACTOR));\n}\n","import {\n calculateTransferFeeExcludedAmount,\n calculateTransferFeeIncludedAmount,\n getAmountWithSlippage,\n getPriceImpact,\n hasPartner,\n isSwapEnabled,\n} from \"../helpers\";\nimport {\n FeeMode,\n PoolState,\n Quote2Result,\n Rounding,\n SwapMode,\n SwapResult2,\n TradeDirection,\n} from \"../types\";\nimport BN from \"bn.js\";\nimport {\n getFeeMode,\n getFeeOnAmount,\n getIncludedFeeAmount,\n getMaxFeeNumerator,\n getTotalTradingFeeFromExcludedFeeAmount,\n getTotalTradingFeeFromIncludedFeeAmount,\n splitFees,\n} from \"./feeMath\";\nimport {\n getAmountAFromLiquidityDelta,\n getAmountBFromLiquidityDelta,\n getNextSqrtPriceFromInput,\n getNextSqrtPriceFromOutput,\n} from \"./curve\";\nimport { Mint } from \"@solana/spl-token\";\n\n/**\n * Gets the swap result from exact input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @param feeMode - The fee mode\n * @param tradeDirection - The trade direction\n * @param currentPoint - The current point\n * @returns The swap result from exact input\n */\nexport function getSwapResultFromExactInput(\n poolState: PoolState,\n amountIn: BN,\n feeMode: FeeMode,\n tradeDirection: TradeDirection,\n currentPoint: BN\n): SwapResult2 {\n let actualProtocolFee = new BN(0);\n let actualTradingFee = new BN(0);\n let actualReferralFee = new BN(0);\n let actualPartnerFee = new BN(0);\n\n const maxFeeNumerator = getMaxFeeNumerator(poolState.version);\n\n // We can compute the trade_fee_numerator here. Instead of separately for amount_in, and amount_out.\n // This is because FeeRateLimiter (fee rate scale based on amount) only applied when fee_mode.fees_on_input\n // (a.k.a TradeDirection::QuoteToBase + CollectFeeMode::QuoteToken)\n // For the rest of the time, the fee rate is not dependent on amount.\n const tradeFeeNumerator = getTotalTradingFeeFromIncludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n amountIn,\n tradeDirection,\n maxFeeNumerator\n );\n\n let actualAmountIn: BN;\n if (feeMode.feesOnInput) {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n amountIn,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountIn = amount;\n } else {\n actualAmountIn = amountIn;\n }\n\n let swapAmountFromInput;\n if (tradeDirection === TradeDirection.AtoB) {\n swapAmountFromInput = calculateAtoBFromAmountIn(poolState, actualAmountIn);\n } else {\n swapAmountFromInput = calculateBtoAFromAmountIn(poolState, actualAmountIn);\n }\n const { outputAmount, nextSqrtPrice, amountLeft } = swapAmountFromInput;\n\n let actualAmountOut: BN;\n if (feeMode.feesOnInput) {\n actualAmountOut = outputAmount;\n } else {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n outputAmount,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountOut = amount;\n }\n\n return {\n amountLeft,\n includedFeeInputAmount: amountIn,\n excludedFeeInputAmount: actualAmountIn,\n outputAmount: actualAmountOut,\n nextSqrtPrice: nextSqrtPrice,\n tradingFee: actualTradingFee,\n protocolFee: actualProtocolFee,\n partnerFee: actualPartnerFee,\n referralFee: actualReferralFee,\n };\n}\n\n/**\n * Calculates the swap result from exact input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from exact input\n */\nexport function calculateAtoBFromAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n // finding new target price\n const nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n true\n );\n\n if (nextSqrtPrice.lt(poolState.sqrtMinPrice)) {\n throw new Error(\"Price range is violated\");\n }\n\n // finding output amount\n const outputAmount = getAmountBFromLiquidityDelta(\n nextSqrtPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft: new BN(0),\n };\n}\n\n/**\n * Calculates the swap result from exact input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from exact input\n */\nexport function calculateBtoAFromAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n // finding new target price\n const nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n false\n );\n\n if (nextSqrtPrice.gt(poolState.sqrtMaxPrice)) {\n throw new Error(\"Price range is violated\");\n }\n\n // finding output amount\n const outputAmount = getAmountAFromLiquidityDelta(\n poolState.sqrtPrice,\n nextSqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft: new BN(0),\n };\n}\n\n/**\n * Gets the swap result from partial input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @param feeMode - The fee mode\n * @param tradeDirection - The trade direction\n * @param currentPoint - The current point\n * @returns The swap result from partial input\n */\nexport function getSwapResultFromPartialInput(\n poolState: PoolState,\n amountIn: BN,\n feeMode: FeeMode,\n tradeDirection: TradeDirection,\n currentPoint: BN\n): SwapResult2 {\n let actualProtocolFee = new BN(0);\n let actualTradingFee = new BN(0);\n let actualReferralFee = new BN(0);\n let actualPartnerFee = new BN(0);\n\n const maxFeeNumerator = getMaxFeeNumerator(poolState.version);\n\n const tradeFeeNumerator = getTotalTradingFeeFromIncludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n amountIn,\n tradeDirection,\n maxFeeNumerator\n );\n\n let actualAmountIn: BN;\n if (feeMode.feesOnInput) {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n amountIn,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountIn = amount;\n } else {\n actualAmountIn = amountIn;\n }\n\n let swapAmountFromInput;\n if (tradeDirection === TradeDirection.AtoB) {\n swapAmountFromInput = calculateAtoBFromPartialAmountIn(\n poolState,\n actualAmountIn\n );\n } else {\n swapAmountFromInput = calculateBtoAFromPartialAmountIn(\n poolState,\n actualAmountIn\n );\n }\n\n let { amountLeft, outputAmount, nextSqrtPrice } = swapAmountFromInput;\n\n let includedFeeInputAmount: BN;\n if (amountLeft.gt(new BN(0))) {\n actualAmountIn = actualAmountIn.sub(amountLeft);\n\n if (feeMode.feesOnInput) {\n const tradeFeeNumerator = getTotalTradingFeeFromExcludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n actualAmountIn,\n tradeDirection,\n maxFeeNumerator\n );\n\n const { includedFeeAmount, feeAmount } = getIncludedFeeAmount(\n tradeFeeNumerator,\n actualAmountIn\n );\n\n const { tradingFee, protocolFee, referralFee, partnerFee } = splitFees(\n poolState.poolFees,\n feeAmount,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n includedFeeInputAmount = includedFeeAmount;\n } else {\n includedFeeInputAmount = actualAmountIn;\n }\n } else {\n includedFeeInputAmount = amountIn;\n }\n\n let actualAmountOut: BN;\n if (feeMode.feesOnInput) {\n actualAmountOut = outputAmount;\n } else {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n outputAmount,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountOut = amount;\n }\n\n return {\n includedFeeInputAmount,\n excludedFeeInputAmount: actualAmountIn,\n amountLeft,\n outputAmount: actualAmountOut,\n nextSqrtPrice,\n tradingFee: actualTradingFee,\n protocolFee: actualProtocolFee,\n partnerFee: actualPartnerFee,\n referralFee: actualReferralFee,\n };\n}\n\n/**\n * Calculates the swap result from partial input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from partial input\n */\nexport function calculateAtoBFromPartialAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n const maxAmountIn = getAmountAFromLiquidityDelta(\n poolState.sqrtMinPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n let consumedInAmount: BN;\n let nextSqrtPrice: BN;\n\n if (amountIn.gte(maxAmountIn)) {\n consumedInAmount = maxAmountIn;\n nextSqrtPrice = poolState.sqrtMinPrice;\n } else {\n nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n true\n );\n consumedInAmount = amountIn;\n }\n\n const outputAmount = getAmountBFromLiquidityDelta(\n nextSqrtPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n const amountLeft = amountIn.sub(consumedInAmount);\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft,\n };\n}\n\n/**\n * Calculates the swap result from partial input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from partial input\n */\nexport function calculateBtoAFromPartialAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n const maxAmountIn = getAmountBFromLiquidityDelta(\n poolState.sqrtPrice,\n poolState.sqrtMaxPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n let consumedInAmount: BN;\n let nextSqrtPrice: BN;\n\n if (amountIn.gte(maxAmountIn)) {\n consumedInAmount = maxAmountIn;\n nextSqrtPrice = poolState.sqrtMaxPrice;\n } else {\n nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n false\n );\n consumedInAmount = amountIn;\n }\n\n const outputAmount = getAmountAFromLiquidityDelta(\n poolState.sqrtPrice,\n nextSqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n const amountLeft = amountIn.sub(consumedInAmount);\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft,\n };\n}\n\n/**\n * Gets the swap result from exact output\n * @param poolState - The pool state\n * @param amountOut - The amount out\n * @param feeMode - The fee mode\n * @param tradeDirection - The trade direction\n * @param currentPoint - The current point\n * @returns The swap result from exact output\n */\nexport function getSwapResultFromExactOutput(\n poolState: PoolState,\n amountOut: BN,\n feeMode: FeeMode,\n tradeDirection: TradeDirection,\n currentPoint: BN\n): SwapResult2 {\n let actualProtocolFee = new BN(0);\n let actualTradingFee = new BN(0);\n let actualReferralFee = new BN(0);\n let actualPartnerFee = new BN(0);\n\n const maxFeeNumerator = getMaxFeeNumerator(poolState.version);\n\n let includedFeeAmountOut: BN;\n if (feeMode.feesOnInput) {\n includedFeeAmountOut = amountOut;\n } else {\n const tradeFeeNumerator = getTotalTradingFeeFromExcludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n amountOut,\n tradeDirection,\n maxFeeNumerator\n );\n\n const { includedFeeAmount, feeAmount } = getIncludedFeeAmount(\n tradeFeeNumerator,\n amountOut\n );\n\n const split = splitFees(\n poolState.poolFees,\n feeAmount,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualTradingFee = split.tradingFee;\n actualProtocolFee = split.protocolFee;\n actualReferralFee = split.referralFee;\n actualPartnerFee = split.partnerFee;\n\n includedFeeAmountOut = includedFeeAmount;\n }\n\n let swapAmountFromOutput;\n if (tradeDirection === TradeDirection.AtoB) {\n swapAmountFromOutput = calculateAtoBFromAmountOut(\n poolState,\n includedFeeAmountOut\n );\n } else {\n swapAmountFromOutput = calculateBtoAFromAmountOut(\n poolState,\n includedFeeAmountOut\n );\n }\n const { inputAmount, nextSqrtPrice } = swapAmountFromOutput;\n\n let includedFeeInputAmount: BN;\n if (feeMode.feesOnInput) {\n const tradeFeeNumerator = getTotalTradingFeeFromExcludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n inputAmount,\n tradeDirection,\n maxFeeNumerator\n );\n\n const { includedFeeAmount, feeAmount } = getIncludedFeeAmount(\n tradeFeeNumerator,\n inputAmount\n );\n\n const split = splitFees(\n poolState.poolFees,\n feeAmount,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualTradingFee = split.tradingFee;\n actualProtocolFee = split.protocolFee;\n actualReferralFee = split.referralFee;\n actualPartnerFee = split.partnerFee;\n\n includedFeeInputAmount = includedFeeAmount;\n } else {\n includedFeeInputAmount = inputAmount;\n }\n\n return {\n amountLeft: new BN(0),\n includedFeeInputAmount: includedFeeInputAmount,\n excludedFeeInputAmount: inputAmount,\n outputAmount: amountOut,\n nextSqrtPrice: nextSqrtPrice,\n tradingFee: actualTradingFee,\n protocolFee: actualProtocolFee,\n partnerFee: actualPartnerFee,\n referralFee: actualReferralFee,\n };\n}\n\n/**\n * Calculates the swap result from exact output\n * @param poolState - The pool state\n * @param amountOut - The amount out\n * @returns The swap result from exact output\n */\nexport function calculateAtoBFromAmountOut(\n poolState: PoolState,\n amountOut: BN\n): { inputAmount: BN; nextSqrtPrice: BN } {\n const nextSqrtPrice = getNextSqrtPriceFromOutput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountOut,\n true\n );\n\n if (nextSqrtPrice.lt(poolState.sqrtMinPrice)) {\n throw new Error(\"Price Range Violation\");\n }\n\n const inputAmount = getAmountAFromLiquidityDelta(\n nextSqrtPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n return {\n inputAmount,\n nextSqrtPrice,\n };\n}\n\n/**\n * Calculates the swap result from exact output\n * @param poolState - The pool state\n * @param amountOut - The amount out\n * @returns The swap result from exact output\n */\nexport function calculateBtoAFromAmountOut(\n poolState: PoolState,\n amountOut: BN\n): { inputAmount: BN; nextSqrtPrice: BN } {\n const nextSqrtPrice = getNextSqrtPriceFromOutput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountOut,\n false\n );\n\n if (nextSqrtPrice.gt(poolState.sqrtMaxPrice)) {\n throw new Error(\"Price Range Violation\");\n }\n\n const inputAmount = getAmountBFromLiquidityDelta(\n poolState.sqrtPrice,\n nextSqrtPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n return {\n inputAmount,\n nextSqrtPrice,\n };\n}\n\n/**\n * Swaps quote exact input\n * @param pool - The pool\n * @param currentPoint - The current point\n * @param amountIn - The amount in\n * @param slippage - The slippage\n * @param aToB - The trade direction\n * @param hasReferral - The has referral\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @param inputTokenInfo - The input token info\n * @param outputTokenInfo - The output token info\n * @returns The swap quote exact input\n */\nexport function swapQuoteExactInput(\n pool: PoolState,\n currentPoint: BN,\n amountIn: BN,\n slippage: number,\n aToB: boolean,\n hasReferral: boolean,\n tokenADecimal: number,\n tokenBDecimal: number,\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n },\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n }\n): Quote2Result {\n if (amountIn.lte(new BN(0))) {\n throw new Error(\"Amount in must be greater than 0\");\n }\n\n if (!isSwapEnabled(pool, currentPoint)) {\n throw new Error(\"Swap is disabled\");\n }\n\n const tradeDirection = aToB ? TradeDirection.AtoB : TradeDirection.BtoA;\n\n const feeMode = getFeeMode(pool.collectFeeMode, tradeDirection, hasReferral);\n\n let actualAmountIn = amountIn;\n if (inputTokenInfo) {\n actualAmountIn = calculateTransferFeeExcludedAmount(\n amountIn,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount;\n }\n\n const swapResult = getSwapResultFromExactInput(\n pool,\n actualAmountIn,\n feeMode,\n tradeDirection,\n currentPoint\n );\n\n let actualAmountOut = swapResult.outputAmount;\n if (outputTokenInfo) {\n actualAmountOut = calculateTransferFeeExcludedAmount(\n swapResult.outputAmount,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount;\n }\n\n const minimumAmountOut = getAmountWithSlippage(\n actualAmountOut,\n slippage,\n SwapMode.ExactIn\n );\n\n const priceImpact = getPriceImpact(\n actualAmountIn,\n actualAmountOut,\n pool.sqrtPrice,\n aToB,\n tokenADecimal,\n tokenBDecimal\n );\n\n return {\n ...swapResult,\n minimumAmountOut,\n priceImpact,\n };\n}\n\n/**\n * Swaps quote exact output\n * @param pool - The pool\n * @param currentPoint - The current point\n * @param amountOut - The amount out\n * @param slippage - The slippage\n * @param aToB - The trade direction\n * @param hasReferral - The has referral\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @param inputTokenInfo - The input token info\n * @param outputTokenInfo - The output token info\n * @returns The swap quote exact output\n */\nexport function swapQuoteExactOutput(\n pool: PoolState,\n currentPoint: BN,\n amountOut: BN,\n slippage: number,\n aToB: boolean,\n hasReferral: boolean,\n tokenADecimal: number,\n tokenBDecimal: number,\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n },\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n }\n): Quote2Result {\n if (amountOut.lte(new BN(0))) {\n throw new Error(\"Amount out must be greater than 0\");\n }\n\n if (!isSwapEnabled(pool, currentPoint)) {\n throw new Error(\"Swap is disabled\");\n }\n\n const tradeDirection = aToB ? TradeDirection.AtoB : TradeDirection.BtoA;\n\n const feeMode = getFeeMode(pool.collectFeeMode, tradeDirection, hasReferral);\n\n let actualAmountOut = amountOut;\n if (outputTokenInfo) {\n actualAmountOut = calculateTransferFeeIncludedAmount(\n amountOut,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount;\n }\n\n const swapResult = getSwapResultFromExactOutput(\n pool,\n actualAmountOut,\n feeMode,\n tradeDirection,\n currentPoint\n );\n\n let actualAmountIn = swapResult.includedFeeInputAmount;\n if (inputTokenInfo) {\n actualAmountIn = calculateTransferFeeIncludedAmount(\n swapResult.includedFeeInputAmount,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount;\n }\n\n const maximumAmountIn = getAmountWithSlippage(\n actualAmountIn,\n slippage,\n SwapMode.ExactOut\n );\n\n const priceImpact = getPriceImpact(\n actualAmountIn,\n actualAmountOut,\n pool.sqrtPrice,\n aToB,\n tokenADecimal,\n tokenBDecimal\n );\n\n return {\n ...swapResult,\n maximumAmountIn,\n priceImpact,\n };\n}\n\n/**\n * Swaps quote partial input\n * @param pool - The pool\n * @param currentPoint - The current point\n * @param amountIn - The amount in\n * @param slippage - The slippage\n * @param aToB - The trade direction\n * @param hasReferral - The has referral\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @param inputTokenInfo - The input token info\n * @param outputTokenInfo - The output token info\n * @returns The swap quote partial input\n */\nexport function swapQuotePartialInput(\n pool: PoolState,\n currentPoint: BN,\n amountIn: BN,\n slippage: number,\n aToB: boolean,\n hasReferral: boolean,\n tokenADecimal: number,\n tokenBDecimal: number,\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n },\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n }\n): Quote2Result {\n if (amountIn.lte(new BN(0))) {\n throw new Error(\"Amount in must be greater than 0\");\n }\n\n if (!isSwapEnabled(pool, currentPoint)) {\n throw new Error(\"Swap is disabled\");\n }\n\n const tradeDirection = aToB ? TradeDirection.AtoB : TradeDirection.BtoA;\n\n const feeMode = getFeeMode(pool.collectFeeMode, tradeDirection, hasReferral);\n\n let actualAmountIn = amountIn;\n if (inputTokenInfo) {\n actualAmountIn = calculateTransferFeeExcludedAmount(\n amountIn,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount;\n }\n\n const swapResult = getSwapResultFromPartialInput(\n pool,\n actualAmountIn,\n feeMode,\n tradeDirection,\n currentPoint\n );\n\n let actualAmountOut = swapResult.outputAmount;\n if (outputTokenInfo) {\n actualAmountOut = calculateTransferFeeExcludedAmount(\n swapResult.outputAmount,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount;\n }\n\n const minimumAmountOut = getAmountWithSlippage(\n actualAmountOut,\n slippage,\n SwapMode.PartialFill\n );\n\n const priceImpact = getPriceImpact(\n actualAmountIn,\n actualAmountOut,\n pool.sqrtPrice,\n aToB,\n tokenADecimal,\n tokenBDecimal\n );\n\n return {\n ...swapResult,\n minimumAmountOut,\n priceImpact,\n };\n}\n","import BN from \"bn.js\";\nimport { mulDiv } from \"./utilsMath\";\nimport { SCALE_OFFSET, U64_MAX } from \"../constants\";\nimport { Rounding } from \"../types\";\n\n/**\n * Gets the next sqrt price given a delta of token_b (input), rounding down.\n * √P' = √P + Δb / L\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_b (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountInBRoundingDown(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n // quotient = (amount << (SCALE_OFFSET * 2)) / liquidity\n const quotient = amount.shln(SCALE_OFFSET * 2).div(liquidity);\n\n // result = sqrtPrice + quotient\n const result = sqrtPrice.add(quotient);\n\n return result;\n}\n\n/**\n * Gets the next sqrt price given a delta of token_b (output), rounding down.\n * √P' = √P - Δb / L\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_b (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountOutBRoundingDown(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n // quotient = ceil((amount << (SCALE_OFFSET * 2)) / liquidity)\n const numerator = amount.shln(SCALE_OFFSET * 2);\n const quotient = numerator.add(liquidity).subn(1).div(liquidity);\n\n // result = sqrtPrice - quotient\n const result = sqrtPrice.sub(quotient);\n\n if (result.isNeg()) {\n throw new Error(\"sqrt price cannot be negative\");\n }\n\n return result;\n}\n\n/**\n * Gets the next sqrt price √P' given a delta of token_a, rounding up.\n * √P' = √P * L / (L + Δa * √P)\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_a (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountInARoundingUp(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n if (amount.isZero()) {\n return sqrtPrice;\n }\n\n // product = amountIn * sqrtPrice\n const product = amount.mul(sqrtPrice);\n\n // denominator = liquidity + product\n const denominator = liquidity.add(product);\n\n // result = mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up)\n const result = mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up);\n\n return result;\n}\n\n/**\n * Gets the next sqrt price √P' given a delta of token_a (output), rounding up.\n * √P' = √P * L / (L - Δa * √P)\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_a (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountOutARoundingUp(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n if (amount.isZero()) {\n return sqrtPrice;\n }\n\n // product = amount * sqrtPrice\n const product = amount.mul(sqrtPrice);\n\n const denominator = liquidity.sub(product);\n if (denominator.lte(new BN(0))) {\n throw new Error(\"MathOverflow: denominator is zero or negative\");\n }\n\n // result = mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up)\n return mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up);\n}\n\n/**\n * Gets the next sqrt price given an output amount of token_a or token_b.\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amountOut - output amount (BN)\n * @param aForB - true if swapping A for B, false if B for A\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromOutput(\n sqrtPrice: BN,\n liquidity: BN,\n amountOut: BN,\n aForB: boolean\n): BN {\n if (sqrtPrice.lte(new BN(0))) {\n throw new Error(\"sqrtPrice must be greater than 0\");\n }\n if (liquidity.lte(new BN(0))) {\n throw new Error(\"liquidity must be greater than 0\");\n }\n\n if (aForB) {\n return getNextSqrtPriceFromAmountOutBRoundingDown(\n sqrtPrice,\n liquidity,\n amountOut\n );\n } else {\n return getNextSqrtPriceFromAmountOutARoundingUp(\n sqrtPrice,\n liquidity,\n amountOut\n );\n }\n}\n\n/**\n * Gets the next sqrt price given an input amount of token_a or token_b\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amountIn - input amount (BN)\n * @param aForB - true if swapping A for B, false if B for A\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromInput(\n sqrtPrice: BN,\n liquidity: BN,\n amountIn: BN,\n aForB: boolean\n): BN {\n if (sqrtPrice.lte(new BN(0))) {\n throw new Error(\"sqrtPrice must be greater than 0\");\n }\n if (liquidity.lte(new BN(0))) {\n throw new Error(\"liquidity must be greater than 0\");\n }\n\n if (aForB) {\n // Rounding up for A to B\n return getNextSqrtPriceFromAmountInARoundingUp(\n sqrtPrice,\n liquidity,\n amountIn\n );\n } else {\n // Rounding down for B to A\n return getNextSqrtPriceFromAmountInBRoundingDown(\n sqrtPrice,\n liquidity,\n amountIn\n );\n }\n}\n\n/**\n * Gets the delta amount of token_b for given liquidity and price range. (getDeltaAmountBUnsigned)\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_b (BN)\n */\nexport function getAmountBFromLiquidityDelta(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n const result = getDeltaAmountBUnsignedUnchecked(\n lowerSqrtPrice,\n upperSqrtPrice,\n liquidity,\n rounding\n );\n\n return result;\n}\n\n/**\n * Gets the delta amount of token_b for given liquidity and price range.\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_b (BN)\n */\nfunction getDeltaAmountBUnsignedUnchecked(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n // delta_sqrt_price = upper_sqrt_price - lower_sqrt_price\n const deltaSqrtPrice = upperSqrtPrice.sub(lowerSqrtPrice);\n const prod = liquidity.mul(deltaSqrtPrice);\n\n const shift = SCALE_OFFSET * 2;\n\n if (rounding === Rounding.Up) {\n // denominator = 1 << (SCALE_OFFSET * 2)\n const denominator = new BN(1).ushln(shift);\n // result = ceil(prod / denominator)\n const result = prod.add(denominator.subn(1)).div(denominator);\n return result;\n } else {\n // result = prod >> (RESOLUTION * 2)\n const result = prod.ushrn(shift);\n return result;\n }\n}\n\n/**\n * Gets the delta amount_a for given liquidity and price range. (getDeltaAmountAUnsigned)\n * `Δa = L * (1 / √P_lower - 1 / √P_upper)`\n * i.e. `L * (√P_upper - √P_lower) / (√P_upper * √P_lower)`\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_a (BN)\n */\nexport function getAmountAFromLiquidityDelta(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n const result = getDeltaAmountAUnsignedUnchecked(\n lowerSqrtPrice,\n upperSqrtPrice,\n liquidity,\n rounding\n );\n\n return result;\n}\n\n/**\n * Computes L * (√P_upper - √P_lower) / (√P_upper * √P_lower)\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_a (BN)\n */\nfunction getDeltaAmountAUnsignedUnchecked(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n const numerator1 = liquidity;\n const numerator2 = upperSqrtPrice.sub(lowerSqrtPrice);\n\n const denominator = lowerSqrtPrice.mul(upperSqrtPrice);\n\n if (denominator.lte(new BN(0))) {\n throw new Error(\"Denominator must be greater than zero\");\n }\n\n const result = mulDiv(numerator1, numerator2, denominator, rounding);\n return result;\n}\n\n/**\n * Gets the liquidity delta from amount A\n * Δa = L * (1 / √P_lower - 1 / √P_upper)\n * Δa = L * (√P_upper - √P_lower) / (√P_upper * √P_lower)\n * L = Δa * √P_upper * √P_lower / (√P_upper - √P_lower)\n * @param amountA - The amount of token A\n * @param lowerSqrtPrice - The lower sqrt price\n * @param upperSqrtPrice - The upper sqrt price\n * @returns The liquidity delta from amount A\n */\nexport function getLiquidityDeltaFromAmountA(\n amountA: BN,\n lowerSqrtPrice: BN, // current sqrt price\n upperSqrtPrice: BN // max sqrt price\n): BN {\n const product = amountA.mul(lowerSqrtPrice).mul(upperSqrtPrice); // Q128.128\n const denominator = upperSqrtPrice.sub(lowerSqrtPrice); // Q64.64\n\n return product.div(denominator);\n}\n\n/**\n * Gets the liquidity delta from amount B\n * Δb = L (√P_upper - √P_lower)\n * L = Δb / (√P_upper - √P_lower)\n * @param amountB - The amount of token B\n * @param lowerSqrtPrice - The lower sqrt price\n * @param upperSqrtPrice - The upper sqrt price\n * @returns The liquidity delta from amount B\n */\nexport function getLiquidityDeltaFromAmountB(\n amountB: BN,\n lowerSqrtPrice: BN, // min sqrt price\n upperSqrtPrice: BN // current sqrt price,\n): BN {\n const denominator = upperSqrtPrice.sub(lowerSqrtPrice);\n const product = amountB.shln(128);\n return product.div(denominator);\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport Decimal from \"decimal.js\";\n\n/**\n * Calculates the initial sqrt price\n * a = L * (1/s - 1/pb)\n * b = L * (s - pa)\n * b/a = (s - pa) / (1/s - 1/pb)\n * With: x = 1 / pb and y = b/a\n * => s ^ 2 + s * (-pa + x * y) - y = 0\n * s = [(pa - xy) + √((xy - pa)² + 4y)]/2\n * @param tokenAAmount - The token A amount\n * @param tokenBAmount - The token B amount\n * @param minSqrtPrice - The min sqrt price\n * @param maxSqrtPrice - The max sqrt price\n * @returns The initial sqrt price\n */\nexport function calculateInitSqrtPrice(\n tokenAAmount: BN,\n tokenBAmount: BN,\n minSqrtPrice: BN,\n maxSqrtPrice: BN\n): BN {\n if (tokenAAmount.isZero() || tokenBAmount.isZero()) {\n throw new Error(\"Amount cannot be zero\");\n }\n\n const amountADecimal = new Decimal(tokenAAmount.toString());\n const amountBDecimal = new Decimal(tokenBAmount.toString());\n const minSqrtPriceDecimal = new Decimal(minSqrtPrice.toString()).div(\n Decimal.pow(2, 64)\n );\n const maxSqrtPriceDecimal = new Decimal(maxSqrtPrice.toString()).div(\n Decimal.pow(2, 64)\n );\n\n const x = new Decimal(1).div(maxSqrtPriceDecimal);\n const y = amountBDecimal.div(amountADecimal);\n const xy = x.mul(y);\n\n const paMinusXY = minSqrtPriceDecimal.sub(xy);\n const xyMinusPa = xy.sub(minSqrtPriceDecimal);\n\n const fourY = new Decimal(4).mul(y);\n\n const discriminant = xyMinusPa.mul(xyMinusPa).add(fourY);\n\n // sqrt_discriminant = √discriminant\n const sqrtDiscriminant = discriminant.sqrt();\n const result = paMinusXY\n .add(sqrtDiscriminant)\n .div(new Decimal(2))\n .mul(Decimal.pow(2, 64));\n\n return new BN(result.floor().toFixed());\n}\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport {\n ActivationType,\n BaseFee,\n BaseFeeMode,\n DynamicFee,\n PoolState,\n PoolStatus,\n PoolVersion,\n} from \"../types\";\nimport {\n BASIS_POINT_MAX,\n BIN_STEP_BPS_DEFAULT,\n BIN_STEP_BPS_U128_DEFAULT,\n CURRENT_POOL_VERSION,\n DYNAMIC_FEE_DECAY_PERIOD_DEFAULT,\n DYNAMIC_FEE_FILTER_PERIOD_DEFAULT,\n DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT,\n FEE_DENOMINATOR,\n MAX_PRICE_CHANGE_BPS_DEFAULT,\n MAX_RATE_LIMITER_DURATION_IN_SECONDS,\n MAX_RATE_LIMITER_DURATION_IN_SLOTS,\n MIN_FEE_NUMERATOR,\n ONE_Q64,\n} from \"../constants\";\nimport { getMaxFeeBps, getMaxFeeNumerator } from \"../math\";\nimport Decimal from \"decimal.js\";\n\n/**\n * Checks if the partner is valid\n * @param partner - The partner address\n * @returns True if the partner is valid, false otherwise\n */\nexport function hasPartner(poolState: PoolState): boolean {\n return !poolState.partner.equals(PublicKey.default);\n}\n\n/**\n * Gets the current point\n * @param connection - The connection to the Solana cluster\n * @param activationType - The activation type\n * @returns The current point\n */\nexport async function getCurrentPoint(\n connection: Connection,\n activationType: ActivationType\n): Promise<BN> {\n const currentSlot = await connection.getSlot();\n\n if (activationType === ActivationType.Slot) {\n return new BN(currentSlot);\n } else {\n const currentTime = await connection.getBlockTime(currentSlot);\n return new BN(currentTime);\n }\n}\n\n/**\n * Checks if the swap is enabled\n * @param pool - The pool\n * @param currentPoint - The current point\n * @returns True if the swap is enabled, false otherwise\n */\nexport function isSwapEnabled(\n pool: { poolStatus: PoolStatus; activationPoint: BN },\n currentPoint: BN\n): boolean {\n return (\n pool.poolStatus === PoolStatus.Enable &&\n currentPoint.gte(pool.activationPoint)\n );\n}\n\n/**\n * Converts the value to a fee scheduler second factor\n * @param value - The value to convert\n * @returns The fee scheduler second factor\n */\nexport function convertToFeeSchedulerSecondFactor(value: BN): number[] {\n return Array.from(value.toArrayLike(Buffer, \"le\", 8));\n}\n\n/**\n * Parses the fee scheduler second factor\n * @param secondFactor - The fee scheduler second factor\n * @returns The fee scheduler second factor\n */\nexport function parseFeeSchedulerSecondFactor(secondFactor: number[]): BN {\n return new BN(Buffer.from(secondFactor), \"le\");\n}\n\n/**\n * Converts the value to a rate limiter second factor\n * @param maxLimiterDuration - The max limiter duration\n * @param maxFeeBps - The max fee in basis points\n * @returns The rate limiter second factor\n */\nexport function convertToRateLimiterSecondFactor(\n maxLimiterDuration: BN,\n maxFeeBps: BN\n): number[] {\n const buffer1 = maxLimiterDuration.toArrayLike(Buffer, \"le\", 4); // maxLimiterDuration\n const buffer2 = maxFeeBps.toArrayLike(Buffer, \"le\", 4); // maxFeeBps\n const buffer = Buffer.concat([buffer1, buffer2]);\n return Array.from(buffer);\n}\n\n/**\n * Parses the rate limiter second factor\n * @param secondFactor - The rate limiter second factor\n * @returns The rate limiter second factor\n */\nexport function parseRateLimiterSecondFactor(secondFactor: number[]): {\n maxLimiterDuration: number;\n maxFeeBps: number;\n} {\n const buffer = Buffer.from(secondFactor);\n return {\n maxLimiterDuration: buffer.readUInt32LE(0),\n maxFeeBps: buffer.readUInt32LE(4),\n };\n}\n\n/**\n * Converts basis points (bps) to a fee numerator\n * 1 bps = 0.01% = 0.0001 in decimal\n *\n * @param bps - The value in basis points [1-10_000]\n * @returns The equivalent fee numerator\n */\nexport function bpsToFeeNumerator(bps: number): BN {\n return new BN(bps * FEE_DENOMINATOR).divn(BASIS_POINT_MAX);\n}\n\n/**\n * Converts a fee numerator back to basis points (bps)\n *\n * @param feeNumerator - The fee numerator to convert\n * @returns The equivalent value in basis points [1-10_000]\n */\nexport function feeNumeratorToBps(feeNumerator: BN): number {\n return feeNumerator\n .muln(BASIS_POINT_MAX)\n .div(new BN(FEE_DENOMINATOR))\n .toNumber();\n}\n\n/**\n * Converts the amount to lamports\n * @param amount - The amount to convert\n * @param tokenDecimal - The token decimal\n * @returns The amount in lamports\n */\nexport function convertToLamports(\n amount: number | string,\n tokenDecimal: number\n): BN {\n const valueInLamports = new Decimal(amount).mul(\n Decimal.pow(10, tokenDecimal)\n );\n return fromDecimalToBN(valueInLamports);\n}\n\n/**\n * Converts the value to a BN\n * @param value - The value to convert\n * @returns The value in BN\n */\nexport function fromDecimalToBN(value: Decimal): BN {\n return new BN(value.floor().toFixed());\n}\n\n/**\n * Gets the fee scheduler parameters\n * @param startingBaseFeeBps - The starting base fee in basis points\n * @param endingBaseFeeBps - The ending base fee in basis points\n * @param baseFeeMode - The base fee mode\n * @param numberOfPeriod - The number of periods\n * @param totalDuration - The total duration\n * @param poolVersion - The pool version\n * @returns The fee scheduler parameters\n */\nexport function getFeeSchedulerParams(\n startingBaseFeeBps: number,\n endingBaseFeeBps: number,\n baseFeeMode: BaseFeeMode,\n numberOfPeriod: number,\n totalDuration: number\n): BaseFee {\n if (startingBaseFeeBps == endingBaseFeeBps) {\n if (numberOfPeriod != 0 || totalDuration != 0) {\n throw new Error(\"numberOfPeriod and totalDuration must both be zero\");\n }\n\n return {\n cliffFeeNumerator: bpsToFeeNumerator(startingBaseFeeBps),\n firstFactor: 0,\n secondFactor: Array.from(new BN(0).toArrayLike(Buffer, \"le\", 8)),\n thirdFactor: new BN(0),\n baseFeeMode: BaseFeeMode.FeeSchedulerLinear,\n };\n }\n\n if (numberOfPeriod <= 0) {\n throw new Error(\"Total periods must be greater than zero\");\n }\n\n const poolMaxFeeBps = getMaxFeeBps(CURRENT_POOL_VERSION);\n\n if (startingBaseFeeBps > poolMaxFeeBps) {\n throw new Error(\n `startingBaseFeeBps (${startingBaseFeeBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps`\n );\n }\n\n if (endingBaseFeeBps > startingBaseFeeBps) {\n throw new Error(\n \"endingBaseFeeBps bps must be less than or equal to startingBaseFeeBps bps\"\n );\n }\n\n if (numberOfPeriod == 0 || totalDuration == 0) {\n throw new Error(\n \"numberOfPeriod and totalDuration must both greater than zero\"\n );\n }\n\n const maxBaseFeeNumerator = bpsToFeeNumerator(startingBaseFeeBps);\n\n const minBaseFeeNumerator = bpsToFeeNumerator(endingBaseFeeBps);\n\n const periodFrequency = new BN(totalDuration / numberOfPeriod);\n\n const secondFactor = convertToFeeSchedulerSecondFactor(periodFrequency);\n\n let reductionFactor: BN;\n if (baseFeeMode == BaseFeeMode.FeeSchedulerLinear) {\n const totalReduction = maxBaseFeeNumerator.sub(minBaseFeeNumerator);\n reductionFactor = totalReduction.divn(numberOfPeriod);\n } else {\n const ratio =\n minBaseFeeNumerator.toNumber() / maxBaseFeeNumerator.toNumber();\n const decayBase = Math.pow(ratio, 1 / numberOfPeriod);\n reductionFactor = new BN(BASIS_POINT_MAX * (1 - decayBase));\n }\n\n return {\n cliffFeeNumerator: maxBaseFeeNumerator,\n firstFactor: numberOfPeriod,\n secondFactor,\n thirdFactor: reductionFactor,\n baseFeeMode,\n };\n}\n\n/**\n * Gets the rate limiter parameters\n * @param baseFeeBps - The base fee in basis points\n * @param feeIncrementBps - The fee increment in basis points\n * @param referenceAmount - The reference amount\n * @param maxLimiterDuration - The max limiter duration\n * @param maxFeeBps - The max fee in basis points\n * @param tokenBDecimal - The token B decimal\n * @param activationType - The activation type\n * @param poolVersion - The pool version\n * @returns The rate limiter parameters\n */\nexport function getRateLimiterParams(\n baseFeeBps: number,\n feeIncrementBps: number,\n referenceAmount: number,\n maxLimiterDuration: number,\n maxFeeBps: number,\n tokenBDecimal: number,\n activationType: ActivationType\n): BaseFee {\n const cliffFeeNumerator = bpsToFeeNumerator(baseFeeBps);\n const feeIncrementNumerator = bpsToFeeNumerator(feeIncrementBps);\n\n if (\n baseFeeBps <= 0 ||\n feeIncrementBps <= 0 ||\n referenceAmount <= 0 ||\n maxLimiterDuration <= 0\n ) {\n throw new Error(\"All rate limiter parameters must be greater than zero\");\n }\n\n const poolMaxFeeBps = getMaxFeeBps(CURRENT_POOL_VERSION);\n const poolMaxFeeNumerator = getMaxFeeNumerator(CURRENT_POOL_VERSION);\n\n if (baseFeeBps > poolMaxFeeBps) {\n throw new Error(\n `Base fee (${baseFeeBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps`\n );\n }\n\n if (feeIncrementBps > poolMaxFeeBps) {\n throw new Error(\n `Fee increment (${feeIncrementBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps`\n );\n }\n\n if (feeIncrementNumerator.gte(new BN(FEE_DENOMINATOR))) {\n throw new Error(\n \"Fee increment numerator must be less than FEE_DENOMINATOR\"\n );\n }\n\n if (maxFeeBps > poolMaxFeeBps) {\n throw new Error(\n `Max fee (${maxFeeBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps for PoolVersion V${CURRENT_POOL_VERSION}`\n );\n }\n\n const deltaNumerator = new BN(poolMaxFeeNumerator).sub(cliffFeeNumerator);\n const maxIndex = deltaNumerator.div(feeIncrementNumerator);\n if (maxIndex.lt(new BN(1))) {\n throw new Error(\"Fee increment is too large for the given base fee\");\n }\n\n if (\n cliffFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n cliffFeeNumerator.gt(new BN(poolMaxFeeNumerator))\n ) {\n throw new Error(\"Base fee must be between 0.01% and 99%\");\n }\n\n const maxDuration =\n activationType === ActivationType.Slot\n ? MAX_RATE_LIMITER_DURATION_IN_SLOTS\n : MAX_RATE_LIMITER_DURATION_IN_SECONDS;\n\n if (maxLimiterDuration > maxDuration) {\n throw new Error(\n `Max duration exceeds maximum allowed value of ${maxDuration}`\n );\n }\n\n const referenceAmountInLamports = convertToLamports(\n referenceAmount,\n tokenBDecimal\n );\n\n const secondFactor = convertToRateLimiterSecondFactor(\n new BN(maxLimiterDuration),\n new BN(maxFeeBps)\n );\n\n return {\n cliffFeeNumerator,\n firstFactor: feeIncrementBps,\n secondFactor,\n thirdFactor: new BN(referenceAmountInLamports),\n baseFeeMode: BaseFeeMode.RateLimiter,\n };\n}\n\n/**\n * Gets the base fee parameters\n * @param baseFeeParams - The base fee parameters\n * @param tokenBDecimal - The token B decimal\n * @param activationType - The activation type\n * @param poolVersion - The pool version\n * @returns The base fee parameters\n */\nexport function getBaseFeeParams(\n baseFeeParams: {\n baseFeeMode: BaseFeeMode;\n rateLimiterParam?: {\n baseFeeBps: number;\n feeIncrementBps: number;\n referenceAmount: number;\n maxLimiterDuration: number;\n maxFeeBps: number;\n };\n feeSchedulerParam?: {\n startingFeeBps: number;\n endingFeeBps: number;\n numberOfPeriod: number;\n totalDuration: number;\n };\n },\n tokenBDecimal: number,\n activationType: ActivationType\n): BaseFee {\n if (baseFeeParams.baseFeeMode === BaseFeeMode.RateLimiter) {\n if (!baseFeeParams.rateLimiterParam) {\n throw new Error(\n \"Rate limiter parameters are required for RateLimiter mode\"\n );\n }\n const {\n baseFeeBps,\n feeIncrementBps,\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n } = baseFeeParams.rateLimiterParam;\n\n return getRateLimiterParams(\n baseFeeBps,\n feeIncrementBps,\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n tokenBDecimal,\n activationType\n );\n } else {\n if (!baseFeeParams.feeSchedulerParam) {\n throw new Error(\n \"Fee scheduler parameters are required for FeeScheduler mode\"\n );\n }\n const { startingFeeBps, endingFeeBps, numberOfPeriod, totalDuration } =\n baseFeeParams.feeSchedulerParam;\n\n return getFeeSchedulerParams(\n startingFeeBps,\n endingFeeBps,\n baseFeeParams.baseFeeMode,\n numberOfPeriod,\n totalDuration\n );\n }\n}\n\n/**\n * Gets the dynamic fee parameters\n * @param baseFeeBps - The base fee in basis points\n * @param maxPriceChangeBps - The max price change in basis points\n * @returns The dynamic fee parameters\n */\nexport function getDynamicFeeParams(\n baseFeeBps: number,\n maxPriceChangeBps: number = MAX_PRICE_CHANGE_BPS_DEFAULT // default 15%\n): DynamicFee {\n if (maxPriceChangeBps > MAX_PRICE_CHANGE_BPS_DEFAULT) {\n throw new Error(\n `maxPriceChangeBps (${maxPriceChangeBps} bps) must be less than or equal to ${MAX_PRICE_CHANGE_BPS_DEFAULT}`\n );\n }\n\n const priceRatio = maxPriceChangeBps / BASIS_POINT_MAX + 1;\n // Q64\n const sqrtPriceRatioQ64 = new BN(\n Decimal.sqrt(priceRatio.toString())\n .mul(Decimal.pow(2, 64))\n .floor()\n .toFixed()\n );\n const deltaBinId = sqrtPriceRatioQ64\n .sub(ONE_Q64)\n .div(BIN_STEP_BPS_U128_DEFAULT)\n .muln(2);\n\n const maxVolatilityAccumulator = new BN(deltaBinId.muln(BASIS_POINT_MAX));\n\n const squareVfaBin = maxVolatilityAccumulator\n .mul(new BN(BIN_STEP_BPS_DEFAULT))\n .pow(new BN(2));\n\n const baseFeeNumerator = new BN(bpsToFeeNumerator(baseFeeBps));\n const maxDynamicFeeNumerator = baseFeeNumerator.muln(20).divn(100); // default max dynamic fee = 20% of base fee.\n const vFee = maxDynamicFeeNumerator\n .mul(new BN(100_000_000_000))\n .sub(new BN(99_999_999_999));\n\n const variableFeeControl = vFee.div(squareVfaBin);\n\n return {\n binStep: BIN_STEP_BPS_DEFAULT,\n binStepU128: BIN_STEP_BPS_U128_DEFAULT,\n filterPeriod: DYNAMIC_FEE_FILTER_PERIOD_DEFAULT,\n decayPeriod: DYNAMIC_FEE_DECAY_PERIOD_DEFAULT,\n reductionFactor: DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT,\n maxVolatilityAccumulator: maxVolatilityAccumulator.toNumber(),\n variableFeeControl: variableFeeControl.toNumber(),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/dann/Documents/GitHub/damm-v2-sdk/dist/index.js","../src/CpAmm.ts","../src/idl/cp_amm.json","../src/types.ts","../src/pda.ts","../src/constants.ts","../src/helpers/token.ts","../src/helpers/computeUnits.ts","../src/helpers/utils.ts","../src/helpers/accountFilters.ts","../src/helpers/token2022.ts","../src/helpers/vestings.ts","../src/helpers/validation.ts","../src/math/poolFees/baseFee.ts","../src/math/poolFees/rateLimiter.ts","../src/math/feeMath.ts","../src/math/utilsMath.ts","../src/math/poolFees/feeScheduler.ts","../src/math/poolFees/dynamicFee.ts","../src/math/quote.ts","../src/math/curve.ts","../src/math/priceMath.ts","../src/helpers/common.ts"],"names":["Rounding","ActivationPoint","BaseFeeMode","CollectFeeMode","TradeDirection","ActivationType","PoolVersion","PoolStatus","SwapMode","PublicKey","BN","Decimal","hasPartner","tradeFeeNumerator","min","NATIVE_MINT"],"mappings":"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A;AACL,IAAA;AAAA,EAAA;AACF;ADwuSe;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/dann/Documents/GitHub/damm-v2-sdk/dist/index.js","sourcesContent":[null,"import { Program } from \"@coral-xyz/anchor\";\nimport { NATIVE_MINT, TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport invariant from \"invariant\";\n\nimport CpAmmIDL from \"./idl/cp_amm.json\";\nimport type { CpAmm as CpAmmTypes } from \"./idl/cp_amm\";\nimport {\n Connection,\n Transaction,\n PublicKey,\n TransactionInstruction,\n SystemProgram,\n AccountMeta,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n} from \"@solana/web3.js\";\nimport {\n AddLiquidityParams,\n AmmProgram,\n BuildAddLiquidityParams,\n BuildLiquidatePositionInstructionParams,\n BuildRemoveAllLiquidityInstructionParams,\n ClaimPartnerFeeParams,\n ClaimPositionFeeInstructionParams,\n ClaimPositionFeeParams,\n ClaimPositionFeeParams2,\n ClaimRewardParams,\n ClosePositionInstructionParams,\n ClosePositionParams,\n ConfigState,\n CreatePoolParams,\n CreatePositionAndAddLiquidity,\n CreatePositionParams,\n DepositQuote,\n FundRewardParams,\n GetDepositQuoteParams,\n GetQuoteParams,\n GetWithdrawQuoteParams,\n InitializeCustomizeablePoolParams,\n InitializeCustomizeablePoolWithDynamicConfigParams,\n LiquidityDeltaParams,\n LockPositionParams,\n MergePositionParams,\n PermanentLockParams,\n PoolState,\n PositionState,\n PrepareCustomizablePoolParams,\n PreparedPoolCreation,\n PreparePoolCreationParams,\n PreparePoolCreationSingleSide,\n PrepareTokenAccountParams,\n RefreshVestingParams,\n RemoveAllLiquidityAndClosePositionParams,\n RemoveAllLiquidityParams,\n RemoveLiquidityParams,\n Rounding,\n SetupFeeClaimAccountsParams,\n SwapParams,\n TradeDirection,\n TxBuilder,\n UpdateRewardDurationParams,\n UpdateRewardFunderParams,\n VestingState,\n WithdrawIneligibleRewardParams,\n WithdrawQuote,\n SplitPositionParams,\n SplitPosition2Params,\n Quote2Result,\n Swap2Params,\n SwapMode,\n GetQuote2Params,\n InitializeRewardParams,\n InitializeAndFundReward,\n} from \"./types\";\nimport {\n deriveCustomizablePoolAddress,\n derivePoolAddress,\n derivePoolAuthority,\n derivePositionAddress,\n derivePositionNftAccount,\n deriveRewardVaultAddress,\n deriveTokenBadgeAddress,\n deriveTokenVaultAddress,\n} from \"./pda\";\n\nimport {\n getOrCreateATAInstruction,\n getTokenProgram,\n unwrapSOLInstruction,\n wrapSOLInstruction,\n positionByPoolFilter,\n vestingByPositionFilter,\n calculateTransferFeeExcludedAmount,\n calculateTransferFeeIncludedAmount,\n getAvailableVestingLiquidity,\n isVestingComplete,\n getAllPositionNftAccountByOwner,\n parseRateLimiterSecondFactor,\n getCurrentPoint,\n offsetBasedFilter,\n} from \"./helpers\";\nimport BN, { min, max } from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport {\n calculateInitSqrtPrice,\n getAmountAFromLiquidityDelta,\n getAmountBFromLiquidityDelta,\n getLiquidityDeltaFromAmountA,\n getLiquidityDeltaFromAmountB,\n isRateLimiterApplied,\n swapQuoteExactInput,\n swapQuoteExactOutput,\n swapQuotePartialInput,\n} from \"./math\";\n\n/**\n * CpAmm SDK class to interact with the DAMM-V2\n */\nexport class CpAmm {\n _program: AmmProgram;\n private poolAuthority: PublicKey;\n constructor(connection: Connection) {\n this._program = new Program(CpAmmIDL as CpAmmTypes, {\n connection: connection,\n });\n this.poolAuthority = derivePoolAuthority();\n }\n\n //// ANCHOR: PRIVATE FUNCTIONS //////\n /**\n * Prepares token accounts for a transaction by retrieving or creating associated token accounts.\n * @private\n * @param {PublicKey} owner - The owner of the token accounts\n * @param {PublicKey} tokenAMint - Mint address of token A\n * @param {PublicKey} tokenBMint - Mint address of token B\n * @param {PublicKey} tokenAProgram - Program ID for token A (Token or Token2022)\n * @param {PublicKey} tokenBProgram - Program ID for token B (Token or Token2022)\n * @returns {Promise<{tokenAAta: PublicKey, tokenBAta: PublicKey, instructions: TransactionInstruction[]}>}\n * The token account addresses and any instructions needed to create them\n */\n private async prepareTokenAccounts(\n params: PrepareTokenAccountParams\n ): Promise<{\n tokenAAta: PublicKey;\n tokenBAta: PublicKey;\n instructions: TransactionInstruction[];\n }> {\n const {\n payer,\n tokenAOwner,\n tokenBOwner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n const instructions: TransactionInstruction[] = [];\n const [\n { ataPubkey: tokenAAta, ix: createInputTokenAccountIx },\n { ataPubkey: tokenBAta, ix: createOutputTokenAccountIx },\n ] = await Promise.all([\n getOrCreateATAInstruction(\n this._program.provider.connection,\n tokenAMint,\n tokenAOwner,\n payer,\n true,\n tokenAProgram\n ),\n getOrCreateATAInstruction(\n this._program.provider.connection,\n tokenBMint,\n tokenBOwner,\n payer,\n true,\n tokenBProgram\n ),\n ]);\n createInputTokenAccountIx && instructions.push(createInputTokenAccountIx);\n createOutputTokenAccountIx && instructions.push(createOutputTokenAccountIx);\n\n return { tokenAAta, tokenBAta, instructions };\n }\n\n /**\n * Derives token badge account metadata\n * @param tokenAMint - Public key of token A mint\n * @param tokenBMint - Public key of token B mint\n * @returns Array of account metadata for token badges\n */\n private getTokenBadgeAccounts(\n tokenAMint: PublicKey,\n tokenBMint: PublicKey\n ): AccountMeta[] {\n return [\n {\n pubkey: deriveTokenBadgeAddress(tokenAMint),\n isWritable: false,\n isSigner: false,\n },\n {\n pubkey: deriveTokenBadgeAddress(tokenBMint),\n isWritable: false,\n isSigner: false,\n },\n ];\n }\n\n /**\n * Builds an instruction to add liquidity to a position.\n * @private\n * @param {BuildAddLiquidityParams} params - Parameters for adding liquidity\n * @returns {Promise<TransactionInstruction>} Instruction to add liquidity\n */\n private async buildAddLiquidityInstruction(\n params: BuildAddLiquidityParams\n ): Promise<TransactionInstruction> {\n const {\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n } = params;\n return await this._program.methods\n .addLiquidity({\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n })\n .accountsPartial({\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to remove all liquidity from a position.\n * @private\n * @param {BuildRemoveAllLiquidityInstructionParams} params - Parameters for removing all liquidity\n * @returns {Promise<TransactionInstruction>} Instruction to remove all liquidity\n */\n private async buildRemoveAllLiquidityInstruction(\n params: BuildRemoveAllLiquidityInstructionParams\n ): Promise<TransactionInstruction> {\n const {\n poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n } = params;\n return await this._program.methods\n .removeAllLiquidity(tokenAAmountThreshold, tokenBAmountThreshold)\n .accountsPartial({\n poolAuthority,\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to claim fees accumulated by a position.\n * @private\n * @param {ClaimPositionFeeInstructionParams} params - Parameters for claiming position fees\n * @returns {Promise<TransactionInstruction>} Instruction to claim position fees\n */\n private async buildClaimPositionFeeInstruction(\n params: ClaimPositionFeeInstructionParams\n ): Promise<TransactionInstruction> {\n const {\n owner,\n poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n return await this._program.methods\n .claimPositionFee()\n .accountsPartial({\n poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to close a position.\n * @private\n * @param {ClosePositionInstructionParams} params - Parameters for closing a position\n * @returns {Promise<TransactionInstruction>} Instruction to close the position\n */\n private async buildClosePositionInstruction(\n params: ClosePositionInstructionParams\n ): Promise<TransactionInstruction> {\n const {\n owner,\n poolAuthority,\n pool,\n position,\n positionNftAccount,\n positionNftMint,\n } = params;\n\n return await this._program.methods\n .closePosition()\n .accountsPartial({\n positionNftMint,\n positionNftAccount,\n pool,\n position,\n poolAuthority,\n rentReceiver: owner,\n owner,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n })\n .instruction();\n }\n\n /**\n * Builds an instruction to refresh vesting for a position\n * @param params Parameters required for the refresh vesting instruction\n * @returns Transaction instruction or null if no vestings to refresh\n */\n private async buildRefreshVestingInstruction(\n params: RefreshVestingParams\n ): Promise<TransactionInstruction | null> {\n const { owner, position, positionNftAccount, pool, vestingAccounts } =\n params;\n\n if (vestingAccounts.length == 0) {\n return null;\n }\n\n return await this._program.methods\n .refreshVesting()\n .accountsPartial({\n position,\n positionNftAccount,\n pool,\n owner,\n })\n .remainingAccounts(\n vestingAccounts.map((pubkey: PublicKey) => {\n return {\n isSigner: false,\n isWritable: true,\n pubkey,\n };\n })\n )\n .instruction();\n }\n\n /**\n * Helper function that builds instructions to claim fees, remove liquidity, and close a position\n * @param {BuildLiquidatePositionInstructionParams} params - Parameters for liquidating a position\n * @returns {Promise<TransactionInstruction[]>} Array of instructions\n * @private\n */\n private async buildLiquidatePositionInstruction(\n params: BuildLiquidatePositionInstructionParams\n ): Promise<TransactionInstruction[]> {\n const {\n owner,\n position,\n positionNftAccount,\n positionState,\n poolState,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n } = params;\n\n const { nftMint: positionNftMint, pool } = positionState;\n const { tokenAMint, tokenBMint, tokenAVault, tokenBVault } = poolState;\n\n const tokenAProgram = getTokenProgram(poolState.tokenAFlag);\n const tokenBProgram = getTokenProgram(poolState.tokenBFlag);\n\n const instructions: TransactionInstruction[] = [];\n\n // 1. claim position fee\n const claimPositionFeeInstruction =\n await this.buildClaimPositionFeeInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n instructions.push(claimPositionFeeInstruction);\n\n // 2. remove all liquidity\n const removeAllLiquidityInstruction =\n await this.buildRemoveAllLiquidityInstruction({\n poolAuthority: this.poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n });\n instructions.push(removeAllLiquidityInstruction);\n // 3. close position\n const closePositionInstruction = await this.buildClosePositionInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftMint,\n positionNftAccount,\n });\n instructions.push(closePositionInstruction);\n\n return instructions;\n }\n\n /**\n * Builds a instruction to create a position.\n * @param {CreatePositionParams} params - Parameters for position creation.\n * @returns Transaction instruction.\n */\n private async buildCreatePositionInstruction(\n params: CreatePositionParams\n ): Promise<{\n ix: TransactionInstruction;\n position: PublicKey;\n positionNftAccount: PublicKey;\n }> {\n const { owner, payer, pool, positionNft } = params;\n\n const position = derivePositionAddress(positionNft);\n const positionNftAccount = derivePositionNftAccount(positionNft);\n\n const ix = await this._program.methods\n .createPosition()\n .accountsPartial({\n owner,\n positionNftMint: positionNft,\n poolAuthority: this.poolAuthority,\n positionNftAccount,\n payer: payer,\n pool,\n position,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n\n return {\n ix,\n position,\n positionNftAccount,\n };\n }\n\n /**\n * Private helper method to prepare common customizable pool creation logic\n * @param {PrepareCustomizablePoolParams} params - Common parameters for pool creation\n * @returns Prepared transaction data including instructions and accounts\n */\n private async prepareCreatePoolParams(params: PrepareCustomizablePoolParams) {\n const {\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const position = derivePositionAddress(positionNft);\n const positionNftAccount = derivePositionNftAccount(positionNft);\n\n const tokenAVault = deriveTokenVaultAddress(tokenAMint, pool);\n const tokenBVault = deriveTokenVaultAddress(tokenBMint, pool);\n\n const {\n tokenAAta: payerTokenA,\n tokenBAta: payerTokenB,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner: payer,\n tokenBOwner: payer,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n payerTokenA,\n BigInt(tokenAAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n payerTokenB,\n BigInt(tokenBAmount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n const tokenBadgeAccounts = this.getTokenBadgeAccounts(\n tokenAMint,\n tokenBMint\n );\n\n return {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n };\n }\n\n /**\n * Sets up token accounts and instructions for fee claim operations.\n * @private\n * @param {SetupFeeClaimAccountsParams} params - Parameters for setting up fee claim accounts.\n * @returns Token accounts and instructions for fee claiming.\n */\n private async setupFeeClaimAccounts(\n params: SetupFeeClaimAccountsParams\n ): Promise<{\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n preInstructions: TransactionInstruction[];\n postInstructions: TransactionInstruction[];\n }> {\n const {\n payer,\n owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n receiver,\n tempWSolAccount,\n } = params;\n\n const tokenAIsSOL = tokenAMint.equals(NATIVE_MINT);\n const tokenBIsSOL = tokenBMint.equals(NATIVE_MINT);\n const hasSolToken = tokenAIsSOL || tokenBIsSOL;\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: TransactionInstruction[] = [];\n let tokenAAccount: PublicKey;\n let tokenBAccount: PublicKey;\n\n let tokenAOwner = owner;\n let tokenBOwner = owner;\n if (receiver) {\n tokenAOwner = tokenAIsSOL ? tempWSolAccount : receiver;\n tokenBOwner = tokenBIsSOL ? tempWSolAccount : receiver;\n }\n\n const { tokenAAta, tokenBAta, instructions } =\n await this.prepareTokenAccounts({\n payer,\n tokenAOwner,\n tokenBOwner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n tokenAAccount = tokenAAta;\n tokenBAccount = tokenBAta;\n preInstructions.push(...instructions);\n\n if (hasSolToken) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(\n tempWSolAccount ?? owner,\n receiver ?? owner\n );\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n return {\n tokenAAccount,\n tokenBAccount,\n preInstructions,\n postInstructions,\n };\n }\n\n //// ANCHOR: GETTER/FETCHER FUNCTIONS //////\n\n /**\n * Fetches the Config state of the program.\n * @param config - Public key of the config account.\n * @returns Parsed ConfigState.\n */\n async fetchConfigState(config: PublicKey): Promise<ConfigState> {\n const configState = await this._program.account.config.fetchNullable(\n config\n );\n invariant(configState, `Config account: ${config} not found`);\n\n return configState;\n }\n\n /**\n * Fetches the Pool state.\n * @param pool - Public key of the pool.\n * @returns Parsed PoolState.\n */\n async fetchPoolState(pool: PublicKey): Promise<PoolState> {\n const poolState = await this._program.account.pool.fetchNullable(pool);\n invariant(poolState, `Pool account: ${pool} not found`);\n\n return poolState;\n }\n\n /**\n * Fetches all Pool states by tokenAMint.\n * @param tokenAMint - Public key of the tokenA mint.\n * @returns Array of matched pool accounts and their state.\n */\n async fetchPoolStatesByTokenAMint(\n tokenAMint: PublicKey\n ): Promise<Array<{ publicKey: PublicKey; account: PoolState }>> {\n const filters = offsetBasedFilter(tokenAMint, 168);\n const pools = await this._program.account.pool.all(filters);\n return pools;\n }\n\n /**\n * Fetches the Position state.\n * @param position - Public key of the position.\n * @returns Parsed PositionState.\n */\n async fetchPositionState(position: PublicKey): Promise<PositionState> {\n const positionState = await this._program.account.position.fetchNullable(\n position\n );\n invariant(positionState, `Position account: ${position} not found`);\n\n return positionState;\n }\n\n /**\n * Retrieves all config accounts.\n * @returns Array of config public keys and their states.\n */\n async getAllConfigs(): Promise<\n Array<{ publicKey: PublicKey; account: ConfigState }>\n > {\n const configAccounts = await this._program.account.config.all();\n\n return configAccounts;\n }\n\n /**\n * Retrieves all pool accounts.\n * @returns Array of pool public keys and their states.\n */\n async getAllPools(): Promise<\n Array<{ publicKey: PublicKey; account: PoolState }>\n > {\n const poolAccounts = await this._program.account.pool.all();\n\n return poolAccounts;\n }\n\n /**\n * Retrieves all position accounts.\n * @returns Array of position public keys and their states.\n */\n async getAllPositions(): Promise<\n Array<{\n publicKey: PublicKey;\n account: PositionState;\n }>\n > {\n const poolAccounts = await this._program.account.position.all();\n\n return poolAccounts;\n }\n\n /**\n * Gets all positions a specific pool.\n * @param pool - Public key of the pool.\n * @returns List of user positions for the pool.\n */\n async getAllPositionsByPool(pool: PublicKey): Promise<\n Array<{\n publicKey: PublicKey;\n account: PositionState;\n }>\n > {\n return await this._program.account.position.all([\n positionByPoolFilter(pool),\n ]);\n }\n\n /**\n * Gets all positions of a user for a specific pool.\n * @param pool - Public key of the pool.\n * @param user - Public key of the user.\n * @returns List of user positions for the pool.\n */\n async getUserPositionByPool(\n pool: PublicKey,\n user: PublicKey\n ): Promise<\n Array<{\n positionNftAccount: PublicKey;\n position: PublicKey;\n positionState: PositionState;\n }>\n > {\n const allUserPositions = await this.getPositionsByUser(user);\n return allUserPositions.filter((position) =>\n position.positionState.pool.equals(pool)\n );\n }\n\n /**\n * Gets all positions of a user across all pools.\n * @param user - Public key of the user.\n * @returns Array of user positions already sorted by liquidity\n */\n async getPositionsByUser(user: PublicKey): Promise<\n Array<{\n positionNftAccount: PublicKey;\n position: PublicKey;\n positionState: PositionState;\n }>\n > {\n const userPositionAccounts = await getAllPositionNftAccountByOwner(\n this._program.provider.connection,\n user\n );\n if (userPositionAccounts.length === 0) {\n return [];\n }\n\n const positionAddresses = userPositionAccounts.map((account) =>\n derivePositionAddress(account.positionNft)\n );\n\n const positionStates = await this._program.account.position.fetchMultiple(\n positionAddresses\n );\n const positionResult = userPositionAccounts\n .map((account, index) => {\n const positionState = positionStates[index];\n if (!positionState) return null;\n\n return {\n positionNftAccount: account.positionNftAccount,\n position: positionAddresses[index],\n positionState,\n };\n })\n .filter(Boolean);\n\n // in-place sort\n positionResult.sort((a, b) => {\n const totalLiquidityA = a.positionState.vestedLiquidity\n .add(a.positionState.permanentLockedLiquidity)\n .add(a.positionState.unlockedLiquidity);\n\n const totalLiquidityB = b.positionState.vestedLiquidity\n .add(b.positionState.permanentLockedLiquidity)\n .add(b.positionState.unlockedLiquidity);\n\n return totalLiquidityB.cmp(totalLiquidityA);\n });\n\n return positionResult;\n }\n\n /**\n * Retrieves all vesting accounts associated with a position.\n * @param position - Public key of the position.\n * @returns Array of vesting account public keys and their states.\n */\n async getAllVestingsByPosition(position: PublicKey): Promise<\n Array<{\n publicKey: PublicKey;\n account: VestingState;\n }>\n > {\n const vestings = await this._program.account.vesting.all([\n vestingByPositionFilter(position),\n ]);\n\n return vestings;\n }\n\n /**\n * Checks if a position has any locked liquidity.\n * @param position - Position state.\n * @returns True if the position has locked liquidity, false otherwise.\n */\n isLockedPosition(position: PositionState): boolean {\n const totalLockedLiquidity = position.vestedLiquidity.add(\n position.permanentLockedLiquidity\n );\n\n return totalLockedLiquidity.gtn(0);\n }\n\n /**\n * Checks if a position is permanently locked.\n * @param positionState - Position state.\n * @returns True if the position is permanently locked, false otherwise.\n */\n isPermanentLockedPosition(positionState: PositionState): boolean {\n return positionState.permanentLockedLiquidity.gtn(0);\n }\n\n /**\n * Checks if a position can be unlocked based on its locking state and vesting schedules.\n *\n * This method evaluates whether a position is eligible for operations that require\n * unlocked liquidity, such as removing all liquidity or closing the position. It checks both\n * permanent locks and time-based vesting schedules.\n *\n * @private\n * @param {PositionState} positionState - The current state of the position\n * @param {Array<{account: PublicKey; vestingState: VestingState}>} vestings - Array of vesting accounts and their states\n * @param {BN} currentPoint - Current timestamp or slot number (depending on activation type of pool)\n *\n * @returns {Object} Result object containing unlock status and reason\n * @returns {boolean} result.canUnlock - Whether the position can be unlocked\n * @returns {string|undefined} result.reason - Reason why position cannot be unlocked (if applicable)\n */\n canUnlockPosition(\n positionState: PositionState,\n vestings: Array<{ account: PublicKey; vestingState: VestingState }>,\n currentPoint: BN\n ): { canUnlock: boolean; reason?: string } {\n if (vestings.length > 0) {\n // Check if permanently locked\n if (this.isPermanentLockedPosition(positionState)) {\n return {\n canUnlock: false,\n reason: \"Position is permanently locked\",\n };\n }\n\n // Check each vesting\n // We expect that should have only one vesting per position\n for (const vesting of vestings) {\n if (!isVestingComplete(vesting.vestingState, currentPoint)) {\n return {\n canUnlock: false,\n reason: \"Position has incomplete vesting schedule\",\n };\n }\n }\n }\n\n return { canUnlock: true };\n }\n\n /**\n * Checks if a pool exists.\n * @param pool - Public key of the pool.\n * @returns True if the pool exists, false otherwise.\n */\n async isPoolExist(pool: PublicKey): Promise<boolean> {\n const poolState = await this._program.account.pool.fetchNullable(pool);\n return poolState !== null;\n }\n\n /**\n * Computes the liquidity delta based on the provided token amounts and sqrt price\n *\n * @param {LiquidityDeltaParams} params - The parameters for liquidity calculation\n * @returns {Promise<BN>} - The computed liquidity delta in Q64 value.\n */\n getLiquidityDelta(params: LiquidityDeltaParams): BN {\n const {\n maxAmountTokenA,\n maxAmountTokenB,\n sqrtMaxPrice,\n sqrtMinPrice,\n sqrtPrice,\n } = params;\n\n const liquidityDeltaFromAmountA = getLiquidityDeltaFromAmountA(\n maxAmountTokenA,\n sqrtPrice,\n sqrtMaxPrice\n );\n\n const liquidityDeltaFromAmountB = getLiquidityDeltaFromAmountB(\n maxAmountTokenB,\n sqrtMinPrice,\n sqrtPrice\n );\n\n return min(liquidityDeltaFromAmountA, liquidityDeltaFromAmountB);\n }\n\n /**\n * Calculates swap quote based on input amount and pool state.\n * @param params - Swap parameters including input amount, pool state, slippage, etc.\n * @returns Swap quote including expected output amount, fee, and price impact.\n */\n getQuote(params: GetQuoteParams): {\n swapInAmount: BN;\n consumedInAmount: BN;\n swapOutAmount: BN;\n minSwapOutAmount: BN;\n totalFee: BN;\n priceImpact: Decimal;\n } {\n const {\n inAmount,\n inputTokenMint,\n slippage,\n poolState,\n currentTime,\n currentSlot,\n inputTokenInfo,\n outputTokenInfo,\n tokenADecimal,\n tokenBDecimal,\n hasReferral,\n } = params;\n const { activationType } = poolState;\n\n const aToB = poolState.tokenAMint.equals(inputTokenMint);\n\n // because for a DAMM v2 pool, the activation type can either be slot (0) or timestamp (1).\n // if it is slot, we use the currentSlot from blockchain slot.\n // if it is timestamp, we use the currentTime from blockTime.\n const currentPoint = activationType\n ? new BN(currentTime)\n : new BN(currentSlot);\n\n const swapResult = swapQuoteExactInput(\n poolState,\n currentPoint,\n inAmount,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n\n return {\n swapInAmount: inAmount,\n consumedInAmount: swapResult.includedFeeInputAmount,\n swapOutAmount: swapResult.outputAmount,\n minSwapOutAmount: swapResult.minimumAmountOut,\n totalFee: swapResult.tradingFee\n .add(swapResult.protocolFee)\n .add(swapResult.partnerFee)\n .add(swapResult.referralFee),\n priceImpact: swapResult.priceImpact,\n };\n }\n\n /**\n * Calculates the expected output amount or input amount for a swap depending on the swap mode.\n * @param params GetQuote2Params\n * @returns Quote2Result\n */\n getQuote2(params: GetQuote2Params): Quote2Result {\n const {\n inputTokenMint,\n slippage,\n poolState,\n currentPoint,\n inputTokenInfo,\n outputTokenInfo,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n swapMode,\n } = params;\n\n const aToB = poolState.tokenAMint.equals(inputTokenMint);\n\n switch (swapMode) {\n case SwapMode.ExactIn:\n if (\"amountIn\" in params) {\n return swapQuoteExactInput(\n poolState,\n currentPoint,\n params.amountIn,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n }\n throw new Error(\"amountIn is required for ExactIn swap mode\");\n\n case SwapMode.ExactOut:\n if (\"amountOut\" in params) {\n return swapQuoteExactOutput(\n poolState,\n currentPoint,\n params.amountOut,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n }\n throw new Error(\"outAmount is required for ExactOut swap mode\");\n\n case SwapMode.PartialFill:\n if (\"amountIn\" in params) {\n return swapQuotePartialInput(\n poolState,\n currentPoint,\n params.amountIn,\n slippage,\n aToB,\n hasReferral,\n tokenADecimal,\n tokenBDecimal,\n inputTokenInfo,\n outputTokenInfo\n );\n }\n throw new Error(\"amountIn is required for PartialFill swap mode\");\n\n default:\n throw new Error(`Unsupported swap mode: ${swapMode}`);\n }\n }\n\n /**\n * Calculates the deposit quote for liquidity pool.\n *\n * @param {GetDepositQuoteParams} params - The parameters for calculating the deposit quote.\n *\n * @returns {Promise<Object>} Deposit quote results\n * @returns {BN} returns.actualInputAmount - The actual amount used as input (after deducting transfer fees).\n * @returns {BN} returns.outputAmount - The calculated corresponding amount of the other token.\n * @returns {BN} returns.liquidityDelta - The amount of liquidity that will be added to the pool.\n */\n getDepositQuote(params: GetDepositQuoteParams): DepositQuote {\n const {\n inAmount,\n isTokenA,\n inputTokenInfo,\n outputTokenInfo,\n minSqrtPrice,\n maxSqrtPrice,\n sqrtPrice,\n } = params;\n\n const actualAmountIn = inputTokenInfo\n ? calculateTransferFeeExcludedAmount(\n inAmount,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount\n : inAmount;\n\n const { liquidityDelta, rawAmount } = isTokenA\n ? {\n liquidityDelta: getLiquidityDeltaFromAmountA(\n actualAmountIn,\n sqrtPrice,\n maxSqrtPrice\n ),\n rawAmount: (delta: BN) =>\n getAmountBFromLiquidityDelta(\n minSqrtPrice,\n sqrtPrice,\n delta,\n Rounding.Up\n ),\n }\n : {\n liquidityDelta: getLiquidityDeltaFromAmountB(\n actualAmountIn,\n minSqrtPrice,\n sqrtPrice\n ),\n rawAmount: (delta: BN) =>\n getAmountAFromLiquidityDelta(\n sqrtPrice,\n maxSqrtPrice,\n delta,\n Rounding.Up\n ),\n };\n\n const rawOutputAmount = new BN(rawAmount(liquidityDelta));\n const outputAmount = outputTokenInfo\n ? calculateTransferFeeIncludedAmount(\n rawOutputAmount,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount\n : rawOutputAmount;\n\n return {\n actualInputAmount: actualAmountIn,\n consumedInputAmount: inAmount,\n liquidityDelta,\n outputAmount,\n };\n }\n\n /**\n * Calculates the withdrawal quote for removing liquidity from a concentrated liquidity pool.\n *\n * @param {GetWithdrawQuoteParams} params - The parameters for calculating the withdraw quote\n *\n * @param {Object|null} params.tokenATokenInfo - must provide if token a is token2022\n * @param {Object|null} params.tokenBTokenInfo - must provide if token b is token2022\n *\n * @returns {Promise<Object>} Withdrawal quote results\n * @returns {BN} returns.liquidityDelta - The amount of liquidity that will be removed from the pool\n * @returns {BN} returns.outAmountA - The calculated amount of token A to be received (after deducting transfer fees)\n * @returns {BN} returns.outAmountB - The calculated amount of token B to be received (after deducting transfer fees)\n */\n getWithdrawQuote(params: GetWithdrawQuoteParams): WithdrawQuote {\n const {\n liquidityDelta,\n sqrtPrice,\n maxSqrtPrice,\n minSqrtPrice,\n tokenATokenInfo,\n tokenBTokenInfo,\n } = params;\n const amountA = getAmountAFromLiquidityDelta(\n sqrtPrice,\n maxSqrtPrice,\n liquidityDelta,\n Rounding.Down\n );\n const amountB = getAmountBFromLiquidityDelta(\n minSqrtPrice,\n sqrtPrice,\n liquidityDelta,\n Rounding.Down\n );\n\n return {\n liquidityDelta,\n outAmountA: tokenATokenInfo\n ? calculateTransferFeeExcludedAmount(\n amountA,\n tokenATokenInfo.mint,\n tokenATokenInfo.currentEpoch\n ).amount\n : amountA,\n outAmountB: tokenBTokenInfo\n ? calculateTransferFeeExcludedAmount(\n amountB,\n tokenBTokenInfo.mint,\n tokenBTokenInfo.currentEpoch\n ).amount\n : amountB,\n };\n }\n\n /**\n * Calculates liquidity and corresponding token amounts for token A single-sided pool creation\n * Only supports initialization where initial price equals min sqrt price\n * @param params Parameters for single-sided pool creation\n * @returns Calculated liquidity delta\n */\n preparePoolCreationSingleSide(params: PreparePoolCreationSingleSide): BN {\n const {\n tokenAAmount,\n initSqrtPrice,\n minSqrtPrice,\n maxSqrtPrice,\n tokenAInfo,\n } = params;\n\n if (!initSqrtPrice.eq(minSqrtPrice)) {\n throw new Error(\"Only support single side for base token.\");\n }\n\n const actualAmountIn = tokenAInfo\n ? tokenAAmount.sub(\n calculateTransferFeeIncludedAmount(\n tokenAAmount,\n tokenAInfo.mint,\n tokenAInfo.currentEpoch\n ).transferFee\n )\n : tokenAAmount;\n\n const liquidityDelta = getLiquidityDeltaFromAmountA(\n actualAmountIn,\n initSqrtPrice,\n maxSqrtPrice\n );\n\n return liquidityDelta;\n }\n\n /**\n * Prepares parameters required for pool creation, including initial sqrt price and liquidity.\n * @private\n * @param {PreparePoolCreationParams} params - Initial token amounts for pool creation.\n * @returns init sqrt price and liquidity in Q64 format.\n */\n preparePoolCreationParams(\n params: PreparePoolCreationParams\n ): PreparedPoolCreation {\n const {\n tokenAAmount,\n tokenBAmount,\n minSqrtPrice,\n maxSqrtPrice,\n tokenAInfo,\n tokenBInfo,\n } = params;\n\n if (tokenAAmount.eq(new BN(0)) && tokenBAmount.eq(new BN(0))) {\n throw new Error(\"Invalid input amount\");\n }\n\n const actualAmountAIn = tokenAInfo\n ? tokenAAmount.sub(\n calculateTransferFeeIncludedAmount(\n tokenAAmount,\n tokenAInfo.mint,\n tokenAInfo.currentEpoch\n ).transferFee\n )\n : tokenAAmount;\n\n const actualAmountBIn = tokenBInfo\n ? tokenBAmount.sub(\n calculateTransferFeeIncludedAmount(\n tokenBAmount,\n tokenBInfo.mint,\n tokenBInfo.currentEpoch\n ).transferFee\n )\n : tokenBAmount;\n\n const initSqrtPrice = calculateInitSqrtPrice(\n tokenAAmount,\n tokenBAmount,\n minSqrtPrice,\n maxSqrtPrice\n );\n\n const liquidityDeltaFromAmountA = getLiquidityDeltaFromAmountA(\n actualAmountAIn,\n initSqrtPrice,\n maxSqrtPrice\n );\n\n const liquidityDeltaFromAmountB = getLiquidityDeltaFromAmountB(\n actualAmountBIn,\n minSqrtPrice,\n initSqrtPrice\n );\n\n const liquidityDelta = min(\n liquidityDeltaFromAmountA,\n liquidityDeltaFromAmountB\n );\n\n return {\n initSqrtPrice,\n liquidityDelta,\n };\n }\n\n //// ANCHOR: MAIN ENDPOINT //////\n /**\n * Builds a transaction to create a permissionless pool.\n * @param params - Parameters for pool creation.\n * @returns Transaction builder.\n */\n async createPool(params: CreatePoolParams): TxBuilder {\n const {\n payer,\n creator,\n config,\n positionNft,\n tokenAMint,\n tokenBMint,\n initSqrtPrice,\n liquidityDelta,\n activationPoint,\n tokenAAmount,\n tokenBAmount,\n tokenAProgram,\n tokenBProgram,\n isLockLiquidity,\n } = params;\n\n const pool = derivePoolAddress(config, tokenAMint, tokenBMint);\n const {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n } = await this.prepareCreatePoolParams({\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstruction: TransactionInstruction[] = [];\n\n if (isLockLiquidity) {\n const permanentLockIx = await this._program.methods\n .permanentLockPosition(liquidityDelta)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: creator,\n })\n .instruction();\n postInstruction.push(permanentLockIx);\n }\n\n const tx = await this._program.methods\n .initializePool({\n liquidity: liquidityDelta,\n sqrtPrice: initSqrtPrice,\n activationPoint: activationPoint,\n })\n .accountsPartial({\n creator,\n positionNftAccount,\n positionNftMint: positionNft,\n payer,\n config,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n tokenAProgram,\n tokenBProgram,\n systemProgram: SystemProgram.programId,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstruction)\n .remainingAccounts(tokenBadgeAccounts)\n .transaction();\n\n return tx;\n }\n\n /**\n * Builds a transaction to create a customizable pool.\n * @param params - Parameters for customizable pool creation.\n * @returns Transaction and related addresses.\n */\n async createCustomPool(params: InitializeCustomizeablePoolParams): Promise<{\n tx: Transaction;\n pool: PublicKey;\n position: PublicKey;\n }> {\n const {\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n sqrtMinPrice,\n sqrtMaxPrice,\n liquidityDelta,\n initSqrtPrice,\n payer,\n creator,\n positionNft,\n poolFees,\n hasAlphaVault,\n collectFeeMode,\n activationPoint,\n activationType,\n tokenAProgram,\n tokenBProgram,\n isLockLiquidity,\n } = params;\n const pool = deriveCustomizablePoolAddress(tokenAMint, tokenBMint);\n const {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n } = await this.prepareCreatePoolParams({\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount: tokenBMint.equals(NATIVE_MINT)\n ? max(tokenBAmount, new BN(1))\n : tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstruction: TransactionInstruction[] = [];\n\n if (isLockLiquidity) {\n const permanentLockIx = await this._program.methods\n .permanentLockPosition(liquidityDelta)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: creator,\n })\n .instruction();\n postInstruction.push(permanentLockIx);\n }\n\n const transaction = await this._program.methods\n .initializeCustomizablePool({\n poolFees,\n sqrtMinPrice,\n sqrtMaxPrice,\n hasAlphaVault,\n liquidity: liquidityDelta,\n sqrtPrice: initSqrtPrice,\n activationType,\n collectFeeMode,\n activationPoint,\n })\n .accountsPartial({\n creator,\n positionNftAccount,\n positionNftMint: positionNft,\n payer: payer,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n tokenAProgram,\n tokenBProgram,\n systemProgram: SystemProgram.programId,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstruction)\n .remainingAccounts(tokenBadgeAccounts)\n .transaction();\n\n return { tx: transaction, pool, position };\n }\n\n /**\n * Builds a transaction to create a customizable pool with dynamic config.\n * @param params InitializeCustomizeablePoolWithDynamicConfigParams\n * @returns Transaction and related addresses.\n */\n async createCustomPoolWithDynamicConfig(\n params: InitializeCustomizeablePoolWithDynamicConfigParams\n ): Promise<{\n tx: Transaction;\n pool: PublicKey;\n position: PublicKey;\n }> {\n const {\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n sqrtMinPrice,\n sqrtMaxPrice,\n liquidityDelta,\n initSqrtPrice,\n payer,\n config,\n poolCreatorAuthority,\n creator,\n positionNft,\n poolFees,\n hasAlphaVault,\n collectFeeMode,\n activationPoint,\n activationType,\n tokenAProgram,\n tokenBProgram,\n isLockLiquidity,\n } = params;\n\n const pool = derivePoolAddress(config, tokenAMint, tokenBMint);\n const {\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n preInstructions,\n tokenBadgeAccounts,\n } = await this.prepareCreatePoolParams({\n pool,\n tokenAMint,\n tokenBMint,\n tokenAAmount,\n tokenBAmount,\n payer,\n positionNft,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstruction: TransactionInstruction[] = [];\n\n if (isLockLiquidity) {\n const permanentLockIx = await this._program.methods\n .permanentLockPosition(liquidityDelta)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: creator,\n })\n .instruction();\n postInstruction.push(permanentLockIx);\n }\n\n const transaction = await this._program.methods\n .initializePoolWithDynamicConfig({\n poolFees,\n sqrtMinPrice,\n sqrtMaxPrice,\n hasAlphaVault,\n liquidity: liquidityDelta,\n sqrtPrice: initSqrtPrice,\n activationType,\n collectFeeMode,\n activationPoint,\n })\n .accountsPartial({\n creator,\n positionNftAccount,\n positionNftMint: positionNft,\n payer: payer,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n poolCreatorAuthority: poolCreatorAuthority,\n config: config,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n payerTokenA,\n payerTokenB,\n token2022Program: TOKEN_2022_PROGRAM_ID,\n tokenAProgram,\n tokenBProgram,\n systemProgram: SystemProgram.programId,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstruction)\n .remainingAccounts(tokenBadgeAccounts)\n .transaction();\n\n return { tx: transaction, pool, position };\n }\n\n /**\n * Builds a transaction to create a position.\n * @param {CreatePositionParams} params - Parameters for position creation.\n * @returns Transaction builder.\n */\n async createPosition(params: CreatePositionParams): TxBuilder {\n const { ix } = await this.buildCreatePositionInstruction(params);\n return new Transaction().add(ix);\n }\n\n /**\n * Builds a transaction to add liquidity to an existing position.\n * @param {AddLiquidityParams} params - Parameters for adding liquidity.\n * @returns Transaction builder.\n */\n async addLiquidity(params: AddLiquidityParams): TxBuilder {\n const {\n owner,\n pool,\n position,\n positionNftAccount,\n liquidityDelta,\n maxAmountTokenA,\n maxAmountTokenB,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenAAccount,\n BigInt(maxAmountTokenA.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenBAccount,\n BigInt(maxAmountTokenB.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const addLiquidityInstruction = await this.buildAddLiquidityInstruction({\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n addLiquidityInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Creates a new position and add liquidity to position it in a single transaction.\n * Handles both native SOL and other tokens, automatically wrapping/unwrapping SOL as needed.\n *\n * @param {CreatePositionAndAddLiquidity} params - Parameters for creating position and adding liquidity\n *\n * @returns {Transaction} A transaction that creates a position and adds liquidity\n *\n **/\n async createPositionAndAddLiquidity(\n params: CreatePositionAndAddLiquidity\n ): TxBuilder {\n const {\n owner,\n pool,\n positionNft,\n liquidityDelta,\n maxAmountTokenA,\n maxAmountTokenB,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const tokenAVault = deriveTokenVaultAddress(tokenAMint, pool);\n const tokenBVault = deriveTokenVaultAddress(tokenBMint, pool);\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenAAccount,\n BigInt(maxAmountTokenA.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n owner,\n tokenBAccount,\n BigInt(maxAmountTokenB.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n const {\n ix: createPositionIx,\n position,\n positionNftAccount,\n } = await this.buildCreatePositionInstruction({\n owner,\n payer: owner,\n pool,\n positionNft,\n });\n\n const addLiquidityInstruction = await this.buildAddLiquidityInstruction({\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n });\n\n const transaction = new Transaction();\n transaction.add(createPositionIx);\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n addLiquidityInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to remove liquidity from a position.\n * @param {RemoveLiquidityParams} params - Parameters for removing liquidity.\n * @returns Transaction builder.\n */\n async removeLiquidity(params: RemoveLiquidityParams): TxBuilder {\n const {\n owner,\n pool,\n position,\n positionNftAccount,\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n vestings,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (vestings.length > 0) {\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position,\n positionNftAccount,\n pool,\n vestingAccounts: vestings.map((item) => item.account),\n });\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n return await this._program.methods\n .removeLiquidity({\n liquidityDelta,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n })\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to remove liquidity from a position.\n * @param {RemoveLiquidityParams} params - Parameters for removing liquidity.\n * @returns Transaction builder.\n */\n async removeAllLiquidity(params: RemoveAllLiquidityParams): TxBuilder {\n const {\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n vestings,\n } = params;\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n if (vestings.length > 0) {\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position,\n positionNftAccount,\n pool,\n vestingAccounts: vestings.map((item) => item.account),\n });\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n const removeAllLiquidityInstruction =\n await this.buildRemoveAllLiquidityInstruction({\n poolAuthority: this.poolAuthority,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n removeAllLiquidityInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to perform a swap in the pool.\n * @param {SwapParams} params - Parameters for swapping tokens.\n * @returns Transaction builder.\n */\n async swap(params: SwapParams): TxBuilder {\n const {\n payer,\n pool,\n inputTokenMint,\n outputTokenMint,\n amountIn,\n minimumAmountOut,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n } = params;\n\n const [inputTokenProgram, outputTokenProgram] = inputTokenMint.equals(\n tokenAMint\n )\n ? [tokenAProgram, tokenBProgram]\n : [tokenBProgram, tokenAProgram];\n\n const tradeDirection = inputTokenMint.equals(tokenAMint)\n ? TradeDirection.AtoB\n : TradeDirection.BtoA;\n\n const {\n tokenAAta: inputTokenAccount,\n tokenBAta: outputTokenAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner: payer,\n tokenBOwner: payer,\n tokenAMint: inputTokenMint,\n tokenBMint: outputTokenMint,\n tokenAProgram: inputTokenProgram,\n tokenBProgram: outputTokenProgram,\n });\n\n if (inputTokenMint.equals(NATIVE_MINT)) {\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n inputTokenAccount,\n BigInt(amountIn.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(payer);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n let { poolState } = params;\n poolState = poolState ?? (await this.fetchPoolState(pool));\n\n const currentPoint = await getCurrentPoint(\n this._program.provider.connection,\n poolState.activationType\n );\n\n const { maxLimiterDuration, maxFeeBps } = parseRateLimiterSecondFactor(\n poolState.poolFees.baseFee.secondFactor\n );\n\n // check if rate limiter is applied\n const rateLimiterApplied = isRateLimiterApplied(\n poolState.poolFees.baseFee.thirdFactor,\n maxLimiterDuration,\n maxFeeBps,\n poolState.poolFees.baseFee.firstFactor,\n currentPoint,\n poolState.activationPoint,\n tradeDirection\n );\n\n // add remaining accounts if rate limiter is applied\n const remainingAccounts = rateLimiterApplied\n ? [\n {\n isSigner: false,\n isWritable: false,\n pubkey: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n ]\n : [];\n\n return await this._program.methods\n .swap({\n amountIn,\n minimumAmountOut,\n })\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n payer,\n inputTokenAccount,\n outputTokenAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n })\n .remainingAccounts(remainingAccounts)\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to perform a swap in the pool.\n * @param params Swap2Params\n * @returns Transaction builder.\n */\n async swap2(params: Swap2Params): TxBuilder {\n const {\n payer,\n pool,\n inputTokenMint,\n outputTokenMint,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n swapMode,\n } = params;\n\n const [inputTokenProgram, outputTokenProgram] = inputTokenMint.equals(\n tokenAMint\n )\n ? [tokenAProgram, tokenBProgram]\n : [tokenBProgram, tokenAProgram];\n\n const tradeDirection = inputTokenMint.equals(tokenAMint)\n ? TradeDirection.AtoB\n : TradeDirection.BtoA;\n\n const {\n tokenAAta: inputTokenAccount,\n tokenBAta: outputTokenAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner: payer,\n tokenBOwner: payer,\n tokenAMint: inputTokenMint,\n tokenBMint: outputTokenMint,\n tokenAProgram: inputTokenProgram,\n tokenBProgram: outputTokenProgram,\n });\n\n let amount0: BN;\n let amount1: BN;\n\n if (swapMode === SwapMode.ExactOut) {\n amount0 = params.amountOut;\n amount1 = params.maximumAmountIn;\n } else {\n amount0 = params.amountIn;\n amount1 = params.minimumAmountOut;\n }\n\n if (inputTokenMint.equals(NATIVE_MINT)) {\n const amount =\n swapMode === SwapMode.ExactIn || swapMode === SwapMode.PartialFill\n ? amount0\n : amount1;\n const wrapSOLIx = wrapSOLInstruction(\n payer,\n inputTokenAccount,\n BigInt(amount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(payer);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n let { poolState } = params;\n poolState = poolState ?? (await this.fetchPoolState(pool));\n\n const currentPoint = await getCurrentPoint(\n this._program.provider.connection,\n poolState.activationType\n );\n\n const { maxLimiterDuration, maxFeeBps } = parseRateLimiterSecondFactor(\n poolState.poolFees.baseFee.secondFactor\n );\n\n // check if rate limiter is applied\n const rateLimiterApplied = isRateLimiterApplied(\n poolState.poolFees.baseFee.thirdFactor,\n maxLimiterDuration,\n maxFeeBps,\n poolState.poolFees.baseFee.firstFactor,\n currentPoint,\n poolState.activationPoint,\n tradeDirection\n );\n\n // add remaining accounts if rate limiter is applied\n const remainingAccounts = rateLimiterApplied\n ? [\n {\n isSigner: false,\n isWritable: false,\n pubkey: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n ]\n : [];\n\n return await this._program.methods\n .swap2({\n amount0,\n amount1,\n swapMode,\n })\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n payer,\n inputTokenAccount,\n outputTokenAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n referralTokenAccount,\n })\n .remainingAccounts(remainingAccounts)\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to lock a position with vesting schedule.\n * @param {LockPositionParams} params - Locking parameters.\n * @returns Transaction builder.\n */\n async lockPosition(params: LockPositionParams): TxBuilder {\n const {\n owner,\n pool,\n payer,\n vestingAccount,\n position,\n positionNftAccount,\n cliffPoint,\n periodFrequency,\n cliffUnlockLiquidity,\n liquidityPerPeriod,\n numberOfPeriod,\n } = params;\n const lockPositionParams = {\n cliffPoint,\n periodFrequency,\n cliffUnlockLiquidity,\n liquidityPerPeriod,\n numberOfPeriod,\n };\n return await this._program.methods\n .lockPosition(lockPositionParams)\n .accountsPartial({\n position,\n positionNftAccount,\n vesting: vestingAccount,\n pool: pool,\n owner: owner,\n payer: payer,\n systemProgram: SystemProgram.programId,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to permanently lock a position.\n * @param {PermanentLockParams} params - Parameters for permanent locking.\n * @returns Transaction builder.\n */\n async permanentLockPosition(params: PermanentLockParams): TxBuilder {\n const { owner, position, positionNftAccount, pool, unlockedLiquidity } =\n params;\n\n return await this._program.methods\n .permanentLockPosition(unlockedLiquidity)\n .accountsPartial({\n position,\n positionNftAccount,\n pool: pool,\n owner: owner,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to refresh vesting status of a position.\n * @param {RefreshVestingParams} params - Refresh vesting parameters.\n * @returns Transaction builder.\n */\n async refreshVesting(params: RefreshVestingParams): TxBuilder {\n const instruction = await this.buildRefreshVestingInstruction(params);\n\n return new Transaction().add(instruction);\n }\n\n /**\n * Builds a transaction to close a position.\n * @param params ClosePositionParams\n * @returns Transaction builder.\n */\n async closePosition(params: ClosePositionParams): TxBuilder {\n const { owner, pool, position, positionNftMint, positionNftAccount } =\n params;\n\n const instruction = await this.buildClosePositionInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftMint,\n positionNftAccount,\n });\n\n return new Transaction().add(instruction);\n }\n\n /**\n * Builds a transaction to remove all liquidity from a position and close it.\n * This combines several operations in a single transaction:\n * 1. Claims any accumulated fees\n * 2. Removes all liquidity\n * 3. Closes the position\n *\n * @param {RemoveAllLiquidityAndClosePositionParams} params - Combined parameters\n * @returns {TxBuilder} Transaction builder with all required instructions\n * @throws {Error} If the position is locked or cannot be closed\n */\n async removeAllLiquidityAndClosePosition(\n params: RemoveAllLiquidityAndClosePositionParams\n ): TxBuilder {\n const {\n owner,\n position,\n positionNftAccount,\n positionState,\n poolState,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n vestings,\n currentPoint,\n } = params;\n\n const { pool } = positionState;\n const { tokenAMint, tokenBMint } = poolState;\n\n const { canUnlock, reason } = this.canUnlockPosition(\n positionState,\n vestings,\n currentPoint\n );\n\n if (!canUnlock) {\n throw new Error(`Cannot remove liquidity: ${reason}`);\n }\n\n const tokenAProgram = getTokenProgram(poolState.tokenAFlag);\n const tokenBProgram = getTokenProgram(poolState.tokenBFlag);\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n // 1. refresh vesting if vesting account provided\n if (vestings.length > 0) {\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position,\n positionNftAccount,\n pool,\n vestingAccounts: vestings.map((item) => item.account),\n });\n\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n const transaction = new Transaction();\n\n if (preInstructions.length > 0) {\n transaction.add(...preInstructions);\n }\n\n // 2. claim fee, remove liquidity and close position\n const liquidatePositionInstructions =\n await this.buildLiquidatePositionInstruction({\n owner,\n position,\n positionNftAccount,\n positionState,\n poolState,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold,\n tokenBAmountThreshold,\n });\n\n transaction.add(...liquidatePositionInstructions);\n\n if (postInstructions.length > 0) {\n transaction.add(...postInstructions);\n }\n\n return transaction;\n }\n\n /**\n * Builds a transaction to merge liquidity from one position into another.\n * This process:\n * 1. Claims fees from the source position\n * 2. Removes all liquidity from the source position\n * 3. Adds that liquidity to the target position\n * 4. Closes the source position\n *\n * @param {MergePositionParams} params - Parameters for merging positions\n * @returns {TxBuilder} Transaction builder with all required instructions\n * @throws {Error} If either position is locked or incompatible\n */\n async mergePosition(params: MergePositionParams): TxBuilder {\n const {\n owner,\n positionA,\n positionB,\n positionBState,\n poolState,\n positionBNftAccount,\n positionANftAccount,\n tokenAAmountAddLiquidityThreshold,\n tokenBAmountAddLiquidityThreshold,\n tokenAAmountRemoveLiquidityThreshold,\n tokenBAmountRemoveLiquidityThreshold,\n positionBVestings,\n currentPoint,\n } = params;\n\n const { canUnlock, reason } = this.canUnlockPosition(\n positionBState,\n positionBVestings,\n currentPoint\n );\n\n if (!canUnlock) {\n throw new Error(`Cannot remove liquidity: ${reason}`);\n }\n\n const pool = positionBState.pool;\n const { tokenAMint, tokenBMint, tokenAVault, tokenBVault } = poolState;\n\n const tokenAProgram = getTokenProgram(poolState.tokenAFlag);\n const tokenBProgram = getTokenProgram(poolState.tokenBFlag);\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstructions,\n } = await this.prepareTokenAccounts({\n payer: owner,\n tokenAOwner: owner,\n tokenBOwner: owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n let positionBLiquidityDelta = positionBState.unlockedLiquidity;\n // 1. refresh vesting position B if vesting account provided\n if (positionBVestings.length > 0) {\n // accumulate all liquidity delta of position b (unlocked + available vesting)\n const totalAvailableVestingLiquidity = positionBVestings.reduce(\n (total, position) => {\n const available = getAvailableVestingLiquidity(\n position.vestingState,\n currentPoint\n );\n return total.add(available);\n },\n new BN(0)\n );\n\n positionBLiquidityDelta = positionBLiquidityDelta.add(\n totalAvailableVestingLiquidity\n );\n\n const refreshVestingInstruction =\n await this.buildRefreshVestingInstruction({\n owner,\n position: positionB,\n positionNftAccount: positionBNftAccount,\n pool,\n vestingAccounts: positionBVestings.map((item) => item.account),\n });\n refreshVestingInstruction &&\n preInstructions.push(refreshVestingInstruction);\n }\n\n // recalculate liquidity delta\n const tokenAWithdrawAmount = getAmountAFromLiquidityDelta(\n poolState.sqrtPrice,\n poolState.sqrtMaxPrice,\n positionBLiquidityDelta,\n Rounding.Down\n );\n\n const tokenBWithdrawAmount = getAmountBFromLiquidityDelta(\n poolState.sqrtMinPrice,\n poolState.sqrtPrice,\n positionBLiquidityDelta,\n Rounding.Down\n );\n\n const newLiquidityDelta = this.getLiquidityDelta({\n maxAmountTokenA: tokenAWithdrawAmount,\n maxAmountTokenB: tokenBWithdrawAmount,\n sqrtMaxPrice: poolState.sqrtMaxPrice,\n sqrtMinPrice: poolState.sqrtMinPrice,\n sqrtPrice: poolState.sqrtPrice,\n });\n\n const transaction = new Transaction();\n\n if (preInstructions.length > 0) {\n transaction.add(...preInstructions);\n }\n\n // 2. claim fee, remove liquidity and close position\n const liquidatePositionInstructions =\n await this.buildLiquidatePositionInstruction({\n owner,\n position: positionB,\n positionNftAccount: positionBNftAccount,\n positionState: positionBState,\n poolState,\n tokenAAccount,\n tokenBAccount,\n tokenAAmountThreshold: tokenAAmountRemoveLiquidityThreshold,\n tokenBAmountThreshold: tokenBAmountRemoveLiquidityThreshold,\n });\n\n transaction.add(...liquidatePositionInstructions);\n\n // 3. add liquidity from position B to positon A\n const addLiquidityInstruction = await this.buildAddLiquidityInstruction({\n pool,\n position: positionA,\n positionNftAccount: positionANftAccount,\n owner,\n tokenAAccount,\n tokenBAccount,\n tokenAMint,\n tokenBMint,\n tokenAVault,\n tokenBVault,\n tokenAProgram,\n tokenBProgram,\n liquidityDelta: newLiquidityDelta,\n tokenAAmountThreshold: tokenAAmountAddLiquidityThreshold,\n tokenBAmountThreshold: tokenBAmountAddLiquidityThreshold,\n });\n\n transaction.add(addLiquidityInstruction);\n\n if (\n [tokenAMint.toBase58(), tokenBMint.toBase58()].includes(\n NATIVE_MINT.toBase58()\n )\n ) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner);\n closeWrappedSOLIx && transaction.add(closeWrappedSOLIx);\n }\n\n return transaction;\n }\n\n /**\n * Builds a transaction to initialize a reward for a pool.\n * @param params InitializeRewardParams\n * @returns Transaction builder.\n */\n async initializeReward(params: InitializeRewardParams): TxBuilder {\n const {\n rewardIndex,\n rewardDuration,\n funder,\n pool,\n creator,\n payer,\n rewardMint,\n rewardMintProgram,\n } = params;\n\n const rewardVault = deriveRewardVaultAddress(pool, rewardIndex);\n\n return await this._program.methods\n .initializeReward(rewardIndex, rewardDuration, funder)\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n rewardVault,\n rewardMint,\n signer: creator,\n payer,\n tokenProgram: rewardMintProgram,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to initialize and fund a reward for a pool.\n * @param params InitializeAndFundReward\n * @returns Transaction builder.\n */\n async initializeAndFundReward(params: InitializeAndFundReward): TxBuilder {\n const {\n rewardIndex,\n rewardDuration,\n pool,\n creator,\n payer,\n rewardMint,\n carryForward,\n amount,\n rewardMintProgram,\n } = params;\n\n const rewardVault = deriveRewardVaultAddress(pool, rewardIndex);\n\n const initializeRewardTx = await this.initializeReward({\n rewardIndex,\n rewardDuration,\n funder: payer,\n pool,\n creator,\n payer,\n rewardMint,\n rewardMintProgram,\n });\n\n // fund reward\n const fundRewardTx = await this.fundReward({\n rewardIndex,\n carryForward,\n pool,\n funder: payer,\n amount,\n rewardMint,\n rewardVault,\n rewardMintProgram,\n });\n\n return new Transaction().add(initializeRewardTx).add(fundRewardTx);\n }\n /**\n * Builds a transaction to update reward duration.\n * @param {UpdateRewardDurationParams} params - Parameters including pool and new duration.\n * @returns Transaction builder.\n */\n async updateRewardDuration(params: UpdateRewardDurationParams): TxBuilder {\n const { pool, signer, rewardIndex, newDuration } = params;\n return await this._program.methods\n .updateRewardDuration(rewardIndex, newDuration)\n .accountsPartial({\n pool,\n signer,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to update reward funder address.\n * @param {UpdateRewardFunderParams} params - Parameters including pool and new funder address.\n * @returns Transaction builder.\n */\n async updateRewardFunder(params: UpdateRewardFunderParams): TxBuilder {\n const { pool, signer, rewardIndex, newFunder } = params;\n return await this._program.methods\n .updateRewardFunder(rewardIndex, newFunder)\n .accountsPartial({\n pool,\n signer,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to fund rewards in a pool.\n * @param {FundRewardParams} params - Funding parameters.\n * @returns Transaction builder.\n */\n async fundReward(params: FundRewardParams): TxBuilder {\n const { rewardIndex, carryForward, pool, funder, amount } = params;\n\n const poolState = await this.fetchPoolState(pool);\n const rewardInfo = poolState.rewardInfos[rewardIndex];\n const { vault, mint } = rewardInfo;\n const tokenProgram = getTokenProgram(rewardIndex);\n\n const preInstructions: TransactionInstruction[] = [];\n\n const { ataPubkey: funderTokenAccount, ix: createFunderTokenAccountIx } =\n await getOrCreateATAInstruction(\n this._program.provider.connection,\n mint,\n funder,\n funder,\n true,\n tokenProgram\n );\n\n createFunderTokenAccountIx &&\n preInstructions.push(createFunderTokenAccountIx);\n\n // TODO: check case reward mint is wSOL && carryForward is true => total amount > amount\n if (mint.equals(NATIVE_MINT) && !amount.isZero()) {\n const wrapSOLIx = wrapSOLInstruction(\n funder,\n funderTokenAccount,\n BigInt(amount.toString())\n );\n\n preInstructions.push(...wrapSOLIx);\n }\n\n return await this._program.methods\n .fundReward(rewardIndex, amount, carryForward)\n .accountsPartial({\n pool,\n rewardVault: vault,\n rewardMint: mint,\n funderTokenAccount,\n funder: funder,\n tokenProgram,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to withdraw ineligible rewards from a pool.\n * @param {WithdrawIneligibleRewardParams} params - Parameters for withdrawal.\n * @returns Transaction builder.\n */\n async withdrawIneligibleReward(\n params: WithdrawIneligibleRewardParams\n ): TxBuilder {\n const { rewardIndex, pool, funder } = params;\n const poolState = await this.fetchPoolState(pool);\n\n const rewardInfo = poolState.rewardInfos[rewardIndex];\n const { mint, vault, rewardTokenFlag } = rewardInfo;\n const tokenProgram = getTokenProgram(rewardTokenFlag);\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: TransactionInstruction[] = [];\n const { ataPubkey: funderTokenAccount, ix: createFunderTokenAccountIx } =\n await getOrCreateATAInstruction(\n this._program.provider.connection,\n mint,\n funder,\n funder,\n true,\n tokenProgram\n );\n createFunderTokenAccountIx &&\n preInstructions.push(createFunderTokenAccountIx);\n\n if (mint.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(funder);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n\n return await this._program.methods\n .withdrawIneligibleReward(rewardIndex)\n .accountsPartial({\n pool,\n rewardVault: vault,\n rewardMint: mint,\n poolAuthority: this.poolAuthority,\n funderTokenAccount,\n funder: funder,\n tokenProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to claim partner fee rewards.\n * @param {ClaimPartnerFeeParams} params - Claim parameters including amounts and partner address.\n * @returns Transaction builder.\n */\n async claimPartnerFee(params: ClaimPartnerFeeParams): TxBuilder {\n const {\n feePayer,\n receiver,\n tempWSolAccount,\n partner,\n pool,\n maxAmountA,\n maxAmountB,\n } = params;\n const poolState = await this.fetchPoolState(pool);\n const {\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAFlag,\n tokenBFlag,\n } = poolState;\n\n const tokenAProgram = getTokenProgram(tokenAFlag);\n const tokenBProgram = getTokenProgram(tokenBFlag);\n\n const payer = feePayer ?? partner;\n const { tokenAAccount, tokenBAccount, preInstructions, postInstructions } =\n await this.setupFeeClaimAccounts({\n payer,\n owner: partner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n receiver,\n tempWSolAccount,\n });\n\n return await this._program.methods\n .claimPartnerFee(maxAmountA, maxAmountB)\n .accountsPartial({\n poolAuthority: this.poolAuthority,\n pool,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n partner,\n tokenAProgram,\n tokenBProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to claim position fee rewards.\n * @param {ClaimPositionFeeParams} params - Parameters for claiming position fee.\n * @returns Transaction builder.\n */\n async claimPositionFee(params: ClaimPositionFeeParams): TxBuilder {\n const {\n receiver,\n tempWSolAccount,\n feePayer,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const payer = feePayer ?? owner;\n const { tokenAAccount, tokenBAccount, preInstructions, postInstructions } =\n await this.setupFeeClaimAccounts({\n payer,\n owner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n receiver,\n tempWSolAccount,\n });\n const claimPositionFeeInstruction =\n await this.buildClaimPositionFeeInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstructions.length > 0 ? preInstructions : []),\n claimPositionFeeInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to claim position fee rewards.\n * @param {ClaimPositionFeeParams2} params - Parameters for claiming position fee.\n * @returns Transaction builder.\n */\n async claimPositionFee2(params: ClaimPositionFeeParams2): TxBuilder {\n const {\n receiver,\n feePayer,\n owner,\n pool,\n position,\n positionNftAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n } = params;\n\n const payer = feePayer ?? owner;\n\n let tokenAOwner = receiver;\n let tokenBOwner = receiver;\n\n if (tokenAMint.equals(NATIVE_MINT)) {\n tokenAOwner = owner;\n }\n\n if (tokenBMint.equals(NATIVE_MINT)) {\n tokenBOwner = owner;\n }\n\n const {\n tokenAAta: tokenAAccount,\n tokenBAta: tokenBAccount,\n instructions: preInstruction,\n } = await this.prepareTokenAccounts({\n payer,\n tokenAOwner,\n tokenBOwner,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const postInstructions: TransactionInstruction[] = [];\n if (tokenAMint.equals(NATIVE_MINT) || tokenBMint.equals(NATIVE_MINT)) {\n // unwarp sol to receiver\n const closeWrappedSOLIx = await unwrapSOLInstruction(owner, receiver);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n const claimPositionFeeInstruction =\n await this.buildClaimPositionFeeInstruction({\n owner,\n poolAuthority: this.poolAuthority,\n pool,\n position,\n positionNftAccount,\n tokenAAccount,\n tokenBAccount,\n tokenAVault,\n tokenBVault,\n tokenAMint,\n tokenBMint,\n tokenAProgram,\n tokenBProgram,\n });\n\n const transaction = new Transaction();\n transaction.add(\n ...(preInstruction.length > 0 ? preInstruction : []),\n claimPositionFeeInstruction,\n ...(postInstructions.length > 0 ? postInstructions : [])\n );\n\n return transaction;\n }\n\n /**\n * Builds a transaction to claim reward from a position.\n * @param {ClaimRewardParams} params - Parameters for claiming reward.\n * @returns Transaction builder.\n */\n async claimReward(params: ClaimRewardParams): TxBuilder {\n const {\n feePayer,\n user,\n position,\n positionNftAccount,\n rewardIndex,\n poolState,\n positionState,\n isSkipReward,\n } = params;\n\n const rewardInfo = poolState.rewardInfos[rewardIndex];\n const tokenProgram = getTokenProgram(rewardInfo.rewardTokenFlag);\n\n const preInstructions: TransactionInstruction[] = [];\n const postInstructions: TransactionInstruction[] = [];\n const { ataPubkey: userTokenAccount, ix: createUserTokenAccountIx } =\n await getOrCreateATAInstruction(\n this._program.provider.connection,\n rewardInfo.mint,\n user,\n feePayer ?? user,\n true,\n tokenProgram\n );\n createUserTokenAccountIx && preInstructions.push(createUserTokenAccountIx);\n\n if (rewardInfo.mint.equals(NATIVE_MINT)) {\n const closeWrappedSOLIx = await unwrapSOLInstruction(user);\n closeWrappedSOLIx && postInstructions.push(closeWrappedSOLIx);\n }\n const skipReward = isSkipReward ? 1 : 0;\n return await this._program.methods\n .claimReward(rewardIndex, skipReward)\n .accountsPartial({\n pool: positionState.pool,\n positionNftAccount,\n rewardVault: rewardInfo.vault,\n rewardMint: rewardInfo.mint,\n poolAuthority: this.poolAuthority,\n position,\n userTokenAccount,\n owner: user,\n tokenProgram,\n })\n .preInstructions(preInstructions)\n .postInstructions(postInstructions)\n .transaction();\n }\n\n /**\n * Builds a transaction to split a position into two positions.\n * @param params SplitPositionParams\n * @returns Transaction builder.\n */\n async splitPosition(params: SplitPositionParams): TxBuilder {\n const {\n firstPositionOwner,\n secondPositionOwner,\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n permanentLockedLiquidityPercentage,\n unlockedLiquidityPercentage,\n feeAPercentage,\n feeBPercentage,\n reward0Percentage,\n reward1Percentage,\n } = params;\n\n return await this._program.methods\n .splitPosition({\n permanentLockedLiquidityPercentage,\n unlockedLiquidityPercentage,\n feeAPercentage,\n feeBPercentage,\n reward0Percentage,\n reward1Percentage,\n padding: new Array(16).fill(0),\n })\n .accountsPartial({\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n firstOwner: firstPositionOwner,\n secondOwner: secondPositionOwner,\n })\n .transaction();\n }\n\n /**\n * Builds a transaction to split a position into two positions.\n * @param params SplitPosition2Params\n * @returns Transaction builder.\n */\n async splitPosition2(params: SplitPosition2Params): TxBuilder {\n const {\n firstPositionOwner,\n secondPositionOwner,\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n numerator,\n } = params;\n\n return await this._program.methods\n .splitPosition2(numerator)\n .accountsPartial({\n pool,\n firstPosition,\n firstPositionNftAccount,\n secondPosition,\n secondPositionNftAccount,\n firstOwner: firstPositionOwner,\n secondOwner: secondPositionOwner,\n })\n .transaction();\n }\n}\n","{\n \"address\": \"cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG\",\n \"metadata\": {\n \"name\": \"cp_amm\",\n \"version\": \"0.1.5\",\n \"spec\": \"0.1.0\",\n \"description\": \"Created with Anchor\"\n },\n \"instructions\": [\n {\n \"name\": \"add_liquidity\",\n \"discriminator\": [\n 181,\n 157,\n 89,\n 67,\n 143,\n 182,\n 52,\n 72\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"AddLiquidityParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"claim_partner_fee\",\n \"discriminator\": [\n 97,\n 206,\n 39,\n 105,\n 94,\n 94,\n 126,\n 148\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The treasury token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The treasury token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"partner\",\n \"signer\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"max_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"max_amount_b\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claim_position_fee\",\n \"discriminator\": [\n 180,\n 38,\n 154,\n 17,\n 133,\n 33,\n 162,\n 211\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"claim_protocol_fee\",\n \"discriminator\": [\n 165,\n 228,\n 133,\n 48,\n 99,\n 249,\n 255,\n 33\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The treasury token a account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 48,\n 9,\n 89,\n 123,\n 106,\n 114,\n 131,\n 251,\n 50,\n 173,\n 254,\n 250,\n 10,\n 80,\n 160,\n 84,\n 143,\n 100,\n 81,\n 249,\n 134,\n 112,\n 30,\n 213,\n 50,\n 166,\n 239,\n 78,\n 53,\n 175,\n 188,\n 85\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The treasury token b account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 48,\n 9,\n 89,\n 123,\n 106,\n 114,\n 131,\n 251,\n 50,\n 173,\n 254,\n 250,\n 10,\n 80,\n 160,\n 84,\n 143,\n 100,\n 81,\n 249,\n 134,\n 112,\n 30,\n 213,\n 50,\n 166,\n 239,\n 78,\n 53,\n 175,\n 188,\n 85\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_program\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n }\n ],\n \"program\": {\n \"kind\": \"const\",\n \"value\": [\n 140,\n 151,\n 37,\n 143,\n 78,\n 36,\n 137,\n 241,\n 187,\n 61,\n 16,\n 41,\n 20,\n 142,\n 13,\n 131,\n 11,\n 90,\n 19,\n 153,\n 218,\n 255,\n 16,\n 132,\n 4,\n 142,\n 123,\n 216,\n 219,\n 233,\n 248,\n 89\n ]\n }\n }\n },\n {\n \"name\": \"claim_fee_operator\",\n \"docs\": [\n \"Claim fee operator\"\n ]\n },\n {\n \"name\": \"operator\",\n \"docs\": [\n \"Operator\"\n ],\n \"signer\": true,\n \"relations\": [\n \"claim_fee_operator\"\n ]\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"max_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"max_amount_b\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"claim_reward\",\n \"discriminator\": [\n 149,\n 95,\n 181,\n 242,\n 94,\n 90,\n 158,\n 162\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"docs\": [\n \"The vault token account for reward token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"user_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"skip_reward\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"close_claim_fee_operator\",\n \"discriminator\": [\n 38,\n 134,\n 82,\n 216,\n 95,\n 124,\n 17,\n 99\n ],\n \"accounts\": [\n {\n \"name\": \"claim_fee_operator\",\n \"writable\": true\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"close_config\",\n \"discriminator\": [\n 145,\n 9,\n 72,\n 157,\n 95,\n 125,\n 61,\n 85\n ],\n \"accounts\": [\n {\n \"name\": \"config\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"close_position\",\n \"discriminator\": [\n 123,\n 134,\n 81,\n 0,\n 49,\n 68,\n 98,\n 98\n ],\n \"accounts\": [\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"Owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"close_token_badge\",\n \"discriminator\": [\n 108,\n 146,\n 86,\n 110,\n 179,\n 254,\n 10,\n 104\n ],\n \"accounts\": [\n {\n \"name\": \"token_badge\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"rent_receiver\",\n \"writable\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_claim_fee_operator\",\n \"discriminator\": [\n 169,\n 62,\n 207,\n 107,\n 58,\n 187,\n 162,\n 109\n ],\n \"accounts\": [\n {\n \"name\": \"claim_fee_operator\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 102,\n 95,\n 111,\n 112,\n 101,\n 114,\n 97,\n 116,\n 111,\n 114\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"operator\"\n }\n ]\n }\n },\n {\n \"name\": \"operator\"\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_config\",\n \"docs\": [\n \"ADMIN FUNCTIONS /////\"\n ],\n \"discriminator\": [\n 201,\n 207,\n 243,\n 114,\n 75,\n 111,\n 47,\n 189\n ],\n \"accounts\": [\n {\n \"name\": \"config\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 111,\n 110,\n 102,\n 105,\n 103\n ]\n },\n {\n \"kind\": \"arg\",\n \"path\": \"index\"\n }\n ]\n }\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"config_parameters\",\n \"type\": {\n \"defined\": {\n \"name\": \"StaticConfigParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_dynamic_config\",\n \"discriminator\": [\n 81,\n 251,\n 122,\n 78,\n 66,\n 57,\n 208,\n 82\n ],\n \"accounts\": [\n {\n \"name\": \"config\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 99,\n 111,\n 110,\n 102,\n 105,\n 103\n ]\n },\n {\n \"kind\": \"arg\",\n \"path\": \"index\"\n }\n ]\n }\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"config_parameters\",\n \"type\": {\n \"defined\": {\n \"name\": \"DynamicConfigParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"create_position\",\n \"discriminator\": [\n 48,\n 215,\n 197,\n 153,\n 96,\n 203,\n 180,\n 133\n ],\n \"accounts\": [\n {\n \"name\": \"owner\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the position. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"create_token_badge\",\n \"discriminator\": [\n 88,\n 206,\n 0,\n 91,\n 60,\n 175,\n 151,\n 118\n ],\n \"accounts\": [\n {\n \"name\": \"token_badge\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 98,\n 97,\n 100,\n 103,\n 101\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_mint\"\n },\n {\n \"name\": \"admin\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"fund_reward\",\n \"discriminator\": [\n 188,\n 50,\n 249,\n 165,\n 93,\n 151,\n 38,\n 63\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"writable\": true\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"funder_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"funder\",\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"carry_forward\",\n \"type\": \"bool\"\n }\n ]\n },\n {\n \"name\": \"initialize_customizable_pool\",\n \"discriminator\": [\n 20,\n 161,\n 241,\n 24,\n 189,\n 221,\n 180,\n 2\n ],\n \"accounts\": [\n {\n \"name\": \"creator\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the pool. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Initialize an account to store the pool state\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"Token a mint\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"Token b mint\"\n ]\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"Token a vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"Token b vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"payer_token_a\",\n \"docs\": [\n \"payer token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"payer_token_b\",\n \"docs\": [\n \"creator token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_2022_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"InitializeCustomizablePoolParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initialize_pool\",\n \"docs\": [\n \"USER FUNCTIONS ////\"\n ],\n \"discriminator\": [\n 95,\n 180,\n 10,\n 172,\n 84,\n 174,\n 232,\n 40\n ],\n \"accounts\": [\n {\n \"name\": \"creator\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the pool. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"config\",\n \"docs\": [\n \"Which config the pool belongs to.\"\n ]\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Initialize an account to store the pool state\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"Token a mint\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"Token b mint\"\n ]\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"Token a vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"Token b vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"payer_token_a\",\n \"docs\": [\n \"payer token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"payer_token_b\",\n \"docs\": [\n \"creator token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_2022_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"InitializePoolParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initialize_pool_with_dynamic_config\",\n \"discriminator\": [\n 149,\n 82,\n 72,\n 197,\n 253,\n 252,\n 68,\n 15\n ],\n \"accounts\": [\n {\n \"name\": \"creator\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"docs\": [\n \"position_nft_mint\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"position nft account\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110,\n 95,\n 110,\n 102,\n 116,\n 95,\n 97,\n 99,\n 99,\n 111,\n 117,\n 110,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"Address paying to create the pool. Can be anyone\"\n ],\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"pool_creator_authority\",\n \"signer\": true,\n \"relations\": [\n \"config\"\n ]\n },\n {\n \"name\": \"config\",\n \"docs\": [\n \"Which config the pool belongs to.\"\n ]\n },\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Initialize an account to store the pool state\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"position\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 112,\n 111,\n 115,\n 105,\n 116,\n 105,\n 111,\n 110\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"position_nft_mint\"\n }\n ]\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"Token a mint\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"Token b mint\"\n ]\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"Token a vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_a_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"Token b vault for the pool\"\n ],\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 116,\n 111,\n 107,\n 101,\n 110,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"token_b_mint\"\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n }\n ]\n }\n },\n {\n \"name\": \"payer_token_a\",\n \"docs\": [\n \"payer token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"payer_token_b\",\n \"docs\": [\n \"creator token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Program to create mint account and mint tokens\"\n ]\n },\n {\n \"name\": \"token_2022_program\",\n \"docs\": [\n \"Program to create NFT mint/token account and transfer for token22 account\"\n ],\n \"address\": \"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"InitializeCustomizablePoolParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"initialize_reward\",\n \"discriminator\": [\n 95,\n 135,\n 192,\n 196,\n 242,\n 129,\n 230,\n 68\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"writable\": true,\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 114,\n 101,\n 119,\n 97,\n 114,\n 100,\n 95,\n 118,\n 97,\n 117,\n 108,\n 116\n ]\n },\n {\n \"kind\": \"account\",\n \"path\": \"pool\"\n },\n {\n \"kind\": \"arg\",\n \"path\": \"reward_index\"\n }\n ]\n }\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_duration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"pubkey\"\n }\n ]\n },\n {\n \"name\": \"lock_position\",\n \"discriminator\": [\n 227,\n 62,\n 2,\n 252,\n 247,\n 10,\n 171,\n 185\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"vesting\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"payer\",\n \"writable\": true,\n \"signer\": true\n },\n {\n \"name\": \"system_program\",\n \"address\": \"11111111111111111111111111111111\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"VestingParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"permanent_lock_position\",\n \"discriminator\": [\n 165,\n 176,\n 125,\n 6,\n 231,\n 171,\n 186,\n 213\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"permanent_lock_liquidity\",\n \"type\": \"u128\"\n }\n ]\n },\n {\n \"name\": \"refresh_vesting\",\n \"discriminator\": [\n 9,\n 94,\n 216,\n 14,\n 116,\n 204,\n 247,\n 0\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\"\n }\n ],\n \"args\": []\n },\n {\n \"name\": \"remove_all_liquidity\",\n \"discriminator\": [\n 10,\n 51,\n 61,\n 35,\n 112,\n 105,\n 24,\n 85\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"token_a_amount_threshold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"remove_liquidity\",\n \"discriminator\": [\n 80,\n 85,\n 209,\n 72,\n 24,\n 206,\n 177,\n 108\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"position\"\n ]\n },\n {\n \"name\": \"position\",\n \"writable\": true\n },\n {\n \"name\": \"token_a_account\",\n \"docs\": [\n \"The user token a account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_b_account\",\n \"docs\": [\n \"The user token b account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ],\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"position_nft_account\",\n \"docs\": [\n \"The token account for nft\"\n ]\n },\n {\n \"name\": \"owner\",\n \"docs\": [\n \"owner of position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"RemoveLiquidityParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"set_pool_status\",\n \"discriminator\": [\n 112,\n 87,\n 135,\n 223,\n 83,\n 204,\n 132,\n 53\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"admin\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n },\n {\n \"name\": \"split_position\",\n \"discriminator\": [\n 172,\n 241,\n 221,\n 138,\n 161,\n 29,\n 253,\n 42\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"first_position\",\n \"second_position\"\n ]\n },\n {\n \"name\": \"first_position\",\n \"docs\": [\n \"The first position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"first_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"second_position\",\n \"docs\": [\n \"The second position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"second_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"first_owner\",\n \"docs\": [\n \"Owner of first position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"second_owner\",\n \"docs\": [\n \"Owner of second position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"split_position2\",\n \"discriminator\": [\n 221,\n 147,\n 228,\n 207,\n 140,\n 212,\n 17,\n 119\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true,\n \"relations\": [\n \"first_position\",\n \"second_position\"\n ]\n },\n {\n \"name\": \"first_position\",\n \"docs\": [\n \"The first position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"first_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"second_position\",\n \"docs\": [\n \"The second position\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"second_position_nft_account\",\n \"docs\": [\n \"The token account for position nft\"\n ]\n },\n {\n \"name\": \"first_owner\",\n \"docs\": [\n \"Owner of first position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"second_owner\",\n \"docs\": [\n \"Owner of second position\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"numerator\",\n \"type\": \"u32\"\n }\n ]\n },\n {\n \"name\": \"swap\",\n \"discriminator\": [\n 248,\n 198,\n 158,\n 145,\n 225,\n 117,\n 135,\n 200\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Pool account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"input_token_account\",\n \"docs\": [\n \"The user token account for input token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"output_token_account\",\n \"docs\": [\n \"The user token account for output token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ]\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"The user performing the swap\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"referral_token_account\",\n \"docs\": [\n \"referral token account\"\n ],\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"swap2\",\n \"discriminator\": [\n 65,\n 75,\n 63,\n 76,\n 235,\n 91,\n 91,\n 136\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"docs\": [\n \"Pool account\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"input_token_account\",\n \"docs\": [\n \"The user token account for input token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"output_token_account\",\n \"docs\": [\n \"The user token account for output token\"\n ],\n \"writable\": true\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"The vault token account for input token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"The vault token account for output token\"\n ],\n \"writable\": true,\n \"relations\": [\n \"pool\"\n ]\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"The mint of token a\"\n ]\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"The mint of token b\"\n ]\n },\n {\n \"name\": \"payer\",\n \"docs\": [\n \"The user performing the swap\"\n ],\n \"signer\": true\n },\n {\n \"name\": \"token_a_program\",\n \"docs\": [\n \"Token a program\"\n ]\n },\n {\n \"name\": \"token_b_program\",\n \"docs\": [\n \"Token b program\"\n ]\n },\n {\n \"name\": \"referral_token_account\",\n \"docs\": [\n \"referral token account\"\n ],\n \"writable\": true,\n \"optional\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters2\"\n }\n }\n }\n ]\n },\n {\n \"name\": \"update_reward_duration\",\n \"discriminator\": [\n 138,\n 174,\n 196,\n 169,\n 213,\n 235,\n 254,\n 107\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"new_duration\",\n \"type\": \"u64\"\n }\n ]\n },\n {\n \"name\": \"update_reward_funder\",\n \"discriminator\": [\n 211,\n 28,\n 48,\n 32,\n 215,\n 160,\n 35,\n 23\n ],\n \"accounts\": [\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"signer\",\n \"signer\": true\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"new_funder\",\n \"type\": \"pubkey\"\n }\n ]\n },\n {\n \"name\": \"withdraw_ineligible_reward\",\n \"discriminator\": [\n 148,\n 206,\n 42,\n 195,\n 247,\n 49,\n 103,\n 8\n ],\n \"accounts\": [\n {\n \"name\": \"pool_authority\",\n \"address\": \"HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC\"\n },\n {\n \"name\": \"pool\",\n \"writable\": true\n },\n {\n \"name\": \"reward_vault\",\n \"writable\": true\n },\n {\n \"name\": \"reward_mint\"\n },\n {\n \"name\": \"funder_token_account\",\n \"writable\": true\n },\n {\n \"name\": \"funder\",\n \"signer\": true\n },\n {\n \"name\": \"token_program\"\n },\n {\n \"name\": \"event_authority\",\n \"pda\": {\n \"seeds\": [\n {\n \"kind\": \"const\",\n \"value\": [\n 95,\n 95,\n 101,\n 118,\n 101,\n 110,\n 116,\n 95,\n 97,\n 117,\n 116,\n 104,\n 111,\n 114,\n 105,\n 116,\n 121\n ]\n }\n ]\n }\n },\n {\n \"name\": \"program\"\n }\n ],\n \"args\": [\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n }\n ]\n }\n ],\n \"accounts\": [\n {\n \"name\": \"ClaimFeeOperator\",\n \"discriminator\": [\n 166,\n 48,\n 134,\n 86,\n 34,\n 200,\n 188,\n 150\n ]\n },\n {\n \"name\": \"Config\",\n \"discriminator\": [\n 155,\n 12,\n 170,\n 224,\n 30,\n 250,\n 204,\n 130\n ]\n },\n {\n \"name\": \"Pool\",\n \"discriminator\": [\n 241,\n 154,\n 109,\n 4,\n 17,\n 177,\n 109,\n 188\n ]\n },\n {\n \"name\": \"Position\",\n \"discriminator\": [\n 170,\n 188,\n 143,\n 228,\n 122,\n 64,\n 247,\n 208\n ]\n },\n {\n \"name\": \"TokenBadge\",\n \"discriminator\": [\n 116,\n 219,\n 204,\n 229,\n 249,\n 116,\n 255,\n 150\n ]\n },\n {\n \"name\": \"Vesting\",\n \"discriminator\": [\n 100,\n 149,\n 66,\n 138,\n 95,\n 200,\n 128,\n 241\n ]\n }\n ],\n \"events\": [\n {\n \"name\": \"EvtAddLiquidity\",\n \"discriminator\": [\n 175,\n 242,\n 8,\n 157,\n 30,\n 247,\n 185,\n 169\n ]\n },\n {\n \"name\": \"EvtClaimPartnerFee\",\n \"discriminator\": [\n 118,\n 99,\n 77,\n 10,\n 226,\n 1,\n 1,\n 87\n ]\n },\n {\n \"name\": \"EvtClaimPositionFee\",\n \"discriminator\": [\n 198,\n 182,\n 183,\n 52,\n 97,\n 12,\n 49,\n 56\n ]\n },\n {\n \"name\": \"EvtClaimProtocolFee\",\n \"discriminator\": [\n 186,\n 244,\n 75,\n 251,\n 188,\n 13,\n 25,\n 33\n ]\n },\n {\n \"name\": \"EvtClaimReward\",\n \"discriminator\": [\n 218,\n 86,\n 147,\n 200,\n 235,\n 188,\n 215,\n 231\n ]\n },\n {\n \"name\": \"EvtCloseClaimFeeOperator\",\n \"discriminator\": [\n 111,\n 39,\n 37,\n 55,\n 110,\n 216,\n 194,\n 23\n ]\n },\n {\n \"name\": \"EvtCloseConfig\",\n \"discriminator\": [\n 36,\n 30,\n 239,\n 45,\n 58,\n 132,\n 14,\n 5\n ]\n },\n {\n \"name\": \"EvtClosePosition\",\n \"discriminator\": [\n 20,\n 145,\n 144,\n 68,\n 143,\n 142,\n 214,\n 178\n ]\n },\n {\n \"name\": \"EvtCreateClaimFeeOperator\",\n \"discriminator\": [\n 21,\n 6,\n 153,\n 120,\n 68,\n 116,\n 28,\n 177\n ]\n },\n {\n \"name\": \"EvtCreateConfig\",\n \"discriminator\": [\n 131,\n 207,\n 180,\n 174,\n 180,\n 73,\n 165,\n 54\n ]\n },\n {\n \"name\": \"EvtCreateDynamicConfig\",\n \"discriminator\": [\n 231,\n 197,\n 13,\n 164,\n 248,\n 213,\n 133,\n 152\n ]\n },\n {\n \"name\": \"EvtCreatePosition\",\n \"discriminator\": [\n 156,\n 15,\n 119,\n 198,\n 29,\n 181,\n 221,\n 55\n ]\n },\n {\n \"name\": \"EvtCreateTokenBadge\",\n \"discriminator\": [\n 141,\n 120,\n 134,\n 116,\n 34,\n 28,\n 114,\n 160\n ]\n },\n {\n \"name\": \"EvtFundReward\",\n \"discriminator\": [\n 104,\n 233,\n 237,\n 122,\n 199,\n 191,\n 121,\n 85\n ]\n },\n {\n \"name\": \"EvtInitializePool\",\n \"discriminator\": [\n 228,\n 50,\n 246,\n 85,\n 203,\n 66,\n 134,\n 37\n ]\n },\n {\n \"name\": \"EvtInitializeReward\",\n \"discriminator\": [\n 129,\n 91,\n 188,\n 3,\n 246,\n 52,\n 185,\n 249\n ]\n },\n {\n \"name\": \"EvtLiquidityChange\",\n \"discriminator\": [\n 197,\n 171,\n 78,\n 127,\n 224,\n 211,\n 87,\n 13\n ]\n },\n {\n \"name\": \"EvtLockPosition\",\n \"discriminator\": [\n 168,\n 63,\n 108,\n 83,\n 219,\n 82,\n 2,\n 200\n ]\n },\n {\n \"name\": \"EvtPermanentLockPosition\",\n \"discriminator\": [\n 145,\n 143,\n 162,\n 218,\n 218,\n 80,\n 67,\n 11\n ]\n },\n {\n \"name\": \"EvtRemoveLiquidity\",\n \"discriminator\": [\n 87,\n 46,\n 88,\n 98,\n 175,\n 96,\n 34,\n 91\n ]\n },\n {\n \"name\": \"EvtSetPoolStatus\",\n \"discriminator\": [\n 100,\n 213,\n 74,\n 3,\n 95,\n 91,\n 228,\n 146\n ]\n },\n {\n \"name\": \"EvtSplitPosition2\",\n \"discriminator\": [\n 165,\n 32,\n 203,\n 174,\n 72,\n 100,\n 233,\n 103\n ]\n },\n {\n \"name\": \"EvtSwap\",\n \"discriminator\": [\n 27,\n 60,\n 21,\n 213,\n 138,\n 170,\n 187,\n 147\n ]\n },\n {\n \"name\": \"EvtSwap2\",\n \"discriminator\": [\n 189,\n 66,\n 51,\n 168,\n 38,\n 80,\n 117,\n 153\n ]\n },\n {\n \"name\": \"EvtUpdateRewardDuration\",\n \"discriminator\": [\n 149,\n 135,\n 65,\n 231,\n 129,\n 153,\n 65,\n 57\n ]\n },\n {\n \"name\": \"EvtUpdateRewardFunder\",\n \"discriminator\": [\n 76,\n 154,\n 208,\n 13,\n 40,\n 115,\n 246,\n 146\n ]\n },\n {\n \"name\": \"EvtWithdrawIneligibleReward\",\n \"discriminator\": [\n 248,\n 215,\n 184,\n 78,\n 31,\n 180,\n 179,\n 168\n ]\n }\n ],\n \"errors\": [\n {\n \"code\": 6000,\n \"name\": \"MathOverflow\",\n \"msg\": \"Math operation overflow\"\n },\n {\n \"code\": 6001,\n \"name\": \"InvalidFee\",\n \"msg\": \"Invalid fee setup\"\n },\n {\n \"code\": 6002,\n \"name\": \"ExceededSlippage\",\n \"msg\": \"Exceeded slippage tolerance\"\n },\n {\n \"code\": 6003,\n \"name\": \"PoolDisabled\",\n \"msg\": \"Pool disabled\"\n },\n {\n \"code\": 6004,\n \"name\": \"ExceedMaxFeeBps\",\n \"msg\": \"Exceeded max fee bps\"\n },\n {\n \"code\": 6005,\n \"name\": \"InvalidAdmin\",\n \"msg\": \"Invalid admin\"\n },\n {\n \"code\": 6006,\n \"name\": \"AmountIsZero\",\n \"msg\": \"Amount is zero\"\n },\n {\n \"code\": 6007,\n \"name\": \"TypeCastFailed\",\n \"msg\": \"Type cast error\"\n },\n {\n \"code\": 6008,\n \"name\": \"UnableToModifyActivationPoint\",\n \"msg\": \"Unable to modify activation point\"\n },\n {\n \"code\": 6009,\n \"name\": \"InvalidAuthorityToCreateThePool\",\n \"msg\": \"Invalid authority to create the pool\"\n },\n {\n \"code\": 6010,\n \"name\": \"InvalidActivationType\",\n \"msg\": \"Invalid activation type\"\n },\n {\n \"code\": 6011,\n \"name\": \"InvalidActivationPoint\",\n \"msg\": \"Invalid activation point\"\n },\n {\n \"code\": 6012,\n \"name\": \"InvalidQuoteMint\",\n \"msg\": \"Quote token must be SOL,USDC\"\n },\n {\n \"code\": 6013,\n \"name\": \"InvalidFeeCurve\",\n \"msg\": \"Invalid fee curve\"\n },\n {\n \"code\": 6014,\n \"name\": \"InvalidPriceRange\",\n \"msg\": \"Invalid Price Range\"\n },\n {\n \"code\": 6015,\n \"name\": \"PriceRangeViolation\",\n \"msg\": \"Trade is over price range\"\n },\n {\n \"code\": 6016,\n \"name\": \"InvalidParameters\",\n \"msg\": \"Invalid parameters\"\n },\n {\n \"code\": 6017,\n \"name\": \"InvalidCollectFeeMode\",\n \"msg\": \"Invalid collect fee mode\"\n },\n {\n \"code\": 6018,\n \"name\": \"InvalidInput\",\n \"msg\": \"Invalid input\"\n },\n {\n \"code\": 6019,\n \"name\": \"CannotCreateTokenBadgeOnSupportedMint\",\n \"msg\": \"Cannot create token badge on supported mint\"\n },\n {\n \"code\": 6020,\n \"name\": \"InvalidTokenBadge\",\n \"msg\": \"Invalid token badge\"\n },\n {\n \"code\": 6021,\n \"name\": \"InvalidMinimumLiquidity\",\n \"msg\": \"Invalid minimum liquidity\"\n },\n {\n \"code\": 6022,\n \"name\": \"InvalidVestingInfo\",\n \"msg\": \"Invalid vesting information\"\n },\n {\n \"code\": 6023,\n \"name\": \"InsufficientLiquidity\",\n \"msg\": \"Insufficient liquidity\"\n },\n {\n \"code\": 6024,\n \"name\": \"InvalidVestingAccount\",\n \"msg\": \"Invalid vesting account\"\n },\n {\n \"code\": 6025,\n \"name\": \"InvalidPoolStatus\",\n \"msg\": \"Invalid pool status\"\n },\n {\n \"code\": 6026,\n \"name\": \"UnsupportNativeMintToken2022\",\n \"msg\": \"Unsupported native mint token2022\"\n },\n {\n \"code\": 6027,\n \"name\": \"InvalidRewardIndex\",\n \"msg\": \"Invalid reward index\"\n },\n {\n \"code\": 6028,\n \"name\": \"InvalidRewardDuration\",\n \"msg\": \"Invalid reward duration\"\n },\n {\n \"code\": 6029,\n \"name\": \"RewardInitialized\",\n \"msg\": \"Reward already initialized\"\n },\n {\n \"code\": 6030,\n \"name\": \"RewardUninitialized\",\n \"msg\": \"Reward not initialized\"\n },\n {\n \"code\": 6031,\n \"name\": \"InvalidRewardVault\",\n \"msg\": \"Invalid reward vault\"\n },\n {\n \"code\": 6032,\n \"name\": \"MustWithdrawnIneligibleReward\",\n \"msg\": \"Must withdraw ineligible reward\"\n },\n {\n \"code\": 6033,\n \"name\": \"IdenticalRewardDuration\",\n \"msg\": \"Reward duration is the same\"\n },\n {\n \"code\": 6034,\n \"name\": \"RewardCampaignInProgress\",\n \"msg\": \"Reward campaign in progress\"\n },\n {\n \"code\": 6035,\n \"name\": \"IdenticalFunder\",\n \"msg\": \"Identical funder\"\n },\n {\n \"code\": 6036,\n \"name\": \"InvalidFunder\",\n \"msg\": \"Invalid funder\"\n },\n {\n \"code\": 6037,\n \"name\": \"RewardNotEnded\",\n \"msg\": \"Reward not ended\"\n },\n {\n \"code\": 6038,\n \"name\": \"FeeInverseIsIncorrect\",\n \"msg\": \"Fee inverse is incorrect\"\n },\n {\n \"code\": 6039,\n \"name\": \"PositionIsNotEmpty\",\n \"msg\": \"Position is not empty\"\n },\n {\n \"code\": 6040,\n \"name\": \"InvalidPoolCreatorAuthority\",\n \"msg\": \"Invalid pool creator authority\"\n },\n {\n \"code\": 6041,\n \"name\": \"InvalidConfigType\",\n \"msg\": \"Invalid config type\"\n },\n {\n \"code\": 6042,\n \"name\": \"InvalidPoolCreator\",\n \"msg\": \"Invalid pool creator\"\n },\n {\n \"code\": 6043,\n \"name\": \"RewardVaultFrozenSkipRequired\",\n \"msg\": \"Reward vault is frozen, must skip reward to proceed\"\n },\n {\n \"code\": 6044,\n \"name\": \"InvalidSplitPositionParameters\",\n \"msg\": \"Invalid parameters for split position\"\n },\n {\n \"code\": 6045,\n \"name\": \"UnsupportPositionHasVestingLock\",\n \"msg\": \"Unsupported split position has vesting lock\"\n },\n {\n \"code\": 6046,\n \"name\": \"SamePosition\",\n \"msg\": \"Same position\"\n },\n {\n \"code\": 6047,\n \"name\": \"InvalidBaseFeeMode\",\n \"msg\": \"Invalid base fee mode\"\n },\n {\n \"code\": 6048,\n \"name\": \"InvalidFeeRateLimiter\",\n \"msg\": \"Invalid fee rate limiter\"\n },\n {\n \"code\": 6049,\n \"name\": \"FailToValidateSingleSwapInstruction\",\n \"msg\": \"Fail to validate single swap instruction in rate limiter\"\n },\n {\n \"code\": 6050,\n \"name\": \"InvalidFeeScheduler\",\n \"msg\": \"Invalid fee scheduler\"\n },\n {\n \"code\": 6051,\n \"name\": \"UndeterminedError\",\n \"msg\": \"Undetermined error\"\n },\n {\n \"code\": 6052,\n \"name\": \"InvalidPoolVersion\",\n \"msg\": \"Invalid pool version\"\n }\n ],\n \"types\": [\n {\n \"name\": \"AddLiquidityParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity_delta\",\n \"docs\": [\n \"delta liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"token_a_amount_threshold\",\n \"docs\": [\n \"maximum token a amount\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"docs\": [\n \"maximum token b amount\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_fee_numerator\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"base_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"first_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"second_factor\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"third_factor\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_fee_numerator\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"first_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"second_factor\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"third_factor\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"base_fee_mode\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"BaseFeeStruct\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_fee_numerator\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"base_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding_0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"first_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"second_factor\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"third_factor\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding_1\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"ClaimFeeOperator\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"operator\",\n \"docs\": [\n \"operator\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"_padding\",\n \"docs\": [\n \"Reserve\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 128\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"Config\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"vault_config_key\",\n \"docs\": [\n \"Vault config key\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"docs\": [\n \"Only pool_creator_authority can use the current config to initialize new pool. When it's Pubkey::default, it's a public config.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_fees\",\n \"docs\": [\n \"Pool fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeesConfig\"\n }\n }\n },\n {\n \"name\": \"activation_type\",\n \"docs\": [\n \"Activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"docs\": [\n \"Collect fee mode\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"config_type\",\n \"docs\": [\n \"Config type mode, 0 for static, 1 for dynamic\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding_0\",\n \"docs\": [\n \"padding 0\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"index\",\n \"docs\": [\n \"config index\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"sqrt_min_price\",\n \"docs\": [\n \"sqrt min price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"docs\": [\n \"sqrt max price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"_padding_1\",\n \"docs\": [\n \"Fee curve point\",\n \"Padding for further use\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 10\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"DynamicConfigParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"initialized\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"max_volatility_accumulator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"variable_fee_control\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"bin_step\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"filter_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"decay_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reduction_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding_1\",\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"bin_step_u128\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"bin_step\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"bin_step_u128\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"filter_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"decay_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reduction_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"max_volatility_accumulator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"variable_fee_control\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"DynamicFeeStruct\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"initialized\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 7\n ]\n }\n },\n {\n \"name\": \"max_volatility_accumulator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"variable_fee_control\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"bin_step\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"filter_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"decay_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"reduction_factor\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"last_update_timestamp\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"bin_step_u128\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price_reference\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"volatility_accumulator\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"volatility_reference\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtAddLiquidity\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"AddLiquidityParameters\"\n }\n }\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_b\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimPartnerFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimPositionFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"fee_a_claimed\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b_claimed\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimProtocolFee\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClaimReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"mint_reward\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"total_reward\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCloseClaimFeeOperator\",\n \"docs\": [\n \"Close claim fee operator\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"claim_fee_operator\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"operator\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCloseConfig\",\n \"docs\": [\n \"Close config\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"docs\": [\n \"Config pubkey\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"admin\",\n \"docs\": [\n \"admin pk\"\n ],\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtClosePosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateClaimFeeOperator\",\n \"docs\": [\n \"Create claim fee operator\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"operator\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateConfig\",\n \"docs\": [\n \"Create static config\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"vault_config_key\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"activation_type\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"sqrt_min_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"config\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateDynamicConfig\",\n \"docs\": [\n \"Create dynamic config\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"config\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"index\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreatePosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position_nft_mint\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtCreateTokenBadge\",\n \"docs\": [\n \"Create token badge\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token_mint\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtFundReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"mint_reward\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"transfer_fee_excluded_amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_duration_end\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"pre_reward_rate\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"post_reward_rate\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtInitializePool\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_b_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"creator\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"payer\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"alpha_vault\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"sqrt_min_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_type\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_point\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_a_flag\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_b_flag\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_amount_b\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"pool_type\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtInitializeReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"funder\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"creator\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_duration\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtLiquidityChange\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"transfer_fee_included_token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"transfer_fee_included_token_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_b_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"liquidity_delta\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"token_a_amount_threshold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"change_type\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtLockPosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"vesting\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cliff_point\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"period_frequency\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"cliff_unlock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquidity_per_period\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"number_of_period\",\n \"type\": \"u16\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtPermanentLockPosition\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"lock_liquidity_amount\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_permanent_locked_liquidity\",\n \"type\": \"u128\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtRemoveLiquidity\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"RemoveLiquidityParameters\"\n }\n }\n },\n {\n \"name\": \"token_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtSetPoolStatus\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"status\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtSplitPosition2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"first_owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"second_owner\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"first_position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"second_position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"current_sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"amount_splits\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitAmountInfo\"\n }\n }\n },\n {\n \"name\": \"first_position_info\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionInfo\"\n }\n }\n },\n {\n \"name\": \"second_position_info\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionInfo\"\n }\n }\n },\n {\n \"name\": \"split_position_parameters\",\n \"type\": {\n \"defined\": {\n \"name\": \"SplitPositionParameters2\"\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"EvtSwap\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"trade_direction\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"has_referral\",\n \"type\": \"bool\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters\"\n }\n }\n },\n {\n \"name\": \"swap_result\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapResult\"\n }\n }\n },\n {\n \"name\": \"actual_amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"current_timestamp\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtSwap2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"trade_direction\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"has_referral\",\n \"type\": \"bool\"\n },\n {\n \"name\": \"params\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapParameters2\"\n }\n }\n },\n {\n \"name\": \"swap_result\",\n \"type\": {\n \"defined\": {\n \"name\": \"SwapResult2\"\n }\n }\n },\n {\n \"name\": \"included_transfer_fee_amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"included_transfer_fee_amount_out\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"excluded_transfer_fee_amount_out\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"current_timestamp\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_a_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reserve_b_amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtUpdateRewardDuration\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"old_reward_duration\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"new_reward_duration\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtUpdateRewardFunder\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_index\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"old_funder\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"new_funder\",\n \"type\": \"pubkey\"\n }\n ]\n }\n },\n {\n \"name\": \"EvtWithdrawIneligibleReward\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_mint\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"amount\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"InitializeCustomizablePoolParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"docs\": [\n \"pool fees\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"sqrt_min_price\",\n \"docs\": [\n \"sqrt min price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"docs\": [\n \"sqrt max price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"has_alpha_vault\",\n \"docs\": [\n \"has alpha vault\"\n ],\n \"type\": \"bool\"\n },\n {\n \"name\": \"liquidity\",\n \"docs\": [\n \"initialize liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"docs\": [\n \"The init price of the pool as a sqrt(token_b/token_a) Q64.64 value\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_type\",\n \"docs\": [\n \"activation type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"docs\": [\n \"collect fee mode\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"activation_point\",\n \"docs\": [\n \"activation point\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"InitializePoolParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity\",\n \"docs\": [\n \"initialize liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"docs\": [\n \"The init price of the pool as a sqrt(token_b/token_a) Q64.64 value\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_point\",\n \"docs\": [\n \"activation point\"\n ],\n \"type\": {\n \"option\": \"u64\"\n }\n }\n ]\n }\n },\n {\n \"name\": \"Pool\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"docs\": [\n \"Pool fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeesStruct\"\n }\n }\n },\n {\n \"name\": \"token_a_mint\",\n \"docs\": [\n \"token a mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_b_mint\",\n \"docs\": [\n \"token b mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_a_vault\",\n \"docs\": [\n \"token a vault\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"token_b_vault\",\n \"docs\": [\n \"token b vault\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"whitelisted_vault\",\n \"docs\": [\n \"Whitelisted vault to be able to buy pool before activation_point\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"partner\",\n \"docs\": [\n \"partner\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"liquidity\",\n \"docs\": [\n \"liquidity share\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"_padding\",\n \"docs\": [\n \"padding, previous reserve amount, be careful to use that field\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"protocol_a_fee\",\n \"docs\": [\n \"protocol a fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocol_b_fee\",\n \"docs\": [\n \"protocol b fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_a_fee\",\n \"docs\": [\n \"partner a fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_b_fee\",\n \"docs\": [\n \"partner b fee\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"sqrt_min_price\",\n \"docs\": [\n \"min price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"docs\": [\n \"max price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_price\",\n \"docs\": [\n \"current price\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"activation_point\",\n \"docs\": [\n \"Activation point, can be slot or timestamp\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"activation_type\",\n \"docs\": [\n \"Activation type, 0 means by slot, 1 means by timestamp\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"pool_status\",\n \"docs\": [\n \"pool status, 0: enable, 1 disable\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_a_flag\",\n \"docs\": [\n \"token a flag\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"token_b_flag\",\n \"docs\": [\n \"token b flag\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"docs\": [\n \"0 is collect fee in both token, 1 only collect fee in token a, 2 only collect fee in token b\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"pool_type\",\n \"docs\": [\n \"pool type\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"version\",\n \"docs\": [\n \"pool version, 0: max_fee is still capped at 50%, 1: max_fee is capped at 99%\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding_0\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"fee_a_per_liquidity\",\n \"docs\": [\n \"cumulative\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"fee_b_per_liquidity\",\n \"docs\": [\n \"cumulative\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"permanent_lock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"metrics\",\n \"docs\": [\n \"metrics\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PoolMetrics\"\n }\n }\n },\n {\n \"name\": \"creator\",\n \"docs\": [\n \"pool creator\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"_padding_1\",\n \"docs\": [\n \"Padding for further use\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 6\n ]\n }\n },\n {\n \"name\": \"reward_infos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"RewardInfo\"\n }\n },\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolFeeParameters\",\n \"docs\": [\n \"Information regarding fee charges\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"base_fee\",\n \"docs\": [\n \"Base fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"BaseFeeParameters\"\n }\n }\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 3\n ]\n }\n },\n {\n \"name\": \"dynamic_fee\",\n \"docs\": [\n \"dynamic fee\"\n ],\n \"type\": {\n \"option\": {\n \"defined\": {\n \"name\": \"DynamicFeeParameters\"\n }\n }\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolFeesConfig\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"base_fee\",\n \"type\": {\n \"defined\": {\n \"name\": \"BaseFeeConfig\"\n }\n }\n },\n {\n \"name\": \"dynamic_fee\",\n \"type\": {\n \"defined\": {\n \"name\": \"DynamicFeeConfig\"\n }\n }\n },\n {\n \"name\": \"protocol_fee_percent\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"partner_fee_percent\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"referral_fee_percent\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding_0\",\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"padding_1\",\n \"type\": {\n \"array\": [\n \"u64\",\n 5\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolFeesStruct\",\n \"docs\": [\n \"Information regarding fee charges\",\n \"trading_fee = amount * trade_fee_numerator / denominator\",\n \"protocol_fee = trading_fee * protocol_fee_percentage / 100\",\n \"referral_fee = protocol_fee * referral_percentage / 100\",\n \"partner_fee = (protocol_fee - referral_fee) * partner_fee_percentage / denominator\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"base_fee\",\n \"docs\": [\n \"Trade fees are extra token amounts that are held inside the token\",\n \"accounts during a trade, making the value of liquidity tokens rise.\",\n \"Trade fee numerator\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"BaseFeeStruct\"\n }\n }\n },\n {\n \"name\": \"protocol_fee_percent\",\n \"docs\": [\n \"Protocol trading fees are extra token amounts that are held inside the token\",\n \"accounts during a trade, with the equivalent in pool tokens minted to\",\n \"the protocol of the program.\",\n \"Protocol trade fee numerator\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"partner_fee_percent\",\n \"docs\": [\n \"partner fee\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"referral_fee_percent\",\n \"docs\": [\n \"referral fee\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding_0\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 5\n ]\n }\n },\n {\n \"name\": \"dynamic_fee\",\n \"docs\": [\n \"dynamic fee\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"DynamicFeeStruct\"\n }\n }\n },\n {\n \"name\": \"padding_1\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u64\",\n 2\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PoolMetrics\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"total_lp_a_fee\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_lp_b_fee\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_protocol_a_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_protocol_b_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_partner_a_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_partner_b_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_position\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"padding\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Position\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"nft_mint\",\n \"docs\": [\n \"nft mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"fee_a_per_token_checkpoint\",\n \"docs\": [\n \"fee a checkpoint\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"fee_b_per_token_checkpoint\",\n \"docs\": [\n \"fee b checkpoint\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"fee_a_pending\",\n \"docs\": [\n \"fee a pending\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b_pending\",\n \"docs\": [\n \"fee b pending\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"unlocked_liquidity\",\n \"docs\": [\n \"unlock liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"vested_liquidity\",\n \"docs\": [\n \"vesting liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"permanent_locked_liquidity\",\n \"docs\": [\n \"permanent locked liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"metrics\",\n \"docs\": [\n \"metrics\"\n ],\n \"type\": {\n \"defined\": {\n \"name\": \"PositionMetrics\"\n }\n }\n },\n {\n \"name\": \"reward_infos\",\n \"docs\": [\n \"Farming reward information\"\n ],\n \"type\": {\n \"array\": [\n {\n \"defined\": {\n \"name\": \"UserRewardInfo\"\n }\n },\n 2\n ]\n }\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"padding for future usage\"\n ],\n \"type\": {\n \"array\": [\n \"u128\",\n 6\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"PositionMetrics\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"total_claimed_a_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_claimed_b_fee\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"RemoveLiquidityParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity_delta\",\n \"docs\": [\n \"delta liquidity\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"token_a_amount_threshold\",\n \"docs\": [\n \"minimum token a amount\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"token_b_amount_threshold\",\n \"docs\": [\n \"minimum token b amount\"\n ],\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 \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"initialized\",\n \"docs\": [\n \"Indicates if the reward has been initialized\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_token_flag\",\n \"docs\": [\n \"reward token flag\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"_padding_0\",\n \"docs\": [\n \"padding\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 6\n ]\n }\n },\n {\n \"name\": \"_padding_1\",\n \"docs\": [\n \"Padding to ensure `reward_rate: u128` is 16-byte aligned\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 8\n ]\n }\n },\n {\n \"name\": \"mint\",\n \"docs\": [\n \"Reward token mint.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"vault\",\n \"docs\": [\n \"Reward vault token account.\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"funder\",\n \"docs\": [\n \"Authority account that allows to fund rewards\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"reward_duration\",\n \"docs\": [\n \"reward duration\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_duration_end\",\n \"docs\": [\n \"reward duration end\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_rate\",\n \"docs\": [\n \"reward rate\"\n ],\n \"type\": \"u128\"\n },\n {\n \"name\": \"reward_per_token_stored\",\n \"docs\": [\n \"Reward per token stored\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"last_update_time\",\n \"docs\": [\n \"The last time reward states were updated.\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"cumulative_seconds_with_empty_liquidity_reward\",\n \"docs\": [\n \"Accumulated seconds when the farm distributed rewards but the bin was empty.\",\n \"These rewards will be carried over to the next reward time window.\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SplitAmountInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"permanent_locked_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"unlocked_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"fee_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_0\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_1\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SplitPositionInfo\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"fee_a\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"fee_b\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_0\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"reward_1\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SplitPositionParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"unlocked_liquidity_percentage\",\n \"docs\": [\n \"Percentage of unlocked liquidity to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"permanent_locked_liquidity_percentage\",\n \"docs\": [\n \"Percentage of permanent locked liquidity to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"fee_a_percentage\",\n \"docs\": [\n \"Percentage of fee A pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"fee_b_percentage\",\n \"docs\": [\n \"Percentage of fee B pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_0_percentage\",\n \"docs\": [\n \"Percentage of reward 0 pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"reward_1_percentage\",\n \"docs\": [\n \"Percentage of reward 1 pending to split to the second position\"\n ],\n \"type\": \"u8\"\n },\n {\n \"name\": \"padding\",\n \"docs\": [\n \"padding for future\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 16\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"SplitPositionParameters2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"unlocked_liquidity_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"permanent_locked_liquidity_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"fee_a_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"fee_b_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"reward_0_numerator\",\n \"type\": \"u32\"\n },\n {\n \"name\": \"reward_1_numerator\",\n \"type\": \"u32\"\n }\n ]\n }\n },\n {\n \"name\": \"StaticConfigParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"pool_fees\",\n \"type\": {\n \"defined\": {\n \"name\": \"PoolFeeParameters\"\n }\n }\n },\n {\n \"name\": \"sqrt_min_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"sqrt_max_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"vault_config_key\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"pool_creator_authority\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"activation_type\",\n \"type\": \"u8\"\n },\n {\n \"name\": \"collect_fee_mode\",\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount_in\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"minimum_amount_out\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapParameters2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"amount_0\",\n \"docs\": [\n \"When it's exact in, partial fill, this will be amount_in. When it's exact out, this will be amount_out\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount_1\",\n \"docs\": [\n \"When it's exact in, partial fill, this will be minimum_amount_out. When it's exact out, this will be maximum_amount_in\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"swap_mode\",\n \"docs\": [\n \"Swap mode, refer [SwapMode]\"\n ],\n \"type\": \"u8\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapResult\",\n \"docs\": [\n \"Encodes all results of swapping\"\n ],\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"output_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"next_sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"lp_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocol_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"referral_fee\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"SwapResult2\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"included_fee_input_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"excluded_fee_input_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"amount_left\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"output_amount\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"next_sqrt_price\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"trading_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"protocol_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"partner_fee\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"referral_fee\",\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"TokenBadge\",\n \"docs\": [\n \"Parameter that set by the protocol\"\n ],\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"token_mint\",\n \"docs\": [\n \"token mint\"\n ],\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"_padding\",\n \"docs\": [\n \"Reserve\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 128\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"UserRewardInfo\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"reward_per_token_checkpoint\",\n \"docs\": [\n \"The latest update reward checkpoint\"\n ],\n \"type\": {\n \"array\": [\n \"u8\",\n 32\n ]\n }\n },\n {\n \"name\": \"reward_pendings\",\n \"docs\": [\n \"Current pending rewards\"\n ],\n \"type\": \"u64\"\n },\n {\n \"name\": \"total_claimed_rewards\",\n \"docs\": [\n \"Total claimed rewards\"\n ],\n \"type\": \"u64\"\n }\n ]\n }\n },\n {\n \"name\": \"Vesting\",\n \"serialization\": \"bytemuck\",\n \"repr\": {\n \"kind\": \"c\"\n },\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"position\",\n \"type\": \"pubkey\"\n },\n {\n \"name\": \"cliff_point\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"period_frequency\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"cliff_unlock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquidity_per_period\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"total_released_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"number_of_period\",\n \"type\": \"u16\"\n },\n {\n \"name\": \"padding\",\n \"type\": {\n \"array\": [\n \"u8\",\n 14\n ]\n }\n },\n {\n \"name\": \"padding2\",\n \"type\": {\n \"array\": [\n \"u128\",\n 4\n ]\n }\n }\n ]\n }\n },\n {\n \"name\": \"VestingParameters\",\n \"type\": {\n \"kind\": \"struct\",\n \"fields\": [\n {\n \"name\": \"cliff_point\",\n \"type\": {\n \"option\": \"u64\"\n }\n },\n {\n \"name\": \"period_frequency\",\n \"type\": \"u64\"\n },\n {\n \"name\": \"cliff_unlock_liquidity\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"liquidity_per_period\",\n \"type\": \"u128\"\n },\n {\n \"name\": \"number_of_period\",\n \"type\": \"u16\"\n }\n ]\n }\n }\n ]\n}","import { IdlAccounts, IdlTypes, Program, BN } from \"@coral-xyz/anchor\";\nimport { PublicKey, Transaction } from \"@solana/web3.js\";\nimport type { CpAmm as CpAmmTypes } from \"./idl/cp_amm\";\nimport { Mint } from \"@solana/spl-token\";\nimport Decimal from \"decimal.js\";\n\nexport type AmmProgram = Program<CpAmmTypes>;\n\nexport type TxBuilder = Promise<Transaction>;\n\nexport enum Rounding {\n Up,\n Down,\n}\n\nexport enum ActivationPoint {\n Timestamp,\n Slot,\n}\n\nexport enum BaseFeeMode {\n FeeSchedulerLinear,\n FeeSchedulerExponential,\n RateLimiter,\n}\n\nexport enum CollectFeeMode {\n BothToken,\n OnlyB,\n}\n\nexport enum TradeDirection {\n AtoB,\n BtoA,\n}\n\nexport enum ActivationType {\n Slot,\n Timestamp,\n}\n\nexport enum PoolVersion {\n V0,\n V1,\n}\n\nexport type FeeMode = {\n feesOnInput: boolean;\n feesOnTokenA: boolean;\n hasReferral: boolean;\n};\n\nexport enum PoolStatus {\n Enable,\n Disable,\n}\n\nexport enum SwapMode {\n ExactIn,\n PartialFill,\n ExactOut,\n}\n\n// Account state types\nexport type PoolState = IdlAccounts<CpAmmTypes>[\"pool\"];\nexport type PositionState = IdlAccounts<CpAmmTypes>[\"position\"];\nexport type VestingState = IdlAccounts<CpAmmTypes>[\"vesting\"];\nexport type ConfigState = IdlAccounts<CpAmmTypes>[\"config\"];\nexport type TokenBadgeState = IdlAccounts<CpAmmTypes>[\"tokenBadge\"];\n\n// Program params types\n// export type LockPositionParams = IdlTypes<CpAmm>[\"VestingParameters\"];\n// export type AddLiquidityParams = IdlTypes<CpAmm>[\"AddLiquidityParameters\"];\n// export type RemoveLiquidityParams =\n// IdlTypes<CpAmm>[\"RemoveLiquidityParameters\"];\n// export type SwapParams = IdlTypes<CpAmm>[\"SwapParameters\"];\n// export type InitPoolParams = IdlTypes<CpAmm>[\"InitializePoolParameters\"];\n// export type InitCustomizePoolParams =\n// IdlTypes<CpAmm>[\"InitializeCustomizablePoolParameters\"];\nexport type RewardInfo = IdlTypes<CpAmmTypes>[\"rewardInfo\"];\nexport type UserRewardInfo = IdlTypes<CpAmmTypes>[\"userRewardInfo\"];\n\n/**\n * Dynamic fee parameters\n * @param binStep\n * @param binStepU128\n * @param filterPeriod\n * @param decayPeriod\n * @param reductionFactor\n * @param maxVolatilityAccumulator\n * @param variableFeeControl\n */\nexport type DynamicFee = IdlTypes<CpAmmTypes>[\"dynamicFeeParameters\"];\n\n/**\n * Dynamic fee struct\n * @param initialized\n * @param padding\n * @param maxVolatilityAccumulator\n * @param variableFeeControl\n * @param binStep\n * @param filterPeriod\n * @param decayPeriod\n * @param reductionFactor\n * @param lastUpdateTimestamp\n * @param binStepU128\n * @param sqrtPriceReference\n * @param volatilityAccumulator\n * @param volatilityReference\n */\nexport type DynamicFeeStruct = IdlTypes<CpAmmTypes>[\"dynamicFeeStruct\"];\n\n/**\n * Base fee parameters\n * @param cliffFeeNumerator\n * @param firstFactor // feeScheduler: numberOfPeriod, rateLimiter: feeIncrementBps\n * @param secondFactor // feeScheduler: periodFrequency, rateLimiter: maxLimiterDuration\n * @param thirdFactor // feeScheduler: reductionFactor, rateLimiter: referenceAmount\n * @param baseFeeMode\n */\nexport type BaseFee = IdlTypes<CpAmmTypes>[\"baseFeeParameters\"];\n\nexport type PoolFeesStruct = IdlTypes<CpAmmTypes>[\"poolFeesStruct\"];\n\nexport type PoolFeesParams = {\n baseFee: BaseFee;\n padding: number[];\n dynamicFee: DynamicFee | null;\n};\n\nexport type PrepareTokenAccountParams = {\n payer: PublicKey;\n tokenAOwner: PublicKey;\n tokenBOwner: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type PrepareCustomizablePoolParams = {\n pool: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAAmount: BN;\n tokenBAmount: BN;\n payer: PublicKey;\n positionNft: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type InitializeCustomizeablePoolParams = {\n payer: PublicKey;\n creator: PublicKey;\n positionNft: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAAmount: BN;\n tokenBAmount: BN;\n sqrtMinPrice: BN;\n sqrtMaxPrice: BN;\n liquidityDelta: BN;\n initSqrtPrice: BN;\n poolFees: PoolFeesParams;\n hasAlphaVault: boolean;\n activationType: number;\n collectFeeMode: number;\n activationPoint: BN | null;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n isLockLiquidity?: boolean;\n};\n\nexport type InitializeCustomizeablePoolWithDynamicConfigParams =\n InitializeCustomizeablePoolParams & {\n config: PublicKey;\n poolCreatorAuthority: PublicKey;\n };\n\nexport type PreparePoolCreationParams = {\n tokenAAmount: BN;\n tokenBAmount: BN;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n tokenAInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenBInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type PreparedPoolCreation = {\n initSqrtPrice: BN;\n liquidityDelta: BN;\n};\n\nexport type PreparePoolCreationSingleSide = {\n tokenAAmount: BN;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n initSqrtPrice: BN;\n tokenAInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type CreatePoolParams = {\n creator: PublicKey;\n payer: PublicKey;\n config: PublicKey;\n positionNft: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n initSqrtPrice: BN;\n liquidityDelta: BN;\n tokenAAmount: BN;\n tokenBAmount: BN;\n activationPoint: BN | null;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n isLockLiquidity?: boolean;\n};\n\nexport type CreatePositionParams = {\n owner: PublicKey;\n payer: PublicKey;\n pool: PublicKey;\n positionNft: PublicKey;\n};\n\nexport type AddLiquidityParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n liquidityDelta: BN;\n maxAmountTokenA: BN;\n maxAmountTokenB: BN;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type CreatePositionAndAddLiquidity = {\n owner: PublicKey;\n pool: PublicKey;\n positionNft: PublicKey;\n liquidityDelta: BN;\n maxAmountTokenA: BN;\n maxAmountTokenB: BN;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type LiquidityDeltaParams = {\n maxAmountTokenA: BN;\n maxAmountTokenB: BN;\n sqrtPrice: BN;\n sqrtMinPrice: BN;\n sqrtMaxPrice: BN;\n tokenAInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenBInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type RemoveLiquidityParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n liquidityDelta: BN;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n vestings: Array<{\n account: PublicKey;\n vestingState: VestingState;\n }>;\n currentPoint: BN;\n};\n\nexport type RemoveAllLiquidityParams = Omit<\n RemoveLiquidityParams,\n \"liquidityDelta\"\n>;\n\nexport type BuildAddLiquidityParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n liquidityDelta: BN;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type BuildLiquidatePositionInstructionParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n positionState: PositionState;\n poolState: PoolState;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n};\n\nexport type BuildRemoveAllLiquidityInstructionParams = {\n poolAuthority: PublicKey;\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type ClosePositionParams = {\n owner: PublicKey;\n pool: PublicKey;\n position: PublicKey;\n positionNftMint: PublicKey;\n positionNftAccount: PublicKey;\n};\n\nexport type RemoveAllLiquidityAndClosePositionParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n poolState: PoolState;\n positionState: PositionState;\n tokenAAmountThreshold: BN;\n tokenBAmountThreshold: BN;\n vestings: Array<{\n account: PublicKey;\n vestingState: VestingState;\n }>;\n currentPoint: BN;\n};\n\nexport type MergePositionParams = {\n owner: PublicKey;\n positionA: PublicKey;\n positionB: PublicKey;\n poolState: PoolState;\n positionBNftAccount: PublicKey;\n positionANftAccount: PublicKey;\n positionBState: PositionState;\n tokenAAmountAddLiquidityThreshold: BN;\n tokenBAmountAddLiquidityThreshold: BN;\n tokenAAmountRemoveLiquidityThreshold: BN;\n tokenBAmountRemoveLiquidityThreshold: BN;\n positionBVestings: Array<{\n account: PublicKey;\n vestingState: VestingState;\n }>;\n currentPoint: BN;\n};\n\nexport type GetQuoteParams = {\n inAmount: BN;\n inputTokenMint: PublicKey;\n slippage: number;\n poolState: PoolState;\n currentTime: number;\n currentSlot: number;\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenADecimal: number;\n tokenBDecimal: number;\n hasReferral?: boolean;\n};\n\nexport type GetQuote2Params = {\n inputTokenMint: PublicKey;\n slippage: number;\n currentPoint: BN;\n poolState: PoolState;\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenADecimal: number;\n tokenBDecimal: number;\n hasReferral: boolean;\n} & (\n | {\n swapMode: SwapMode.ExactIn;\n amountIn: BN;\n }\n | {\n swapMode: SwapMode.PartialFill;\n amountIn: BN;\n }\n | {\n swapMode: SwapMode.ExactOut;\n amountOut: BN;\n }\n);\n\nexport type SwapAmount = {\n outputAmount: BN;\n nextSqrtPrice: BN;\n};\n\nexport type SwapResult = IdlTypes<CpAmmTypes>[\"swapResult\"];\n\nexport type SwapResult2 = IdlTypes<CpAmmTypes>[\"swapResult2\"];\n\nexport interface Quote2Result extends SwapResult2 {\n priceImpact: Decimal;\n minimumAmountOut?: BN;\n maximumAmountIn?: BN;\n}\n\nexport type SwapParams = {\n payer: PublicKey;\n pool: PublicKey;\n inputTokenMint: PublicKey;\n outputTokenMint: PublicKey;\n amountIn: BN;\n minimumAmountOut: BN;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n referralTokenAccount: PublicKey | null;\n poolState?: PoolState;\n};\n\nexport type Swap2Params = {\n payer: PublicKey;\n pool: PublicKey;\n inputTokenMint: PublicKey;\n outputTokenMint: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n referralTokenAccount: PublicKey | null;\n poolState?: PoolState;\n} & (\n | {\n swapMode: SwapMode.ExactIn;\n amountIn: BN;\n minimumAmountOut: BN;\n }\n | {\n swapMode: SwapMode.PartialFill;\n amountIn: BN;\n minimumAmountOut: BN;\n }\n | {\n swapMode: SwapMode.ExactOut;\n amountOut: BN;\n maximumAmountIn: BN;\n }\n);\n\nexport type LockPositionParams = {\n owner: PublicKey;\n payer: PublicKey;\n vestingAccount: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n pool: PublicKey;\n cliffPoint: BN | null;\n periodFrequency: BN;\n cliffUnlockLiquidity: BN;\n liquidityPerPeriod: BN;\n numberOfPeriod: number;\n};\n\nexport type SetupFeeClaimAccountsParams = {\n payer: PublicKey;\n owner: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n receiver?: PublicKey;\n tempWSolAccount?: PublicKey;\n};\n\nexport type ClaimPositionFeeInstructionParams = {\n owner: PublicKey;\n poolAuthority: PublicKey;\n pool: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n tokenAAccount: PublicKey;\n tokenBAccount: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n};\n\nexport type ClaimPositionFeeParams = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n receiver?: PublicKey;\n feePayer?: PublicKey;\n tempWSolAccount?: PublicKey;\n};\n\nexport type ClaimPositionFeeParams2 = {\n owner: PublicKey;\n position: PublicKey;\n pool: PublicKey;\n positionNftAccount: PublicKey;\n tokenAMint: PublicKey;\n tokenBMint: PublicKey;\n tokenAVault: PublicKey;\n tokenBVault: PublicKey;\n tokenAProgram: PublicKey;\n tokenBProgram: PublicKey;\n receiver: PublicKey;\n feePayer?: PublicKey;\n};\n\nexport type ClosePositionInstructionParams = {\n owner: PublicKey;\n poolAuthority: PublicKey;\n pool: PublicKey;\n position: PublicKey;\n positionNftMint: PublicKey;\n positionNftAccount: PublicKey;\n};\n\nexport type InitializeRewardParams = {\n rewardIndex: number; // 0: for creators or admins, 1: for admins only\n rewardDuration: BN;\n pool: PublicKey;\n rewardMint: PublicKey;\n funder: PublicKey;\n payer: PublicKey;\n creator: PublicKey;\n rewardMintProgram: PublicKey;\n};\n\nexport type InitializeAndFundReward = {\n rewardIndex: number; // 0: for creators or admins, 1: for admins only\n rewardDuration: BN;\n pool: PublicKey;\n creator: PublicKey;\n payer: PublicKey;\n rewardMint: PublicKey;\n carryForward: boolean;\n amount: BN;\n rewardMintProgram: PublicKey;\n};\n\nexport type UpdateRewardDurationParams = {\n pool: PublicKey;\n signer: PublicKey;\n rewardIndex: number;\n newDuration: BN;\n};\n\nexport type UpdateRewardFunderParams = {\n pool: PublicKey;\n signer: PublicKey;\n rewardIndex: number;\n newFunder: PublicKey;\n};\n\nexport type FundRewardParams = {\n funder: PublicKey;\n rewardIndex: number;\n pool: PublicKey;\n carryForward: boolean;\n amount: BN;\n rewardMint: PublicKey;\n rewardVault: PublicKey;\n rewardMintProgram: PublicKey;\n};\n\nexport type WithdrawIneligibleRewardParams = {\n rewardIndex: number;\n pool: PublicKey;\n funder: PublicKey;\n};\n\nexport type ClaimPartnerFeeParams = {\n partner: PublicKey;\n pool: PublicKey;\n maxAmountA: BN;\n maxAmountB: BN;\n receiver?: PublicKey;\n feePayer?: PublicKey;\n tempWSolAccount?: PublicKey;\n};\n\nexport type ClaimRewardParams = {\n user: PublicKey;\n position: PublicKey;\n poolState: PoolState;\n positionState: PositionState;\n positionNftAccount: PublicKey;\n rewardIndex: number;\n isSkipReward: boolean;\n feePayer?: PublicKey;\n};\n\nexport type RefreshVestingParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n pool: PublicKey;\n vestingAccounts: PublicKey[];\n};\n\nexport type PermanentLockParams = {\n owner: PublicKey;\n position: PublicKey;\n positionNftAccount: PublicKey;\n pool: PublicKey;\n unlockedLiquidity: BN;\n};\n\nexport type GetDepositQuoteParams = {\n inAmount: BN;\n isTokenA: boolean;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n sqrtPrice: BN;\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type GetWithdrawQuoteParams = {\n liquidityDelta: BN;\n minSqrtPrice: BN;\n maxSqrtPrice: BN;\n sqrtPrice: BN;\n tokenATokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n tokenBTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n };\n};\n\nexport type DepositQuote = {\n actualInputAmount: BN;\n consumedInputAmount: BN;\n outputAmount: BN;\n liquidityDelta: BN;\n};\n\nexport type WithdrawQuote = {\n liquidityDelta: BN;\n outAmountA: BN;\n outAmountB: BN;\n};\n\nexport type DynamicFeeParams = {\n volatilityAccumulator: BN;\n binStep: number;\n variableFeeControl: number;\n};\n\nexport type SplitPositionParams = {\n firstPositionOwner: PublicKey;\n secondPositionOwner: PublicKey;\n pool: PublicKey;\n firstPosition: PublicKey;\n firstPositionNftAccount: PublicKey;\n secondPosition: PublicKey;\n secondPositionNftAccount: PublicKey;\n permanentLockedLiquidityPercentage: number;\n unlockedLiquidityPercentage: number;\n feeAPercentage: number;\n feeBPercentage: number;\n reward0Percentage: number;\n reward1Percentage: number;\n};\n\nexport type SplitPosition2Params = {\n firstPositionOwner: PublicKey;\n secondPositionOwner: PublicKey;\n pool: PublicKey;\n firstPosition: PublicKey;\n firstPositionNftAccount: PublicKey;\n secondPosition: PublicKey;\n secondPositionNftAccount: PublicKey;\n numerator: number;\n};\n\nexport interface BaseFeeHandler {\n validate(\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n ): boolean;\n getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n includedFeeAmount: BN\n ): BN;\n getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n excludedFeeAmount: BN\n ): BN;\n}\n\nexport interface FeeOnAmountResult {\n amount: BN;\n tradingFee: BN;\n protocolFee: BN;\n partnerFee: BN;\n referralFee: BN;\n}\n\nexport interface SplitFees {\n tradingFee: BN;\n protocolFee: BN;\n referralFee: BN;\n partnerFee: BN;\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { BN } from \"@coral-xyz/anchor\";\nimport { CP_AMM_PROGRAM_ID } from \"./constants\";\n\n// Private function: Only use to derive pool account\nexport function getFirstKey(key1: PublicKey, key2: PublicKey) {\n const buf1 = key1.toBuffer();\n const buf2 = key2.toBuffer();\n // Buf1 > buf2\n if (Buffer.compare(buf1, buf2) === 1) {\n return buf1;\n }\n return buf2;\n}\n\nexport function getSecondKey(key1: PublicKey, key2: PublicKey) {\n const buf1 = key1.toBuffer();\n const buf2 = key2.toBuffer();\n // Buf1 > buf2\n if (Buffer.compare(buf1, buf2) === 1) {\n return buf2;\n }\n return buf1;\n}\n\nexport function derivePoolAuthority(): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"pool_authority\")],\n CP_AMM_PROGRAM_ID\n )[0];\n}\nexport function deriveConfigAddress(index: BN): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"config\"), index.toArrayLike(Buffer, \"le\", 8)],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function derivePoolAddress(\n config: PublicKey,\n tokenAMint: PublicKey,\n tokenBMint: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"pool\"),\n config.toBuffer(),\n getFirstKey(tokenAMint, tokenBMint),\n getSecondKey(tokenAMint, tokenBMint),\n ],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function derivePositionAddress(positionNft: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"position\"), positionNft.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveTokenVaultAddress(\n tokenMint: PublicKey,\n pool: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"token_vault\"), tokenMint.toBuffer(), pool.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveRewardVaultAddress(\n pool: PublicKey,\n rewardIndex: number\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"reward_vault\"), pool.toBuffer(), Buffer.from([rewardIndex])],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveCustomizablePoolAddress(\n tokenAMint: PublicKey,\n tokenBMint: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(\"cpool\"),\n getFirstKey(tokenAMint, tokenBMint),\n getSecondKey(tokenAMint, tokenBMint),\n ],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveTokenBadgeAddress(tokenMint: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"token_badge\"), tokenMint.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function deriveClaimFeeOperatorAddress(operator: PublicKey): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"cf_operator\"), operator.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n\nexport function derivePositionNftAccount(\n positionNftMint: PublicKey\n): PublicKey {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(\"position_nft_account\"), positionNftMint.toBuffer()],\n CP_AMM_PROGRAM_ID\n )[0];\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { PoolVersion } from \"./types\";\n\nexport const CP_AMM_PROGRAM_ID = new PublicKey(\n \"cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG\"\n);\n\nexport const LIQUIDITY_SCALE = 128;\nexport const SCALE_OFFSET = 64;\nexport const BASIS_POINT_MAX = 10_000;\nexport const FEE_DENOMINATOR = 1_000_000_000;\n\nexport const ONE_Q64 = new BN(1).shln(SCALE_OFFSET);\nexport const MAX_EXPONENTIAL = new BN(0x80000);\nexport const MAX = new BN(2).pow(new BN(128)).sub(new BN(1));\n\nexport const MIN_FEE_BPS = 1; // 0.01%\nexport const MIN_FEE_NUMERATOR = 100_000; // 0.01%\n\nexport const MAX_FEE_BPS_V0 = 5000; // 50%\nexport const MAX_FEE_NUMERATOR_V0 = 500_000_000; // 50%\n\nexport const MAX_FEE_BPS_V1 = 9900; // 99%\nexport const MAX_FEE_NUMERATOR_V1 = 990_000_000; // 99%\n\nexport const MIN_SQRT_PRICE = new BN(\"4295048016\");\nexport const MAX_SQRT_PRICE = new BN(\"79226673521066979257578248091\");\nexport const MIN_CU_BUFFER = 50_000;\nexport const MAX_CU_BUFFER = 200_000;\n\nexport const DYNAMIC_FEE_SCALING_FACTOR = new BN(100_000_000_000);\nexport const DYNAMIC_FEE_ROUNDING_OFFSET = new BN(99_999_999_999);\nexport const DYNAMIC_FEE_FILTER_PERIOD_DEFAULT = 10;\nexport const DYNAMIC_FEE_DECAY_PERIOD_DEFAULT = 120;\nexport const DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT = 5000; // 50%\nexport const BIN_STEP_BPS_DEFAULT = 1;\n// bin_step << 64 / BASIS_POINT_MAX\nexport const BIN_STEP_BPS_U128_DEFAULT = new BN(\"1844674407370955\");\nexport const MAX_PRICE_CHANGE_BPS_DEFAULT = 1500; // 15%\n\nexport const U128_MAX = new BN(\"340282366920938463463374607431768211455\");\nexport const U64_MAX = new BN(\"18446744073709551615\");\nexport const U16_MAX = 65535;\n\nexport const MAX_RATE_LIMITER_DURATION_IN_SECONDS = 43200; // 12 hours\nexport const MAX_RATE_LIMITER_DURATION_IN_SLOTS = 108000; // 12 hours\n\nexport const SPLIT_POSITION_DENOMINATOR = 1_000_000_000;\n\nexport const CURRENT_POOL_VERSION = PoolVersion.V0;\n","import { bs58 } from \"@coral-xyz/anchor/dist/cjs/utils/bytes\";\nimport {\n AccountLayout,\n createAssociatedTokenAccountIdempotentInstruction,\n createCloseAccountInstruction,\n getAccount,\n getAssociatedTokenAddressSync,\n getMint,\n NATIVE_MINT,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n TokenAccountNotFoundError,\n TokenInvalidAccountOwnerError,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n GetProgramAccountsFilter,\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from \"@solana/web3.js\";\n\n/**\n * Gets the token program\n * @param flag - The flag\n * @returns The token program\n */\nexport function getTokenProgram(flag: number): PublicKey {\n return flag == 0 ? TOKEN_PROGRAM_ID : TOKEN_2022_PROGRAM_ID;\n}\n\n/**\n * Gets the token decimals\n * @param connection - The connection\n * @param mint - The mint\n * @returns The token decimals\n */\nexport const getTokenDecimals = async (\n connection: Connection,\n mint: PublicKey,\n tokenProgram: PublicKey\n): Promise<number> => {\n return (await getMint(connection, mint, \"confirmed\", tokenProgram)).decimals;\n};\n\n/**\n * Gets the or creates the ATA instruction\n * @param connection - The connection\n * @param tokenMint - The token mint\n * @param owner - The owner\n * @param payer - The payer\n * @param allowOwnerOffCurve - The allow owner off curve\n * @param tokenProgram - The token program\n * @returns The ATA instruction\n */\nexport const getOrCreateATAInstruction = async (\n connection: Connection,\n tokenMint: PublicKey,\n owner: PublicKey,\n payer: PublicKey = owner,\n allowOwnerOffCurve = true,\n tokenProgram: PublicKey\n): Promise<{ ataPubkey: PublicKey; ix?: TransactionInstruction }> => {\n const toAccount = getAssociatedTokenAddressSync(\n tokenMint,\n owner,\n allowOwnerOffCurve,\n tokenProgram\n );\n\n try {\n await getAccount(connection, toAccount);\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 tokenProgram\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\n/**\n * Gets the wrap SOL instruction\n * @param from - The from\n * @param to - The to\n * @param amount - The amount\n * @returns The wrap SOL instruction\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\n/**\n * Gets the unwrap SOL instruction\n * @param owner - The owner\n * @param receiver - The receiver\n * @param allowOwnerOffCurve - The allow owner off curve\n * @returns The unwrap SOL instruction\n */\nexport const unwrapSOLInstruction = async (\n owner: PublicKey,\n receiver: PublicKey = owner,\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 receiver,\n owner,\n [],\n TOKEN_PROGRAM_ID\n );\n return closedWrappedSolInstruction;\n }\n return null;\n};\n\n/**\n * Gets all the user position NFT accounts\n * @param connection - The connection\n * @param user - The user\n * @returns The user position NFT accounts\n */\nexport async function getAllUserPositionNftAccount(\n connection: Connection,\n user: PublicKey\n): Promise<\n Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }>\n> {\n const filters: GetProgramAccountsFilter[] = [\n {\n memcmp: {\n offset: 32,\n bytes: user.toBase58(),\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: bs58.encode(Buffer.from([1, 0, 0, 0, 0, 0, 0, 0])), // 1\n },\n },\n ];\n\n const tokenAccountsRaw = await connection.getProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters,\n }\n );\n\n const userPositionNftAccount: Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }> = [];\n for (const { account, pubkey } of tokenAccountsRaw) {\n const tokenAccountData = AccountLayout.decode(account.data);\n userPositionNftAccount.push({\n positionNft: tokenAccountData.mint,\n positionNftAccount: pubkey,\n });\n }\n\n return userPositionNftAccount;\n}\n\n/**\n * Gets all the position NFT accounts by owner\n * @param connection - The connection\n * @param user - The user\n * @returns The position NFT accounts by owner\n */\nexport async function getAllPositionNftAccountByOwner(\n connection: Connection,\n user: PublicKey\n): Promise<\n Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }>\n> {\n const tokenAccounts = await connection.getTokenAccountsByOwner(user, {\n programId: TOKEN_2022_PROGRAM_ID,\n });\n\n const userPositionNftAccount: Array<{\n positionNft: PublicKey;\n positionNftAccount: PublicKey;\n }> = [];\n for (const { account, pubkey } of tokenAccounts.value) {\n const tokenAccountData = AccountLayout.decode(account.data);\n if (tokenAccountData.amount.toString() === \"1\") {\n userPositionNftAccount.push({\n positionNft: tokenAccountData.mint,\n positionNftAccount: pubkey,\n });\n }\n }\n\n return userPositionNftAccount;\n}\n","import {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n Connection,\n PublicKey,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { MAX_CU_BUFFER, MIN_CU_BUFFER } from \"../constants\";\n\n/**\n * Gets the estimated compute unit usage for a transaction.\n * @param connection - The connection to the Solana cluster\n * @param instructions - The instructions to simulate\n * @param payer - The public key of the fee payer\n * @param lookupTables - The lookup tables to simulate\n * @param commitment - The commitment level to simulate\n * @returns The estimated compute unit usage\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\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 if (!estimatedComputeUnitUsage) {\n return 0;\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 { BASIS_POINT_MAX, LIQUIDITY_SCALE } from \"../constants\";\nimport Decimal from \"decimal.js\";\nimport { PoolState, PositionState, RewardInfo, SwapMode } from \"../types\";\n\n/**\n * It takes an amount and a slippage rate, and returns the maximum amount that can be received with\n * that slippage rate\n * @param {BN} amount - The amount of tokens you want to buy.\n * @param {number} rate - The maximum percentage of slippage you're willing to accept. (Max to 2 decimal place)\n * @returns The maximum amount of tokens that can be bought with the given amount of ETH, given the\n * slippage rate.\n */\nexport const getMaxAmountWithSlippage = (amount: BN, rate: number) => {\n const slippage = ((100 + rate) / 100) * BASIS_POINT_MAX;\n return amount.mul(new BN(slippage)).div(new BN(BASIS_POINT_MAX));\n};\n\n/**\n * Calculates minimum amount out or maximum amount in based on slippage and swap mode.\n * For ExactIn/PartialFill: returns minimum amount out.\n * For ExactOut: returns maximum amount in.\n *\n * @param {BN} amount - The base amount (outputAmount for ExactIn/PartialFill, includedFeeInputAmount for ExactOut)\n * @param {number} slippageBps - Slippage in basis points (1% = 100)\n * @param {SwapMode} swapMode - Swap mode (ExactIn, PartialFill, ExactOut)\n * @returns {BN} - Minimum amount out (for ExactIn/PartialFill) or maximum amount in (for ExactOut)\n */\nexport const getAmountWithSlippage = (\n amount: BN,\n slippageBps: number,\n swapMode: SwapMode\n): BN => {\n let result: BN;\n\n if (slippageBps > 0) {\n if (swapMode === SwapMode.ExactOut) {\n // maximum amount in: amount * (10000 + slippageBps) / 10000\n const slippageFactor = new BN(BASIS_POINT_MAX + slippageBps);\n result = amount.mul(slippageFactor).div(new BN(BASIS_POINT_MAX));\n } else {\n // minimum amount out: amount * (10000 - slippageBps) / 10000\n const slippageFactor = new BN(BASIS_POINT_MAX - slippageBps);\n result = amount.mul(slippageFactor).div(new BN(BASIS_POINT_MAX));\n }\n } else {\n result = amount;\n }\n\n return result;\n};\n\n/**\n * Calculate price impact as a percentage\n * Price impact measures how much worse the user's execution was compared to the current market price\n * @param amountIn - Input amount (in base units)\n * @param amountOut - Output amount (in base units)\n * @param currentSqrtPrice - Current pool sqrt price (spot price)\n * @param aToB - Direction of swap: true for token A to token B, false for token B to token A\n * @param tokenADecimal - Decimal places for token A\n * @param tokenBDecimal - Decimal places for token B\n * @returns Price impact as a percentage (e.g., 1.5 means 1.5% worse than spot price)\n */\nexport const getPriceImpact = (\n amountIn: BN,\n amountOut: BN,\n currentSqrtPrice: BN,\n aToB: boolean,\n tokenADecimal: number,\n tokenBDecimal: number\n): Decimal => {\n if (amountIn.eq(new BN(0))) {\n return new Decimal(0);\n }\n if (amountOut.eq(new BN(0))) {\n throw new Error(\"Amount out must be greater than 0\");\n }\n\n // spot price: (sqrtPrice)^2 * 10^(base_decimal - quote_decimal) / 2^128\n const spotPrice = getPriceFromSqrtPrice(\n currentSqrtPrice,\n tokenADecimal,\n tokenBDecimal\n );\n\n // execution price: amountIn / amountOut\n const executionPrice = new Decimal(amountIn.toString())\n .div(new Decimal(amountOut.toString()))\n .mul(\n Decimal.pow(\n 10,\n aToB ? tokenBDecimal - tokenADecimal : tokenADecimal - tokenBDecimal\n )\n );\n\n let priceImpact: Decimal;\n let actualExecutionPrice: Decimal;\n if (aToB) {\n actualExecutionPrice = new Decimal(1).div(executionPrice);\n } else {\n actualExecutionPrice = executionPrice;\n }\n\n // price impact = abs(execution_price - spot_price) / spot_price * 100%\n priceImpact = actualExecutionPrice\n .sub(spotPrice)\n .abs()\n .div(spotPrice)\n .mul(100);\n\n return priceImpact;\n};\n\n/**\n * Calculate price change as a percentage (old implementation)\n * This measures the percentage change in pool price after a swap\n * @param nextSqrtPrice sqrt price after swap\n * @param currentSqrtPrice current pool sqrt price\n * @returns Price change as a percentage (e.g., 1.5 means 1.5% change)\n */\nexport const getPriceChange = (\n nextSqrtPrice: BN,\n currentSqrtPrice: BN\n): number => {\n // price = (sqrtPrice)^2 * 10 ** (base_decimal - quote_decimal) / 2^128\n // k = 10^(base_decimal - quote_decimal) / 2^128\n // priceA = (sqrtPriceA)^2 * k\n // priceB = (sqrtPriceB)^2 * k\n // => price_change = k * abs ( (sqrtPriceA)^2 - (sqrtPriceB)^2 ) * 100 / (sqrtPriceB)^2 * k\n // => price_change = abs ( (sqrtPriceA)^2 - (sqrtPriceB)^2 ) * 100 / (sqrtPriceB)^2\n const diff = nextSqrtPrice\n .pow(new BN(2))\n .sub(currentSqrtPrice.pow(new BN(2)))\n .abs();\n\n return new Decimal(diff.toString())\n .div(new Decimal(currentSqrtPrice.pow(new BN(2)).toString()))\n .mul(100)\n .toNumber();\n};\n\n/**\n * Converts a sqrt price to a price\n * (sqrtPrice)^2 * 10 ** (base_decimal - quote_decimal) / 2^128\n * @param sqrtPrice - The sqrt price\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @returns The price\n */\nexport const getPriceFromSqrtPrice = (\n sqrtPrice: BN,\n tokenADecimal: number,\n tokenBDecimal: number\n): Decimal => {\n const decimalSqrtPrice = new Decimal(sqrtPrice.toString());\n const price = decimalSqrtPrice\n .mul(decimalSqrtPrice)\n .mul(new Decimal(10 ** (tokenADecimal - tokenBDecimal)))\n .div(Decimal.pow(2, 128));\n\n return price;\n};\n\n/**\n * Converts a price to a sqrt price\n * sqrt(price / 10^(tokenADecimal - tokenBDecimal)) * 2^64\n * @param price - The price\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @returns The sqrt price\n */\nexport const getSqrtPriceFromPrice = (\n price: string,\n tokenADecimal: number,\n tokenBDecimal: number\n): BN => {\n const decimalPrice = new Decimal(price);\n\n const adjustedByDecimals = decimalPrice.div(\n new Decimal(10 ** (tokenADecimal - tokenBDecimal))\n );\n\n const sqrtValue = Decimal.sqrt(adjustedByDecimals);\n\n const sqrtValueQ64 = sqrtValue.mul(Decimal.pow(2, 64));\n\n return new BN(sqrtValueQ64.floor().toFixed());\n};\n\n// fee = totalLiquidity * feePerTokenStore\n// precision: (totalLiquidity * feePerTokenStore) >> 128\n/**\n * Gets the unclaimed reward\n * fee = totalLiquidity * feePerTokenStore\n * precision: (totalLiquidity * feePerTokenStore) >> 128\n * @param poolState - The pool state\n * @param positionState - The position state\n * @returns The unclaimed reward\n */\nexport const getUnClaimLpFee = (\n poolState: PoolState,\n positionState: PositionState\n): {\n feeTokenA: BN;\n feeTokenB: BN;\n rewards: BN[];\n} => {\n const totalPositionLiquidity = positionState.unlockedLiquidity\n .add(positionState.vestedLiquidity)\n .add(positionState.permanentLockedLiquidity);\n\n const feeAPerTokenStored = new BN(\n Buffer.from(poolState.feeAPerLiquidity).reverse()\n ).sub(new BN(Buffer.from(positionState.feeAPerTokenCheckpoint).reverse()));\n\n const feeBPerTokenStored = new BN(\n Buffer.from(poolState.feeBPerLiquidity).reverse()\n ).sub(new BN(Buffer.from(positionState.feeBPerTokenCheckpoint).reverse()));\n\n const feeA = totalPositionLiquidity\n .mul(feeAPerTokenStored)\n .shrn(LIQUIDITY_SCALE);\n const feeB = totalPositionLiquidity\n .mul(feeBPerTokenStored)\n .shrn(LIQUIDITY_SCALE);\n\n return {\n feeTokenA: positionState.feeAPending.add(feeA),\n feeTokenB: positionState.feeBPending.add(feeB),\n rewards:\n positionState.rewardInfos.length > 0\n ? positionState.rewardInfos.map((item) => item.rewardPendings)\n : [],\n };\n};\n\n// update reward_per_token_store\n// refer this implementation in program: https://github.com/MeteoraAg/damm-v2/blob/689a3264484799d833c505523f4ff4e4990690aa/programs/cp-amm/src/state/pool.rs#L315\nfunction getRewardPerTokenStore(\n poolReward: RewardInfo,\n poolLiquidity: BN,\n currentTime: BN\n): BN {\n if (poolLiquidity.eq(new BN(0))) {\n return new BN(0);\n }\n const lastTimeRewardApplicable = BN.min(\n currentTime,\n poolReward.rewardDurationEnd\n );\n\n const timePeriod = lastTimeRewardApplicable.sub(poolReward.lastUpdateTime);\n const currentTotalReward = timePeriod.mul(poolReward.rewardRate);\n const rewardPerTokenStore = currentTotalReward.shln(128).div(poolLiquidity);\n\n const totalRewardPerTokenStore = new BN(\n Buffer.from(poolReward.rewardPerTokenStored).reverse()\n ).add(rewardPerTokenStore);\n\n return totalRewardPerTokenStore;\n}\n\nfunction getRewardPerPeriod(\n poolReward: RewardInfo,\n currentTime: BN,\n periodTime: BN\n): BN {\n const timeRewardAppicable = currentTime.add(periodTime);\n // cap max period in reward duration end\n const period =\n timeRewardAppicable <= poolReward.rewardDurationEnd\n ? periodTime\n : poolReward.rewardDurationEnd.sub(currentTime);\n // reward_rate = amount / periodTime\n const rewardPerPeriod = poolReward.rewardRate.mul(period);\n\n return rewardPerPeriod;\n}\n\n// get pool reward info\nexport function getRewardInfo(\n poolState: PoolState,\n rewardIndex: number,\n periodTime: BN,\n currentTime: BN\n): {\n rewardPerPeriod: BN;\n rewardBalance: BN;\n totalRewardDistributed: BN;\n} {\n const poolReward = poolState.rewardInfos[rewardIndex];\n\n const rewardPerTokenStore = getRewardPerTokenStore(\n poolReward,\n poolState.liquidity,\n currentTime\n );\n\n // calculate current reward distributed to user reward.\n const totalRewardDistributed = rewardPerTokenStore\n .mul(poolState.liquidity)\n .shrn(192);\n\n if (poolReward.rewardDurationEnd <= currentTime) {\n return {\n rewardPerPeriod: new BN(0),\n rewardBalance: new BN(0),\n totalRewardDistributed,\n };\n }\n\n const rewardPerPeriod = getRewardPerPeriod(\n poolReward,\n currentTime,\n periodTime\n );\n\n const remainTime = poolReward.rewardDurationEnd.sub(currentTime);\n const rewardBalance = poolReward.rewardRate.mul(remainTime).shrn(64);\n\n if (poolState.liquidity.eq(new BN(0))) {\n return {\n rewardPerPeriod,\n rewardBalance,\n totalRewardDistributed: new BN(0),\n };\n }\n\n return {\n rewardPerPeriod: rewardPerPeriod.shrn(64),\n rewardBalance,\n totalRewardDistributed,\n };\n}\n\n// get current pending user reward\n// refer to this implementation: https://github.com/MeteoraAg/damm-v2/blob/689a3264484799d833c505523f4ff4e4990690aa/programs/cp-amm/src/state/position.rs#L29\nexport function getUserRewardPending(\n poolState: PoolState,\n positionState: PositionState,\n rewardIndex: number,\n currentTime: BN,\n periodTime: BN\n): { userRewardPerPeriod: BN; userPendingReward: BN } {\n if (poolState.liquidity.eq(new BN(0))) {\n return {\n userRewardPerPeriod: new BN(0),\n userPendingReward: new BN(0),\n };\n }\n const poolReward = poolState.rewardInfos[rewardIndex];\n const userRewardInfo = positionState.rewardInfos[rewardIndex];\n\n const rewardPerTokenStore = getRewardPerTokenStore(\n poolReward,\n poolState.liquidity,\n currentTime\n );\n\n const totalPositionLiquidity = positionState.unlockedLiquidity\n .add(positionState.vestedLiquidity)\n .add(positionState.permanentLockedLiquidity);\n\n const userRewardPerTokenCheckPoint = new BN(\n Buffer.from(userRewardInfo.rewardPerTokenCheckpoint).reverse()\n );\n const newReward = totalPositionLiquidity\n .mul(rewardPerTokenStore.sub(userRewardPerTokenCheckPoint))\n .shrn(192);\n\n if (poolReward.rewardDurationEnd <= currentTime) {\n return {\n userPendingReward: userRewardInfo.rewardPendings.add(newReward),\n userRewardPerPeriod: new BN(0),\n };\n }\n\n const rewardPerPeriod = getRewardPerPeriod(\n poolReward,\n currentTime,\n periodTime\n );\n\n const rewardPerTokenStorePerPeriod = rewardPerPeriod\n .shln(128)\n .div(poolState.liquidity);\n const userRewardPerPeriod = totalPositionLiquidity\n .mul(rewardPerTokenStorePerPeriod)\n .shrn(192);\n\n return {\n userPendingReward: userRewardInfo.rewardPendings.add(newReward),\n userRewardPerPeriod: userRewardPerPeriod,\n };\n}\n","import { GetProgramAccountsFilter, PublicKey } from \"@solana/web3.js\";\n\n/**\n * Filters for the position by pool\n * @param pool - The pool address\n * @returns The filter for the position by pool\n */\nexport const positionByPoolFilter = (\n pool: PublicKey\n): GetProgramAccountsFilter => {\n return {\n memcmp: {\n bytes: pool.toBase58(),\n offset: 8,\n },\n };\n};\n\n/**\n * Filters for the vesting by position\n * @param position - The position address\n * @returns The filter for the vesting by position\n */\nexport const vestingByPositionFilter = (\n position: PublicKey\n): GetProgramAccountsFilter => {\n return {\n memcmp: {\n bytes: position.toBase58(),\n offset: 8,\n },\n };\n};\n\n/**\n * Create a memcmp filter for offset-based filtering\n * @param value - The value to filter by\n * @param offset - The offset where the value field is located in the account data\n * @returns A GetProgramAccountsFilter array with the value filter\n */\nexport function offsetBasedFilter(\n value: PublicKey | string,\n offset: number\n): GetProgramAccountsFilter[] {\n const valueKey = typeof value === \"string\" ? new PublicKey(value) : value;\n return [\n {\n memcmp: {\n offset,\n bytes: valueKey.toBase58(),\n encoding: \"base58\",\n },\n },\n ];\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport {\n calculateFee,\n getEpochFee,\n getTransferFeeConfig,\n MAX_FEE_BASIS_POINTS,\n Mint,\n TransferFee,\n} from \"@solana/spl-token\";\n\ninterface TransferFeeIncludedAmount {\n amount: BN;\n transferFee: BN;\n}\n\n/**\n * Calculates the pre fee amount\n * @param transferFee - The transfer fee\n * @param postFeeAmount - The post fee amount\n * @returns The pre fee amount\n */\nfunction calculatePreFeeAmount(transferFee: TransferFee, postFeeAmount: BN) {\n if (postFeeAmount.isZero()) {\n return new BN(0);\n }\n\n if (transferFee.transferFeeBasisPoints === 0) {\n return postFeeAmount;\n }\n\n const maximumFee = new BN(transferFee.maximumFee.toString());\n\n if (transferFee.transferFeeBasisPoints === MAX_FEE_BASIS_POINTS) {\n return postFeeAmount.add(maximumFee);\n }\n\n const ONE_IN_BASIS_POINTS = new BN(MAX_FEE_BASIS_POINTS);\n const numerator = postFeeAmount.mul(ONE_IN_BASIS_POINTS);\n const denominator = ONE_IN_BASIS_POINTS.sub(\n new BN(transferFee.transferFeeBasisPoints)\n );\n\n const rawPreFeeAmount = numerator\n .add(denominator)\n .sub(new BN(1))\n .div(denominator);\n\n if (rawPreFeeAmount.sub(postFeeAmount).gte(maximumFee)) {\n return postFeeAmount.add(maximumFee);\n }\n\n return rawPreFeeAmount;\n}\n\n/**\n * Calculates the inverse fee\n * @param transferFee - The transfer fee\n * @param postFeeAmount - The post fee amount\n * @returns The inverse fee\n */\nfunction calculateInverseFee(transferFee: TransferFee, postFeeAmount: BN) {\n const preFeeAmount = calculatePreFeeAmount(transferFee, postFeeAmount);\n return new BN(\n calculateFee(transferFee, BigInt(preFeeAmount.toString())).toString()\n );\n}\n\n/**\n * Calculates the transfer fee included amount\n * @param transferFeeExcludedAmount - The transfer fee excluded amount\n * @param mint - The mint\n * @param currentEpoch - The current epoch\n * @returns The transfer fee included amount\n */\nexport function calculateTransferFeeIncludedAmount(\n transferFeeExcludedAmount: BN,\n mint: Mint,\n currentEpoch: number\n): TransferFeeIncludedAmount {\n if (transferFeeExcludedAmount.isZero()) {\n return {\n amount: new BN(0),\n transferFee: new BN(0),\n };\n }\n\n const transferFeeConfig = getTransferFeeConfig(mint);\n\n if (transferFeeConfig === null) {\n return {\n amount: transferFeeExcludedAmount,\n transferFee: new BN(0),\n };\n }\n\n const epochFee = getEpochFee(transferFeeConfig, BigInt(currentEpoch));\n\n const transferFee =\n epochFee.transferFeeBasisPoints == MAX_FEE_BASIS_POINTS\n ? new BN(epochFee.maximumFee.toString())\n : calculateInverseFee(epochFee, transferFeeExcludedAmount);\n\n const transferFeeIncludedAmount = transferFeeExcludedAmount.add(transferFee);\n\n return {\n amount: transferFeeIncludedAmount,\n transferFee,\n };\n}\n\ninterface TransferFeeExcludedAmount {\n amount: BN;\n transferFee: BN;\n}\n\n/**\n * Calculates the transfer fee excluded amount\n * @param transferFeeIncludedAmount - The transfer fee included amount\n * @param mint - The mint\n * @param currentEpoch - The current epoch\n * @returns The transfer fee excluded amount\n */\nexport function calculateTransferFeeExcludedAmount(\n transferFeeIncludedAmount: BN,\n mint: Mint,\n currentEpoch: number\n): TransferFeeExcludedAmount {\n const transferFeeConfig = getTransferFeeConfig(mint);\n if (transferFeeConfig === null) {\n return {\n amount: transferFeeIncludedAmount,\n transferFee: new BN(0),\n };\n }\n\n const transferFeeIncludedAmountN = BigInt(\n transferFeeIncludedAmount.toString()\n );\n\n const transferFee = calculateFee(\n getEpochFee(transferFeeConfig, BigInt(currentEpoch)),\n transferFeeIncludedAmountN\n );\n\n const transferFeeExcludedAmount = new BN(\n (transferFeeIncludedAmountN - transferFee).toString()\n );\n\n return {\n amount: transferFeeExcludedAmount,\n transferFee: new BN(transferFee.toString()),\n };\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport { PositionState, VestingState } from \"../types\";\nimport { min } from \"bn.js\";\n\n/**\n * Checks if a vesting schedule is ready for full release\n * @param vestingData The vesting account data\n * @param currentPoint Current timestamp or slot\n * @returns True if the vesting is complete and all liquidity can be released\n */\nexport function isVestingComplete(\n vestingData: VestingState,\n currentPoint: BN\n): boolean {\n const cliffPoint = vestingData.cliffPoint;\n const periodFrequency = vestingData.periodFrequency;\n const numberOfPeriods = vestingData.numberOfPeriod;\n\n const endPoint = cliffPoint.add(periodFrequency.muln(numberOfPeriods));\n\n return currentPoint.gte(endPoint);\n}\n\n/**\n * Gets the total amount of liquidity in the vesting schedule\n * @param vestingData The vesting account data\n * @returns The total locked liquidity amount\n */\nexport function getTotalLockedLiquidity(vestingData: VestingState): BN {\n return vestingData.cliffUnlockLiquidity.add(\n vestingData.liquidityPerPeriod.mul(new BN(vestingData.numberOfPeriod))\n );\n}\n\n/**\n * Calculates the available liquidity to withdraw based on vesting schedule\n * @param vestingData The vesting account data\n * @param positionData The position account data\n * @param currentPoint Current timestamp or slot\n * @returns The amount of liquidity available to withdraw\n */\nexport function getAvailableVestingLiquidity(\n vestingData: VestingState,\n currentPoint: BN\n): BN {\n const {\n cliffPoint,\n periodFrequency,\n cliffUnlockLiquidity,\n liquidityPerPeriod,\n numberOfPeriod,\n totalReleasedLiquidity,\n } = vestingData;\n\n if (currentPoint.lt(cliffPoint)) {\n return new BN(0);\n }\n\n if (periodFrequency.isZero()) {\n return cliffUnlockLiquidity;\n }\n\n let passedPeriod = new BN(currentPoint).sub(cliffPoint).div(periodFrequency);\n\n passedPeriod = min(passedPeriod, new BN(numberOfPeriod));\n\n // total unlocked liquidity: cliff + (periods * per_period)\n const unlockedLiquidity = cliffUnlockLiquidity.add(\n passedPeriod.mul(liquidityPerPeriod)\n );\n const availableReleasingLiquidity = unlockedLiquidity.sub(\n totalReleasedLiquidity\n );\n\n return availableReleasingLiquidity;\n}\n","import BN from \"bn.js\";\nimport {\n ActivationType,\n BaseFeeMode,\n CollectFeeMode,\n PoolVersion,\n} from \"../types\";\nimport {\n getFeeNumeratorFromIncludedFeeAmount,\n getMaxBaseFeeNumerator,\n getMinBaseFeeNumerator,\n isNonZeroRateLimiter,\n isZeroRateLimiter,\n} from \"../math/poolFees\";\nimport {\n FEE_DENOMINATOR,\n MAX_RATE_LIMITER_DURATION_IN_SECONDS,\n MAX_RATE_LIMITER_DURATION_IN_SLOTS,\n MIN_FEE_NUMERATOR,\n} from \"../constants\";\nimport { toNumerator } from \"../math\";\nimport { getMaxFeeBps, getMaxFeeNumerator } from \"../math\";\n\n/**\n * Validate fee scheduler parameters\n * @param numberOfPeriod Number of periods\n * @param periodFrequency Period frequency\n * @param reductionFactor Reduction factor\n * @param cliffFeeNumerator Cliff fee numerator\n * @returns Validation result\n */\nexport function validateFeeScheduler(\n numberOfPeriod: number,\n periodFrequency: BN,\n reductionFactor: BN,\n cliffFeeNumerator: BN,\n baseFeeMode: BaseFeeMode,\n poolVersion: PoolVersion\n): boolean {\n if (\n !periodFrequency.eq(new BN(0)) ||\n numberOfPeriod !== 0 ||\n !reductionFactor.eq(new BN(0))\n ) {\n if (\n numberOfPeriod === 0 ||\n periodFrequency.eq(new BN(0)) ||\n reductionFactor.eq(new BN(0))\n ) {\n return false;\n }\n }\n\n const minFeeNumerator = getMinBaseFeeNumerator(\n cliffFeeNumerator,\n numberOfPeriod,\n reductionFactor,\n baseFeeMode\n );\n const maxFeeNumerator = getMaxBaseFeeNumerator(cliffFeeNumerator);\n validateFeeFraction(minFeeNumerator, new BN(FEE_DENOMINATOR));\n validateFeeFraction(maxFeeNumerator, new BN(FEE_DENOMINATOR));\n\n if (\n minFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n maxFeeNumerator.gt(getMaxFeeNumerator(poolVersion))\n ) {\n throw new Error(\"PoolError::ExceedMaxFeeBps\");\n }\n\n return true;\n}\n\n/**\n * Validate rate limiter parameters\n * @param cliffFeeNumerator - Cliff fee numerator\n * @param feeIncrementBps - Fee increment bps\n * @param maxLimiterDuration - Max limiter duration\n * @param referenceAmount - Reference amount\n * @param collectFeeMode - Collect fee mode\n * @param activationType - Activation type (slot or timestamp)\n * @returns Validation result\n */\nexport function validateFeeRateLimiter(\n cliffFeeNumerator: BN,\n feeIncrementBps: number,\n maxFeeBps: number,\n maxLimiterDuration: number,\n referenceAmount: BN,\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n): boolean {\n // can only be applied in OnlyB collect fee mode\n if (collectFeeMode !== CollectFeeMode.OnlyB) {\n return false;\n }\n\n // max_fee_numerator_from_bps = to_numerator(maxFeeBps, FEE_DENOMINATOR)\n const maxFeeNumeratorFromBps = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n\n // cliff_fee_numerator >= MIN_FEE_NUMERATOR && cliff_fee_numerator <= max_fee_numerator_from_bps\n if (\n cliffFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n cliffFeeNumerator.gt(maxFeeNumeratorFromBps)\n ) {\n return false;\n }\n\n // is_zero_rate_limiter\n if (\n isZeroRateLimiter(\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n feeIncrementBps\n )\n ) {\n return true;\n }\n\n if (\n isNonZeroRateLimiter(\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n feeIncrementBps\n )\n ) {\n return false;\n }\n\n // max_limiter_duration = match activation_type\n const maxLimiterDurationLimit =\n activationType === ActivationType.Slot\n ? new BN(MAX_RATE_LIMITER_DURATION_IN_SLOTS)\n : new BN(MAX_RATE_LIMITER_DURATION_IN_SECONDS);\n\n if (new BN(maxLimiterDuration).gt(maxLimiterDurationLimit)) {\n return false;\n }\n\n // fee_increment_numerator = to_numerator(feeIncrementBps, FEE_DENOMINATOR)\n const feeIncrementNumerator = toNumerator(\n new BN(feeIncrementBps),\n new BN(FEE_DENOMINATOR)\n );\n if (feeIncrementNumerator.gte(new BN(FEE_DENOMINATOR))) {\n return false;\n }\n\n if (maxFeeBps > getMaxFeeBps(poolVersion)) {\n return false;\n }\n\n // validate max fee (more amount, then more fee)\n const minFeeNumerator = getFeeNumeratorFromIncludedFeeAmount(\n new BN(0),\n cliffFeeNumerator,\n referenceAmount,\n maxFeeBps,\n feeIncrementBps\n );\n const maxFeeNumeratorFromAmount = getFeeNumeratorFromIncludedFeeAmount(\n new BN(Number.MAX_SAFE_INTEGER),\n cliffFeeNumerator,\n referenceAmount,\n maxFeeBps,\n feeIncrementBps\n );\n\n if (\n minFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n maxFeeNumeratorFromAmount.gt(getMaxFeeNumerator(poolVersion))\n ) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validates that the fee fraction is valid (numerator < denominator, denominator != 0)\n * @param numerator - The numerator of the fee fraction\n * @param denominator - The denominator of the fee fraction\n * @throws Error if the fee fraction is invalid\n */\nexport function validateFeeFraction(numerator: BN, denominator: BN): void {\n if (denominator.isZero() || numerator.gte(denominator)) {\n throw new Error(\n \"InvalidFee: Fee numerator must be less than denominator and denominator must be non-zero\"\n );\n }\n}\n","import BN from \"bn.js\";\nimport {\n TradeDirection,\n BaseFeeMode,\n CollectFeeMode,\n ActivationType,\n BaseFeeHandler,\n PoolVersion,\n} from \"../../types\";\nimport {\n getFeeNumeratorFromIncludedFeeAmount,\n getFeeNumeratorFromExcludedFeeAmount,\n isRateLimiterApplied,\n} from \"./rateLimiter\";\nimport { getBaseFeeNumerator } from \"./feeScheduler\";\nimport { validateFeeRateLimiter, validateFeeScheduler } from \"../../helpers\";\n\n/**\n * Fee Rate Limiter class\n */\nexport class FeeRateLimiter implements BaseFeeHandler {\n constructor(\n public cliffFeeNumerator: BN,\n public feeIncrementBps: number,\n public maxFeeBps: number,\n public maxLimiterDuration: number,\n public referenceAmount: BN\n ) {}\n\n validate(\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n ): boolean {\n return validateFeeRateLimiter(\n this.cliffFeeNumerator,\n this.feeIncrementBps,\n this.maxFeeBps,\n this.maxLimiterDuration,\n this.referenceAmount,\n collectFeeMode,\n activationType,\n poolVersion\n );\n }\n\n getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n includedFeeAmount: BN\n ): BN {\n if (\n isRateLimiterApplied(\n this.referenceAmount,\n this.maxLimiterDuration,\n this.maxFeeBps,\n this.feeIncrementBps,\n currentPoint,\n activationPoint,\n tradeDirection\n )\n ) {\n return getFeeNumeratorFromIncludedFeeAmount(\n includedFeeAmount,\n this.referenceAmount,\n this.cliffFeeNumerator,\n this.maxFeeBps,\n this.feeIncrementBps\n );\n } else {\n return this.cliffFeeNumerator;\n }\n }\n\n getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection,\n excludedFeeAmount: BN\n ): BN {\n if (\n isRateLimiterApplied(\n this.referenceAmount,\n this.maxLimiterDuration,\n this.maxFeeBps,\n this.feeIncrementBps,\n currentPoint,\n activationPoint,\n tradeDirection\n )\n ) {\n return getFeeNumeratorFromExcludedFeeAmount(\n excludedFeeAmount,\n this.referenceAmount,\n this.cliffFeeNumerator,\n this.maxFeeBps,\n this.feeIncrementBps\n );\n } else {\n return this.cliffFeeNumerator;\n }\n }\n}\n\n/**\n * Fee Scheduler implementation\n */\nexport class FeeScheduler implements BaseFeeHandler {\n constructor(\n public cliffFeeNumerator: BN,\n public numberOfPeriod: number,\n public periodFrequency: BN,\n public reductionFactor: BN,\n public feeSchedulerMode: BaseFeeMode\n ) {}\n\n validate(\n collectFeeMode: CollectFeeMode,\n activationType: ActivationType,\n poolVersion: PoolVersion\n ): boolean {\n return validateFeeScheduler(\n this.numberOfPeriod,\n this.periodFrequency,\n this.reductionFactor,\n this.cliffFeeNumerator,\n this.feeSchedulerMode,\n poolVersion\n );\n }\n\n getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN\n ): BN {\n return getBaseFeeNumerator(\n this.cliffFeeNumerator,\n this.numberOfPeriod,\n this.periodFrequency,\n this.reductionFactor,\n this.feeSchedulerMode,\n currentPoint,\n activationPoint\n );\n }\n\n getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint: BN,\n activationPoint: BN\n ): BN {\n return getBaseFeeNumerator(\n this.cliffFeeNumerator,\n this.numberOfPeriod,\n this.periodFrequency,\n this.reductionFactor,\n this.feeSchedulerMode,\n currentPoint,\n activationPoint\n );\n }\n}\n\n/**\n * Get base fee handler based on base fee mode\n * @param cliffFeeNumerator Cliff fee numerator\n * @param firstFactor First factor (feeScheduler: numberOfPeriod, rateLimiter: feeIncrementBps)\n * @param secondFactor Second factor (feeScheduler: periodFrequency, rateLimiter: maxLimiterDuration)\n * @param thirdFactor Third factor (feeScheduler: reductionFactor, rateLimiter: referenceAmount)\n * @param baseFeeMode Base fee mode\n * @returns Base fee handler instance\n */\nexport function getBaseFeeHandler(\n cliffFeeNumerator: BN,\n firstFactor: number,\n secondFactor: number[],\n thirdFactor: BN,\n baseFeeMode: BaseFeeMode\n): BaseFeeHandler {\n switch (baseFeeMode) {\n case BaseFeeMode.FeeSchedulerLinear:\n case BaseFeeMode.FeeSchedulerExponential: {\n if (secondFactor.length < 8) {\n throw new Error(\n \"TypeCastFailed: secondFactor must be at least 8 bytes\"\n );\n }\n\n // periodFrequency is a u64 little-endian from 8 bytes\n const periodFrequency = new BN(\n Buffer.from(secondFactor.slice(0, 8)),\n \"le\"\n );\n const feeScheduler = new FeeScheduler(\n cliffFeeNumerator,\n firstFactor,\n periodFrequency,\n thirdFactor,\n baseFeeMode\n );\n return feeScheduler;\n }\n case BaseFeeMode.RateLimiter: {\n // secondFactor: first 4 bytes = maxLimiterDuration (u32 LE), next 4 bytes = maxFeeBps (u32 LE)\n if (secondFactor.length < 8) {\n throw new Error(\n \"TypeCastFailed: secondFactor must be at least 8 bytes\"\n );\n }\n const maxLimiterDuration = Buffer.from(\n secondFactor.slice(0, 4)\n ).readUInt32LE(0);\n const maxFeeBps = Buffer.from(secondFactor.slice(4, 8)).readUInt32LE(0);\n\n const feeRateLimiter = new FeeRateLimiter(\n cliffFeeNumerator,\n firstFactor,\n maxFeeBps,\n maxLimiterDuration,\n thirdFactor\n );\n return feeRateLimiter;\n }\n default:\n throw new Error(\"Invalid base fee mode\");\n }\n}\n","import BN from \"bn.js\";\nimport { Rounding, TradeDirection } from \"../../types\";\nimport { FEE_DENOMINATOR, U64_MAX } from \"../../constants\";\nimport { getExcludedFeeAmount, getIncludedFeeAmount } from \"../feeMath\";\nimport { mulDiv, sqrt } from \"../utilsMath\";\nimport { toNumerator } from \"../feeMath\";\n\n/// we denote reference_amount = x0, cliff_fee_numerator = c, fee_increment = i\n/// if input_amount <= x0, then fee = input_amount * c\n///\n/// if input_amount > x0, then input_amount = x0 + (a * x0 + b)\n/// if a < max_index\n/// then fee = x0 * c + x0 * (c + i) + .... + x0 * (c + i*a) + b * (c + i * (a+1))\n/// then fee = x0 * (c + c*a + i*a*(a+1)/2) + b * (c + i * (a+1))\n///\n/// if a >= max_index\n/// if a = max_index + d, input_amount = x0 + max_index * x0 + (d * x0 + b)\n/// then fee = x0 * (c + c*max_index + i*max_index*(max_index+1)/2) + (d * x0 + b) * MAX_FEE\n\n/**\n * Checks if the rate limiter is zero.\n * @param referenceAmount - The reference amount.\n * @param maxLimiterDuration - The maximum rate limiter duration.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns True if the rate limiter is zero, false otherwise.\n */\nexport function isZeroRateLimiter(\n referenceAmount: BN,\n maxLimiterDuration: number,\n maxFeeBps: number,\n feeIncrementBps: number\n): boolean {\n return (\n referenceAmount.isZero() &&\n maxLimiterDuration === 0 &&\n maxFeeBps === 0 &&\n feeIncrementBps === 0\n );\n}\n\n/**\n * Checks if the rate limiter is non-zero.\n * @param referenceAmount - The reference amount.\n * @param maxLimiterDuration - The maximum rate limiter duration.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns True if the rate limiter is non-zero, false otherwise.\n */\nexport function isNonZeroRateLimiter(\n referenceAmount: BN,\n maxLimiterDuration: number,\n maxFeeBps: number,\n feeIncrementBps: number\n): boolean {\n return (\n referenceAmount.isZero() &&\n maxLimiterDuration !== 0 &&\n maxFeeBps !== 0 &&\n feeIncrementBps !== 0\n );\n}\n\n/**\n * Checks if the rate limiter is applied.\n * @param referenceAmount - The reference amount.\n * @param maxLimiterDuration - The maximum rate limiter duration.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @param currentPoint - The current point.\n * @param activationPoint - The activation point.\n * @param tradeDirection - The trade direction.\n * @returns True if the rate limiter is applied, false otherwise.\n */\nexport function isRateLimiterApplied(\n referenceAmount: BN,\n maxLimiterDuration: number,\n maxFeeBps: number,\n feeIncrementBps: number,\n currentPoint: BN,\n activationPoint: BN,\n tradeDirection: TradeDirection\n): boolean {\n // if rate limiter is zero, return false\n if (\n isZeroRateLimiter(\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n feeIncrementBps\n )\n ) {\n return false;\n }\n\n // only handle for the case B to A and collect fee mode in token B\n if (tradeDirection === TradeDirection.AtoB) {\n return false;\n }\n\n if (currentPoint.lt(activationPoint)) {\n return false;\n }\n\n // last_effective_rate_limiter_point = activation_point + max_limiter_duration\n const lastEffectiveRateLimiterPoint = activationPoint.add(\n new BN(maxLimiterDuration)\n );\n\n if (currentPoint.gt(lastEffectiveRateLimiterPoint)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Gets the maximum index.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns The maximum index.\n */\nexport function getMaxIndex(\n maxFeeBps: number,\n cliffFeeNumerator: BN,\n feeIncrementBps: number\n): BN {\n // max_fee_numerator = to_numerator(maxFeeBps, FEE_DENOMINATOR)\n const maxFeeNumerator = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n\n // delta_numerator = max_fee_numerator.safe_sub(cliff_fee_numerator)\n if (cliffFeeNumerator.gt(maxFeeNumerator)) {\n throw new Error(\"cliffFeeNumerator cannot be greater than maxFeeNumerator\");\n }\n const deltaNumerator = maxFeeNumerator.sub(cliffFeeNumerator);\n\n // fee_increment_numerator = to_numerator(feeIncrementBps, FEE_DENOMINATOR)\n const feeIncrementNumerator = toNumerator(\n new BN(feeIncrementBps),\n new BN(FEE_DENOMINATOR)\n );\n\n if (feeIncrementNumerator.isZero()) {\n throw new Error(\"feeIncrementNumerator cannot be zero\");\n }\n\n const maxIndex = deltaNumerator.div(feeIncrementNumerator);\n\n return maxIndex;\n}\n\n/**\n * Gets the fee numerator from included fee amount.\n * @param inputAmount - The input amount.\n * @param referenceAmount - The reference amount.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns The fee numerator from included fee amount.\n */\nexport function getFeeNumeratorFromIncludedFeeAmount(\n inputAmount: BN,\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): BN {\n if (inputAmount.lte(referenceAmount)) {\n return cliffFeeNumerator;\n } else {\n // max_fee_numerator = to_numerator(maxFeeBps, FEE_DENOMINATOR)\n const maxFeeNumerator = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n\n const c = cliffFeeNumerator;\n // a = (inputAmount - referenceAmount) / referenceAmount\n // b = (inputAmount - referenceAmount) % referenceAmount\n const inputMinusRef = inputAmount.sub(referenceAmount);\n const a = inputMinusRef.div(referenceAmount);\n const b = inputMinusRef.mod(referenceAmount);\n\n const maxIndex = getMaxIndex(maxFeeBps, cliffFeeNumerator, feeIncrementBps);\n const i = toNumerator(new BN(feeIncrementBps), new BN(FEE_DENOMINATOR));\n const x0 = referenceAmount;\n const one = new BN(1);\n const two = new BN(2);\n\n let tradingFeeNumerator: BN;\n if (a.lt(maxIndex)) {\n // numerator_1 = c + c * a + i * a * (a + one) / two\n const numerator1 = c.add(c.mul(a)).add(i.mul(a).mul(a.add(one)).div(two));\n // numerator_2 = c + i * (a + one)\n const numerator2 = c.add(i.mul(a.add(one)));\n // first_fee = x0 * numerator_1\n const firstFee = x0.mul(numerator1);\n // second_fee = b * numerator_2\n const secondFee = b.mul(numerator2);\n tradingFeeNumerator = firstFee.add(secondFee);\n } else {\n // numerator_1 = c + c * max_index + i * max_index * (max_index + one) / two\n const numerator1 = c\n .add(c.mul(maxIndex))\n .add(i.mul(maxIndex).mul(maxIndex.add(one)).div(two));\n // numerator_2 = maxFeeNumerator\n const numerator2 = maxFeeNumerator;\n // first_fee = x0 * numerator_1\n const firstFee = x0.mul(numerator1);\n\n // d = a - max_index\n const d = a.sub(maxIndex);\n // left_amount = d * x0 + b\n const leftAmount = d.mul(x0).add(b);\n // second_fee = left_amount * numerator_2\n const secondFee = leftAmount.mul(numerator2);\n tradingFeeNumerator = firstFee.add(secondFee);\n }\n\n const denominator = new BN(FEE_DENOMINATOR);\n // trading_fee = (trading_fee_numerator + denominator - one) / denominator\n const tradingFee = tradingFeeNumerator\n .add(denominator)\n .sub(one)\n .div(denominator);\n\n // reverse to fee numerator\n // input_amount * numerator / FEE_DENOMINATOR = trading_fee\n // then numerator = trading_fee * FEE_DENOMINATOR / input_amount (rounded up)\n const numerator = mulDiv(tradingFee, denominator, inputAmount, Rounding.Up);\n\n if (numerator.gt(new BN(U64_MAX))) {\n throw new Error(\"Numerator does not fit in u64\");\n }\n\n return numerator;\n }\n}\n\n/**\n * Gets the excluded fee amount from included fee amount.\n * @param includedFeeAmount - The included fee amount.\n * @param referenceAmount - The reference amount.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param maxFeeBps - The maximum fee in basis points.\n * @param feeIncrementBps - The fee increment in basis points.\n * @returns The excluded fee amount.\n */\nexport function getExcludedFeeAmountFromIncludedFeeAmount(\n includedFeeAmount: BN,\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): BN {\n const feeNumerator = getFeeNumeratorFromIncludedFeeAmount(\n includedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n const { excludedFeeAmount } = getExcludedFeeAmount(\n feeNumerator,\n includedFeeAmount\n );\n return excludedFeeAmount;\n}\n\n/**\n * Returns checked output and input amounts, and a flag indicating if the input was capped at u64::MAX.\n * @param referenceAmount - The reference amount\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param maxFeeBps - The maximum fee in basis points\n * @param feeIncrementBps - The fee increment in basis points\n * @returns [checkedOutputAmount: BN, checkedIncludedFeeAmount: BN, capped: boolean]\n */\nexport function getCheckedAmounts(\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): {\n checkedExcludedFeeAmount: BN;\n checkedIncludedFeeAmount: BN;\n isOverflow: boolean;\n} {\n const maxIndex = getMaxIndex(maxFeeBps, cliffFeeNumerator, feeIncrementBps);\n\n const x0 = referenceAmount;\n const one = new BN(1);\n const maxIndexInputAmount = maxIndex.add(one).mul(x0);\n\n if (maxIndexInputAmount.lte(U64_MAX)) {\n const checkedIncludedFeeAmount = maxIndexInputAmount;\n const checkedExcludedFeeAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n checkedIncludedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n return {\n checkedExcludedFeeAmount,\n checkedIncludedFeeAmount,\n isOverflow: false,\n };\n } else {\n const checkedIncludedFeeAmount = U64_MAX;\n const checkedExcludedFeeAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n checkedIncludedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n return {\n checkedExcludedFeeAmount,\n checkedIncludedFeeAmount,\n isOverflow: true,\n };\n }\n}\n\n/**\n * Calculates the fee numerator from an excluded fee amount.\n * @param excludedFeeAmount - The excluded fee amount\n * @param referenceAmount - The reference amount\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param maxFeeBps - The maximum fee in basis points\n * @param feeIncrementBps - The fee increment in basis points\n * @returns The fee numerator\n */\nexport function getFeeNumeratorFromExcludedFeeAmount(\n excludedFeeAmount: BN,\n referenceAmount: BN,\n cliffFeeNumerator: BN,\n maxFeeBps: number,\n feeIncrementBps: number\n): BN {\n // get excluded fee reference amount\n const excludedFeeReferenceAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n referenceAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n if (excludedFeeAmount.lte(excludedFeeReferenceAmount)) {\n return cliffFeeNumerator;\n }\n\n // get checked amounts\n const { checkedExcludedFeeAmount, checkedIncludedFeeAmount, isOverflow } =\n getCheckedAmounts(\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n\n if (excludedFeeAmount.eq(checkedExcludedFeeAmount)) {\n return getFeeNumeratorFromIncludedFeeAmount(\n checkedIncludedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n }\n\n let includedFeeAmount: BN;\n if (excludedFeeAmount.lt(checkedExcludedFeeAmount)) {\n const TWO = new BN(2);\n const FOUR = new BN(4);\n // d: fee denominator\n // ex: excluded_fee_amount\n // input_amount = x0 + (a * x0)\n // fee = x0 * (c + c*a + i*a*(a+1)/2) / d\n // fee = x0 * (a+1) * (c + i*a/2) / d\n // fee = input_amount * (c + i * (input_amount/x0-1)/2) / d\n // ex = input_amount - fee\n // ex = input_amount - input_amount * (c + i * (input_amount/x0-1)/2) / d\n // ex * d * 2 = input_amount * d * 2 - input_amount * (2 * c + i * (input_amount/x0-1))\n // ex * d * 2 * x0 = input_amount * d * 2 * x0 - input_amount * (2 * c * x0 + i * (input_amount-x0))\n // ex * d * 2 * x0 = input_amount * d * 2 * x0 - input_amount * (2 * c * x0 + i * input_amount- i*x0)\n // ex * d * 2 * x0 = input_amount * d * 2 * x0 - input_amount * 2 * c * x0 - i * input_amount ^ 2 + input_amount * i*x0\n // i * input_amount ^ 2 - input_amount * (-2 * c * x0 + i*x0 + d * 2 * x0) + ex * d * 2 * x0 = 0\n // equation: x * input_amount ^ 2 - y * input_amount + z = 0\n // x = i, y = (-2 * c * x0 + i*x0 + d * 2 * x0), z = ex * d * 2 * x0\n // input_amount = (y +(-) sqrt(y^2 - 4xz)) / 2x\n const i = toNumerator(new BN(feeIncrementBps), new BN(FEE_DENOMINATOR));\n const x0 = referenceAmount;\n const d = new BN(FEE_DENOMINATOR);\n const c = cliffFeeNumerator;\n const ex = excludedFeeAmount;\n\n // x = i\n const x = i;\n // y = 2*d*x0 + i*x0 - 2*c*x0\n const y = TWO.mul(d).mul(x0).add(i.mul(x0)).sub(TWO.mul(c).mul(x0)); // y is always greater than 0\n // z = 2*ex*d*x0\n const z = TWO.mul(ex).mul(d).mul(x0);\n\n // solve quadratic equation\n // discriminant: y^2 - 4xz\n const discriminant = y.mul(y).sub(FOUR.mul(x).mul(z));\n const sqrtDiscriminant = sqrt(discriminant);\n\n includedFeeAmount = y.sub(sqrtDiscriminant).div(TWO.mul(x));\n\n // included_fee_amount = (y - sqrt(discriminant)) / (2x)\n const numerator = y.sub(sqrtDiscriminant);\n const denominator = TWO.mul(x);\n\n includedFeeAmount = numerator.div(denominator);\n // a_plus_one = included_fee_amount / x0\n const aPlusOne = includedFeeAmount.div(x0);\n\n const firstExcludedFeeAmount = getExcludedFeeAmountFromIncludedFeeAmount(\n includedFeeAmount,\n referenceAmount,\n cliffFeeNumerator,\n maxFeeBps,\n feeIncrementBps\n );\n // excluded_fee_remaining_amount = excludedFeeAmount - firstExcludedFeeAmount\n const excludedFeeRemainingAmount = excludedFeeAmount.sub(\n firstExcludedFeeAmount\n );\n\n // remaining_amount_fee_numerator = c + i * a_plus_one\n const remainingAmountFeeNumerator = c.add(i.mul(aPlusOne));\n\n // included_fee_remaining_amount = getIncludedFeeAmount(remainingAmountFeeNumerator, excludedFeeRemainingAmount)\n const { includedFeeAmount: includedFeeRemainingAmount } =\n getIncludedFeeAmount(\n remainingAmountFeeNumerator,\n excludedFeeRemainingAmount\n );\n\n // total_in_amount = includedFeeAmount + includedFeeRemainingAmount\n includedFeeAmount = includedFeeAmount.add(includedFeeRemainingAmount);\n } else {\n // excludedFeeAmount > checkedExcludedFeeAmount\n if (isOverflow) {\n throw new Error(\"Math overflow in getFeeNumeratorFromExcludedFeeAmount\");\n }\n // excluded_fee_remaining_amount = excludedFeeAmount - checkedExcludedFeeAmount\n const excludedFeeRemainingAmount = excludedFeeAmount.sub(\n checkedExcludedFeeAmount\n );\n\n const maxFeeNumerator = toNumerator(\n new BN(maxFeeBps),\n new BN(FEE_DENOMINATOR)\n );\n const { includedFeeAmount: includedFeeRemainingAmount } =\n getIncludedFeeAmount(maxFeeNumerator, excludedFeeRemainingAmount);\n\n // total_amount_in = includedFeeRemainingAmount + checkedIncludedFeeAmount\n includedFeeAmount = includedFeeRemainingAmount.add(\n checkedIncludedFeeAmount\n );\n }\n\n // trading_fee = includedFeeAmount - excludedFeeAmount\n const tradingFee = includedFeeAmount.sub(excludedFeeAmount);\n\n // fee_numerator = mulDiv(tradingFee, FEE_DENOMINATOR, includedFeeAmount, Rounding.Up)\n const feeNumerator = mulDiv(\n tradingFee,\n new BN(FEE_DENOMINATOR),\n includedFeeAmount,\n Rounding.Up\n );\n\n // sanity check\n if (feeNumerator.lt(cliffFeeNumerator)) {\n throw new Error(\"feeNumerator is less than cliffFeeNumerator\");\n }\n\n return feeNumerator;\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport {\n BASIS_POINT_MAX,\n FEE_DENOMINATOR,\n MAX_FEE_BPS_V0,\n MAX_FEE_BPS_V1,\n MAX_FEE_NUMERATOR_V0,\n MAX_FEE_NUMERATOR_V1,\n ONE_Q64,\n SCALE_OFFSET,\n U128_MAX,\n U64_MAX,\n} from \"../constants\";\nimport { mulDiv, pow } from \"./utilsMath\";\nimport {\n CollectFeeMode,\n FeeMode,\n FeeOnAmountResult,\n PoolFeesStruct,\n PoolVersion,\n Rounding,\n SplitFees,\n TradeDirection,\n} from \"../types\";\nimport { getBaseFeeHandler, getDynamicFeeNumerator } from \"./poolFees\";\n\n/**\n * Converts basis points to a numerator\n * @param bps - The basis points\n * @param feeDenominator - The fee denominator\n * @returns The numerator\n */\nexport function toNumerator(bps: BN, feeDenominator: BN): BN {\n const numerator = mulDiv(\n bps,\n feeDenominator,\n new BN(BASIS_POINT_MAX),\n Rounding.Down\n );\n return numerator;\n}\n\n/**\n * Gets the fee in a period\n * @param cliffFeeNumerator - The cliff fee numerator\n * @param reductionFactor - The reduction factor\n * @param passedPeriod - The passed period\n * @returns The fee in a period\n */\nexport function getFeeInPeriod(\n cliffFeeNumerator: BN,\n reductionFactor: BN,\n passedPeriod: number\n): BN {\n if (reductionFactor.isZero()) {\n return cliffFeeNumerator;\n }\n\n // Make bin_step into Q64x64, and divided by BASIS_POINT_MAX. If bin_step = 1, we get 0.0001 in Q64x64\n const bps = reductionFactor.shln(SCALE_OFFSET).div(new BN(BASIS_POINT_MAX));\n const base = ONE_Q64.sub(bps);\n const result = pow(base, new BN(passedPeriod));\n\n if (result.gt(U128_MAX)) {\n throw new Error(\"Math overflow\");\n }\n\n const fee = result.mul(cliffFeeNumerator).shrn(SCALE_OFFSET);\n\n return fee;\n}\n\n/**\n * Gets the fee mode\n * @param collectFeeMode - The collect fee mode\n * @param tradeDirection - The trade direction\n * @param hasReferral - The has referral\n * @returns The fee mode\n */\nexport function getFeeMode(\n collectFeeMode: CollectFeeMode,\n tradeDirection: TradeDirection,\n hasReferral: boolean\n): FeeMode {\n // (CollectFeeMode::BothToken, TradeDirection::AToB) => (false, false)\n // (CollectFeeMode::BothToken, TradeDirection::BtoA) => (false, true)\n // (CollectFeeMode::OnlyB, TradeDirection::AtoB) => (false, false)\n // (CollectFeeMode::OnlyB, TradeDirection::BtoA) => (true, false)\n\n let feesOnInput: boolean;\n let feesOnTokenA: boolean;\n\n if (collectFeeMode === CollectFeeMode.BothToken) {\n if (tradeDirection === TradeDirection.AtoB) {\n feesOnInput = false;\n feesOnTokenA = false;\n } else {\n // TradeDirection::BtoA\n feesOnInput = false;\n feesOnTokenA = true;\n }\n } else {\n // CollectFeeMode::OnlyB\n if (tradeDirection === TradeDirection.AtoB) {\n feesOnInput = false;\n feesOnTokenA = false;\n } else {\n // TradeDirection::BtoA\n feesOnInput = true;\n feesOnTokenA = false;\n }\n }\n\n return {\n feesOnInput,\n feesOnTokenA,\n hasReferral,\n };\n}\n\n/**\n * Gets the total fee numerator\n * @param poolFees - The pool fees\n * @param baseFeeNumerator - The base fee numerator\n * @param maxFeeNumerator - The max fee numerator\n * @returns The total fee numerator\n */\nexport function getTotalFeeNumerator(\n poolFees: PoolFeesStruct,\n baseFeeNumerator: BN,\n maxFeeNumerator: BN\n): BN {\n let dynamicFeeNumerator = new BN(0);\n\n if (poolFees.dynamicFee.initialized !== 0) {\n dynamicFeeNumerator = getDynamicFeeNumerator(\n poolFees.dynamicFee.volatilityAccumulator,\n new BN(poolFees.dynamicFee.binStep),\n new BN(poolFees.dynamicFee.variableFeeControl)\n );\n }\n\n const totalFeeNumerator = dynamicFeeNumerator.add(baseFeeNumerator);\n\n return BN.min(totalFeeNumerator, maxFeeNumerator);\n}\n\n/**\n * Gets the total trading fee from included fee amount\n * @param poolFees - The pool fees\n * @param currentPoint - The current point\n * @param activationPoint - The activation point\n * @param includedFeeAmount - The included fee amount\n * @param tradeDirection - The trade direction\n * @param maxFeeNumerator - The max fee numerator\n * @returns The total trading fee from included fee amount\n */\nexport function getTotalTradingFeeFromIncludedFeeAmount(\n poolFees: PoolFeesStruct,\n currentPoint: BN,\n activationPoint: BN,\n includedFeeAmount: BN,\n tradeDirection: TradeDirection,\n maxFeeNumerator: BN\n): BN {\n const baseFeeHandler = getBaseFeeHandler(\n poolFees.baseFee.cliffFeeNumerator,\n poolFees.baseFee.firstFactor,\n poolFees.baseFee.secondFactor,\n poolFees.baseFee.thirdFactor,\n poolFees.baseFee.baseFeeMode\n );\n\n // get the base fee numerator from the included fee amount\n const baseFeeNumerator =\n baseFeeHandler.getBaseFeeNumeratorFromIncludedFeeAmount(\n currentPoint,\n activationPoint,\n tradeDirection,\n includedFeeAmount\n );\n\n // get the total fee numerator, capped at maxFeeNumerator\n return getTotalFeeNumerator(poolFees, baseFeeNumerator, maxFeeNumerator);\n}\n\n/**\n * Gets the total trading fee from excluded fee amount\n * @param poolFees - The pool fees\n * @param currentPoint - The current point\n * @param activationPoint - The activation point\n * @param excludedFeeAmount - The excluded fee amount\n * @param tradeDirection - The trade direction\n * @param maxFeeNumerator - The max fee numerator\n * @returns The total trading fee from excluded fee amount\n */\nexport function getTotalTradingFeeFromExcludedFeeAmount(\n poolFees: PoolFeesStruct,\n currentPoint: BN,\n activationPoint: BN,\n excludedFeeAmount: BN,\n tradeDirection: TradeDirection,\n maxFeeNumerator: BN\n): BN {\n const baseFeeHandler = getBaseFeeHandler(\n poolFees.baseFee.cliffFeeNumerator,\n poolFees.baseFee.firstFactor,\n poolFees.baseFee.secondFactor,\n poolFees.baseFee.thirdFactor,\n poolFees.baseFee.baseFeeMode\n );\n\n // get the base fee numerator from the excluded fee amount\n const baseFeeNumerator =\n baseFeeHandler.getBaseFeeNumeratorFromExcludedFeeAmount(\n currentPoint,\n activationPoint,\n tradeDirection,\n excludedFeeAmount\n );\n\n // get the total fee numerator, capped at maxFeeNumerator\n return getTotalFeeNumerator(poolFees, baseFeeNumerator, maxFeeNumerator);\n}\n\n/**\n * Splits the fees\n * @param poolFees - The pool fees\n * @param feeAmount - The fee amount\n * @param hasReferral - The has referral\n * @param hasPartner - The has partner\n * @returns The split fees\n */\nexport function splitFees(\n poolFees: PoolFeesStruct,\n feeAmount: BN,\n hasReferral: boolean,\n hasPartner: boolean\n): SplitFees {\n // protocol_fee = feeAmount * protocol_fee_percent / 100 (rounded down)\n const protocolFee = feeAmount.muln(poolFees.protocolFeePercent).divn(100);\n\n // trading_fee = feeAmount - protocol_fee\n const tradingFee = feeAmount.sub(protocolFee);\n\n // referral_fee = protocol_fee * referral_fee_percent / 100 (rounded down) if hasReferral else 0\n let referralFee = new BN(0);\n if (hasReferral) {\n referralFee = protocolFee.muln(poolFees.referralFeePercent).divn(100);\n }\n\n // protocol_fee_after_referral_fee = protocol_fee - referral_fee\n const protocolFeeAfterReferral = protocolFee.sub(referralFee);\n\n // partner_fee = protocol_fee_after_referral_fee * partner_fee_percent / 100 (rounded down) if hasPartner && partner_fee_percent > 0 else 0\n let partnerFee = new BN(0);\n if (hasPartner && poolFees.partnerFeePercent > 0) {\n partnerFee = protocolFeeAfterReferral\n .muln(poolFees.partnerFeePercent)\n .divn(100);\n }\n\n // protocol_fee = protocol_fee_after_referral_fee - partner_fee\n const finalProtocolFee = protocolFeeAfterReferral.sub(partnerFee);\n\n return {\n tradingFee,\n protocolFee: finalProtocolFee,\n referralFee,\n partnerFee,\n };\n}\n\n/**\n * Gets the fee on amount\n * @param poolFees - The pool fees\n * @param amount - The amount\n * @param tradeFeeNumerator - The trade fee numerator\n * @param hasReferral - The has referral\n * @param hasPartner - The has partner\n * @returns The fee on amount result\n */\nexport function getFeeOnAmount(\n poolFees: PoolFeesStruct,\n amount: BN,\n tradeFeeNumerator: BN,\n hasReferral: boolean,\n hasPartner: boolean\n): FeeOnAmountResult {\n // get the amount and trading fee after excluding the fee from the amount\n const { excludedFeeAmount, tradingFee } = getExcludedFeeAmount(\n tradeFeeNumerator,\n amount\n );\n\n // split the trading fee into protocol, referral, and partner fees\n const splitFeesResult = splitFees(\n poolFees,\n tradingFee,\n hasReferral,\n hasPartner\n );\n\n return {\n amount: excludedFeeAmount,\n tradingFee: splitFeesResult.tradingFee,\n protocolFee: splitFeesResult.protocolFee,\n partnerFee: splitFeesResult.partnerFee,\n referralFee: splitFeesResult.referralFee,\n };\n}\n\n/**\n * Calculates the excluded fee amount and trading fee from an included fee amount\n * @param tradeFeeNumerator - The fee numerator\n * @param includedFeeAmount - The amount that includes the fee\n * @returns Tuple of [excluded_fee_amount, trading_fee]\n */\nexport function getExcludedFeeAmount(\n tradeFeeNumerator: BN,\n includedFeeAmount: BN\n): { excludedFeeAmount: BN; tradingFee: BN } {\n const tradingFee = mulDiv(\n includedFeeAmount,\n tradeFeeNumerator,\n new BN(FEE_DENOMINATOR),\n Rounding.Up\n );\n const excludedFeeAmount = includedFeeAmount.sub(tradingFee);\n\n return { excludedFeeAmount, tradingFee };\n}\n\n/**\n * Calculates the included fee amount and fee amount from an excluded fee amount\n * @param tradeFeeNumerator - The fee numerator\n * @param excludedFeeAmount - The amount that excludes the fee\n * @returns Tuple of [included_fee_amount, fee_amount]\n */\nexport function getIncludedFeeAmount(\n tradeFeeNumerator: BN,\n excludedFeeAmount: BN\n): { includedFeeAmount: BN; feeAmount: BN } {\n const denominator = new BN(FEE_DENOMINATOR).sub(tradeFeeNumerator);\n if (denominator.isZero() || denominator.isNeg()) {\n throw new Error(\"Invalid fee numerator\");\n }\n\n const includedFeeAmount = mulDiv(\n excludedFeeAmount,\n new BN(FEE_DENOMINATOR),\n denominator,\n Rounding.Up\n );\n\n const feeAmount = includedFeeAmount.sub(excludedFeeAmount);\n\n return { includedFeeAmount, feeAmount };\n}\n\n/**\n * Gets the max fee numerator\n * @param poolVersion - The pool version\n * @returns The max fee numerator\n */\nexport function getMaxFeeNumerator(poolVersion: PoolVersion): BN {\n switch (poolVersion) {\n case PoolVersion.V0:\n return new BN(MAX_FEE_NUMERATOR_V0);\n case PoolVersion.V1:\n return new BN(MAX_FEE_NUMERATOR_V1);\n default:\n throw new Error(\"Invalid pool version\");\n }\n}\n\n/**\n * Gets the max fee bps\n * @param poolVersion - The pool version\n * @returns The max fee bps\n */\nexport function getMaxFeeBps(poolVersion: PoolVersion): number {\n switch (poolVersion) {\n case PoolVersion.V0:\n return MAX_FEE_BPS_V0;\n case PoolVersion.V1:\n return MAX_FEE_BPS_V1;\n default:\n throw new Error(\"Invalid pool version\");\n }\n}\n","import Decimal from \"decimal.js\";\nimport { Rounding } from \"../types\";\nimport { MAX, MAX_EXPONENTIAL, ONE_Q64, SCALE_OFFSET } from \"../constants\";\nimport BN from \"bn.js\";\n\n/**\n * Multiplies two numbers and divides by a denominator, rounding up or down\n * @param x - The first number\n * @param y - The second number\n * @param denominator - The denominator\n * @param rounding - The rounding mode\n * @returns The result of the multiplication and division\n */\nexport function mulDiv(x: BN, y: BN, denominator: BN, rounding: Rounding): BN {\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\n/**\n * Converts a Q64 number to a Decimal\n * @param num - The Q64 number\n * @param decimalPlaces - The number of decimal places\n * @returns The Decimal number\n */\nexport function q64ToDecimal(num: BN, decimalPlaces?: number): Decimal {\n return new Decimal(num.toString())\n .div(Decimal.pow(2, 64))\n .toDecimalPlaces(decimalPlaces);\n}\n\n/**\n * Converts a Decimal number to a Q64 number\n * @param num - The Decimal number\n * @returns The Q64 number\n */\nexport function decimalToQ64(num: Decimal): BN {\n return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed());\n}\n\n/**\n * Calculates the square root of a number\n * @param value - The number\n * @returns The square root of the number\n */\nexport function sqrt(value: BN): BN {\n if (value.isZero()) {\n return new BN(0);\n }\n\n if (value.eq(new BN(1))) {\n return new BN(1);\n }\n\n let x = value;\n let y = value.add(new BN(1)).div(new BN(2));\n\n while (y.lt(x)) {\n x = y;\n y = x.add(value.div(x)).div(new BN(2));\n }\n\n return x;\n}\n\n/**\n * Calculates the power of a number\n * @param base - The base\n * @param exp - The exponent\n * @returns The power of the number\n */\nexport function pow(base: BN, exp: BN): BN {\n let invert = exp.isNeg();\n\n if (exp.isZero()) {\n return ONE_Q64;\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_Q64;\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 \"bn.js\";\nimport { BaseFeeMode } from \"../../types\";\nimport { BASIS_POINT_MAX, ONE_Q64, U16_MAX } from \"../../constants\";\nimport { pow } from \"../utilsMath\";\n\n/**\n * Gets the max base fee numerator.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @returns The max base fee numerator.\n */\nexport function getMaxBaseFeeNumerator(cliffFeeNumerator: BN): BN {\n return cliffFeeNumerator;\n}\n\n/**\n * Gets the min base fee numerator.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param numberOfPeriod - The number of periods.\n * @param periodFrequency - The period frequency.\n * @param reductionFactor - The reduction factor.\n * @param feeSchedulerMode - The fee scheduler mode.\n * @returns The min base fee numerator.\n */\nexport function getMinBaseFeeNumerator(\n cliffFeeNumerator: BN,\n numberOfPeriod: number,\n reductionFactor: BN,\n feeSchedulerMode: BaseFeeMode\n): BN {\n return getBaseFeeNumeratorByPeriod(\n cliffFeeNumerator,\n numberOfPeriod,\n new BN(numberOfPeriod),\n reductionFactor,\n feeSchedulerMode\n );\n}\n\n/**\n * Gets the base fee numerator by period.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param numberOfPeriod - The number of periods.\n * @param period - The period.\n * @param reductionFactor - The reduction factor.\n * @param feeSchedulerMode - The fee scheduler mode.\n * @returns The base fee numerator by period.\n */\nexport function getBaseFeeNumeratorByPeriod(\n cliffFeeNumerator: BN,\n numberOfPeriod: number,\n period: BN,\n reductionFactor: BN,\n feeSchedulerMode: BaseFeeMode\n): BN {\n const periodValue = BN.min(period, new BN(numberOfPeriod));\n const periodNumber = periodValue.toNumber();\n if (periodNumber > U16_MAX) {\n throw new Error(\"Math overflow\");\n }\n\n switch (feeSchedulerMode) {\n case BaseFeeMode.FeeSchedulerLinear: {\n const feeNumerator = getFeeNumeratorOnLinearFeeScheduler(\n cliffFeeNumerator,\n reductionFactor,\n periodNumber\n );\n return feeNumerator;\n }\n case BaseFeeMode.FeeSchedulerExponential: {\n const feeNumerator = getFeeNumeratorOnExponentialFeeScheduler(\n cliffFeeNumerator,\n reductionFactor,\n periodNumber\n );\n return feeNumerator;\n }\n default:\n throw new Error(\"Invalid fee scheduler mode\");\n }\n}\n\n/**\n * Gets the fee numerator on linear fee scheduler.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param reductionFactor - The reduction factor.\n * @param period - The period.\n * @returns The fee numerator on linear fee scheduler.\n */\nexport function getFeeNumeratorOnLinearFeeScheduler(\n cliffFeeNumerator: BN,\n reductionFactor: BN,\n period: number\n): BN {\n const reduction = new BN(period).mul(reductionFactor);\n\n return cliffFeeNumerator.sub(reduction);\n}\n\n/**\n * Gets the fee numerator on exponential fee scheduler.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param reductionFactor - The reduction factor.\n * @param period - The period.\n * @returns The fee numerator on exponential fee scheduler.\n */\nexport function getFeeNumeratorOnExponentialFeeScheduler(\n cliffFeeNumerator: BN,\n reductionFactor: BN,\n period: number\n): BN {\n if (period === 0) {\n return cliffFeeNumerator;\n }\n\n const basisPointMax = new BN(BASIS_POINT_MAX);\n const bps = new BN(reductionFactor).shln(64).div(basisPointMax);\n\n // base = ONE_Q64 - bps (equivalent to 1 - reduction_factor/10_000 in Q64.64)\n const base = ONE_Q64.sub(bps);\n\n const result = pow(base, new BN(period));\n\n // final fee: cliffFeeNumerator * result >> 64\n return cliffFeeNumerator.mul(result).div(ONE_Q64);\n}\n\n/**\n * Gets the base fee numerator.\n * @param cliffFeeNumerator - The cliff fee numerator.\n * @param numberOfPeriod - The number of periods.\n * @param periodFrequency - The period frequency.\n * @param reductionFactor - The reduction factor.\n * @param feeSchedulerMode - The fee scheduler mode.\n * @param currentPoint - The current point.\n * @param activationPoint - The activation point.\n * @returns The base fee numerator.\n */\nexport function getBaseFeeNumerator(\n cliffFeeNumerator: BN,\n numberOfPeriod: number,\n periodFrequency: BN,\n reductionFactor: BN,\n feeSchedulerMode: BaseFeeMode,\n currentPoint: BN,\n activationPoint: BN\n): BN {\n if (periodFrequency.isZero()) {\n return cliffFeeNumerator;\n }\n\n let period: BN;\n\n if (currentPoint.lt(activationPoint)) {\n period = new BN(numberOfPeriod);\n } else {\n period = currentPoint.sub(activationPoint).div(periodFrequency);\n\n // clamp to maximum period\n if (period.gt(new BN(numberOfPeriod))) {\n period = new BN(numberOfPeriod);\n }\n }\n\n return getBaseFeeNumeratorByPeriod(\n cliffFeeNumerator,\n numberOfPeriod,\n period,\n reductionFactor,\n feeSchedulerMode\n );\n}\n","import {\n DYNAMIC_FEE_ROUNDING_OFFSET,\n DYNAMIC_FEE_SCALING_FACTOR,\n} from \"../../constants\";\nimport { DynamicFeeStruct } from \"../../types\";\nimport BN from \"bn.js\";\n\n/**\n * Check if dynamic fee is enabled\n * @param dynamicFee Dynamic fee parameters\n * @returns True if dynamic fee is enabled\n */\nexport function isDynamicFeeEnabled(dynamicFee: DynamicFeeStruct): boolean {\n return dynamicFee.initialized !== 0;\n}\n\n/**\n * Calculates the dynamic fee numerator based on market volatility metrics\n *\n * @param volatilityAccumulator - A measure of accumulated market volatility (BN)\n * @param binStep - The size of price bins in the liquidity distribution (BN)\n * @param variableFeeControl - Parameter controlling the impact of volatility on fees (BN)\n * @returns The calculated dynamic fee numerator (BN)\n */\nexport function getDynamicFeeNumerator(\n volatilityAccumulator: BN,\n binStep: BN,\n variableFeeControl: BN\n): BN {\n const squareVfaBin = volatilityAccumulator\n .mul(new BN(binStep))\n .pow(new BN(2));\n const vFee = variableFeeControl.mul(squareVfaBin);\n\n return vFee\n .add(new BN(DYNAMIC_FEE_ROUNDING_OFFSET))\n .div(new BN(DYNAMIC_FEE_SCALING_FACTOR));\n}\n","import {\n calculateTransferFeeExcludedAmount,\n calculateTransferFeeIncludedAmount,\n getAmountWithSlippage,\n getPriceImpact,\n hasPartner,\n isSwapEnabled,\n} from \"../helpers\";\nimport {\n FeeMode,\n PoolState,\n Quote2Result,\n Rounding,\n SwapMode,\n SwapResult2,\n TradeDirection,\n} from \"../types\";\nimport BN from \"bn.js\";\nimport {\n getFeeMode,\n getFeeOnAmount,\n getIncludedFeeAmount,\n getMaxFeeNumerator,\n getTotalTradingFeeFromExcludedFeeAmount,\n getTotalTradingFeeFromIncludedFeeAmount,\n splitFees,\n} from \"./feeMath\";\nimport {\n getAmountAFromLiquidityDelta,\n getAmountBFromLiquidityDelta,\n getNextSqrtPriceFromInput,\n getNextSqrtPriceFromOutput,\n} from \"./curve\";\nimport { Mint } from \"@solana/spl-token\";\n\n/**\n * Gets the swap result from exact input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @param feeMode - The fee mode\n * @param tradeDirection - The trade direction\n * @param currentPoint - The current point\n * @returns The swap result from exact input\n */\nexport function getSwapResultFromExactInput(\n poolState: PoolState,\n amountIn: BN,\n feeMode: FeeMode,\n tradeDirection: TradeDirection,\n currentPoint: BN\n): SwapResult2 {\n let actualProtocolFee = new BN(0);\n let actualTradingFee = new BN(0);\n let actualReferralFee = new BN(0);\n let actualPartnerFee = new BN(0);\n\n const maxFeeNumerator = getMaxFeeNumerator(poolState.version);\n\n // We can compute the trade_fee_numerator here. Instead of separately for amount_in, and amount_out.\n // This is because FeeRateLimiter (fee rate scale based on amount) only applied when fee_mode.fees_on_input\n // (a.k.a TradeDirection::QuoteToBase + CollectFeeMode::QuoteToken)\n // For the rest of the time, the fee rate is not dependent on amount.\n const tradeFeeNumerator = getTotalTradingFeeFromIncludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n amountIn,\n tradeDirection,\n maxFeeNumerator\n );\n\n let actualAmountIn: BN;\n if (feeMode.feesOnInput) {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n amountIn,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountIn = amount;\n } else {\n actualAmountIn = amountIn;\n }\n\n let swapAmountFromInput;\n if (tradeDirection === TradeDirection.AtoB) {\n swapAmountFromInput = calculateAtoBFromAmountIn(poolState, actualAmountIn);\n } else {\n swapAmountFromInput = calculateBtoAFromAmountIn(poolState, actualAmountIn);\n }\n const { outputAmount, nextSqrtPrice, amountLeft } = swapAmountFromInput;\n\n let actualAmountOut: BN;\n if (feeMode.feesOnInput) {\n actualAmountOut = outputAmount;\n } else {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n outputAmount,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountOut = amount;\n }\n\n return {\n amountLeft,\n includedFeeInputAmount: amountIn,\n excludedFeeInputAmount: actualAmountIn,\n outputAmount: actualAmountOut,\n nextSqrtPrice: nextSqrtPrice,\n tradingFee: actualTradingFee,\n protocolFee: actualProtocolFee,\n partnerFee: actualPartnerFee,\n referralFee: actualReferralFee,\n };\n}\n\n/**\n * Calculates the swap result from exact input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from exact input\n */\nexport function calculateAtoBFromAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n // finding new target price\n const nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n true\n );\n\n if (nextSqrtPrice.lt(poolState.sqrtMinPrice)) {\n throw new Error(\"Price range is violated\");\n }\n\n // finding output amount\n const outputAmount = getAmountBFromLiquidityDelta(\n nextSqrtPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft: new BN(0),\n };\n}\n\n/**\n * Calculates the swap result from exact input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from exact input\n */\nexport function calculateBtoAFromAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n // finding new target price\n const nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n false\n );\n\n if (nextSqrtPrice.gt(poolState.sqrtMaxPrice)) {\n throw new Error(\"Price range is violated\");\n }\n\n // finding output amount\n const outputAmount = getAmountAFromLiquidityDelta(\n poolState.sqrtPrice,\n nextSqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft: new BN(0),\n };\n}\n\n/**\n * Gets the swap result from partial input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @param feeMode - The fee mode\n * @param tradeDirection - The trade direction\n * @param currentPoint - The current point\n * @returns The swap result from partial input\n */\nexport function getSwapResultFromPartialInput(\n poolState: PoolState,\n amountIn: BN,\n feeMode: FeeMode,\n tradeDirection: TradeDirection,\n currentPoint: BN\n): SwapResult2 {\n let actualProtocolFee = new BN(0);\n let actualTradingFee = new BN(0);\n let actualReferralFee = new BN(0);\n let actualPartnerFee = new BN(0);\n\n const maxFeeNumerator = getMaxFeeNumerator(poolState.version);\n\n const tradeFeeNumerator = getTotalTradingFeeFromIncludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n amountIn,\n tradeDirection,\n maxFeeNumerator\n );\n\n let actualAmountIn: BN;\n if (feeMode.feesOnInput) {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n amountIn,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountIn = amount;\n } else {\n actualAmountIn = amountIn;\n }\n\n let swapAmountFromInput;\n if (tradeDirection === TradeDirection.AtoB) {\n swapAmountFromInput = calculateAtoBFromPartialAmountIn(\n poolState,\n actualAmountIn\n );\n } else {\n swapAmountFromInput = calculateBtoAFromPartialAmountIn(\n poolState,\n actualAmountIn\n );\n }\n\n let { amountLeft, outputAmount, nextSqrtPrice } = swapAmountFromInput;\n\n let includedFeeInputAmount: BN;\n if (amountLeft.gt(new BN(0))) {\n actualAmountIn = actualAmountIn.sub(amountLeft);\n\n if (feeMode.feesOnInput) {\n const tradeFeeNumerator = getTotalTradingFeeFromExcludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n actualAmountIn,\n tradeDirection,\n maxFeeNumerator\n );\n\n const { includedFeeAmount, feeAmount } = getIncludedFeeAmount(\n tradeFeeNumerator,\n actualAmountIn\n );\n\n const { tradingFee, protocolFee, referralFee, partnerFee } = splitFees(\n poolState.poolFees,\n feeAmount,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n includedFeeInputAmount = includedFeeAmount;\n } else {\n includedFeeInputAmount = actualAmountIn;\n }\n } else {\n includedFeeInputAmount = amountIn;\n }\n\n let actualAmountOut: BN;\n if (feeMode.feesOnInput) {\n actualAmountOut = outputAmount;\n } else {\n const { amount, tradingFee, protocolFee, partnerFee, referralFee } =\n getFeeOnAmount(\n poolState.poolFees,\n outputAmount,\n tradeFeeNumerator,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n actualProtocolFee = protocolFee;\n actualTradingFee = tradingFee;\n actualReferralFee = referralFee;\n actualPartnerFee = partnerFee;\n\n actualAmountOut = amount;\n }\n\n return {\n includedFeeInputAmount,\n excludedFeeInputAmount: actualAmountIn,\n amountLeft,\n outputAmount: actualAmountOut,\n nextSqrtPrice,\n tradingFee: actualTradingFee,\n protocolFee: actualProtocolFee,\n partnerFee: actualPartnerFee,\n referralFee: actualReferralFee,\n };\n}\n\n/**\n * Calculates the swap result from partial input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from partial input\n */\nexport function calculateAtoBFromPartialAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n const maxAmountIn = getAmountAFromLiquidityDelta(\n poolState.sqrtMinPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n let consumedInAmount: BN;\n let nextSqrtPrice: BN;\n\n if (amountIn.gte(maxAmountIn)) {\n consumedInAmount = maxAmountIn;\n nextSqrtPrice = poolState.sqrtMinPrice;\n } else {\n nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n true\n );\n consumedInAmount = amountIn;\n }\n\n const outputAmount = getAmountBFromLiquidityDelta(\n nextSqrtPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n const amountLeft = amountIn.sub(consumedInAmount);\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft,\n };\n}\n\n/**\n * Calculates the swap result from partial input\n * @param poolState - The pool state\n * @param amountIn - The amount in\n * @returns The swap result from partial input\n */\nexport function calculateBtoAFromPartialAmountIn(\n poolState: PoolState,\n amountIn: BN\n): {\n outputAmount: BN;\n nextSqrtPrice: BN;\n amountLeft: BN;\n} {\n const maxAmountIn = getAmountBFromLiquidityDelta(\n poolState.sqrtPrice,\n poolState.sqrtMaxPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n let consumedInAmount: BN;\n let nextSqrtPrice: BN;\n\n if (amountIn.gte(maxAmountIn)) {\n consumedInAmount = maxAmountIn;\n nextSqrtPrice = poolState.sqrtMaxPrice;\n } else {\n nextSqrtPrice = getNextSqrtPriceFromInput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountIn,\n false\n );\n consumedInAmount = amountIn;\n }\n\n const outputAmount = getAmountAFromLiquidityDelta(\n poolState.sqrtPrice,\n nextSqrtPrice,\n poolState.liquidity,\n Rounding.Down\n );\n\n const amountLeft = amountIn.sub(consumedInAmount);\n\n return {\n outputAmount,\n nextSqrtPrice,\n amountLeft,\n };\n}\n\n/**\n * Gets the swap result from exact output\n * @param poolState - The pool state\n * @param amountOut - The amount out\n * @param feeMode - The fee mode\n * @param tradeDirection - The trade direction\n * @param currentPoint - The current point\n * @returns The swap result from exact output\n */\nexport function getSwapResultFromExactOutput(\n poolState: PoolState,\n amountOut: BN,\n feeMode: FeeMode,\n tradeDirection: TradeDirection,\n currentPoint: BN\n): SwapResult2 {\n let actualProtocolFee = new BN(0);\n let actualTradingFee = new BN(0);\n let actualReferralFee = new BN(0);\n let actualPartnerFee = new BN(0);\n\n const maxFeeNumerator = getMaxFeeNumerator(poolState.version);\n\n let includedFeeAmountOut: BN;\n if (feeMode.feesOnInput) {\n includedFeeAmountOut = amountOut;\n } else {\n const tradeFeeNumerator = getTotalTradingFeeFromExcludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n amountOut,\n tradeDirection,\n maxFeeNumerator\n );\n\n const { includedFeeAmount, feeAmount } = getIncludedFeeAmount(\n tradeFeeNumerator,\n amountOut\n );\n\n const split = splitFees(\n poolState.poolFees,\n feeAmount,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualTradingFee = split.tradingFee;\n actualProtocolFee = split.protocolFee;\n actualReferralFee = split.referralFee;\n actualPartnerFee = split.partnerFee;\n\n includedFeeAmountOut = includedFeeAmount;\n }\n\n let swapAmountFromOutput;\n if (tradeDirection === TradeDirection.AtoB) {\n swapAmountFromOutput = calculateAtoBFromAmountOut(\n poolState,\n includedFeeAmountOut\n );\n } else {\n swapAmountFromOutput = calculateBtoAFromAmountOut(\n poolState,\n includedFeeAmountOut\n );\n }\n const { inputAmount, nextSqrtPrice } = swapAmountFromOutput;\n\n let includedFeeInputAmount: BN;\n if (feeMode.feesOnInput) {\n const tradeFeeNumerator = getTotalTradingFeeFromExcludedFeeAmount(\n poolState.poolFees,\n currentPoint,\n poolState.activationPoint,\n inputAmount,\n tradeDirection,\n maxFeeNumerator\n );\n\n const { includedFeeAmount, feeAmount } = getIncludedFeeAmount(\n tradeFeeNumerator,\n inputAmount\n );\n\n const split = splitFees(\n poolState.poolFees,\n feeAmount,\n feeMode.hasReferral,\n hasPartner(poolState)\n );\n\n actualTradingFee = split.tradingFee;\n actualProtocolFee = split.protocolFee;\n actualReferralFee = split.referralFee;\n actualPartnerFee = split.partnerFee;\n\n includedFeeInputAmount = includedFeeAmount;\n } else {\n includedFeeInputAmount = inputAmount;\n }\n\n return {\n amountLeft: new BN(0),\n includedFeeInputAmount: includedFeeInputAmount,\n excludedFeeInputAmount: inputAmount,\n outputAmount: amountOut,\n nextSqrtPrice: nextSqrtPrice,\n tradingFee: actualTradingFee,\n protocolFee: actualProtocolFee,\n partnerFee: actualPartnerFee,\n referralFee: actualReferralFee,\n };\n}\n\n/**\n * Calculates the swap result from exact output\n * @param poolState - The pool state\n * @param amountOut - The amount out\n * @returns The swap result from exact output\n */\nexport function calculateAtoBFromAmountOut(\n poolState: PoolState,\n amountOut: BN\n): { inputAmount: BN; nextSqrtPrice: BN } {\n const nextSqrtPrice = getNextSqrtPriceFromOutput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountOut,\n true\n );\n\n if (nextSqrtPrice.lt(poolState.sqrtMinPrice)) {\n throw new Error(\"Price Range Violation\");\n }\n\n const inputAmount = getAmountAFromLiquidityDelta(\n nextSqrtPrice,\n poolState.sqrtPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n return {\n inputAmount,\n nextSqrtPrice,\n };\n}\n\n/**\n * Calculates the swap result from exact output\n * @param poolState - The pool state\n * @param amountOut - The amount out\n * @returns The swap result from exact output\n */\nexport function calculateBtoAFromAmountOut(\n poolState: PoolState,\n amountOut: BN\n): { inputAmount: BN; nextSqrtPrice: BN } {\n const nextSqrtPrice = getNextSqrtPriceFromOutput(\n poolState.sqrtPrice,\n poolState.liquidity,\n amountOut,\n false\n );\n\n if (nextSqrtPrice.gt(poolState.sqrtMaxPrice)) {\n throw new Error(\"Price Range Violation\");\n }\n\n const inputAmount = getAmountBFromLiquidityDelta(\n poolState.sqrtPrice,\n nextSqrtPrice,\n poolState.liquidity,\n Rounding.Up\n );\n\n return {\n inputAmount,\n nextSqrtPrice,\n };\n}\n\n/**\n * Swaps quote exact input\n * @param pool - The pool\n * @param currentPoint - The current point\n * @param amountIn - The amount in\n * @param slippage - The slippage\n * @param aToB - The trade direction\n * @param hasReferral - The has referral\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @param inputTokenInfo - The input token info\n * @param outputTokenInfo - The output token info\n * @returns The swap quote exact input\n */\nexport function swapQuoteExactInput(\n pool: PoolState,\n currentPoint: BN,\n amountIn: BN,\n slippage: number,\n aToB: boolean,\n hasReferral: boolean,\n tokenADecimal: number,\n tokenBDecimal: number,\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n },\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n }\n): Quote2Result {\n if (amountIn.lte(new BN(0))) {\n throw new Error(\"Amount in must be greater than 0\");\n }\n\n if (!isSwapEnabled(pool, currentPoint)) {\n throw new Error(\"Swap is disabled\");\n }\n\n const tradeDirection = aToB ? TradeDirection.AtoB : TradeDirection.BtoA;\n\n const feeMode = getFeeMode(pool.collectFeeMode, tradeDirection, hasReferral);\n\n let actualAmountIn = amountIn;\n if (inputTokenInfo) {\n actualAmountIn = calculateTransferFeeExcludedAmount(\n amountIn,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount;\n }\n\n const swapResult = getSwapResultFromExactInput(\n pool,\n actualAmountIn,\n feeMode,\n tradeDirection,\n currentPoint\n );\n\n let actualAmountOut = swapResult.outputAmount;\n if (outputTokenInfo) {\n actualAmountOut = calculateTransferFeeExcludedAmount(\n swapResult.outputAmount,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount;\n }\n\n const minimumAmountOut = getAmountWithSlippage(\n actualAmountOut,\n slippage,\n SwapMode.ExactIn\n );\n\n const priceImpact = getPriceImpact(\n actualAmountIn,\n actualAmountOut,\n pool.sqrtPrice,\n aToB,\n tokenADecimal,\n tokenBDecimal\n );\n\n return {\n ...swapResult,\n minimumAmountOut,\n priceImpact,\n };\n}\n\n/**\n * Swaps quote exact output\n * @param pool - The pool\n * @param currentPoint - The current point\n * @param amountOut - The amount out\n * @param slippage - The slippage\n * @param aToB - The trade direction\n * @param hasReferral - The has referral\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @param inputTokenInfo - The input token info\n * @param outputTokenInfo - The output token info\n * @returns The swap quote exact output\n */\nexport function swapQuoteExactOutput(\n pool: PoolState,\n currentPoint: BN,\n amountOut: BN,\n slippage: number,\n aToB: boolean,\n hasReferral: boolean,\n tokenADecimal: number,\n tokenBDecimal: number,\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n },\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n }\n): Quote2Result {\n if (amountOut.lte(new BN(0))) {\n throw new Error(\"Amount out must be greater than 0\");\n }\n\n if (!isSwapEnabled(pool, currentPoint)) {\n throw new Error(\"Swap is disabled\");\n }\n\n const tradeDirection = aToB ? TradeDirection.AtoB : TradeDirection.BtoA;\n\n const feeMode = getFeeMode(pool.collectFeeMode, tradeDirection, hasReferral);\n\n let actualAmountOut = amountOut;\n if (outputTokenInfo) {\n actualAmountOut = calculateTransferFeeIncludedAmount(\n amountOut,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount;\n }\n\n const swapResult = getSwapResultFromExactOutput(\n pool,\n actualAmountOut,\n feeMode,\n tradeDirection,\n currentPoint\n );\n\n let actualAmountIn = swapResult.includedFeeInputAmount;\n if (inputTokenInfo) {\n actualAmountIn = calculateTransferFeeIncludedAmount(\n swapResult.includedFeeInputAmount,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount;\n }\n\n const maximumAmountIn = getAmountWithSlippage(\n actualAmountIn,\n slippage,\n SwapMode.ExactOut\n );\n\n const priceImpact = getPriceImpact(\n actualAmountIn,\n actualAmountOut,\n pool.sqrtPrice,\n aToB,\n tokenADecimal,\n tokenBDecimal\n );\n\n return {\n ...swapResult,\n maximumAmountIn,\n priceImpact,\n };\n}\n\n/**\n * Swaps quote partial input\n * @param pool - The pool\n * @param currentPoint - The current point\n * @param amountIn - The amount in\n * @param slippage - The slippage\n * @param aToB - The trade direction\n * @param hasReferral - The has referral\n * @param tokenADecimal - The token A decimal\n * @param tokenBDecimal - The token B decimal\n * @param inputTokenInfo - The input token info\n * @param outputTokenInfo - The output token info\n * @returns The swap quote partial input\n */\nexport function swapQuotePartialInput(\n pool: PoolState,\n currentPoint: BN,\n amountIn: BN,\n slippage: number,\n aToB: boolean,\n hasReferral: boolean,\n tokenADecimal: number,\n tokenBDecimal: number,\n inputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n },\n outputTokenInfo?: {\n mint: Mint;\n currentEpoch: number;\n }\n): Quote2Result {\n if (amountIn.lte(new BN(0))) {\n throw new Error(\"Amount in must be greater than 0\");\n }\n\n if (!isSwapEnabled(pool, currentPoint)) {\n throw new Error(\"Swap is disabled\");\n }\n\n const tradeDirection = aToB ? TradeDirection.AtoB : TradeDirection.BtoA;\n\n const feeMode = getFeeMode(pool.collectFeeMode, tradeDirection, hasReferral);\n\n let actualAmountIn = amountIn;\n if (inputTokenInfo) {\n actualAmountIn = calculateTransferFeeExcludedAmount(\n amountIn,\n inputTokenInfo.mint,\n inputTokenInfo.currentEpoch\n ).amount;\n }\n\n const swapResult = getSwapResultFromPartialInput(\n pool,\n actualAmountIn,\n feeMode,\n tradeDirection,\n currentPoint\n );\n\n let actualAmountOut = swapResult.outputAmount;\n if (outputTokenInfo) {\n actualAmountOut = calculateTransferFeeExcludedAmount(\n swapResult.outputAmount,\n outputTokenInfo.mint,\n outputTokenInfo.currentEpoch\n ).amount;\n }\n\n const minimumAmountOut = getAmountWithSlippage(\n actualAmountOut,\n slippage,\n SwapMode.PartialFill\n );\n\n const priceImpact = getPriceImpact(\n actualAmountIn,\n actualAmountOut,\n pool.sqrtPrice,\n aToB,\n tokenADecimal,\n tokenBDecimal\n );\n\n return {\n ...swapResult,\n minimumAmountOut,\n priceImpact,\n };\n}\n","import BN from \"bn.js\";\nimport { mulDiv } from \"./utilsMath\";\nimport { SCALE_OFFSET, U64_MAX } from \"../constants\";\nimport { Rounding } from \"../types\";\n\n/**\n * Gets the next sqrt price given a delta of token_b (input), rounding down.\n * √P' = √P + Δb / L\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_b (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountInBRoundingDown(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n // quotient = (amount << (SCALE_OFFSET * 2)) / liquidity\n const quotient = amount.shln(SCALE_OFFSET * 2).div(liquidity);\n\n // result = sqrtPrice + quotient\n const result = sqrtPrice.add(quotient);\n\n return result;\n}\n\n/**\n * Gets the next sqrt price given a delta of token_b (output), rounding down.\n * √P' = √P - Δb / L\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_b (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountOutBRoundingDown(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n // quotient = ceil((amount << (SCALE_OFFSET * 2)) / liquidity)\n const numerator = amount.shln(SCALE_OFFSET * 2);\n const quotient = numerator.add(liquidity).subn(1).div(liquidity);\n\n // result = sqrtPrice - quotient\n const result = sqrtPrice.sub(quotient);\n\n if (result.isNeg()) {\n throw new Error(\"sqrt price cannot be negative\");\n }\n\n return result;\n}\n\n/**\n * Gets the next sqrt price √P' given a delta of token_a, rounding up.\n * √P' = √P * L / (L + Δa * √P)\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_a (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountInARoundingUp(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n if (amount.isZero()) {\n return sqrtPrice;\n }\n\n // product = amountIn * sqrtPrice\n const product = amount.mul(sqrtPrice);\n\n // denominator = liquidity + product\n const denominator = liquidity.add(product);\n\n // result = mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up)\n const result = mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up);\n\n return result;\n}\n\n/**\n * Gets the next sqrt price √P' given a delta of token_a (output), rounding up.\n * √P' = √P * L / (L - Δa * √P)\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amount - delta of token_a (BN)\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromAmountOutARoundingUp(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN\n): BN {\n if (amount.isZero()) {\n return sqrtPrice;\n }\n\n // product = amount * sqrtPrice\n const product = amount.mul(sqrtPrice);\n\n const denominator = liquidity.sub(product);\n if (denominator.lte(new BN(0))) {\n throw new Error(\"MathOverflow: denominator is zero or negative\");\n }\n\n // result = mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up)\n return mulDiv(liquidity, sqrtPrice, denominator, Rounding.Up);\n}\n\n/**\n * Gets the next sqrt price given an output amount of token_a or token_b.\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amountOut - output amount (BN)\n * @param aForB - true if swapping A for B, false if B for A\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromOutput(\n sqrtPrice: BN,\n liquidity: BN,\n amountOut: BN,\n aForB: boolean\n): BN {\n if (sqrtPrice.lte(new BN(0))) {\n throw new Error(\"sqrtPrice must be greater than 0\");\n }\n if (liquidity.lte(new BN(0))) {\n throw new Error(\"liquidity must be greater than 0\");\n }\n\n if (aForB) {\n return getNextSqrtPriceFromAmountOutBRoundingDown(\n sqrtPrice,\n liquidity,\n amountOut\n );\n } else {\n return getNextSqrtPriceFromAmountOutARoundingUp(\n sqrtPrice,\n liquidity,\n amountOut\n );\n }\n}\n\n/**\n * Gets the next sqrt price given an input amount of token_a or token_b\n * @param sqrtPrice - current sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param amountIn - input amount (BN)\n * @param aForB - true if swapping A for B, false if B for A\n * @returns next sqrt price (BN)\n */\nexport function getNextSqrtPriceFromInput(\n sqrtPrice: BN,\n liquidity: BN,\n amountIn: BN,\n aForB: boolean\n): BN {\n if (sqrtPrice.lte(new BN(0))) {\n throw new Error(\"sqrtPrice must be greater than 0\");\n }\n if (liquidity.lte(new BN(0))) {\n throw new Error(\"liquidity must be greater than 0\");\n }\n\n if (aForB) {\n // Rounding up for A to B\n return getNextSqrtPriceFromAmountInARoundingUp(\n sqrtPrice,\n liquidity,\n amountIn\n );\n } else {\n // Rounding down for B to A\n return getNextSqrtPriceFromAmountInBRoundingDown(\n sqrtPrice,\n liquidity,\n amountIn\n );\n }\n}\n\n/**\n * Gets the delta amount of token_b for given liquidity and price range. (getDeltaAmountBUnsigned)\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_b (BN)\n */\nexport function getAmountBFromLiquidityDelta(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n const result = getDeltaAmountBUnsignedUnchecked(\n lowerSqrtPrice,\n upperSqrtPrice,\n liquidity,\n rounding\n );\n\n return result;\n}\n\n/**\n * Gets the delta amount of token_b for given liquidity and price range.\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_b (BN)\n */\nfunction getDeltaAmountBUnsignedUnchecked(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n // delta_sqrt_price = upper_sqrt_price - lower_sqrt_price\n const deltaSqrtPrice = upperSqrtPrice.sub(lowerSqrtPrice);\n const prod = liquidity.mul(deltaSqrtPrice);\n\n const shift = SCALE_OFFSET * 2;\n\n if (rounding === Rounding.Up) {\n // denominator = 1 << (SCALE_OFFSET * 2)\n const denominator = new BN(1).ushln(shift);\n // result = ceil(prod / denominator)\n const result = prod.add(denominator.subn(1)).div(denominator);\n return result;\n } else {\n // result = prod >> (RESOLUTION * 2)\n const result = prod.ushrn(shift);\n return result;\n }\n}\n\n/**\n * Gets the delta amount_a for given liquidity and price range. (getDeltaAmountAUnsigned)\n * `Δa = L * (1 / √P_lower - 1 / √P_upper)`\n * i.e. `L * (√P_upper - √P_lower) / (√P_upper * √P_lower)`\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_a (BN)\n */\nexport function getAmountAFromLiquidityDelta(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n const result = getDeltaAmountAUnsignedUnchecked(\n lowerSqrtPrice,\n upperSqrtPrice,\n liquidity,\n rounding\n );\n\n return result;\n}\n\n/**\n * Computes L * (√P_upper - √P_lower) / (√P_upper * √P_lower)\n * @param lowerSqrtPrice - lower sqrt price (BN)\n * @param upperSqrtPrice - upper sqrt price (BN)\n * @param liquidity - current liquidity (BN)\n * @param rounding - rounding (Rounding)\n * @returns delta amount of token_a (BN)\n */\nfunction getDeltaAmountAUnsignedUnchecked(\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n liquidity: BN,\n rounding: Rounding\n): BN {\n const numerator1 = liquidity;\n const numerator2 = upperSqrtPrice.sub(lowerSqrtPrice);\n\n const denominator = lowerSqrtPrice.mul(upperSqrtPrice);\n\n if (denominator.lte(new BN(0))) {\n throw new Error(\"Denominator must be greater than zero\");\n }\n\n const result = mulDiv(numerator1, numerator2, denominator, rounding);\n return result;\n}\n\n/**\n * Gets the liquidity delta from amount A\n * Δa = L * (1 / √P_lower - 1 / √P_upper)\n * Δa = L * (√P_upper - √P_lower) / (√P_upper * √P_lower)\n * L = Δa * √P_upper * √P_lower / (√P_upper - √P_lower)\n * @param amountA - The amount of token A\n * @param lowerSqrtPrice - The lower sqrt price\n * @param upperSqrtPrice - The upper sqrt price\n * @returns The liquidity delta from amount A\n */\nexport function getLiquidityDeltaFromAmountA(\n amountA: BN,\n lowerSqrtPrice: BN, // current sqrt price\n upperSqrtPrice: BN // max sqrt price\n): BN {\n const product = amountA.mul(lowerSqrtPrice).mul(upperSqrtPrice); // Q128.128\n const denominator = upperSqrtPrice.sub(lowerSqrtPrice); // Q64.64\n\n return product.div(denominator);\n}\n\n/**\n * Gets the liquidity delta from amount B\n * Δb = L (√P_upper - √P_lower)\n * L = Δb / (√P_upper - √P_lower)\n * @param amountB - The amount of token B\n * @param lowerSqrtPrice - The lower sqrt price\n * @param upperSqrtPrice - The upper sqrt price\n * @returns The liquidity delta from amount B\n */\nexport function getLiquidityDeltaFromAmountB(\n amountB: BN,\n lowerSqrtPrice: BN, // min sqrt price\n upperSqrtPrice: BN // current sqrt price,\n): BN {\n const denominator = upperSqrtPrice.sub(lowerSqrtPrice);\n const product = amountB.shln(128);\n return product.div(denominator);\n}\n","import { BN } from \"@coral-xyz/anchor\";\nimport Decimal from \"decimal.js\";\n\n/**\n * Calculates the initial sqrt price\n * a = L * (1/s - 1/pb)\n * b = L * (s - pa)\n * b/a = (s - pa) / (1/s - 1/pb)\n * With: x = 1 / pb and y = b/a\n * => s ^ 2 + s * (-pa + x * y) - y = 0\n * s = [(pa - xy) + √((xy - pa)² + 4y)]/2\n * @param tokenAAmount - The token A amount\n * @param tokenBAmount - The token B amount\n * @param minSqrtPrice - The min sqrt price\n * @param maxSqrtPrice - The max sqrt price\n * @returns The initial sqrt price\n */\nexport function calculateInitSqrtPrice(\n tokenAAmount: BN,\n tokenBAmount: BN,\n minSqrtPrice: BN,\n maxSqrtPrice: BN\n): BN {\n if (tokenAAmount.isZero() || tokenBAmount.isZero()) {\n throw new Error(\"Amount cannot be zero\");\n }\n\n const amountADecimal = new Decimal(tokenAAmount.toString());\n const amountBDecimal = new Decimal(tokenBAmount.toString());\n const minSqrtPriceDecimal = new Decimal(minSqrtPrice.toString()).div(\n Decimal.pow(2, 64)\n );\n const maxSqrtPriceDecimal = new Decimal(maxSqrtPrice.toString()).div(\n Decimal.pow(2, 64)\n );\n\n const x = new Decimal(1).div(maxSqrtPriceDecimal);\n const y = amountBDecimal.div(amountADecimal);\n const xy = x.mul(y);\n\n const paMinusXY = minSqrtPriceDecimal.sub(xy);\n const xyMinusPa = xy.sub(minSqrtPriceDecimal);\n\n const fourY = new Decimal(4).mul(y);\n\n const discriminant = xyMinusPa.mul(xyMinusPa).add(fourY);\n\n // sqrt_discriminant = √discriminant\n const sqrtDiscriminant = discriminant.sqrt();\n const result = paMinusXY\n .add(sqrtDiscriminant)\n .div(new Decimal(2))\n .mul(Decimal.pow(2, 64));\n\n return new BN(result.floor().toFixed());\n}\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport {\n ActivationType,\n BaseFee,\n BaseFeeMode,\n DynamicFee,\n PoolState,\n PoolStatus,\n PoolVersion,\n} from \"../types\";\nimport {\n BASIS_POINT_MAX,\n BIN_STEP_BPS_DEFAULT,\n BIN_STEP_BPS_U128_DEFAULT,\n CURRENT_POOL_VERSION,\n DYNAMIC_FEE_DECAY_PERIOD_DEFAULT,\n DYNAMIC_FEE_FILTER_PERIOD_DEFAULT,\n DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT,\n FEE_DENOMINATOR,\n MAX_PRICE_CHANGE_BPS_DEFAULT,\n MAX_RATE_LIMITER_DURATION_IN_SECONDS,\n MAX_RATE_LIMITER_DURATION_IN_SLOTS,\n MIN_FEE_NUMERATOR,\n ONE_Q64,\n} from \"../constants\";\nimport { getMaxFeeBps, getMaxFeeNumerator } from \"../math\";\nimport Decimal from \"decimal.js\";\n\n/**\n * Checks if the partner is valid\n * @param partner - The partner address\n * @returns True if the partner is valid, false otherwise\n */\nexport function hasPartner(poolState: PoolState): boolean {\n return !poolState.partner.equals(PublicKey.default);\n}\n\n/**\n * Gets the current point\n * @param connection - The connection to the Solana cluster\n * @param activationType - The activation type\n * @returns The current point\n */\nexport async function getCurrentPoint(\n connection: Connection,\n activationType: ActivationType\n): Promise<BN> {\n const currentSlot = await connection.getSlot();\n\n if (activationType === ActivationType.Slot) {\n return new BN(currentSlot);\n } else {\n const currentTime = await connection.getBlockTime(currentSlot);\n return new BN(currentTime);\n }\n}\n\n/**\n * Checks if the swap is enabled\n * @param pool - The pool\n * @param currentPoint - The current point\n * @returns True if the swap is enabled, false otherwise\n */\nexport function isSwapEnabled(\n pool: { poolStatus: PoolStatus; activationPoint: BN },\n currentPoint: BN\n): boolean {\n return (\n pool.poolStatus === PoolStatus.Enable &&\n currentPoint.gte(pool.activationPoint)\n );\n}\n\n/**\n * Converts the value to a fee scheduler second factor\n * @param value - The value to convert\n * @returns The fee scheduler second factor\n */\nexport function convertToFeeSchedulerSecondFactor(value: BN): number[] {\n return Array.from(value.toArrayLike(Buffer, \"le\", 8));\n}\n\n/**\n * Parses the fee scheduler second factor\n * @param secondFactor - The fee scheduler second factor\n * @returns The fee scheduler second factor\n */\nexport function parseFeeSchedulerSecondFactor(secondFactor: number[]): BN {\n return new BN(Buffer.from(secondFactor), \"le\");\n}\n\n/**\n * Converts the value to a rate limiter second factor\n * @param maxLimiterDuration - The max limiter duration\n * @param maxFeeBps - The max fee in basis points\n * @returns The rate limiter second factor\n */\nexport function convertToRateLimiterSecondFactor(\n maxLimiterDuration: BN,\n maxFeeBps: BN\n): number[] {\n const buffer1 = maxLimiterDuration.toArrayLike(Buffer, \"le\", 4); // maxLimiterDuration\n const buffer2 = maxFeeBps.toArrayLike(Buffer, \"le\", 4); // maxFeeBps\n const buffer = Buffer.concat([buffer1, buffer2]);\n return Array.from(buffer);\n}\n\n/**\n * Parses the rate limiter second factor\n * @param secondFactor - The rate limiter second factor\n * @returns The rate limiter second factor\n */\nexport function parseRateLimiterSecondFactor(secondFactor: number[]): {\n maxLimiterDuration: number;\n maxFeeBps: number;\n} {\n const buffer = Buffer.from(secondFactor);\n return {\n maxLimiterDuration: buffer.readUInt32LE(0),\n maxFeeBps: buffer.readUInt32LE(4),\n };\n}\n\n/**\n * Converts basis points (bps) to a fee numerator\n * 1 bps = 0.01% = 0.0001 in decimal\n *\n * @param bps - The value in basis points [1-10_000]\n * @returns The equivalent fee numerator\n */\nexport function bpsToFeeNumerator(bps: number): BN {\n return new BN(bps * FEE_DENOMINATOR).divn(BASIS_POINT_MAX);\n}\n\n/**\n * Converts a fee numerator back to basis points (bps)\n *\n * @param feeNumerator - The fee numerator to convert\n * @returns The equivalent value in basis points [1-10_000]\n */\nexport function feeNumeratorToBps(feeNumerator: BN): number {\n return feeNumerator\n .muln(BASIS_POINT_MAX)\n .div(new BN(FEE_DENOMINATOR))\n .toNumber();\n}\n\n/**\n * Converts the amount to lamports\n * @param amount - The amount to convert\n * @param tokenDecimal - The token decimal\n * @returns The amount in lamports\n */\nexport function convertToLamports(\n amount: number | string,\n tokenDecimal: number\n): BN {\n const valueInLamports = new Decimal(amount).mul(\n Decimal.pow(10, tokenDecimal)\n );\n return fromDecimalToBN(valueInLamports);\n}\n\n/**\n * Converts the value to a BN\n * @param value - The value to convert\n * @returns The value in BN\n */\nexport function fromDecimalToBN(value: Decimal): BN {\n return new BN(value.floor().toFixed());\n}\n\n/**\n * Gets the fee scheduler parameters\n * @param startingBaseFeeBps - The starting base fee in basis points\n * @param endingBaseFeeBps - The ending base fee in basis points\n * @param baseFeeMode - The base fee mode\n * @param numberOfPeriod - The number of periods\n * @param totalDuration - The total duration\n * @param poolVersion - The pool version\n * @returns The fee scheduler parameters\n */\nexport function getFeeSchedulerParams(\n startingBaseFeeBps: number,\n endingBaseFeeBps: number,\n baseFeeMode: BaseFeeMode,\n numberOfPeriod: number,\n totalDuration: number\n): BaseFee {\n if (startingBaseFeeBps == endingBaseFeeBps) {\n if (numberOfPeriod != 0 || totalDuration != 0) {\n throw new Error(\"numberOfPeriod and totalDuration must both be zero\");\n }\n\n return {\n cliffFeeNumerator: bpsToFeeNumerator(startingBaseFeeBps),\n firstFactor: 0,\n secondFactor: Array.from(new BN(0).toArrayLike(Buffer, \"le\", 8)),\n thirdFactor: new BN(0),\n baseFeeMode: BaseFeeMode.FeeSchedulerLinear,\n };\n }\n\n if (numberOfPeriod <= 0) {\n throw new Error(\"Total periods must be greater than zero\");\n }\n\n const poolMaxFeeBps = getMaxFeeBps(CURRENT_POOL_VERSION);\n\n if (startingBaseFeeBps > poolMaxFeeBps) {\n throw new Error(\n `startingBaseFeeBps (${startingBaseFeeBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps`\n );\n }\n\n if (endingBaseFeeBps > startingBaseFeeBps) {\n throw new Error(\n \"endingBaseFeeBps bps must be less than or equal to startingBaseFeeBps bps\"\n );\n }\n\n if (numberOfPeriod == 0 || totalDuration == 0) {\n throw new Error(\n \"numberOfPeriod and totalDuration must both greater than zero\"\n );\n }\n\n const maxBaseFeeNumerator = bpsToFeeNumerator(startingBaseFeeBps);\n\n const minBaseFeeNumerator = bpsToFeeNumerator(endingBaseFeeBps);\n\n const periodFrequency = new BN(totalDuration / numberOfPeriod);\n\n const secondFactor = convertToFeeSchedulerSecondFactor(periodFrequency);\n\n let reductionFactor: BN;\n if (baseFeeMode == BaseFeeMode.FeeSchedulerLinear) {\n const totalReduction = maxBaseFeeNumerator.sub(minBaseFeeNumerator);\n reductionFactor = totalReduction.divn(numberOfPeriod);\n } else {\n const ratio =\n minBaseFeeNumerator.toNumber() / maxBaseFeeNumerator.toNumber();\n const decayBase = Math.pow(ratio, 1 / numberOfPeriod);\n reductionFactor = new BN(BASIS_POINT_MAX * (1 - decayBase));\n }\n\n return {\n cliffFeeNumerator: maxBaseFeeNumerator,\n firstFactor: numberOfPeriod,\n secondFactor,\n thirdFactor: reductionFactor,\n baseFeeMode,\n };\n}\n\n/**\n * Gets the rate limiter parameters\n * @param baseFeeBps - The base fee in basis points\n * @param feeIncrementBps - The fee increment in basis points\n * @param referenceAmount - The reference amount\n * @param maxLimiterDuration - The max limiter duration\n * @param maxFeeBps - The max fee in basis points\n * @param tokenBDecimal - The token B decimal\n * @param activationType - The activation type\n * @param poolVersion - The pool version\n * @returns The rate limiter parameters\n */\nexport function getRateLimiterParams(\n baseFeeBps: number,\n feeIncrementBps: number,\n referenceAmount: number,\n maxLimiterDuration: number,\n maxFeeBps: number,\n tokenBDecimal: number,\n activationType: ActivationType\n): BaseFee {\n const cliffFeeNumerator = bpsToFeeNumerator(baseFeeBps);\n const feeIncrementNumerator = bpsToFeeNumerator(feeIncrementBps);\n\n if (\n baseFeeBps <= 0 ||\n feeIncrementBps <= 0 ||\n referenceAmount <= 0 ||\n maxLimiterDuration <= 0\n ) {\n throw new Error(\"All rate limiter parameters must be greater than zero\");\n }\n\n const poolMaxFeeBps = getMaxFeeBps(CURRENT_POOL_VERSION);\n const poolMaxFeeNumerator = getMaxFeeNumerator(CURRENT_POOL_VERSION);\n\n if (baseFeeBps > poolMaxFeeBps) {\n throw new Error(\n `Base fee (${baseFeeBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps`\n );\n }\n\n if (feeIncrementBps > poolMaxFeeBps) {\n throw new Error(\n `Fee increment (${feeIncrementBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps`\n );\n }\n\n if (feeIncrementNumerator.gte(new BN(FEE_DENOMINATOR))) {\n throw new Error(\n \"Fee increment numerator must be less than FEE_DENOMINATOR\"\n );\n }\n\n if (maxFeeBps > poolMaxFeeBps) {\n throw new Error(\n `Max fee (${maxFeeBps} bps) exceeds maximum allowed value of ${poolMaxFeeBps} bps for PoolVersion V${CURRENT_POOL_VERSION}`\n );\n }\n\n const deltaNumerator = new BN(poolMaxFeeNumerator).sub(cliffFeeNumerator);\n const maxIndex = deltaNumerator.div(feeIncrementNumerator);\n if (maxIndex.lt(new BN(1))) {\n throw new Error(\"Fee increment is too large for the given base fee\");\n }\n\n if (\n cliffFeeNumerator.lt(new BN(MIN_FEE_NUMERATOR)) ||\n cliffFeeNumerator.gt(new BN(poolMaxFeeNumerator))\n ) {\n throw new Error(\"Base fee must be between 0.01% and 99%\");\n }\n\n const maxDuration =\n activationType === ActivationType.Slot\n ? MAX_RATE_LIMITER_DURATION_IN_SLOTS\n : MAX_RATE_LIMITER_DURATION_IN_SECONDS;\n\n if (maxLimiterDuration > maxDuration) {\n throw new Error(\n `Max duration exceeds maximum allowed value of ${maxDuration}`\n );\n }\n\n const referenceAmountInLamports = convertToLamports(\n referenceAmount,\n tokenBDecimal\n );\n\n const secondFactor = convertToRateLimiterSecondFactor(\n new BN(maxLimiterDuration),\n new BN(maxFeeBps)\n );\n\n return {\n cliffFeeNumerator,\n firstFactor: feeIncrementBps,\n secondFactor,\n thirdFactor: new BN(referenceAmountInLamports),\n baseFeeMode: BaseFeeMode.RateLimiter,\n };\n}\n\n/**\n * Gets the base fee parameters\n * @param baseFeeParams - The base fee parameters\n * @param tokenBDecimal - The token B decimal\n * @param activationType - The activation type\n * @param poolVersion - The pool version\n * @returns The base fee parameters\n */\nexport function getBaseFeeParams(\n baseFeeParams: {\n baseFeeMode: BaseFeeMode;\n rateLimiterParam?: {\n baseFeeBps: number;\n feeIncrementBps: number;\n referenceAmount: number;\n maxLimiterDuration: number;\n maxFeeBps: number;\n };\n feeSchedulerParam?: {\n startingFeeBps: number;\n endingFeeBps: number;\n numberOfPeriod: number;\n totalDuration: number;\n };\n },\n tokenBDecimal: number,\n activationType: ActivationType\n): BaseFee {\n if (baseFeeParams.baseFeeMode === BaseFeeMode.RateLimiter) {\n if (!baseFeeParams.rateLimiterParam) {\n throw new Error(\n \"Rate limiter parameters are required for RateLimiter mode\"\n );\n }\n const {\n baseFeeBps,\n feeIncrementBps,\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n } = baseFeeParams.rateLimiterParam;\n\n return getRateLimiterParams(\n baseFeeBps,\n feeIncrementBps,\n referenceAmount,\n maxLimiterDuration,\n maxFeeBps,\n tokenBDecimal,\n activationType\n );\n } else {\n if (!baseFeeParams.feeSchedulerParam) {\n throw new Error(\n \"Fee scheduler parameters are required for FeeScheduler mode\"\n );\n }\n const { startingFeeBps, endingFeeBps, numberOfPeriod, totalDuration } =\n baseFeeParams.feeSchedulerParam;\n\n return getFeeSchedulerParams(\n startingFeeBps,\n endingFeeBps,\n baseFeeParams.baseFeeMode,\n numberOfPeriod,\n totalDuration\n );\n }\n}\n\n/**\n * Gets the dynamic fee parameters\n * @param baseFeeBps - The base fee in basis points\n * @param maxPriceChangeBps - The max price change in basis points\n * @returns The dynamic fee parameters\n */\nexport function getDynamicFeeParams(\n baseFeeBps: number,\n maxPriceChangeBps: number = MAX_PRICE_CHANGE_BPS_DEFAULT // default 15%\n): DynamicFee {\n if (maxPriceChangeBps > MAX_PRICE_CHANGE_BPS_DEFAULT) {\n throw new Error(\n `maxPriceChangeBps (${maxPriceChangeBps} bps) must be less than or equal to ${MAX_PRICE_CHANGE_BPS_DEFAULT}`\n );\n }\n\n const priceRatio = maxPriceChangeBps / BASIS_POINT_MAX + 1;\n // Q64\n const sqrtPriceRatioQ64 = new BN(\n Decimal.sqrt(priceRatio.toString())\n .mul(Decimal.pow(2, 64))\n .floor()\n .toFixed()\n );\n const deltaBinId = sqrtPriceRatioQ64\n .sub(ONE_Q64)\n .div(BIN_STEP_BPS_U128_DEFAULT)\n .muln(2);\n\n const maxVolatilityAccumulator = new BN(deltaBinId.muln(BASIS_POINT_MAX));\n\n const squareVfaBin = maxVolatilityAccumulator\n .mul(new BN(BIN_STEP_BPS_DEFAULT))\n .pow(new BN(2));\n\n const baseFeeNumerator = new BN(bpsToFeeNumerator(baseFeeBps));\n const maxDynamicFeeNumerator = baseFeeNumerator.muln(20).divn(100); // default max dynamic fee = 20% of base fee.\n const vFee = maxDynamicFeeNumerator\n .mul(new BN(100_000_000_000))\n .sub(new BN(99_999_999_999));\n\n const variableFeeControl = vFee.div(squareVfaBin);\n\n return {\n binStep: BIN_STEP_BPS_DEFAULT,\n binStepU128: BIN_STEP_BPS_U128_DEFAULT,\n filterPeriod: DYNAMIC_FEE_FILTER_PERIOD_DEFAULT,\n decayPeriod: DYNAMIC_FEE_DECAY_PERIOD_DEFAULT,\n reductionFactor: DYNAMIC_FEE_REDUCTION_FACTOR_DEFAULT,\n maxVolatilityAccumulator: maxVolatilityAccumulator.toNumber(),\n variableFeeControl: variableFeeControl.toNumber(),\n };\n}\n"]}
|