{"version":3,"sources":["../../../src/raydium/tradeV2/instrument.ts","../../../src/raydium/clmm/clmm.ts","../../../node_modules/decimal.js/decimal.mjs","../../../src/common/logger.ts","../../../src/common/utility.ts","../../../src/module/amount.ts","../../../src/common/bignumber.ts","../../../src/module/token.ts","../../../src/common/pubKey.ts","../../../src/raydium/token/constant.ts","../../../src/module/fraction.ts","../../../src/module/formatter.ts","../../../src/module/price.ts","../../../src/module/currency.ts","../../../src/module/percent.ts","../../../src/common/txTool/txTool.ts","../../../src/common/txTool/txType.ts","../../../src/common/txTool/txUtils.ts","../../../src/common/txTool/lookupTable.ts","../../../src/common/accountInfo.ts","../../../src/common/lodash.ts","../../../src/common/programId.ts","../../../src/common/pda.ts","../../../src/common/transfer.ts","../../../src/raydium/clmm/utils/constants.ts","../../../src/raydium/clmm/utils/math.ts","../../../src/raydium/clmm/utils/util.ts","../../../src/raydium/clmm/utils/pda.ts","../../../src/raydium/clmm/utils/pool.ts","../../../src/raydium/clmm/utils/tick.ts","../../../src/marshmallow/index.ts","../../../src/marshmallow/buffer-layout.ts","../../../src/raydium/clmm/utils/tickarrayBitmap.ts","../../../src/raydium/clmm/layout.ts","../../../src/raydium/clmm/utils/tickQuery.ts","../../../src/raydium/clmm/utils/position.ts","../../../src/raydium/clmm/instrument.ts","../../../src/raydium/account/util.ts","../../../src/raydium/account/layout.ts","../../../node_modules/@noble/hashes/src/_assert.ts","../../../node_modules/@noble/hashes/src/utils.ts","../../../node_modules/@noble/hashes/src/_md.ts","../../../node_modules/@noble/hashes/src/sha256.ts","../../../src/raydium/liquidity/instruction.ts","../../../src/raydium/liquidity/layout.ts","../../../src/raydium/liquidity/stable.ts"],"sourcesContent":["import { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, TransactionInstruction, SystemProgram, AccountMeta } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { ClmmInstrument, ONE, MIN_SQRT_PRICE_X64, MAX_SQRT_PRICE_X64, getPdaExBitmapAccount } from \"../clmm\";\nimport { InstructionType, jsonInfo2PoolKeys, MEMO_PROGRAM_ID } from \"@/common\";\nimport { struct, u64, u8 } from \"@/marshmallow\";\nimport { makeAMMSwapInstruction } from \"../liquidity/instruction\";\n\nimport { ApiV3PoolInfoItem, ApiV3PoolInfoConcentratedItem, PoolKeys, ClmmKeys, AmmV4Keys, AmmV5Keys } from \"@/api/type\";\nimport { ComputeAmountOutLayout, ReturnTypeMakeSwapInstruction } from \"./type\";\n\nexport function route1Instruction(\n  programId: PublicKey,\n  poolInfoA: ApiV3PoolInfoItem,\n  poolKeyA: PoolKeys,\n  poolKeyB: PoolKeys,\n\n  userSourceToken: PublicKey,\n  userRouteToken: PublicKey,\n  // userDestinationToken: PublicKey,\n  userPdaAccount: PublicKey,\n  ownerWallet: PublicKey,\n\n  inputMint: PublicKey,\n\n  amountIn: BN,\n  amountOut: BN,\n\n  tickArrayA?: PublicKey[],\n  // tickArrayB?: PublicKey[],\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"instruction\"), u64(\"amountIn\"), u64(\"amountOut\")]);\n\n  const keys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = [\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(poolKeyA.programId), isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(poolKeyA.id), isSigner: false, isWritable: true },\n    { pubkey: new PublicKey(poolKeyB.id), isSigner: false, isWritable: true },\n\n    { pubkey: userSourceToken, isSigner: false, isWritable: true },\n    { pubkey: userRouteToken, isSigner: false, isWritable: true },\n    { pubkey: userPdaAccount, isSigner: false, isWritable: true },\n    { pubkey: ownerWallet, isSigner: true, isWritable: false },\n  ];\n\n  if (poolInfoA.type === \"Concentrated\") {\n    const poolKey = jsonInfo2PoolKeys(poolKeyA as ClmmKeys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        {\n          pubkey: poolKey.mintA.address.equals(inputMint) ? poolKey.vault.A : poolKey.vault.B,\n          isSigner: false,\n          isWritable: true,\n        },\n        {\n          pubkey: poolKey.mintA.address.equals(inputMint) ? poolKey.vault.B : poolKey.vault.A,\n          isSigner: false,\n          isWritable: true,\n        },\n        // { pubkey: poolKey.observationId, isSigner: false, isWritable: true }, // to do\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        ...tickArrayA!.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      ],\n    );\n  } else if (poolInfoA.pooltype.includes(\"StablePool\")) {\n    const poolKey = jsonInfo2PoolKeys(poolKeyA as AmmV5Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      ],\n    );\n  } else {\n    const poolKey = jsonInfo2PoolKeys(poolKeyA as AmmV4Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n          ? [\n              { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n              { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n            ]\n          : [\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n            ]),\n      ],\n    );\n  }\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      instruction: 4,\n      amountIn,\n      amountOut,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\nexport function route2Instruction(\n  programId: PublicKey,\n  poolInfoB: ApiV3PoolInfoItem,\n  poolKeyA: PoolKeys,\n  poolKeyB: PoolKeys,\n\n  // userSourceToken: PublicKey,\n  userRouteToken: PublicKey,\n  userDestinationToken: PublicKey,\n  userPdaAccount: PublicKey,\n  ownerWallet: PublicKey,\n\n  routeMint: PublicKey,\n\n  // tickArrayA?: PublicKey[],\n  tickArrayB?: PublicKey[],\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"instruction\")]);\n\n  const keys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = [\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(String(poolKeyB.programId)), isSigner: false, isWritable: false },\n    { pubkey: new PublicKey(String(poolKeyB.id)), isSigner: false, isWritable: true },\n    { pubkey: new PublicKey(String(poolKeyA.id)), isSigner: false, isWritable: true },\n\n    { pubkey: userRouteToken, isSigner: false, isWritable: true },\n    { pubkey: userDestinationToken, isSigner: false, isWritable: true },\n    { pubkey: userPdaAccount, isSigner: false, isWritable: true },\n    { pubkey: ownerWallet, isSigner: true, isWritable: false },\n  ];\n\n  if (poolInfoB.type === \"Concentrated\") {\n    const poolKey = jsonInfo2PoolKeys(poolKeyB as ClmmKeys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        {\n          pubkey: poolKey.mintA.address.equals(routeMint) ? poolKey.vault.A : poolKey.vault.B,\n          isSigner: false,\n          isWritable: true,\n        },\n        {\n          pubkey: poolKey.mintA.address.equals(routeMint) ? poolKey.vault.B : poolKey.vault.A,\n          isSigner: false,\n          isWritable: true,\n        },\n        // { pubkey: poolKey.observationId, isSigner: false, isWritable: true }, // to do\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        ...tickArrayB!.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      ],\n    );\n  } else if (poolInfoB.pooltype.includes(\"StablePool\")) {\n    const poolKey = jsonInfo2PoolKeys(poolKeyB as AmmV5Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n        { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      ],\n    );\n  } else {\n    const poolKey = jsonInfo2PoolKeys(poolKeyB as AmmV4Keys);\n    keys.push(\n      ...[\n        { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n        { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: false },\n        { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n        { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n        { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n        ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n          ? [\n              { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n              { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n            ]\n          : [\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n              { pubkey: poolKey.id, isSigner: false, isWritable: true },\n            ]),\n      ],\n    );\n  }\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      instruction: 5,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\nfunction makeInnerInsKey(\n  itemPool: ApiV3PoolInfoItem,\n  itemPoolKey: PoolKeys,\n  inMint: string,\n  userInAccount: PublicKey,\n  userOutAccount: PublicKey,\n  remainingAccount: PublicKey[] | undefined,\n): AccountMeta[] {\n  if (itemPool.pooltype.includes(\"StablePool\")) {\n    const poolKey = jsonInfo2PoolKeys(itemPoolKey as AmmV5Keys);\n\n    return [\n      { pubkey: poolKey.programId, isSigner: false, isWritable: false },\n      { pubkey: userInAccount, isSigner: false, isWritable: true },\n      { pubkey: userOutAccount, isSigner: false, isWritable: true },\n\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n      { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\"), isSigner: false, isWritable: false },\n      { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n    ];\n  } else if (itemPool.type === \"Concentrated\") {\n    const pool = itemPool as ApiV3PoolInfoConcentratedItem;\n    const poolKey = jsonInfo2PoolKeys(itemPoolKey as ClmmKeys);\n    const baseIn = pool.mintA.address === inMint;\n    return [\n      { pubkey: new PublicKey(String(itemPool.programId)), isSigner: false, isWritable: false },\n      { pubkey: userInAccount, isSigner: false, isWritable: true },\n      { pubkey: userOutAccount, isSigner: false, isWritable: true },\n      { pubkey: poolKey.config.id, isSigner: false, isWritable: false },\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: baseIn ? poolKey.vault.A : poolKey.vault.B, isSigner: false, isWritable: true },\n      { pubkey: baseIn ? poolKey.vault.B : poolKey.vault.A, isSigner: false, isWritable: true },\n      // { pubkey: itemPool.observationId, isSigner: false, isWritable: true }, // to do\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      ...(poolKey.mintA.programId.equals(TOKEN_2022_PROGRAM_ID) || poolKey.mintB.programId.equals(TOKEN_2022_PROGRAM_ID)\n        ? [\n            { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n            { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n            { pubkey: baseIn ? poolKey.mintA.address : poolKey.mintB.address, isSigner: false, isWritable: false },\n            { pubkey: baseIn ? poolKey.mintB.address : poolKey.mintA.address, isSigner: false, isWritable: false },\n          ]\n        : []),\n      ...(remainingAccount ?? []).map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      {\n        pubkey: getPdaExBitmapAccount(new PublicKey(String(itemPool.programId)), new PublicKey(itemPool.id)).publicKey,\n        isSigner: false,\n        isWritable: true,\n      },\n    ];\n  } else {\n    const poolKey = jsonInfo2PoolKeys(itemPoolKey as AmmV4Keys);\n\n    return [\n      { pubkey: poolKey.programId, isSigner: false, isWritable: false },\n      { pubkey: userInAccount, isSigner: false, isWritable: true },\n      { pubkey: userOutAccount, isSigner: false, isWritable: true },\n\n      { pubkey: poolKey.id, isSigner: false, isWritable: true },\n      { pubkey: poolKey.authority, isSigner: false, isWritable: false },\n      { pubkey: poolKey.marketProgramId, isSigner: false, isWritable: false },\n      { pubkey: poolKey.marketAuthority, isSigner: false, isWritable: false },\n\n      { pubkey: poolKey.openOrders, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.A, isSigner: false, isWritable: true },\n      { pubkey: poolKey.vault.B, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketId, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketBids, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketAsks, isSigner: false, isWritable: true },\n      { pubkey: poolKey.marketEventQueue, isSigner: false, isWritable: true },\n      ...(poolKey.marketProgramId.toString() === \"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\"\n        ? [\n            { pubkey: poolKey.marketBaseVault, isSigner: false, isWritable: true },\n            { pubkey: poolKey.marketQuoteVault, isSigner: false, isWritable: true },\n          ]\n        : [\n            { pubkey: poolKey.id, isSigner: false, isWritable: true },\n            { pubkey: poolKey.id, isSigner: false, isWritable: true },\n          ]),\n    ];\n  }\n}\n\nexport function routeInstruction(\n  programId: PublicKey,\n  wallet: PublicKey,\n\n  userSourceToken: PublicKey,\n  userRouteToken: PublicKey,\n  userDestinationToken: PublicKey,\n\n  inputMint: string,\n  routeMint: string,\n\n  poolInfoA: ApiV3PoolInfoItem,\n  poolInfoB: ApiV3PoolInfoItem,\n\n  poolKeyA: PoolKeys,\n  poolKeyB: PoolKeys,\n\n  amountIn: BN,\n  amountOut: BN,\n\n  remainingAccounts: (PublicKey[] | undefined)[],\n): TransactionInstruction {\n  const dataLayout = struct([u8(\"instruction\"), u64(\"amountIn\"), u64(\"amountOut\")]);\n\n  const keys: { pubkey: PublicKey; isSigner: boolean; isWritable: boolean }[] = [\n    { pubkey: wallet, isSigner: true, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  keys.push(...makeInnerInsKey(poolInfoA, poolKeyA, inputMint, userSourceToken, userRouteToken, remainingAccounts[0]));\n\n  keys.push(\n    ...makeInnerInsKey(poolInfoB, poolKeyB, routeMint, userRouteToken, userDestinationToken, remainingAccounts[1]),\n  );\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      instruction: 8,\n      amountIn,\n      amountOut,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data,\n  });\n}\n\ntype MakeSwapInstructionParam = {\n  ownerInfo: {\n    wallet: PublicKey;\n    // tokenAccountA: PublicKey\n    // tokenAccountB: PublicKey\n\n    sourceToken: PublicKey;\n    routeToken?: PublicKey;\n    destinationToken: PublicKey;\n  };\n\n  inputMint: PublicKey;\n  routeProgram: PublicKey;\n\n  swapInfo: ComputeAmountOutLayout;\n};\n\nexport async function makeSwapInstruction({\n  routeProgram,\n  ownerInfo,\n  inputMint,\n  swapInfo,\n}: MakeSwapInstructionParam): Promise<ReturnTypeMakeSwapInstruction> {\n  if (swapInfo.routeType === \"amm\") {\n    if (swapInfo.poolInfo[0].type === \"Concentrated\") {\n      const _poolKey = jsonInfo2PoolKeys(swapInfo.poolKey[0] as ClmmKeys);\n      const sqrtPriceLimitX64 = inputMint.equals(_poolKey.mintA.address)\n        ? MIN_SQRT_PRICE_X64.add(ONE)\n        : MAX_SQRT_PRICE_X64.sub(ONE);\n\n      return await ClmmInstrument.makeSwapBaseInInstructions({\n        poolInfo: _poolKey as any,\n        poolKeys: _poolKey as any,\n        ownerInfo: {\n          wallet: ownerInfo.wallet,\n          tokenAccountA: _poolKey.mintA.address.equals(inputMint) ? ownerInfo.sourceToken : ownerInfo.destinationToken,\n          tokenAccountB: _poolKey.mintA.address.equals(inputMint) ? ownerInfo.destinationToken : ownerInfo.sourceToken,\n        },\n        inputMint,\n        amountIn: swapInfo.amountIn.amount.raw,\n        amountOutMin: swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n        sqrtPriceLimitX64,\n        remainingAccounts: swapInfo.remainingAccounts[0],\n      });\n    } else {\n      const _poolKey = swapInfo.poolKey[0] as AmmV4Keys | AmmV5Keys;\n\n      return {\n        signers: [],\n        instructions: [\n          makeAMMSwapInstruction({\n            poolKeys: _poolKey,\n            version: swapInfo.poolInfo[0].pooltype.includes(\"StablePool\") ? 5 : 4,\n            userKeys: {\n              tokenAccountIn: ownerInfo.sourceToken,\n              tokenAccountOut: ownerInfo.destinationToken,\n              owner: ownerInfo.wallet,\n            },\n            amountIn: swapInfo.amountIn.amount.raw,\n            amountOut: swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n            fixedSide: \"in\",\n          }),\n        ],\n        lookupTableAddress: _poolKey.lookupTableAccount ? [_poolKey.lookupTableAccount] : [],\n        instructionTypes: [\n          swapInfo.poolInfo[0].pooltype.includes(\"StablePool\")\n            ? InstructionType.AmmV5SwapBaseIn\n            : InstructionType.AmmV4SwapBaseIn,\n        ],\n        address: {},\n      };\n    }\n  } else if (swapInfo.routeType === \"route\") {\n    const poolInfo1 = swapInfo.poolInfo[0];\n    const poolInfo2 = swapInfo.poolInfo[1];\n    const poolKey1 = swapInfo.poolKey[0];\n    const poolKey2 = swapInfo.poolKey[1];\n\n    if (ownerInfo.routeToken === undefined) throw Error(\"owner route token account check error\");\n\n    return {\n      signers: [],\n      instructions: [\n        routeInstruction(\n          routeProgram,\n          ownerInfo.wallet,\n          ownerInfo.sourceToken,\n          ownerInfo.routeToken,\n          ownerInfo.destinationToken,\n\n          inputMint.toString(),\n          swapInfo.minMiddleAmountFee!.token.mint.toString(),\n\n          poolInfo1,\n          poolInfo2,\n          poolKey1,\n          poolKey2,\n\n          swapInfo.amountIn.amount.raw,\n          swapInfo.minAmountOut.amount.raw.sub(swapInfo.minAmountOut.fee?.raw ?? new BN(0)),\n\n          swapInfo.remainingAccounts,\n        ),\n      ],\n      instructionTypes: [InstructionType.RouteSwap],\n      lookupTableAddress: [poolKey1.lookupTableAccount, poolKey2.lookupTableAccount].filter(\n        (a) => a !== undefined,\n      ) as string[],\n      address: {},\n    };\n  } else {\n    throw Error(\"route type error\");\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport Decimal from \"decimal.js\";\nimport { InstructionType, WSOLMint, getTransferAmountFee } from \"@/common\";\nimport { Percent } from \"@/module/percent\";\nimport { ApiV3PoolInfoConcentratedItem, ClmmKeys } from \"@/api/type\";\nimport { MakeTxData, MakeMultiTxData } from \"@/common/txTool/txTool\";\nimport { TxVersion } from \"@/common/txTool/txType\";\nimport { getATAAddress } from \"@/common\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { mockV3CreatePoolInfo, MAX_SQRT_PRICE_X64, MIN_SQRT_PRICE_X64, ONE } from \"./utils/constants\";\nimport { SqrtPriceMath } from \"./utils/math\";\nimport { PoolUtils } from \"./utils/pool\";\nimport {\n  CreateConcentratedPool,\n  IncreasePositionFromLiquidity,\n  IncreasePositionFromBase,\n  DecreaseLiquidity,\n  OpenPositionFromBase,\n  OpenPositionFromLiquidity,\n  InitRewardParams,\n  InitRewardsParams,\n  SetRewardParams,\n  SetRewardsParams,\n  CollectRewardParams,\n  CollectRewardsParams,\n  ManipulateLiquidityExtInfo,\n  ReturnTypeComputeAmountOutBaseOut,\n  OpenPositionFromLiquidityExtInfo,\n  OpenPositionFromBaseExtInfo,\n  ClosePositionExtInfo,\n  InitRewardExtInfo,\n  HarvestAllRewardsParams,\n} from \"./type\";\nimport { ClmmInstrument } from \"./instrument\";\nimport { LoadParams, MakeTransaction, ReturnTypeFetchMultipleMintInfos } from \"../type\";\nimport { MathUtil } from \"./utils/math\";\nimport { TickArray } from \"./utils/tick\";\nimport { getPdaOperationAccount } from \"./utils/pda\";\nimport { ClmmPositionLayout, OperationLayout } from \"./layout\";\nimport BN from \"bn.js\";\n\nexport class Clmm extends ModuleBase {\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async load(params?: LoadParams): Promise<void> {\n    await this.scope.token.load(params);\n  }\n\n  public async createPool<T extends TxVersion>(\n    props: CreateConcentratedPool<T>,\n  ): Promise<MakeTxData<T, { mockPoolInfo: ApiV3PoolInfoConcentratedItem; address: ClmmKeys }>> {\n    const {\n      programId,\n      owner = this.scope.owner?.publicKey || PublicKey.default,\n      mint1,\n      mint2,\n      ammConfig,\n      initialPrice,\n      startTime,\n      computeBudgetConfig,\n      forerunCreate,\n      txVersion,\n    } = props;\n    const txBuilder = this.createTxBuilder();\n    const [mintA, mintB, initPrice] = new BN(new PublicKey(mint1.address).toBuffer()).gt(\n      new BN(new PublicKey(mint2.address).toBuffer()),\n    )\n      ? [mint2, mint1, new Decimal(1).div(initialPrice)]\n      : [mint1, mint2, initialPrice];\n\n    const initialPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(initPrice, mintA.decimals, mintB.decimals);\n\n    const insInfo = await ClmmInstrument.createPoolInstructions({\n      connection: this.scope.connection,\n      programId,\n      owner,\n      mintA,\n      mintB,\n      ammConfigId: ammConfig.id,\n      initialPriceX64,\n      startTime,\n      forerunCreate,\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild<{\n      mockPoolInfo: ApiV3PoolInfoConcentratedItem;\n      address: ClmmKeys;\n      forerunCreate?: boolean;\n    }>({\n      txVersion,\n      extInfo: {\n        address: {\n          ...insInfo.address,\n          programId: programId.toString(),\n          id: insInfo.address.poolId.toString(),\n          mintA,\n          mintB,\n          openTime: startTime.toNumber(),\n          vault: { A: insInfo.address.mintAVault.toString(), B: insInfo.address.mintBVault.toString() },\n          rewardInfos: [],\n          config: {\n            id: ammConfig.id.toString(),\n            index: ammConfig.index,\n            protocolFeeRate: ammConfig.protocolFeeRate,\n            tradeFeeRate: ammConfig.tradeFeeRate,\n            tickSpacing: ammConfig.tickSpacing,\n            fundFeeRate: ammConfig.fundFeeRate,\n            description: ammConfig.description,\n            defaultRange: 0,\n            defaultRangePoint: [],\n          },\n        },\n        mockPoolInfo: {\n          type: \"Concentrated\",\n          id: insInfo.address.poolId.toString(),\n          mintA,\n          mintB,\n          feeRate: ammConfig.tradeFeeRate,\n          openTime: startTime.toNumber(),\n          programId: programId.toString(),\n          price: initPrice.toNumber(),\n          config: {\n            id: ammConfig.id.toString(),\n            index: ammConfig.index,\n            protocolFeeRate: ammConfig.protocolFeeRate,\n            tradeFeeRate: ammConfig.tradeFeeRate,\n            tickSpacing: ammConfig.tickSpacing,\n            fundFeeRate: ammConfig.fundFeeRate,\n            description: ammConfig.description,\n            defaultRange: 0,\n            defaultRangePoint: [],\n          },\n          ...mockV3CreatePoolInfo,\n        },\n        forerunCreate,\n      },\n    }) as Promise<MakeTxData<T, { mockPoolInfo: ApiV3PoolInfoConcentratedItem; address: ClmmKeys }>>;\n  }\n\n  public async openPositionFromBase<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    base,\n    baseAmount,\n    otherAmountMax,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    withMetadata = \"create\",\n    getEphemeralSigners,\n    computeBudgetConfig,\n    txVersion,\n  }: OpenPositionFromBase<T>): Promise<MakeTxData<T, OpenPositionFromBaseExtInfo>> {\n    if (this.scope.availability.addConcentratedPosition === false)\n      this.logAndCreateError(\"add position feature disabled in your region\");\n\n    this.scope.checkOwner();\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | null = null;\n    let ownerTokenAccountB: PublicKey | null = null;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n    const [amountA, amountB] = base === \"MintA\" ? [baseAmount, otherAmountMax] : [otherAmountMax, baseAmount];\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || amountA.isZero()\n            ? {\n                payer: this.scope.ownerPubKey,\n                amount: amountA,\n              }\n            : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        notUseTokenAccount: mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || amountB.isZero()\n            ? {\n                payer: this.scope.ownerPubKey!,\n                amount: amountB,\n              }\n            : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (!ownerTokenAccountA || !ownerTokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    const poolKeys = propPoolKeys || ((await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys);\n    const insInfo = await ClmmInstrument.openPositionFromBaseInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        ...ownerInfo,\n        feePayer: this.scope.ownerPubKey,\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      tickLower,\n      tickUpper,\n      base,\n      baseAmount,\n      otherAmountMax,\n      withMetadata,\n      getEphemeralSigners,\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<OpenPositionFromBaseExtInfo>({ txVersion, extInfo: insInfo.address }) as Promise<\n      MakeTxData<T, OpenPositionFromBaseExtInfo>\n    >;\n  }\n\n  public async openPositionFromLiquidity<T extends TxVersion>({\n    poolInfo,\n    poolKeys: propPoolKeys,\n    ownerInfo,\n    amountMaxA,\n    amountMaxB,\n    tickLower,\n    tickUpper,\n    liquidity,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    withMetadata = \"create\",\n    txVersion,\n    getEphemeralSigners,\n  }: OpenPositionFromLiquidity<T>): Promise<MakeTxData<T, OpenPositionFromLiquidityExtInfo>> {\n    if (this.scope.availability.createConcentratedPosition === false)\n      this.logAndCreateError(\"open position feature disabled in your region\");\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | null = null;\n    let ownerTokenAccountB: PublicKey | null = null;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toBase58();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toBase58();\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintAUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey,\n              amount: amountMaxA,\n            }\n          : undefined,\n\n        skipCloseAccount: !mintAUseSOLBalance,\n        notUseTokenAccount: mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintBUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey!,\n              amount: amountMaxB,\n            }\n          : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (ownerTokenAccountA === undefined || ownerTokenAccountB === undefined)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    const poolKeys = propPoolKeys || ((await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys);\n\n    const makeOpenPositionInstructions = await ClmmInstrument.openPositionFromLiquidityInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      tickLower,\n      tickUpper,\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      withMetadata,\n      getEphemeralSigners,\n    });\n    txBuilder.addInstruction(makeOpenPositionInstructions);\n\n    return txBuilder.versionBuild<OpenPositionFromLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: makeOpenPositionInstructions.address },\n    }) as Promise<MakeTxData<T, OpenPositionFromLiquidityExtInfo>>;\n  }\n\n  public async increasePositionFromLiquidity<T extends TxVersion>(\n    props: IncreasePositionFromLiquidity<T>,\n  ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo>> {\n    const {\n      poolInfo,\n      ownerPosition,\n      amountMaxA,\n      amountMaxB,\n      liquidity,\n      ownerInfo,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      computeBudgetConfig,\n      txVersion,\n    } = props;\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | undefined = undefined;\n    let ownerTokenAccountB: PublicKey | undefined = undefined;\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintAUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey,\n              amount: amountMaxA,\n            }\n          : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintBUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey!,\n              amount: amountMaxB,\n            }\n          : undefined,\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (!ownerTokenAccountA && !ownerTokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n    const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n    const ins = ClmmInstrument.increasePositionFromLiquidityInstructions({\n      poolInfo,\n      poolKeys,\n      ownerPosition,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n    });\n    txBuilder.addInstruction(ins);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: ins.address },\n    }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n  }\n\n  public async increasePositionFromBase<T extends TxVersion>(\n    props: IncreasePositionFromBase<T>,\n  ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo>> {\n    const {\n      poolInfo,\n      ownerPosition,\n      base,\n      baseAmount,\n      otherAmountMax,\n      ownerInfo,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      computeBudgetConfig,\n      txVersion,\n    } = props;\n    const txBuilder = this.createTxBuilder();\n\n    let ownerTokenAccountA: PublicKey | undefined = undefined;\n    let ownerTokenAccountB: PublicKey | undefined = undefined;\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n\n    const { account: _ownerTokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintAUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey,\n              amount: base === \"MintA\" ? baseAmount : otherAmountMax,\n            }\n          : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountA) ownerTokenAccountA = _ownerTokenAccountA;\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: _ownerTokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo: mintBUseSOLBalance\n          ? {\n              payer: this.scope.ownerPubKey!,\n              amount: base === \"MintA\" ? otherAmountMax : baseAmount,\n            }\n          : undefined,\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    if (_ownerTokenAccountB) ownerTokenAccountB = _ownerTokenAccountB;\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n    if (!ownerTokenAccountA && !ownerTokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", this.scope.account.tokenAccounts);\n\n    const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n    const ins = ClmmInstrument.increasePositionFromBaseInstructions({\n      poolInfo,\n      poolKeys,\n      ownerPosition,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n      },\n      base,\n      baseAmount,\n      otherAmountMax,\n    });\n    txBuilder.addInstruction(ins);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: ins.address },\n    }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n  }\n\n  public async decreaseLiquidity<T extends TxVersion>(\n    props: DecreaseLiquidity<T>,\n  ): Promise<MakeTxData<T, ManipulateLiquidityExtInfo & Partial<ClosePositionExtInfo>>> {\n    const {\n      poolInfo,\n      ownerPosition,\n      ownerInfo,\n      amountMinA,\n      amountMinB,\n      liquidity,\n      associatedOnly = true,\n      checkCreateATAOwner = false,\n      computeBudgetConfig,\n      txVersion,\n    } = props;\n    if (this.scope.availability.removeConcentratedPosition === false)\n      this.logAndCreateError(\"remove position feature disabled in your region\");\n    const txBuilder = this.createTxBuilder();\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n\n    let ownerTokenAccountA: PublicKey | undefined = undefined;\n    let ownerTokenAccountB: PublicKey | undefined = undefined;\n    const { account: _ownerTokenAccountA, instructionParams: accountAInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerTokenAccountA = _ownerTokenAccountA;\n    accountAInstructions && txBuilder.addInstruction(accountAInstructions);\n\n    const { account: _ownerTokenAccountB, instructionParams: accountBInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        notUseTokenAccount: mintBUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerTokenAccountB = _ownerTokenAccountB;\n    accountBInstructions && txBuilder.addInstruction(accountBInstructions);\n\n    const rewardAccounts: PublicKey[] = [];\n    for (const itemReward of poolInfo.rewardDefaultInfos) {\n      const rewardUseSOLBalance = ownerInfo.useSOLBalance && itemReward.mint.address === WSOLMint.toString();\n\n      let ownerRewardAccount: PublicKey | undefined;\n\n      if (itemReward.mint.address === poolInfo.mintA.address) ownerRewardAccount = ownerTokenAccountA;\n      else if (itemReward.mint.address === poolInfo.mintB.address) ownerRewardAccount = ownerTokenAccountB;\n      else {\n        const { account: _ownerRewardAccount, instructionParams: ownerRewardAccountInstructions } =\n          await this.scope.account.getOrCreateTokenAccount({\n            tokenProgram: new PublicKey(itemReward.mint.programId),\n            mint: new PublicKey(itemReward.mint.address),\n            notUseTokenAccount: rewardUseSOLBalance,\n            owner: this.scope.ownerPubKey,\n            createInfo: {\n              payer: this.scope.ownerPubKey,\n              amount: 0,\n            },\n            skipCloseAccount: !rewardUseSOLBalance,\n            associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n            checkCreateATAOwner,\n          });\n        ownerRewardAccount = _ownerRewardAccount;\n        ownerRewardAccountInstructions && txBuilder.addInstruction(ownerRewardAccountInstructions);\n      }\n\n      rewardAccounts.push(ownerRewardAccount!);\n    }\n\n    if (!ownerTokenAccountA && !ownerTokenAccountB)\n      this.logAndCreateError(\n        \"cannot found target token accounts\",\n        \"tokenAccounts\",\n        this.scope.account.tokenAccountRawInfos,\n      );\n\n    const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n\n    const decreaseInsInfo = await ClmmInstrument.decreaseLiquidityInstructions({\n      poolInfo,\n      poolKeys,\n      ownerPosition,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccountA: ownerTokenAccountA!,\n        tokenAccountB: ownerTokenAccountB!,\n        rewardAccounts,\n      },\n      liquidity,\n      amountMinA,\n      amountMinB,\n    });\n\n    txBuilder.addInstruction({\n      instructions: decreaseInsInfo.instructions,\n      instructionTypes: [InstructionType.ClmmDecreasePosition],\n    });\n\n    let extInfo = { ...decreaseInsInfo.address };\n    if (ownerInfo.closePosition) {\n      const closeInsInfo = await ClmmInstrument.closePositionInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: { wallet: this.scope.ownerPubKey },\n        ownerPosition,\n      });\n      txBuilder.addInstruction({\n        endInstructions: closeInsInfo.instructions,\n        endInstructionTypes: closeInsInfo.instructionTypes,\n      });\n      extInfo = { ...extInfo, ...closeInsInfo.address };\n    }\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n\n    return txBuilder.versionBuild<ManipulateLiquidityExtInfo>({\n      txVersion,\n      extInfo: { address: extInfo },\n    }) as Promise<MakeTxData<T, ManipulateLiquidityExtInfo>>;\n  }\n\n  public async closePosition<T extends TxVersion>({\n    poolInfo,\n    ownerPosition,\n    txVersion,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    ownerPosition: ClmmPositionLayout;\n    txVersion: T;\n  }): Promise<MakeTxData<T, ClosePositionExtInfo>> {\n    if (this.scope.availability.removeConcentratedPosition === false)\n      this.logAndCreateError(\"remove position feature disabled in your region\");\n    const txBuilder = this.createTxBuilder();\n    const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n    const ins = ClmmInstrument.closePositionInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: { wallet: this.scope.ownerPubKey },\n      ownerPosition,\n    });\n\n    return txBuilder.addInstruction(ins).versionBuild<ClosePositionExtInfo>({\n      txVersion,\n      extInfo: { address: ins.address },\n    }) as Promise<MakeTxData<T, ClosePositionExtInfo>>;\n  }\n\n  public async initReward<T extends TxVersion>({\n    poolInfo,\n    ownerInfo,\n    rewardInfo,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: InitRewardParams<T>): Promise<MakeTxData<T, InitRewardExtInfo>> {\n    if (rewardInfo.endTime <= rewardInfo.openTime)\n      this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n    const txBuilder = this.createTxBuilder();\n\n    const rewardMintUseSOLBalance =\n      ownerInfo.useSOLBalance && rewardInfo.mint.address.toString() === WSOLMint.toString();\n    const _baseRewardAmount = rewardInfo.perSecond.mul(rewardInfo.endTime - rewardInfo.openTime);\n\n    const { account: ownerRewardAccount, instructionParams: ownerRewardAccountIns } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: new PublicKey(rewardInfo.mint.address),\n        mint: new PublicKey(rewardInfo.mint.address),\n        notUseTokenAccount: !!rewardMintUseSOLBalance,\n        skipCloseAccount: !rewardMintUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: rewardMintUseSOLBalance\n          ? {\n              payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n              amount: new BN(\n                new Decimal(_baseRewardAmount.toFixed(0)).gte(_baseRewardAmount)\n                  ? _baseRewardAmount.toFixed(0)\n                  : _baseRewardAmount.add(1).toFixed(0),\n              ),\n            }\n          : undefined,\n        associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerRewardAccountIns && txBuilder.addInstruction(ownerRewardAccountIns);\n\n    if (!ownerRewardAccount)\n      this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n    const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n    const insInfo = ClmmInstrument.initRewardInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccount: ownerRewardAccount!,\n      },\n      rewardInfo: {\n        programId: new PublicKey(rewardInfo.mint.programId),\n        mint: new PublicKey(rewardInfo.mint.address),\n        openTime: rewardInfo.openTime,\n        endTime: rewardInfo.endTime,\n        emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n      },\n    });\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<InitRewardExtInfo>({\n      txVersion,\n      extInfo: { address: insInfo.address },\n    }) as Promise<MakeTxData<T, InitRewardExtInfo>>;\n  }\n\n  public async initRewards<T extends TxVersion>({\n    poolInfo,\n    ownerInfo,\n    rewardInfos,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: InitRewardsParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n    for (const rewardInfo of rewardInfos) {\n      if (rewardInfo.endTime <= rewardInfo.openTime)\n        this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n    }\n\n    const txBuilder = this.createTxBuilder();\n    let address: Record<string, PublicKey> = {};\n\n    for (const rewardInfo of rewardInfos) {\n      const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.address === WSOLMint.toString();\n      const _baseRewardAmount = rewardInfo.perSecond.mul(rewardInfo.endTime - rewardInfo.openTime);\n\n      const { account: ownerRewardAccount, instructionParams: ownerRewardAccountIns } =\n        await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: new PublicKey(rewardInfo.mint.programId),\n          mint: new PublicKey(rewardInfo.mint.address),\n          notUseTokenAccount: !!rewardMintUseSOLBalance,\n          skipCloseAccount: !rewardMintUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          createInfo: rewardMintUseSOLBalance\n            ? {\n                payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n                amount: new BN(\n                  new Decimal(_baseRewardAmount.toFixed(0)).gte(_baseRewardAmount)\n                    ? _baseRewardAmount.toFixed(0)\n                    : _baseRewardAmount.add(1).toFixed(0),\n                ),\n              }\n            : undefined,\n          associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n      ownerRewardAccountIns && txBuilder.addInstruction(ownerRewardAccountIns);\n\n      if (!ownerRewardAccount)\n        this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n\n      const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n      const insInfo = ClmmInstrument.initRewardInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccount: ownerRewardAccount!,\n        },\n        rewardInfo: {\n          programId: new PublicKey(rewardInfo.mint.programId),\n          mint: new PublicKey(rewardInfo.mint.address),\n          openTime: rewardInfo.openTime,\n          endTime: rewardInfo.endTime,\n          emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n        },\n      });\n      address = {\n        ...address,\n        ...insInfo.address,\n      };\n      txBuilder.addInstruction(insInfo);\n    }\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: { address },\n    }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n  }\n\n  public async setReward<T extends TxVersion>({\n    poolInfo,\n    ownerInfo,\n    rewardInfo,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: SetRewardParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n    if (rewardInfo.endTime <= rewardInfo.openTime)\n      this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n    const txBuilder = this.createTxBuilder();\n    const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.equals(WSOLMint);\n    const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: rewardInfo.programId,\n        mint: rewardInfo.mint,\n        notUseTokenAccount: rewardMintUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: rewardMintUseSOLBalance\n          ? {\n              payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n              amount: new BN(\n                new Decimal(rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)).gte(\n                  rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime),\n                )\n                  ? rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)\n                  : rewardInfo.perSecond\n                      .sub(rewardInfo.endTime - rewardInfo.openTime)\n                      .add(1)\n                      .toFixed(0),\n              ),\n            }\n          : undefined,\n\n        associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n    if (!ownerRewardAccount)\n      this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n    const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n    const insInfo = ClmmInstrument.setRewardInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccount: ownerRewardAccount!,\n      },\n      rewardInfo: {\n        mint: rewardInfo.mint,\n        openTime: rewardInfo.openTime,\n        endTime: rewardInfo.endTime,\n        emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n      },\n    });\n\n    txBuilder.addInstruction(insInfo);\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n      txVersion,\n      extInfo: { address: insInfo.address },\n    }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n  }\n\n  public async setRewards<T extends TxVersion>({\n    poolInfo,\n    ownerInfo,\n    rewardInfos,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    computeBudgetConfig,\n    txVersion,\n  }: SetRewardsParams<T>): Promise<MakeTxData<T, { address: Record<string, PublicKey> }>> {\n    const txBuilder = this.createTxBuilder();\n    let address: Record<string, PublicKey> = {};\n    for (const rewardInfo of rewardInfos) {\n      if (rewardInfo.endTime <= rewardInfo.openTime)\n        this.logAndCreateError(\"reward time error\", \"rewardInfo\", rewardInfo);\n\n      const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardInfo.mint.address === WSOLMint.toString();\n      const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n        await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: new PublicKey(rewardInfo.mint.programId),\n          mint: new PublicKey(rewardInfo.mint.address),\n          notUseTokenAccount: rewardMintUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          createInfo: rewardMintUseSOLBalance\n            ? {\n                payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n                amount: new BN(\n                  new Decimal(rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)).gte(\n                    rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime),\n                  )\n                    ? rewardInfo.perSecond.sub(rewardInfo.endTime - rewardInfo.openTime).toFixed(0)\n                    : rewardInfo.perSecond\n                        .sub(rewardInfo.endTime - rewardInfo.openTime)\n                        .add(1)\n                        .toFixed(0),\n                ),\n              }\n            : undefined,\n          associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n      ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n      if (!ownerRewardAccount)\n        this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n      const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n      const insInfo = ClmmInstrument.setRewardInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccount: ownerRewardAccount!,\n        },\n        rewardInfo: {\n          mint: new PublicKey(rewardInfo.mint.address),\n          openTime: rewardInfo.openTime,\n          endTime: rewardInfo.endTime,\n          emissionsPerSecondX64: MathUtil.decimalToX64(rewardInfo.perSecond),\n        },\n      });\n      txBuilder.addInstruction(insInfo);\n      address = {\n        ...address,\n        ...insInfo.address,\n      };\n    }\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    return txBuilder.versionBuild<{ address: Record<string, PublicKey> }>({\n      txVersion,\n      extInfo: { address },\n    }) as Promise<MakeTxData<T, { address: Record<string, PublicKey> }>>;\n  }\n\n  public async collectReward({\n    poolInfo,\n    ownerInfo,\n    rewardMint,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n  }: CollectRewardParams): Promise<MakeTransaction> {\n    const rewardInfo = poolInfo!.rewardDefaultInfos.find((i) => i.mint.address === rewardMint.toString());\n    if (!rewardInfo) this.logAndCreateError(\"reward mint error\", \"not found reward mint\", rewardMint);\n\n    const txBuilder = this.createTxBuilder();\n    const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardMint.equals(WSOLMint);\n    const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: new PublicKey(rewardInfo!.mint.programId),\n        mint: rewardMint,\n        notUseTokenAccount: rewardMintUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        skipCloseAccount: !rewardMintUseSOLBalance,\n        createInfo: {\n          payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n          amount: 0,\n        },\n        associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n\n    if (!ownerRewardAccount)\n      this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n    const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n    const insInfo = ClmmInstrument.collectRewardInstructions({\n      poolInfo,\n      poolKeys,\n      ownerInfo: {\n        wallet: this.scope.ownerPubKey,\n        tokenAccount: ownerRewardAccount!,\n      },\n      rewardMint,\n    });\n    txBuilder.addInstruction(insInfo);\n\n    return txBuilder.build<{ address: Record<string, PublicKey> }>({ address: insInfo.address });\n  }\n\n  public async collectRewards({\n    poolInfo,\n    ownerInfo,\n    rewardMints,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n  }: CollectRewardsParams): Promise<MakeTransaction> {\n    const txBuilder = this.createTxBuilder();\n    let address: Record<string, PublicKey> = {};\n\n    for (const rewardMint of rewardMints) {\n      const rewardInfo = poolInfo!.rewardDefaultInfos.find((i) => i.mint.address === rewardMint.toString());\n      if (!rewardInfo) {\n        this.logAndCreateError(\"reward mint error\", \"not found reward mint\", rewardMint);\n        continue;\n      }\n\n      const rewardMintUseSOLBalance = ownerInfo.useSOLBalance && rewardMint.equals(WSOLMint);\n      const { account: ownerRewardAccount, instructionParams: ownerRewardIns } =\n        await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: new PublicKey(rewardInfo.mint.programId),\n          mint: rewardMint,\n          notUseTokenAccount: rewardMintUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: !rewardMintUseSOLBalance,\n          createInfo: {\n            payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          associatedOnly: rewardMintUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n      if (!ownerRewardAccount)\n        this.logAndCreateError(\"no money\", \"ownerRewardAccount\", this.scope.account.tokenAccountRawInfos);\n      ownerRewardIns && txBuilder.addInstruction(ownerRewardIns);\n      const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n      const insInfo = ClmmInstrument.collectRewardInstructions({\n        poolInfo,\n        poolKeys,\n        ownerInfo: {\n          wallet: this.scope.ownerPubKey,\n          tokenAccount: ownerRewardAccount!,\n        },\n\n        rewardMint,\n      });\n      txBuilder.addInstruction(insInfo);\n      address = { ...address, ...insInfo.address };\n    }\n\n    return txBuilder.build<{ address: Record<string, PublicKey> }>({ address });\n  }\n\n  public async harvestAllRewards<T extends TxVersion = TxVersion.LEGACY>({\n    allPoolInfo,\n    allPositions,\n    ownerInfo,\n    associatedOnly = true,\n    checkCreateATAOwner = false,\n    programId,\n    txVersion,\n    computeBudgetConfig,\n  }: HarvestAllRewardsParams<T>): Promise<MakeMultiTxData<T>> {\n    const ownerMintToAccount: { [mint: string]: PublicKey } = {};\n    for (const item of this.scope.account.tokenAccountRawInfos) {\n      if (associatedOnly) {\n        const ata = getATAAddress(this.scope.ownerPubKey, item.accountInfo.mint, programId).publicKey;\n        if (ata.equals(item.pubkey)) ownerMintToAccount[item.accountInfo.mint.toString()] = item.pubkey;\n      } else {\n        ownerMintToAccount[item.accountInfo.mint.toString()] = item.pubkey;\n      }\n    }\n    const txBuilder = this.createTxBuilder();\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    for (const itemInfo of Object.values(allPoolInfo)) {\n      if (allPositions[itemInfo.id] === undefined) continue;\n      if (\n        !allPositions[itemInfo.id].find(\n          (i) => !i.liquidity.isZero() || i.rewardInfos.find((ii) => !ii.rewardAmountOwed.isZero()),\n        )\n      )\n        continue;\n\n      const poolInfo = itemInfo;\n      const mintAUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintA.address === WSOLMint.toString();\n      const mintBUseSOLBalance = ownerInfo.useSOLBalance && poolInfo.mintB.address === WSOLMint.toString();\n\n      let ownerTokenAccountA = ownerMintToAccount[poolInfo.mintA.address];\n      if (!ownerTokenAccountA) {\n        const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: poolInfo.mintA.programId,\n          mint: new PublicKey(poolInfo.mintA.address),\n          notUseTokenAccount: mintAUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: true,\n          createInfo: {\n            payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n        ownerTokenAccountA = account!;\n        instructionParams && txBuilder.addInstruction(instructionParams);\n      }\n\n      let ownerTokenAccountB = ownerMintToAccount[poolInfo.mintB.address];\n      if (!ownerTokenAccountB) {\n        const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          tokenProgram: poolInfo.mintB.programId,\n          mint: new PublicKey(poolInfo.mintB.address),\n          notUseTokenAccount: mintBUseSOLBalance,\n          owner: this.scope.ownerPubKey,\n          skipCloseAccount: true,\n          createInfo: {\n            payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n            amount: 0,\n          },\n          associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n          checkCreateATAOwner,\n        });\n        ownerTokenAccountB = account!;\n        instructionParams && txBuilder.addInstruction(instructionParams);\n      }\n\n      ownerMintToAccount[poolInfo.mintA.address] = ownerTokenAccountA;\n      ownerMintToAccount[poolInfo.mintB.address] = ownerTokenAccountB;\n\n      const rewardAccounts: PublicKey[] = [];\n      for (const itemReward of poolInfo.rewardDefaultInfos) {\n        const rewardUseSOLBalance = ownerInfo.useSOLBalance && itemReward.mint.address === WSOLMint.toString();\n        let ownerRewardAccount = ownerMintToAccount[itemReward.mint.address];\n        if (!ownerRewardAccount) {\n          const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n            tokenProgram: new PublicKey(itemReward.mint.programId),\n            mint: new PublicKey(itemReward.mint.address),\n            notUseTokenAccount: rewardUseSOLBalance,\n            owner: this.scope.ownerPubKey,\n            skipCloseAccount: !rewardUseSOLBalance,\n            createInfo: {\n              payer: ownerInfo.feePayer || this.scope.ownerPubKey,\n              amount: 0,\n            },\n            associatedOnly: rewardUseSOLBalance ? false : associatedOnly,\n          });\n          ownerRewardAccount = account!;\n          instructionParams && txBuilder.addInstruction(instructionParams);\n        }\n\n        ownerMintToAccount[itemReward.mint.address] = ownerRewardAccount;\n        rewardAccounts.push(ownerRewardAccount!);\n      }\n\n      const poolKeys = (await this.scope.api.fetchPoolKeysById({ id: poolInfo.id })) as ClmmKeys;\n\n      for (const itemPosition of allPositions[itemInfo.id]) {\n        const insData = ClmmInstrument.decreaseLiquidityInstructions({\n          poolInfo,\n          poolKeys,\n          ownerPosition: itemPosition,\n          ownerInfo: {\n            wallet: this.scope.ownerPubKey,\n            tokenAccountA: ownerTokenAccountA,\n            tokenAccountB: ownerTokenAccountB,\n            rewardAccounts,\n          },\n          liquidity: new BN(0),\n          amountMinA: new BN(0),\n          amountMinB: new BN(0),\n        });\n        txBuilder.addInstruction(insData);\n      }\n    }\n\n    if (txVersion === TxVersion.V0) return txBuilder.sizeCheckBuildV0() as Promise<MakeMultiTxData<T>>;\n    return txBuilder.sizeCheckBuild() as Promise<MakeMultiTxData<T>>;\n  }\n\n  public async getWhiteListMint({ programId }: { programId: PublicKey }): Promise<PublicKey[]> {\n    const accountInfo = await this.scope.connection.getAccountInfo(getPdaOperationAccount(programId).publicKey);\n    if (!accountInfo) return [];\n    const whitelistMintsInfo = OperationLayout.decode(accountInfo.data);\n    return whitelistMintsInfo.whitelistMints.filter((i) => !i.equals(PublicKey.default));\n  }\n\n  public async computeAmountIn({\n    poolInfo,\n    tickArrayCache,\n    baseMint,\n    token2022Infos,\n    amountOut,\n    slippage,\n    priceLimit = new Decimal(0),\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    tickArrayCache: { [key: string]: TickArray };\n    baseMint: PublicKey;\n    token2022Infos: ReturnTypeFetchMultipleMintInfos;\n    amountOut: BN;\n    slippage: number;\n    priceLimit?: Decimal;\n  }): Promise<ReturnTypeComputeAmountOutBaseOut> {\n    const epochInfo = await this.scope.fetchEpochInfo();\n\n    let sqrtPriceLimitX64: BN;\n    if (priceLimit.equals(new Decimal(0))) {\n      sqrtPriceLimitX64 =\n        baseMint.toString() === poolInfo.mintB.address ? MIN_SQRT_PRICE_X64.add(ONE) : MAX_SQRT_PRICE_X64.sub(ONE);\n    } else {\n      sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n        priceLimit,\n        poolInfo.mintA.decimals,\n        poolInfo.mintB.decimals,\n      );\n    }\n\n    const realAmountOut = getTransferAmountFee(\n      amountOut,\n      token2022Infos[baseMint.toString()]?.feeConfig,\n      epochInfo,\n      true,\n    );\n\n    const {\n      expectedAmountIn,\n      remainingAccounts,\n      executionPrice: _executionPriceX64,\n      feeAmount,\n    } = PoolUtils.getInputAmountAndRemainAccounts(\n      poolInfo as any, // todo\n      tickArrayCache,\n      baseMint,\n      realAmountOut.amount.sub(realAmountOut.fee || new BN(0)),\n      sqrtPriceLimitX64,\n    );\n\n    const _executionPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      _executionPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const executionPrice =\n      baseMint.toString() === poolInfo.mintA.address ? _executionPrice : new Decimal(1).div(_executionPrice);\n\n    const maxAmountIn = expectedAmountIn.mul(new BN(Math.floor((1 + slippage) * 10000000000))).div(new BN(10000000000));\n\n    const poolPrice =\n      poolInfo.mintA.address === baseMint.toString() ? poolInfo.price : new Decimal(1).div(poolInfo.price);\n\n    const _numerator = new Decimal(executionPrice).sub(poolPrice).abs();\n    const _denominator = poolPrice;\n    const priceImpact = new Percent(\n      new Decimal(_numerator).mul(10 ** 15).toFixed(0),\n      new Decimal(_denominator).mul(10 ** 15).toFixed(0),\n    );\n\n    return {\n      amountIn: expectedAmountIn,\n      maxAmountIn,\n      currentPrice: new Decimal(poolInfo.price),\n      executionPrice,\n      priceImpact,\n      fee: feeAmount,\n\n      remainingAccounts,\n    };\n  }\n}\n","/*\r\n *  decimal.js v10.3.1\r\n *  An arbitrary-precision Decimal type for JavaScript.\r\n *  https://github.com/MikeMcl/decimal.js\r\n *  Copyright (c) 2021 Michael Mclaughlin <M8ch88l@gmail.com>\r\n *  MIT Licence\r\n */\r\n\r\n\r\n// -----------------------------------  EDITABLE DEFAULTS  ------------------------------------ //\r\n\r\n\r\n  // The maximum exponent magnitude.\r\n  // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15,                      // 0 to 9e15\r\n\r\n  // The limit on the value of `precision`, and on the value of the first argument to\r\n  // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n  MAX_DIGITS = 1e9,                        // 0 to 1e9\r\n\r\n  // Base conversion alphabet.\r\n  NUMERALS = '0123456789abcdef',\r\n\r\n  // The natural logarithm of 10 (1025 digits).\r\n  LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n  // Pi (1025 digits).\r\n  PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n  // The initial configuration properties of the Decimal constructor.\r\n  DEFAULTS = {\r\n\r\n    // These values must be integers within the stated ranges (inclusive).\r\n    // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n    // The maximum number of significant digits of the result of a calculation or base conversion.\r\n    // E.g. `Decimal.config({ precision: 20 });`\r\n    precision: 20,                         // 1 to MAX_DIGITS\r\n\r\n    // The rounding mode used when rounding to `precision`.\r\n    //\r\n    // ROUND_UP         0 Away from zero.\r\n    // ROUND_DOWN       1 Towards zero.\r\n    // ROUND_CEIL       2 Towards +Infinity.\r\n    // ROUND_FLOOR      3 Towards -Infinity.\r\n    // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\r\n    // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\r\n    // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n    // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n    // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n    //\r\n    // E.g.\r\n    // `Decimal.rounding = 4;`\r\n    // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n    rounding: 4,                           // 0 to 8\r\n\r\n    // The modulo mode used when calculating the modulus: a mod n.\r\n    // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n    // The remainder (r) is calculated as: r = a - n * q.\r\n    //\r\n    // UP         0 The remainder is positive if the dividend is negative, else is negative.\r\n    // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).\r\n    // FLOOR      3 The remainder has the same sign as the divisor (Python %).\r\n    // HALF_EVEN  6 The IEEE 754 remainder function.\r\n    // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n    //\r\n    // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n    // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n    // be used, but they may not give useful results.\r\n    modulo: 1,                             // 0 to 9\r\n\r\n    // The exponent value at and beneath which `toString` returns exponential notation.\r\n    // JavaScript numbers: -7\r\n    toExpNeg: -7,                          // 0 to -EXP_LIMIT\r\n\r\n    // The exponent value at and above which `toString` returns exponential notation.\r\n    // JavaScript numbers: 21\r\n    toExpPos:  21,                         // 0 to EXP_LIMIT\r\n\r\n    // The minimum exponent value, beneath which underflow to zero occurs.\r\n    // JavaScript numbers: -324  (5e-324)\r\n    minE: -EXP_LIMIT,                      // -1 to -EXP_LIMIT\r\n\r\n    // The maximum exponent value, above which overflow to Infinity occurs.\r\n    // JavaScript numbers: 308  (1.7976931348623157e+308)\r\n    maxE: EXP_LIMIT,                       // 1 to EXP_LIMIT\r\n\r\n    // Whether to use cryptographically-secure random number generation, if available.\r\n    crypto: false                          // true/false\r\n  },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n  inexact, quadrant,\r\n  external = true,\r\n\r\n  decimalError = '[DecimalError] ',\r\n  invalidArgument = decimalError + 'Invalid argument: ',\r\n  precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n  cryptoUnavailable = decimalError + 'crypto unavailable',\r\n  tag = '[object Decimal]',\r\n\r\n  mathfloor = Math.floor,\r\n  mathpow = Math.pow,\r\n\r\n  isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n  isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n  isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n  isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n  BASE = 1e7,\r\n  LOG_BASE = 7,\r\n  MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n  LN10_PRECISION = LN10.length - 1,\r\n  PI_PRECISION = PI.length - 1,\r\n\r\n  // Decimal.prototype object\r\n  P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n *  absoluteValue             abs\r\n *  ceil\r\n *  clampedTo                 clamp\r\n *  comparedTo                cmp\r\n *  cosine                    cos\r\n *  cubeRoot                  cbrt\r\n *  decimalPlaces             dp\r\n *  dividedBy                 div\r\n *  dividedToIntegerBy        divToInt\r\n *  equals                    eq\r\n *  floor\r\n *  greaterThan               gt\r\n *  greaterThanOrEqualTo      gte\r\n *  hyperbolicCosine          cosh\r\n *  hyperbolicSine            sinh\r\n *  hyperbolicTangent         tanh\r\n *  inverseCosine             acos\r\n *  inverseHyperbolicCosine   acosh\r\n *  inverseHyperbolicSine     asinh\r\n *  inverseHyperbolicTangent  atanh\r\n *  inverseSine               asin\r\n *  inverseTangent            atan\r\n *  isFinite\r\n *  isInteger                 isInt\r\n *  isNaN\r\n *  isNegative                isNeg\r\n *  isPositive                isPos\r\n *  isZero\r\n *  lessThan                  lt\r\n *  lessThanOrEqualTo         lte\r\n *  logarithm                 log\r\n *  [maximum]                 [max]\r\n *  [minimum]                 [min]\r\n *  minus                     sub\r\n *  modulo                    mod\r\n *  naturalExponential        exp\r\n *  naturalLogarithm          ln\r\n *  negated                   neg\r\n *  plus                      add\r\n *  precision                 sd\r\n *  round\r\n *  sine                      sin\r\n *  squareRoot                sqrt\r\n *  tangent                   tan\r\n *  times                     mul\r\n *  toBinary\r\n *  toDecimalPlaces           toDP\r\n *  toExponential\r\n *  toFixed\r\n *  toFraction\r\n *  toHexadecimal             toHex\r\n *  toNearest\r\n *  toNumber\r\n *  toOctal\r\n *  toPower                   pow\r\n *  toPrecision\r\n *  toSignificantDigits       toSD\r\n *  toString\r\n *  truncated                 trunc\r\n *  valueOf                   toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n  var x = new this.constructor(this);\r\n  if (x.s < 0) x.s = 1;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n  var k,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n  min = new Ctor(min);\r\n  max = new Ctor(max);\r\n  if (!min.s || !max.s) return new Ctor(NaN);\r\n  if (min.gt(max)) throw Error(invalidArgument + max);\r\n  k = x.cmp(min);\r\n  return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if the value of this Decimal is greater than the value of `y`,\r\n *  -1    if the value of this Decimal is less than the value of `y`,\r\n *   0    if they have the same value,\r\n *   NaN  if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n  var i, j, xdL, ydL,\r\n    x = this,\r\n    xd = x.d,\r\n    yd = (y = new x.constructor(y)).d,\r\n    xs = x.s,\r\n    ys = y.s;\r\n\r\n  // Either NaN or ±Infinity?\r\n  if (!xd || !yd) {\r\n    return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Either zero?\r\n  if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n  // Signs differ?\r\n  if (xs !== ys) return xs;\r\n\r\n  // Compare exponents.\r\n  if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Compare digit by digit.\r\n  for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n    if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n  }\r\n\r\n  // Compare lengths.\r\n  return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0)         = 1\r\n * cos(-0)        = 1\r\n * cos(Infinity)  = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN)       = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.d) return new Ctor(NaN);\r\n\r\n  // cos(0) = cos(-0) = 1\r\n  if (!x.d[0]) return new Ctor(1);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n *  cbrt(0)  =  0\r\n *  cbrt(-0) = -0\r\n *  cbrt(1)  =  1\r\n *  cbrt(-1) = -1\r\n *  cbrt(N)  =  N\r\n *  cbrt(-I) = -I\r\n *  cbrt(I)  =  I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n  var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n   // Math.cbrt underflow/overflow?\r\n   // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n  if (!s || Math.abs(s) == 1 / 0) {\r\n    n = digitsToString(x.d);\r\n    e = x.e;\r\n\r\n    // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n    if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n    s = mathpow(n, 1 / 3);\r\n\r\n    // Rarely, e may be one less than the result exponent value.\r\n    e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n    r.s = x.s;\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Halley's method.\r\n  // TODO? Compare Newton's method.\r\n  for (;;) {\r\n    t = r;\r\n    t3 = t.times(t).times(t);\r\n    t3plusx = t3.plus(x);\r\n    r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n      // , i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n  var w,\r\n    d = this.d,\r\n    n = NaN;\r\n\r\n  if (d) {\r\n    w = d.length - 1;\r\n    n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    w = d[w];\r\n    if (w) for (; w % 10 == 0; w /= 10) n--;\r\n    if (n < 0) n = 0;\r\n  }\r\n\r\n  return n;\r\n};\r\n\r\n\r\n/*\r\n *  n / 0 = I\r\n *  n / N = N\r\n *  n / I = 0\r\n *  0 / n = 0\r\n *  0 / 0 = N\r\n *  0 / N = N\r\n *  0 / I = 0\r\n *  N / n = N\r\n *  N / 0 = N\r\n *  N / N = N\r\n *  N / I = N\r\n *  I / n = I\r\n *  I / 0 = I\r\n *  I / N = N\r\n *  I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n  return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n  return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n  return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n  return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n  var k = this.cmp(y);\r\n  return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0)         = 1\r\n * cosh(-0)        = 1\r\n * cosh(Infinity)  = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN)       = NaN\r\n *\r\n *  x        time taken (ms)   result\r\n * 1000      9                 9.8503555700852349694e+433\r\n * 10000     25                4.4034091128314607936e+4342\r\n * 100000    171               1.4033316802130615897e+43429\r\n * 1000000   3817              1.5166076984010437725e+434294\r\n * 10000000  abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n  var k, n, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    one = new Ctor(1);\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n  if (x.isZero()) return one;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n  // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  // TODO? Estimation reused from cosine() and may not be optimal here.\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    n = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    n = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n  // Reverse argument reduction\r\n  var cosh2_x,\r\n    i = k,\r\n    d8 = new Ctor(8);\r\n  for (; i--;) {\r\n    cosh2_x = x.times(x);\r\n    x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n  }\r\n\r\n  return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0)         = 0\r\n * sinh(-0)        = -0\r\n * sinh(Infinity)  = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN)       = NaN\r\n *\r\n * x        time taken (ms)\r\n * 10       2 ms\r\n * 100      5 ms\r\n * 1000     14 ms\r\n * 10000    82 ms\r\n * 100000   886 ms            1.4033316802130615897e+43429\r\n * 200000   2613 ms\r\n * 300000   5407 ms\r\n * 400000   8824 ms\r\n * 500000   13026 ms          8.7080643612718084129e+217146\r\n * 1000000  48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n  var k, pr, rm, len,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n  } else {\r\n\r\n    // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n    // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n    // 3 multiplications and 1 addition\r\n\r\n    // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n    // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n    // 4 multiplications and 2 additions\r\n\r\n    // Estimate the optimum number of times to use the argument reduction.\r\n    k = 1.4 * Math.sqrt(len);\r\n    k = k > 16 ? 16 : k | 0;\r\n\r\n    x = x.times(1 / tinyPow(5, k));\r\n    x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n    // Reverse argument reduction\r\n    var sinh2_x,\r\n      d5 = new Ctor(5),\r\n      d16 = new Ctor(16),\r\n      d20 = new Ctor(20);\r\n    for (; k--;) {\r\n      sinh2_x = x.times(x);\r\n      x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n    }\r\n  }\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0)         = 0\r\n * tanh(-0)        = -0\r\n * tanh(Infinity)  = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN)       = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(x.s);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 7;\r\n  Ctor.rounding = 1;\r\n\r\n  return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0)       = pi/2\r\n * acos(-0)      = pi/2\r\n * acos(1)       = 0\r\n * acos(-1)      = pi\r\n * acos(1/2)     = pi/3\r\n * acos(-1/2)    = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN)     = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n  var halfPi,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    k = x.abs().cmp(1),\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n    return k === 0\r\n      // |x| is 1\r\n      ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n      // |x| > 1 or x is NaN\r\n      : new Ctor(NaN);\r\n  }\r\n\r\n  if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n  // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.asin();\r\n  halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return halfPi.minus(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1)     = NaN\r\n * acosh(NaN)       = NaN\r\n * acosh(Infinity)  = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0)         = NaN\r\n * acosh(-0)        = NaN\r\n * acosh(1)         = 0\r\n * acosh(-1)        = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n  if (!x.isFinite()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN)       = NaN\r\n * asinh(Infinity)  = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0)         = 0\r\n * asinh(-0)        = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n  Ctor.rounding = 1;\r\n  external = false;\r\n\r\n  x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n  external = true;\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1)   = NaN\r\n * atanh(NaN)       = NaN\r\n * atanh(Infinity)  = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0)         = 0\r\n * atanh(-0)        = -0\r\n * atanh(1)         = Infinity\r\n * atanh(-1)        = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n  var pr, rm, wpr, xsd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  xsd = x.sd();\r\n\r\n  if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n  Ctor.precision = wpr = xsd - x.e;\r\n\r\n  x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n  Ctor.precision = pr + 4;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.ln();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0)       = 0\r\n * asin(-0)      = -0\r\n * asin(1/2)     = pi/6\r\n * asin(-1/2)    = -pi/6\r\n * asin(1)       = pi/2\r\n * asin(-1)      = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN)     = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n  var halfPi, k,\r\n    pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  k = x.abs().cmp(1);\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (k !== -1) {\r\n\r\n    // |x| is 1\r\n    if (k === 0) {\r\n      halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      halfPi.s = x.s;\r\n      return halfPi;\r\n    }\r\n\r\n    // |x| > 1 or x is NaN\r\n    return new Ctor(NaN);\r\n  }\r\n\r\n  // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n  Ctor.precision = pr + 6;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0)         = 0\r\n * atan(-0)        = -0\r\n * atan(1)         = pi/4\r\n * atan(-1)        = -pi/4\r\n * atan(Infinity)  = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN)       = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n  var i, j, k, n, px, t, r, wpr, x2,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding;\r\n\r\n  if (!x.isFinite()) {\r\n    if (!x.s) return new Ctor(NaN);\r\n    if (pr + 4 <= PI_PRECISION) {\r\n      r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n      r.s = x.s;\r\n      return r;\r\n    }\r\n  } else if (x.isZero()) {\r\n    return new Ctor(x);\r\n  } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n    r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n    r.s = x.s;\r\n    return r;\r\n  }\r\n\r\n  Ctor.precision = wpr = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n  // Argument reduction\r\n  // Ensure |x| < 0.42\r\n  // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n  k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n  for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n  external = false;\r\n\r\n  j = Math.ceil(wpr / LOG_BASE);\r\n  n = 1;\r\n  x2 = x.times(x);\r\n  r = new Ctor(x);\r\n  px = x;\r\n\r\n  // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n  for (; i !== -1;) {\r\n    px = px.times(x2);\r\n    t = r.minus(px.div(n += 2));\r\n\r\n    px = px.times(x2);\r\n    r = t.plus(px.div(n += 2));\r\n\r\n    if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n  }\r\n\r\n  if (k) r = r.times(2 << (k - 1));\r\n\r\n  external = true;\r\n\r\n  return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n  return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n  return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n  return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n  return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n  return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n  return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n  return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n  return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a)       = NaN\r\n * log[0](a)        = NaN\r\n * log[1](a)        = NaN\r\n * log[NaN](a)      = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0)        = -Infinity\r\n * log[b](-0)       = -Infinity\r\n * log[b](-a)       = NaN\r\n * log[b](1)        = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN)      = NaN\r\n *\r\n * [base] {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n  var isBase10, d, denominator, k, inf, num, sd, r,\r\n    arg = this,\r\n    Ctor = arg.constructor,\r\n    pr = Ctor.precision,\r\n    rm = Ctor.rounding,\r\n    guard = 5;\r\n\r\n  // Default base is 10.\r\n  if (base == null) {\r\n    base = new Ctor(10);\r\n    isBase10 = true;\r\n  } else {\r\n    base = new Ctor(base);\r\n    d = base.d;\r\n\r\n    // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n    if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n    isBase10 = base.eq(10);\r\n  }\r\n\r\n  d = arg.d;\r\n\r\n  // Is arg negative, non-finite, 0 or 1?\r\n  if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n    return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n  }\r\n\r\n  // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n  // integer power of 10.\r\n  if (isBase10) {\r\n    if (d.length > 1) {\r\n      inf = true;\r\n    } else {\r\n      for (k = d[0]; k % 10 === 0;) k /= 10;\r\n      inf = k !== 1;\r\n    }\r\n  }\r\n\r\n  external = false;\r\n  sd = pr + guard;\r\n  num = naturalLogarithm(arg, sd);\r\n  denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n  // The result will have 5 rounding digits.\r\n  r = divide(num, denominator, sd, 1);\r\n\r\n  // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n  // calculate 10 further digits.\r\n  //\r\n  // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n  // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n  // further digits, the last 14 are nines, round up and assume the result is exact.\r\n  // Also assume the result is exact if the last 14 are zero.\r\n  //\r\n  // Example of a result that will be incorrectly rounded:\r\n  // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n  // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n  // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n  // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n  // place is still 2.6.\r\n  if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n    do {\r\n      sd += 10;\r\n      num = naturalLogarithm(arg, sd);\r\n      denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n      r = divide(num, denominator, sd, 1);\r\n\r\n      if (!inf) {\r\n\r\n        // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n        if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n          r = finalise(r, pr + 1, 0);\r\n        }\r\n\r\n        break;\r\n      }\r\n    } while (checkRoundingDigits(r.d, k += 10, rm));\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.max = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, 'lt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.min = function () {\r\n  Array.prototype.push.call(arguments, this);\r\n  return maxOrMin(this.constructor, arguments, 'gt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n *  n - 0 = n\r\n *  n - N = N\r\n *  n - I = -I\r\n *  0 - n = -n\r\n *  0 - 0 = 0\r\n *  0 - N = N\r\n *  0 - I = -I\r\n *  N - n = N\r\n *  N - 0 = N\r\n *  N - N = N\r\n *  N - I = N\r\n *  I - n = I\r\n *  I - 0 = I\r\n *  I - N = N\r\n *  I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n  var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return y negated if x is finite and y is ±Infinity.\r\n    else if (x.d) y.s = -y.s;\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with different signs.\r\n    // Return NaN if both are ±Infinity with the same sign.\r\n    else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n  // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.plus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return y negated if x is zero and y is non-zero.\r\n    if (yd[0]) y.s = -y.s;\r\n\r\n    // Return x if y is zero and x is non-zero.\r\n    else if (xd[0]) y = new Ctor(x);\r\n\r\n    // Return zero if both are zero.\r\n    // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n    else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  e = mathfloor(y.e / LOG_BASE);\r\n  xe = mathfloor(x.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  k = xe - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (k) {\r\n    xLTy = k < 0;\r\n\r\n    if (xLTy) {\r\n      d = xd;\r\n      k = -k;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = xe;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Numbers with massively different exponents would result in a very high number of\r\n    // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n    // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n    i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n    if (k > i) {\r\n      k = i;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents.\r\n    d.reverse();\r\n    for (i = k; i--;) d.push(0);\r\n    d.reverse();\r\n\r\n  // Base 1e7 exponents equal.\r\n  } else {\r\n\r\n    // Check digits to determine which is the bigger number.\r\n\r\n    i = xd.length;\r\n    len = yd.length;\r\n    xLTy = i < len;\r\n    if (xLTy) len = i;\r\n\r\n    for (i = 0; i < len; i++) {\r\n      if (xd[i] != yd[i]) {\r\n        xLTy = xd[i] < yd[i];\r\n        break;\r\n      }\r\n    }\r\n\r\n    k = 0;\r\n  }\r\n\r\n  if (xLTy) {\r\n    d = xd;\r\n    xd = yd;\r\n    yd = d;\r\n    y.s = -y.s;\r\n  }\r\n\r\n  len = xd.length;\r\n\r\n  // Append zeros to `xd` if shorter.\r\n  // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n  for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n  // Subtract yd from xd.\r\n  for (i = yd.length; i > k;) {\r\n\r\n    if (xd[--i] < yd[i]) {\r\n      for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n      --xd[j];\r\n      xd[i] += BASE;\r\n    }\r\n\r\n    xd[i] -= yd[i];\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; xd[--len] === 0;) xd.pop();\r\n\r\n  // Remove leading zeros and adjust exponent accordingly.\r\n  for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n  // Zero?\r\n  if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n *   n % 0 =  N\r\n *   n % N =  N\r\n *   n % I =  n\r\n *   0 % n =  0\r\n *  -0 % n = -0\r\n *   0 % 0 =  N\r\n *   0 % N =  N\r\n *   0 % I =  0\r\n *   N % n =  N\r\n *   N % 0 =  N\r\n *   N % N =  N\r\n *   N % I =  N\r\n *   I % n =  N\r\n *   I % 0 =  N\r\n *   I % N =  N\r\n *   I % I =  N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n  var q,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n  if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n  // Return x if y is ±Infinity or x is ±0.\r\n  if (!y.d || x.d && !x.d[0]) {\r\n    return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n  }\r\n\r\n  // Prevent rounding of intermediate calculations.\r\n  external = false;\r\n\r\n  if (Ctor.modulo == 9) {\r\n\r\n    // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n    // result = x - q * y    where  0 <= result < abs(y)\r\n    q = divide(x, y.abs(), 0, 3, 1);\r\n    q.s *= y.s;\r\n  } else {\r\n    q = divide(x, y, 0, Ctor.modulo, 1);\r\n  }\r\n\r\n  q = q.times(y);\r\n\r\n  external = true;\r\n\r\n  return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n  return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n  return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n  var x = new this.constructor(this);\r\n  x.s = -x.s;\r\n  return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n *  n + 0 = n\r\n *  n + N = N\r\n *  n + I = I\r\n *  0 + n = n\r\n *  0 + 0 = 0\r\n *  0 + N = N\r\n *  0 + I = I\r\n *  N + n = N\r\n *  N + 0 = N\r\n *  N + N = N\r\n *  N + I = N\r\n *  I + n = I\r\n *  I + 0 = I\r\n *  I + N = N\r\n *  I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n  var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  y = new Ctor(y);\r\n\r\n  // If either is not finite...\r\n  if (!x.d || !y.d) {\r\n\r\n    // Return NaN if either is NaN.\r\n    if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n    // Return x if y is finite and x is ±Infinity.\r\n    // Return x if both are ±Infinity with the same sign.\r\n    // Return NaN if both are ±Infinity with different signs.\r\n    // Return y if x is finite and y is ±Infinity.\r\n    else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n    return y;\r\n  }\r\n\r\n   // If signs differ...\r\n  if (x.s != y.s) {\r\n    y.s = -y.s;\r\n    return x.minus(y);\r\n  }\r\n\r\n  xd = x.d;\r\n  yd = y.d;\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  // If either is zero...\r\n  if (!xd[0] || !yd[0]) {\r\n\r\n    // Return x if y is zero.\r\n    // Return y if y is non-zero.\r\n    if (!yd[0]) y = new Ctor(x);\r\n\r\n    return external ? finalise(y, pr, rm) : y;\r\n  }\r\n\r\n  // x and y are finite, non-zero numbers with the same sign.\r\n\r\n  // Calculate base 1e7 exponents.\r\n  k = mathfloor(x.e / LOG_BASE);\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  xd = xd.slice();\r\n  i = k - e;\r\n\r\n  // If base 1e7 exponents differ...\r\n  if (i) {\r\n\r\n    if (i < 0) {\r\n      d = xd;\r\n      i = -i;\r\n      len = yd.length;\r\n    } else {\r\n      d = yd;\r\n      e = k;\r\n      len = xd.length;\r\n    }\r\n\r\n    // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n    k = Math.ceil(pr / LOG_BASE);\r\n    len = k > len ? k + 1 : len + 1;\r\n\r\n    if (i > len) {\r\n      i = len;\r\n      d.length = 1;\r\n    }\r\n\r\n    // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n    d.reverse();\r\n    for (; i--;) d.push(0);\r\n    d.reverse();\r\n  }\r\n\r\n  len = xd.length;\r\n  i = yd.length;\r\n\r\n  // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n  if (len - i < 0) {\r\n    i = len;\r\n    d = yd;\r\n    yd = xd;\r\n    xd = d;\r\n  }\r\n\r\n  // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n  for (carry = 0; i;) {\r\n    carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n    xd[i] %= BASE;\r\n  }\r\n\r\n  if (carry) {\r\n    xd.unshift(carry);\r\n    ++e;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n  for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n  y.d = xd;\r\n  y.e = getBase10Exponent(xd, e);\r\n\r\n  return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n  var k,\r\n    x = this;\r\n\r\n  if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n  if (x.d) {\r\n    k = getPrecision(x.d);\r\n    if (z && x.e + 1 > k) k = x.e + 1;\r\n  } else {\r\n    k = NaN;\r\n  }\r\n\r\n  return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0)         = 0\r\n * sin(-0)        = -0\r\n * sin(Infinity)  = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN)       = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n  Ctor.rounding = 1;\r\n\r\n  x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n *  sqrt(-n) =  N\r\n *  sqrt(N)  =  N\r\n *  sqrt(-I) =  N\r\n *  sqrt(I)  =  I\r\n *  sqrt(0)  =  0\r\n *  sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n  var m, n, sd, r, rep, t,\r\n    x = this,\r\n    d = x.d,\r\n    e = x.e,\r\n    s = x.s,\r\n    Ctor = x.constructor;\r\n\r\n  // Negative/NaN/Infinity/zero?\r\n  if (s !== 1 || !d || !d[0]) {\r\n    return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n  }\r\n\r\n  external = false;\r\n\r\n  // Initial estimate.\r\n  s = Math.sqrt(+x);\r\n\r\n  // Math.sqrt underflow/overflow?\r\n  // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n  if (s == 0 || s == 1 / 0) {\r\n    n = digitsToString(d);\r\n\r\n    if ((n.length + e) % 2 == 0) n += '0';\r\n    s = Math.sqrt(n);\r\n    e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n    if (s == 1 / 0) {\r\n      n = '5e' + e;\r\n    } else {\r\n      n = s.toExponential();\r\n      n = n.slice(0, n.indexOf('e') + 1) + e;\r\n    }\r\n\r\n    r = new Ctor(n);\r\n  } else {\r\n    r = new Ctor(s.toString());\r\n  }\r\n\r\n  sd = (e = Ctor.precision) + 3;\r\n\r\n  // Newton-Raphson iteration.\r\n  for (;;) {\r\n    t = r;\r\n    r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n    // TODO? Replace with for-loop and checkRoundingDigits.\r\n    if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n      n = n.slice(sd - 3, sd + 1);\r\n\r\n      // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n      // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n      if (n == '9999' || !rep && n == '4999') {\r\n\r\n        // On the first iteration only, check to see if rounding up gives the exact result as the\r\n        // nines may infinitely repeat.\r\n        if (!rep) {\r\n          finalise(t, e + 1, 0);\r\n\r\n          if (t.times(t).eq(x)) {\r\n            r = t;\r\n            break;\r\n          }\r\n        }\r\n\r\n        sd += 4;\r\n        rep = 1;\r\n      } else {\r\n\r\n        // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n        // If not, then there are further digits and m will be truthy.\r\n        if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n          // Truncate to the first rounding digit.\r\n          finalise(r, e + 1, 1);\r\n          m = !r.times(r).eq(x);\r\n        }\r\n\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0)         = 0\r\n * tan(-0)        = -0\r\n * tan(Infinity)  = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN)       = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n  var pr, rm,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (!x.isFinite()) return new Ctor(NaN);\r\n  if (x.isZero()) return new Ctor(x);\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n  Ctor.precision = pr + 10;\r\n  Ctor.rounding = 1;\r\n\r\n  x = x.sin();\r\n  x.s = 1;\r\n  x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n  Ctor.precision = pr;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *  n * 0 = 0\r\n *  n * N = N\r\n *  n * I = I\r\n *  0 * n = 0\r\n *  0 * 0 = 0\r\n *  0 * N = N\r\n *  0 * I = N\r\n *  N * n = N\r\n *  N * 0 = N\r\n *  N * N = N\r\n *  N * I = N\r\n *  I * n = I\r\n *  I * 0 = N\r\n *  I * N = N\r\n *  I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n  var carry, e, i, k, r, rL, t, xdL, ydL,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    xd = x.d,\r\n    yd = (y = new Ctor(y)).d;\r\n\r\n  y.s *= x.s;\r\n\r\n   // If either is NaN, ±Infinity or ±0...\r\n  if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n    return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n      // Return NaN if either is NaN.\r\n      // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n      ? NaN\r\n\r\n      // Return ±Infinity if either is ±Infinity.\r\n      // Return ±0 if either is ±0.\r\n      : !xd || !yd ? y.s / 0 : y.s * 0);\r\n  }\r\n\r\n  e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n  xdL = xd.length;\r\n  ydL = yd.length;\r\n\r\n  // Ensure xd points to the longer array.\r\n  if (xdL < ydL) {\r\n    r = xd;\r\n    xd = yd;\r\n    yd = r;\r\n    rL = xdL;\r\n    xdL = ydL;\r\n    ydL = rL;\r\n  }\r\n\r\n  // Initialise the result array with zeros.\r\n  r = [];\r\n  rL = xdL + ydL;\r\n  for (i = rL; i--;) r.push(0);\r\n\r\n  // Multiply!\r\n  for (i = ydL; --i >= 0;) {\r\n    carry = 0;\r\n    for (k = xdL + i; k > i;) {\r\n      t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n      r[k--] = t % BASE | 0;\r\n      carry = t / BASE | 0;\r\n    }\r\n\r\n    r[k] = (r[k] + carry) % BASE | 0;\r\n  }\r\n\r\n  // Remove trailing zeros.\r\n  for (; !r[--rL];) r.pop();\r\n\r\n  if (carry) ++e;\r\n  else r.shift();\r\n\r\n  y.d = r;\r\n  y.e = getBase10Exponent(r, e);\r\n\r\n  return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n  return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n  if (dp === void 0) return x;\r\n\r\n  checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n  if (rm === void 0) rm = Ctor.rounding;\r\n  else checkInt32(rm, 0, 8);\r\n\r\n  return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x, true);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), dp + 1, rm);\r\n    str = finiteToString(x, true, dp + 1);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n  var str, y,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (dp === void 0) {\r\n    str = finiteToString(x);\r\n  } else {\r\n    checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n    str = finiteToString(y, false, dp + y.e + 1);\r\n  }\r\n\r\n  // To determine whether to add the minus sign look at the value before it was rounded,\r\n  // i.e. look at `x` rather than `y`.\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n  var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n    x = this,\r\n    xd = x.d,\r\n    Ctor = x.constructor;\r\n\r\n  if (!xd) return new Ctor(x);\r\n\r\n  n1 = d0 = new Ctor(1);\r\n  d1 = n0 = new Ctor(0);\r\n\r\n  d = new Ctor(d1);\r\n  e = d.e = getPrecision(xd) - x.e - 1;\r\n  k = e % LOG_BASE;\r\n  d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n  if (maxD == null) {\r\n\r\n    // d is 10**e, the minimum max-denominator needed.\r\n    maxD = e > 0 ? d : n1;\r\n  } else {\r\n    n = new Ctor(maxD);\r\n    if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n    maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n  }\r\n\r\n  external = false;\r\n  n = new Ctor(digitsToString(xd));\r\n  pr = Ctor.precision;\r\n  Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n  for (;;)  {\r\n    q = divide(n, d, 0, 1, 1);\r\n    d2 = d0.plus(q.times(d1));\r\n    if (d2.cmp(maxD) == 1) break;\r\n    d0 = d1;\r\n    d1 = d2;\r\n    d2 = n1;\r\n    n1 = n0.plus(q.times(d2));\r\n    n0 = d2;\r\n    d2 = d;\r\n    d = n.minus(q.times(d2));\r\n    n = d2;\r\n  }\r\n\r\n  d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n  n0 = n0.plus(d2.times(n1));\r\n  d0 = d0.plus(d2.times(d1));\r\n  n0.s = n1.s = x.s;\r\n\r\n  // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n  r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n      ? [n1, d1] : [n0, d0];\r\n\r\n  Ctor.precision = pr;\r\n  external = true;\r\n\r\n  return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n  return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (y == null) {\r\n\r\n    // If x is not finite, return x.\r\n    if (!x.d) return x;\r\n\r\n    y = new Ctor(1);\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    y = new Ctor(y);\r\n    if (rm === void 0) {\r\n      rm = Ctor.rounding;\r\n    } else {\r\n      checkInt32(rm, 0, 8);\r\n    }\r\n\r\n    // If x is not finite, return x if y is not NaN, else NaN.\r\n    if (!x.d) return y.s ? x : y;\r\n\r\n    // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n    if (!y.d) {\r\n      if (y.s) y.s = x.s;\r\n      return y;\r\n    }\r\n  }\r\n\r\n  // If y is not zero, calculate the nearest multiple of y to x.\r\n  if (y.d[0]) {\r\n    external = false;\r\n    x = divide(x, y, 0, rm, 1).times(y);\r\n    external = true;\r\n    finalise(x);\r\n\r\n  // If y is zero, return zero with the sign of x.\r\n  } else {\r\n    y.s = x.s;\r\n    x = y;\r\n  }\r\n\r\n  return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n  return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n  return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n *   pow(x, NaN)                           = NaN\r\n *   pow(x, ±0)                            = 1\r\n\r\n *   pow(NaN, non-zero)                    = NaN\r\n *   pow(abs(x) > 1, +Infinity)            = +Infinity\r\n *   pow(abs(x) > 1, -Infinity)            = +0\r\n *   pow(abs(x) == 1, ±Infinity)           = NaN\r\n *   pow(abs(x) < 1, +Infinity)            = +0\r\n *   pow(abs(x) < 1, -Infinity)            = +Infinity\r\n *   pow(+Infinity, y > 0)                 = +Infinity\r\n *   pow(+Infinity, y < 0)                 = +0\r\n *   pow(-Infinity, odd integer > 0)       = -Infinity\r\n *   pow(-Infinity, even integer > 0)      = +Infinity\r\n *   pow(-Infinity, odd integer < 0)       = -0\r\n *   pow(-Infinity, even integer < 0)      = +0\r\n *   pow(+0, y > 0)                        = +0\r\n *   pow(+0, y < 0)                        = +Infinity\r\n *   pow(-0, odd integer > 0)              = -0\r\n *   pow(-0, even integer > 0)             = +0\r\n *   pow(-0, odd integer < 0)              = -Infinity\r\n *   pow(-0, even integer < 0)             = +Infinity\r\n *   pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n *   x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n  var e, k, pr, r, rm, s,\r\n    x = this,\r\n    Ctor = x.constructor,\r\n    yn = +(y = new Ctor(y));\r\n\r\n  // Either ±Infinity, NaN or ±0?\r\n  if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n  x = new Ctor(x);\r\n\r\n  if (x.eq(1)) return x;\r\n\r\n  pr = Ctor.precision;\r\n  rm = Ctor.rounding;\r\n\r\n  if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n  // y exponent\r\n  e = mathfloor(y.e / LOG_BASE);\r\n\r\n  // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n  if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n    r = intPow(Ctor, x, k, pr);\r\n    return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n  }\r\n\r\n  s = x.s;\r\n\r\n  // if x is negative\r\n  if (s < 0) {\r\n\r\n    // if y is not an integer\r\n    if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n    // Result is positive if x is negative and the last digit of integer y is even.\r\n    if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n    // if x.eq(-1)\r\n    if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n      x.s = s;\r\n      return x;\r\n    }\r\n  }\r\n\r\n  // Estimate result exponent.\r\n  // x^y = 10^e,  where e = y * log10(x)\r\n  // log10(x) = log10(x_significand) + x_exponent\r\n  // log10(x_significand) = ln(x_significand) / ln(10)\r\n  k = mathpow(+x, yn);\r\n  e = k == 0 || !isFinite(k)\r\n    ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n    : new Ctor(k + '').e;\r\n\r\n  // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n  // Overflow/underflow?\r\n  if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n  external = false;\r\n  Ctor.rounding = x.s = 1;\r\n\r\n  // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n  // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n  // new Decimal(2.32456).pow('2087987436534566.46411')\r\n  // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n  k = Math.min(12, (e + '').length);\r\n\r\n  // r = x^y = exp(y*ln(x))\r\n  r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n  // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n  if (r.d) {\r\n\r\n    // Truncate to the required precision plus five rounding digits.\r\n    r = finalise(r, pr + 5, 1);\r\n\r\n    // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n    // the result.\r\n    if (checkRoundingDigits(r.d, pr, rm)) {\r\n      e = pr + 10;\r\n\r\n      // Truncate to the increased precision plus five rounding digits.\r\n      r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n      // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n      if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n        r = finalise(r, pr + 1, 0);\r\n      }\r\n    }\r\n  }\r\n\r\n  r.s = s;\r\n  external = true;\r\n  Ctor.rounding = rm;\r\n\r\n  return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n  var str,\r\n    x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n\r\n    x = finalise(new Ctor(x), sd, rm);\r\n    str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n  }\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n  var x = this,\r\n    Ctor = x.constructor;\r\n\r\n  if (sd === void 0) {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  } else {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  }\r\n\r\n  return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n  return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n  var x = this,\r\n    Ctor = x.constructor,\r\n    str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n  return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n *  digitsToString           P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n *                           finiteToString, naturalExponential, naturalLogarithm\r\n *  checkInt32               P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n *                           P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n *  checkRoundingDigits      P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n *  convertBase              toStringBinary, parseOther\r\n *  cos                      P.cos\r\n *  divide                   P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n *                           P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n *                           P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n *                           taylorSeries, atan2, parseOther\r\n *  finalise                 P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n *                           P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n *                           P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n *                           P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n *                           P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n *                           P.truncated, divide, getLn10, getPi, naturalExponential,\r\n *                           naturalLogarithm, ceil, floor, round, trunc\r\n *  finiteToString           P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n *                           toStringBinary\r\n *  getBase10Exponent        P.minus, P.plus, P.times, parseOther\r\n *  getLn10                  P.logarithm, naturalLogarithm\r\n *  getPi                    P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n *  getPrecision             P.precision, P.toFraction\r\n *  getZeroString            digitsToString, finiteToString\r\n *  intPow                   P.toPower, parseOther\r\n *  isOdd                    toLessThanHalfPi\r\n *  maxOrMin                 max, min\r\n *  naturalExponential       P.naturalExponential, P.toPower\r\n *  naturalLogarithm         P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n *                           P.toPower, naturalExponential\r\n *  nonFiniteToString        finiteToString, toStringBinary\r\n *  parseDecimal             Decimal\r\n *  parseOther               Decimal\r\n *  sin                      P.sin\r\n *  taylorSeries             P.cosh, P.sinh, cos, sin\r\n *  toLessThanHalfPi         P.cos, P.sin\r\n *  toStringBinary           P.toBinary, P.toHexadecimal, P.toOctal\r\n *  truncate                 intPow\r\n *\r\n *  Throws:                  P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n *                           naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n  var i, k, ws,\r\n    indexOfLastWord = d.length - 1,\r\n    str = '',\r\n    w = d[0];\r\n\r\n  if (indexOfLastWord > 0) {\r\n    str += w;\r\n    for (i = 1; i < indexOfLastWord; i++) {\r\n      ws = d[i] + '';\r\n      k = LOG_BASE - ws.length;\r\n      if (k) str += getZeroString(k);\r\n      str += ws;\r\n    }\r\n\r\n    w = d[i];\r\n    ws = w + '';\r\n    k = LOG_BASE - ws.length;\r\n    if (k) str += getZeroString(k);\r\n  } else if (w === 0) {\r\n    return '0';\r\n  }\r\n\r\n  // Remove trailing zeros of last w.\r\n  for (; w % 10 === 0;) w /= 10;\r\n\r\n  return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n  if (i !== ~~i || i < min || i > max) {\r\n    throw Error(invalidArgument + i);\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n  var di, k, r, rd;\r\n\r\n  // Get the length of the first word of the array d.\r\n  for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n  // Is the rounding digit in the first word of d?\r\n  if (--i < 0) {\r\n    i += LOG_BASE;\r\n    di = 0;\r\n  } else {\r\n    di = Math.ceil((i + 1) / LOG_BASE);\r\n    i %= LOG_BASE;\r\n  }\r\n\r\n  // i is the index (0 - 6) of the rounding digit.\r\n  // E.g. if within the word 3487563 the first rounding digit is 5,\r\n  // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n  k = mathpow(10, LOG_BASE - i);\r\n  rd = d[di] % k | 0;\r\n\r\n  if (repeating == null) {\r\n    if (i < 3) {\r\n      if (i == 0) rd = rd / 100 | 0;\r\n      else if (i == 1) rd = rd / 10 | 0;\r\n      r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n    } else {\r\n      r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n          (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n    }\r\n  } else {\r\n    if (i < 4) {\r\n      if (i == 0) rd = rd / 1000 | 0;\r\n      else if (i == 1) rd = rd / 100 | 0;\r\n      else if (i == 2) rd = rd / 10 | 0;\r\n      r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n    } else {\r\n      r = ((repeating || rm < 4) && rd + 1 == k ||\r\n      (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n        (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n    }\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n  var j,\r\n    arr = [0],\r\n    arrL,\r\n    i = 0,\r\n    strL = str.length;\r\n\r\n  for (; i < strL;) {\r\n    for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n    arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n    for (j = 0; j < arr.length; j++) {\r\n      if (arr[j] > baseOut - 1) {\r\n        if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n        arr[j + 1] += arr[j] / baseOut | 0;\r\n        arr[j] %= baseOut;\r\n      }\r\n    }\r\n  }\r\n\r\n  return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n  var k, len, y;\r\n\r\n  if (x.isZero()) return x;\r\n\r\n  // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n  // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  len = x.d.length;\r\n  if (len < 32) {\r\n    k = Math.ceil(len / 3);\r\n    y = (1 / tinyPow(4, k)).toString();\r\n  } else {\r\n    k = 16;\r\n    y = '2.3283064365386962890625e-10';\r\n  }\r\n\r\n  Ctor.precision += k;\r\n\r\n  x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n  // Reverse argument reduction\r\n  for (var i = k; i--;) {\r\n    var cos2x = x.times(x);\r\n    x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n  }\r\n\r\n  Ctor.precision -= k;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n  // Assumes non-zero x and k, and hence non-zero result.\r\n  function multiplyInteger(x, k, base) {\r\n    var temp,\r\n      carry = 0,\r\n      i = x.length;\r\n\r\n    for (x = x.slice(); i--;) {\r\n      temp = x[i] * k + carry;\r\n      x[i] = temp % base | 0;\r\n      carry = temp / base | 0;\r\n    }\r\n\r\n    if (carry) x.unshift(carry);\r\n\r\n    return x;\r\n  }\r\n\r\n  function compare(a, b, aL, bL) {\r\n    var i, r;\r\n\r\n    if (aL != bL) {\r\n      r = aL > bL ? 1 : -1;\r\n    } else {\r\n      for (i = r = 0; i < aL; i++) {\r\n        if (a[i] != b[i]) {\r\n          r = a[i] > b[i] ? 1 : -1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n\r\n    return r;\r\n  }\r\n\r\n  function subtract(a, b, aL, base) {\r\n    var i = 0;\r\n\r\n    // Subtract b from a.\r\n    for (; aL--;) {\r\n      a[aL] -= i;\r\n      i = a[aL] < b[aL] ? 1 : 0;\r\n      a[aL] = i * base + a[aL] - b[aL];\r\n    }\r\n\r\n    // Remove leading zeros.\r\n    for (; !a[0] && a.length > 1;) a.shift();\r\n  }\r\n\r\n  return function (x, y, pr, rm, dp, base) {\r\n    var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n      yL, yz,\r\n      Ctor = x.constructor,\r\n      sign = x.s == y.s ? 1 : -1,\r\n      xd = x.d,\r\n      yd = y.d;\r\n\r\n    // Either NaN, Infinity or 0?\r\n    if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n      return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n        !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n        // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n        xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n    }\r\n\r\n    if (base) {\r\n      logBase = 1;\r\n      e = x.e - y.e;\r\n    } else {\r\n      base = BASE;\r\n      logBase = LOG_BASE;\r\n      e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n    }\r\n\r\n    yL = yd.length;\r\n    xL = xd.length;\r\n    q = new Ctor(sign);\r\n    qd = q.d = [];\r\n\r\n    // Result exponent may be one less than e.\r\n    // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n    for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n    if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n    if (pr == null) {\r\n      sd = pr = Ctor.precision;\r\n      rm = Ctor.rounding;\r\n    } else if (dp) {\r\n      sd = pr + (x.e - y.e) + 1;\r\n    } else {\r\n      sd = pr;\r\n    }\r\n\r\n    if (sd < 0) {\r\n      qd.push(1);\r\n      more = true;\r\n    } else {\r\n\r\n      // Convert precision in number of base 10 digits to base 1e7 digits.\r\n      sd = sd / logBase + 2 | 0;\r\n      i = 0;\r\n\r\n      // divisor < 1e7\r\n      if (yL == 1) {\r\n        k = 0;\r\n        yd = yd[0];\r\n        sd++;\r\n\r\n        // k is the carry.\r\n        for (; (i < xL || k) && sd--; i++) {\r\n          t = k * base + (xd[i] || 0);\r\n          qd[i] = t / yd | 0;\r\n          k = t % yd | 0;\r\n        }\r\n\r\n        more = k || i < xL;\r\n\r\n      // divisor >= 1e7\r\n      } else {\r\n\r\n        // Normalise xd and yd so highest order digit of yd is >= base/2\r\n        k = base / (yd[0] + 1) | 0;\r\n\r\n        if (k > 1) {\r\n          yd = multiplyInteger(yd, k, base);\r\n          xd = multiplyInteger(xd, k, base);\r\n          yL = yd.length;\r\n          xL = xd.length;\r\n        }\r\n\r\n        xi = yL;\r\n        rem = xd.slice(0, yL);\r\n        remL = rem.length;\r\n\r\n        // Add zeros to make remainder as long as divisor.\r\n        for (; remL < yL;) rem[remL++] = 0;\r\n\r\n        yz = yd.slice();\r\n        yz.unshift(0);\r\n        yd0 = yd[0];\r\n\r\n        if (yd[1] >= base / 2) ++yd0;\r\n\r\n        do {\r\n          k = 0;\r\n\r\n          // Compare divisor and remainder.\r\n          cmp = compare(yd, rem, yL, remL);\r\n\r\n          // If divisor < remainder.\r\n          if (cmp < 0) {\r\n\r\n            // Calculate trial digit, k.\r\n            rem0 = rem[0];\r\n            if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n            // k will be how many times the divisor goes into the current remainder.\r\n            k = rem0 / yd0 | 0;\r\n\r\n            //  Algorithm:\r\n            //  1. product = divisor * trial digit (k)\r\n            //  2. if product > remainder: product -= divisor, k--\r\n            //  3. remainder -= product\r\n            //  4. if product was < remainder at 2:\r\n            //    5. compare new remainder and divisor\r\n            //    6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n            if (k > 1) {\r\n              if (k >= base) k = base - 1;\r\n\r\n              // product = divisor * trial digit.\r\n              prod = multiplyInteger(yd, k, base);\r\n              prodL = prod.length;\r\n              remL = rem.length;\r\n\r\n              // Compare product and remainder.\r\n              cmp = compare(prod, rem, prodL, remL);\r\n\r\n              // product > remainder.\r\n              if (cmp == 1) {\r\n                k--;\r\n\r\n                // Subtract divisor from product.\r\n                subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n              }\r\n            } else {\r\n\r\n              // cmp is -1.\r\n              // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n              // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n              if (k == 0) cmp = k = 1;\r\n              prod = yd.slice();\r\n            }\r\n\r\n            prodL = prod.length;\r\n            if (prodL < remL) prod.unshift(0);\r\n\r\n            // Subtract product from remainder.\r\n            subtract(rem, prod, remL, base);\r\n\r\n            // If product was < previous remainder.\r\n            if (cmp == -1) {\r\n              remL = rem.length;\r\n\r\n              // Compare divisor and new remainder.\r\n              cmp = compare(yd, rem, yL, remL);\r\n\r\n              // If divisor < new remainder, subtract divisor from remainder.\r\n              if (cmp < 1) {\r\n                k++;\r\n\r\n                // Subtract divisor from remainder.\r\n                subtract(rem, yL < remL ? yz : yd, remL, base);\r\n              }\r\n            }\r\n\r\n            remL = rem.length;\r\n          } else if (cmp === 0) {\r\n            k++;\r\n            rem = [0];\r\n          }    // if cmp === 1, k will be 0\r\n\r\n          // Add the next digit, k, to the result array.\r\n          qd[i++] = k;\r\n\r\n          // Update the remainder.\r\n          if (cmp && rem[0]) {\r\n            rem[remL++] = xd[xi] || 0;\r\n          } else {\r\n            rem = [xd[xi]];\r\n            remL = 1;\r\n          }\r\n\r\n        } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n        more = rem[0] !== void 0;\r\n      }\r\n\r\n      // Leading zero?\r\n      if (!qd[0]) qd.shift();\r\n    }\r\n\r\n    // logBase is 1 when divide is being used for base conversion.\r\n    if (logBase == 1) {\r\n      q.e = e;\r\n      inexact = more;\r\n    } else {\r\n\r\n      // To calculate q.e, first get the number of digits of qd[0].\r\n      for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n      q.e = i + e * logBase - 1;\r\n\r\n      finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n    }\r\n\r\n    return q;\r\n  };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n  var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n    Ctor = x.constructor;\r\n\r\n  // Don't round if sd is null or undefined.\r\n  out: if (sd != null) {\r\n    xd = x.d;\r\n\r\n    // Infinity/NaN.\r\n    if (!xd) return x;\r\n\r\n    // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n    // w: the word of xd containing rd, a base 1e7 number.\r\n    // xdi: the index of w within xd.\r\n    // digits: the number of digits of w.\r\n    // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n    // they had leading zeros)\r\n    // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n    // Get the length of the first word of the digits array xd.\r\n    for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n    i = sd - digits;\r\n\r\n    // Is the rounding digit in the first word of xd?\r\n    if (i < 0) {\r\n      i += LOG_BASE;\r\n      j = sd;\r\n      w = xd[xdi = 0];\r\n\r\n      // Get the rounding digit at index j of w.\r\n      rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n    } else {\r\n      xdi = Math.ceil((i + 1) / LOG_BASE);\r\n      k = xd.length;\r\n      if (xdi >= k) {\r\n        if (isTruncated) {\r\n\r\n          // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n          for (; k++ <= xdi;) xd.push(0);\r\n          w = rd = 0;\r\n          digits = 1;\r\n          i %= LOG_BASE;\r\n          j = i - LOG_BASE + 1;\r\n        } else {\r\n          break out;\r\n        }\r\n      } else {\r\n        w = k = xd[xdi];\r\n\r\n        // Get the number of digits of w.\r\n        for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n        // Get the index of rd within w.\r\n        i %= LOG_BASE;\r\n\r\n        // Get the index of rd within w, adjusted for leading zeros.\r\n        // The number of leading zeros of w is given by LOG_BASE - digits.\r\n        j = i - LOG_BASE + digits;\r\n\r\n        // Get the rounding digit at index j of w.\r\n        rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n      }\r\n    }\r\n\r\n    // Are there any non-zero digits after the rounding digit?\r\n    isTruncated = isTruncated || sd < 0 ||\r\n      xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n    // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n    // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n    // will give 714.\r\n\r\n    roundUp = rm < 4\r\n      ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n      : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n        // Check whether the digit to the left of the rounding digit is odd.\r\n        ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n          rm == (x.s < 0 ? 8 : 7));\r\n\r\n    if (sd < 1 || !xd[0]) {\r\n      xd.length = 0;\r\n      if (roundUp) {\r\n\r\n        // Convert sd to decimal places.\r\n        sd -= x.e + 1;\r\n\r\n        // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n        xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n        x.e = -sd || 0;\r\n      } else {\r\n\r\n        // Zero.\r\n        xd[0] = x.e = 0;\r\n      }\r\n\r\n      return x;\r\n    }\r\n\r\n    // Remove excess digits.\r\n    if (i == 0) {\r\n      xd.length = xdi;\r\n      k = 1;\r\n      xdi--;\r\n    } else {\r\n      xd.length = xdi + 1;\r\n      k = mathpow(10, LOG_BASE - i);\r\n\r\n      // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n      // j > 0 means i > number of leading zeros of w.\r\n      xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n    }\r\n\r\n    if (roundUp) {\r\n      for (;;) {\r\n\r\n        // Is the digit to be rounded up in the first word of xd?\r\n        if (xdi == 0) {\r\n\r\n          // i will be the length of xd[0] before k is added.\r\n          for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n          j = xd[0] += k;\r\n          for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n          // if i != k the length has increased.\r\n          if (i != k) {\r\n            x.e++;\r\n            if (xd[0] == BASE) xd[0] = 1;\r\n          }\r\n\r\n          break;\r\n        } else {\r\n          xd[xdi] += k;\r\n          if (xd[xdi] != BASE) break;\r\n          xd[xdi--] = 0;\r\n          k = 1;\r\n        }\r\n      }\r\n    }\r\n\r\n    // Remove trailing zeros.\r\n    for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n  }\r\n\r\n  if (external) {\r\n\r\n    // Overflow?\r\n    if (x.e > Ctor.maxE) {\r\n\r\n      // Infinity.\r\n      x.d = null;\r\n      x.e = NaN;\r\n\r\n    // Underflow?\r\n    } else if (x.e < Ctor.minE) {\r\n\r\n      // Zero.\r\n      x.e = 0;\r\n      x.d = [0];\r\n      // Ctor.underflow = true;\r\n    } // else Ctor.underflow = false;\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n  if (!x.isFinite()) return nonFiniteToString(x);\r\n  var k,\r\n    e = x.e,\r\n    str = digitsToString(x.d),\r\n    len = str.length;\r\n\r\n  if (isExp) {\r\n    if (sd && (k = sd - len) > 0) {\r\n      str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n    } else if (len > 1) {\r\n      str = str.charAt(0) + '.' + str.slice(1);\r\n    }\r\n\r\n    str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n  } else if (e < 0) {\r\n    str = '0.' + getZeroString(-e - 1) + str;\r\n    if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n  } else if (e >= len) {\r\n    str += getZeroString(e + 1 - len);\r\n    if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n  } else {\r\n    if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n    if (sd && (k = sd - len) > 0) {\r\n      if (e + 1 === len) str += '.';\r\n      str += getZeroString(k);\r\n    }\r\n  }\r\n\r\n  return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n  var w = digits[0];\r\n\r\n  // Add the number of digits of the first word of the digits array.\r\n  for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n  return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n  if (sd > LN10_PRECISION) {\r\n\r\n    // Reset global state in case the exception is caught.\r\n    external = true;\r\n    if (pr) Ctor.precision = pr;\r\n    throw Error(precisionLimitExceeded);\r\n  }\r\n  return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n  if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n  return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n  var w = digits.length - 1,\r\n    len = w * LOG_BASE + 1;\r\n\r\n  w = digits[w];\r\n\r\n  // If non-zero...\r\n  if (w) {\r\n\r\n    // Subtract the number of trailing zeros of the last word.\r\n    for (; w % 10 == 0; w /= 10) len--;\r\n\r\n    // Add the number of digits of the first word.\r\n    for (w = digits[0]; w >= 10; w /= 10) len++;\r\n  }\r\n\r\n  return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n  var zs = '';\r\n  for (; k--;) zs += '0';\r\n  return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n  var isTruncated,\r\n    r = new Ctor(1),\r\n\r\n    // Max n of 9007199254740991 takes 53 loop iterations.\r\n    // Maximum digits array length; leaves [28, 34] guard digits.\r\n    k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n  external = false;\r\n\r\n  for (;;) {\r\n    if (n % 2) {\r\n      r = r.times(x);\r\n      if (truncate(r.d, k)) isTruncated = true;\r\n    }\r\n\r\n    n = mathfloor(n / 2);\r\n    if (n === 0) {\r\n\r\n      // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n      n = r.d.length - 1;\r\n      if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n      break;\r\n    }\r\n\r\n    x = x.times(x);\r\n    truncate(x.d, k);\r\n  }\r\n\r\n  external = true;\r\n\r\n  return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n  return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'.\r\n */\r\nfunction maxOrMin(Ctor, args, ltgt) {\r\n  var y,\r\n    x = new Ctor(args[0]),\r\n    i = 0;\r\n\r\n  for (; ++i < args.length;) {\r\n    y = new Ctor(args[i]);\r\n    if (!y.s) {\r\n      x = y;\r\n      break;\r\n    } else if (x[ltgt](y)) {\r\n      x = y;\r\n    }\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n *   Repeat x = x / 32, k += 5, until |x| < 0.1\r\n *   exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k  where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n *  exp(Infinity)  = Infinity\r\n *  exp(-Infinity) = 0\r\n *  exp(NaN)       = NaN\r\n *  exp(±0)        = 1\r\n *\r\n *  exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n *  The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n  var denominator, guard, j, pow, sum, t, wpr,\r\n    rep = 0,\r\n    i = 0,\r\n    k = 0,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // 0/NaN/Infinity?\r\n  if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n    return new Ctor(x.d\r\n      ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n      : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  t = new Ctor(0.03125);\r\n\r\n  // while abs(x) >= 0.1\r\n  while (x.e > -2) {\r\n\r\n    // x = x / 2^5\r\n    x = x.times(t);\r\n    k += 5;\r\n  }\r\n\r\n  // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n  // necessary to ensure the first 4 rounding digits are correct.\r\n  guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n  wpr += guard;\r\n  denominator = pow = sum = new Ctor(1);\r\n  Ctor.precision = wpr;\r\n\r\n  for (;;) {\r\n    pow = finalise(pow.times(x), wpr, 1);\r\n    denominator = denominator.times(++i);\r\n    t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      j = k;\r\n      while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n      // Check to see if the first 4 rounding digits are [49]999.\r\n      // If so, repeat the summation with a higher precision, otherwise\r\n      // e.g. with precision: 18, rounding: 1\r\n      // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n\r\n        if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += 10;\r\n          denominator = pow = t = new Ctor(1);\r\n          i = 0;\r\n          rep++;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n  }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n *  ln(-n)        = NaN\r\n *  ln(0)         = -Infinity\r\n *  ln(-0)        = -Infinity\r\n *  ln(1)         = 0\r\n *  ln(Infinity)  = Infinity\r\n *  ln(-Infinity) = NaN\r\n *  ln(NaN)       = NaN\r\n *\r\n *  ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n  var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n    n = 1,\r\n    guard = 10,\r\n    x = y,\r\n    xd = x.d,\r\n    Ctor = x.constructor,\r\n    rm = Ctor.rounding,\r\n    pr = Ctor.precision;\r\n\r\n  // Is x negative or Infinity, NaN, 0 or 1?\r\n  if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n    return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n  }\r\n\r\n  if (sd == null) {\r\n    external = false;\r\n    wpr = pr;\r\n  } else {\r\n    wpr = sd;\r\n  }\r\n\r\n  Ctor.precision = wpr += guard;\r\n  c = digitsToString(xd);\r\n  c0 = c.charAt(0);\r\n\r\n  if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n    // Argument reduction.\r\n    // The series converges faster the closer the argument is to 1, so using\r\n    // ln(a^b) = b * ln(a),   ln(a) = ln(a^b) / b\r\n    // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n    // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n    // later be divided by this number, then separate out the power of 10 using\r\n    // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n    // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n    //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n    // max n is 6 (gives 0.7 - 1.3)\r\n    while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n      x = x.times(y);\r\n      c = digitsToString(x.d);\r\n      c0 = c.charAt(0);\r\n      n++;\r\n    }\r\n\r\n    e = x.e;\r\n\r\n    if (c0 > 1) {\r\n      x = new Ctor('0.' + c);\r\n      e++;\r\n    } else {\r\n      x = new Ctor(c0 + '.' + c.slice(1));\r\n    }\r\n  } else {\r\n\r\n    // The argument reduction method above may result in overflow if the argument y is a massive\r\n    // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n    // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n    t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n    x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n    Ctor.precision = pr;\r\n\r\n    return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n  }\r\n\r\n  // x1 is x reduced to a value near 1.\r\n  x1 = x;\r\n\r\n  // Taylor series.\r\n  // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n  // where x = (y - 1)/(y + 1)    (|x| < 1)\r\n  sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n  x2 = finalise(x.times(x), wpr, 1);\r\n  denominator = 3;\r\n\r\n  for (;;) {\r\n    numerator = finalise(numerator.times(x2), wpr, 1);\r\n    t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n    if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n      sum = sum.times(2);\r\n\r\n      // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n      // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n      if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n      sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n      // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n      // been repeated previously) and the first 4 rounding digits 9999?\r\n      // If so, restart the summation with a higher precision, otherwise\r\n      // e.g. with precision: 12, rounding: 1\r\n      // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n      // `wpr - guard` is the index of first rounding digit.\r\n      if (sd == null) {\r\n        if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n          Ctor.precision = wpr += guard;\r\n          t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n          x2 = finalise(x.times(x), wpr, 1);\r\n          denominator = rep = 1;\r\n        } else {\r\n          return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n        }\r\n      } else {\r\n        Ctor.precision = pr;\r\n        return sum;\r\n      }\r\n    }\r\n\r\n    sum = t;\r\n    denominator += 2;\r\n  }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n  // Unsigned.\r\n  return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n  var e, i, len;\r\n\r\n  // Decimal point?\r\n  if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n  // Exponential form?\r\n  if ((i = str.search(/e/i)) > 0) {\r\n\r\n    // Determine exponent.\r\n    if (e < 0) e = i;\r\n    e += +str.slice(i + 1);\r\n    str = str.substring(0, i);\r\n  } else if (e < 0) {\r\n\r\n    // Integer.\r\n    e = str.length;\r\n  }\r\n\r\n  // Determine leading zeros.\r\n  for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n  // Determine trailing zeros.\r\n  for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n  str = str.slice(i, len);\r\n\r\n  if (str) {\r\n    len -= i;\r\n    x.e = e = e - i - 1;\r\n    x.d = [];\r\n\r\n    // Transform base\r\n\r\n    // e is the base 10 exponent.\r\n    // i is where to slice str to get the first word of the digits array.\r\n    i = (e + 1) % LOG_BASE;\r\n    if (e < 0) i += LOG_BASE;\r\n\r\n    if (i < len) {\r\n      if (i) x.d.push(+str.slice(0, i));\r\n      for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n      str = str.slice(i);\r\n      i = LOG_BASE - str.length;\r\n    } else {\r\n      i -= len;\r\n    }\r\n\r\n    for (; i--;) str += '0';\r\n    x.d.push(+str);\r\n\r\n    if (external) {\r\n\r\n      // Overflow?\r\n      if (x.e > x.constructor.maxE) {\r\n\r\n        // Infinity.\r\n        x.d = null;\r\n        x.e = NaN;\r\n\r\n      // Underflow?\r\n      } else if (x.e < x.constructor.minE) {\r\n\r\n        // Zero.\r\n        x.e = 0;\r\n        x.d = [0];\r\n        // x.constructor.underflow = true;\r\n      } // else x.constructor.underflow = false;\r\n    }\r\n  } else {\r\n\r\n    // Zero.\r\n    x.e = 0;\r\n    x.d = [0];\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n  var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n  if (str.indexOf('_') > -1) {\r\n    str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n    if (isDecimal.test(str)) return parseDecimal(x, str);\r\n  } else if (str === 'Infinity' || str === 'NaN') {\r\n    if (!+str) x.s = NaN;\r\n    x.e = NaN;\r\n    x.d = null;\r\n    return x;\r\n  }\r\n\r\n  if (isHex.test(str))  {\r\n    base = 16;\r\n    str = str.toLowerCase();\r\n  } else if (isBinary.test(str))  {\r\n    base = 2;\r\n  } else if (isOctal.test(str))  {\r\n    base = 8;\r\n  } else {\r\n    throw Error(invalidArgument + str);\r\n  }\r\n\r\n  // Is there a binary exponent part?\r\n  i = str.search(/p/i);\r\n\r\n  if (i > 0) {\r\n    p = +str.slice(i + 1);\r\n    str = str.substring(2, i);\r\n  } else {\r\n    str = str.slice(2);\r\n  }\r\n\r\n  // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n  // fraction part will be restored.\r\n  i = str.indexOf('.');\r\n  isFloat = i >= 0;\r\n  Ctor = x.constructor;\r\n\r\n  if (isFloat) {\r\n    str = str.replace('.', '');\r\n    len = str.length;\r\n    i = len - i;\r\n\r\n    // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n    divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n  }\r\n\r\n  xd = convertBase(str, base, BASE);\r\n  xe = xd.length - 1;\r\n\r\n  // Remove trailing zeros.\r\n  for (i = xe; xd[i] === 0; --i) xd.pop();\r\n  if (i < 0) return new Ctor(x.s * 0);\r\n  x.e = getBase10Exponent(xd, xe);\r\n  x.d = xd;\r\n  external = false;\r\n\r\n  // At what precision to perform the division to ensure exact conversion?\r\n  // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n  // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n  // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n  // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n  // Therefore using 4 * the number of digits of str will always be enough.\r\n  if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n  // Multiply by the binary exponent part if present.\r\n  if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n  external = true;\r\n\r\n  return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n  var k,\r\n    len = x.d.length;\r\n\r\n  if (len < 3) {\r\n    return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n  }\r\n\r\n  // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n  // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n  // and  sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n  // Estimate the optimum number of times to use the argument reduction.\r\n  k = 1.4 * Math.sqrt(len);\r\n  k = k > 16 ? 16 : k | 0;\r\n\r\n  x = x.times(1 / tinyPow(5, k));\r\n  x = taylorSeries(Ctor, 2, x, x);\r\n\r\n  // Reverse argument reduction\r\n  var sin2_x,\r\n    d5 = new Ctor(5),\r\n    d16 = new Ctor(16),\r\n    d20 = new Ctor(20);\r\n  for (; k--;) {\r\n    sin2_x = x.times(x);\r\n    x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n  }\r\n\r\n  return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n  var j, t, u, x2,\r\n    i = 1,\r\n    pr = Ctor.precision,\r\n    k = Math.ceil(pr / LOG_BASE);\r\n\r\n  external = false;\r\n  x2 = x.times(x);\r\n  u = new Ctor(y);\r\n\r\n  for (;;) {\r\n    t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n    y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n    t = u.plus(y);\r\n\r\n    if (t.d[k] !== void 0) {\r\n      for (j = k; t.d[j] === u.d[j] && j--;);\r\n      if (j == -1) break;\r\n    }\r\n\r\n    j = u;\r\n    u = y;\r\n    y = t;\r\n    t = j;\r\n    i++;\r\n  }\r\n\r\n  external = true;\r\n  t.d.length = k + 1;\r\n\r\n  return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n  var n = b;\r\n  while (--e) n *= b;\r\n  return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n  var t,\r\n    isNeg = x.s < 0,\r\n    pi = getPi(Ctor, Ctor.precision, 1),\r\n    halfPi = pi.times(0.5);\r\n\r\n  x = x.abs();\r\n\r\n  if (x.lte(halfPi)) {\r\n    quadrant = isNeg ? 4 : 1;\r\n    return x;\r\n  }\r\n\r\n  t = x.divToInt(pi);\r\n\r\n  if (t.isZero()) {\r\n    quadrant = isNeg ? 3 : 2;\r\n  } else {\r\n    x = x.minus(t.times(pi));\r\n\r\n    // 0 <= x < pi\r\n    if (x.lte(halfPi)) {\r\n      quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n      return x;\r\n    }\r\n\r\n    quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n  }\r\n\r\n  return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n  var base, e, i, k, len, roundUp, str, xd, y,\r\n    Ctor = x.constructor,\r\n    isExp = sd !== void 0;\r\n\r\n  if (isExp) {\r\n    checkInt32(sd, 1, MAX_DIGITS);\r\n    if (rm === void 0) rm = Ctor.rounding;\r\n    else checkInt32(rm, 0, 8);\r\n  } else {\r\n    sd = Ctor.precision;\r\n    rm = Ctor.rounding;\r\n  }\r\n\r\n  if (!x.isFinite()) {\r\n    str = nonFiniteToString(x);\r\n  } else {\r\n    str = finiteToString(x);\r\n    i = str.indexOf('.');\r\n\r\n    // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n    // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n    // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n    // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n    if (isExp) {\r\n      base = 2;\r\n      if (baseOut == 16) {\r\n        sd = sd * 4 - 3;\r\n      } else if (baseOut == 8) {\r\n        sd = sd * 3 - 2;\r\n      }\r\n    } else {\r\n      base = baseOut;\r\n    }\r\n\r\n    // Convert the number as an integer then divide the result by its base raised to a power such\r\n    // that the fraction part will be restored.\r\n\r\n    // Non-integer.\r\n    if (i >= 0) {\r\n      str = str.replace('.', '');\r\n      y = new Ctor(1);\r\n      y.e = str.length - i;\r\n      y.d = convertBase(finiteToString(y), 10, base);\r\n      y.e = y.d.length;\r\n    }\r\n\r\n    xd = convertBase(str, 10, base);\r\n    e = len = xd.length;\r\n\r\n    // Remove trailing zeros.\r\n    for (; xd[--len] == 0;) xd.pop();\r\n\r\n    if (!xd[0]) {\r\n      str = isExp ? '0p+0' : '0';\r\n    } else {\r\n      if (i < 0) {\r\n        e--;\r\n      } else {\r\n        x = new Ctor(x);\r\n        x.d = xd;\r\n        x.e = e;\r\n        x = divide(x, y, sd, rm, 0, base);\r\n        xd = x.d;\r\n        e = x.e;\r\n        roundUp = inexact;\r\n      }\r\n\r\n      // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n      i = xd[sd];\r\n      k = base / 2;\r\n      roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n      roundUp = rm < 4\r\n        ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n        : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n          rm === (x.s < 0 ? 8 : 7));\r\n\r\n      xd.length = sd;\r\n\r\n      if (roundUp) {\r\n\r\n        // Rounding up may mean the previous digit has to be rounded up and so on.\r\n        for (; ++xd[--sd] > base - 1;) {\r\n          xd[sd] = 0;\r\n          if (!sd) {\r\n            ++e;\r\n            xd.unshift(1);\r\n          }\r\n        }\r\n      }\r\n\r\n      // Determine trailing zeros.\r\n      for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n      // E.g. [4, 11, 15] becomes 4bf.\r\n      for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n      // Add binary exponent suffix?\r\n      if (isExp) {\r\n        if (len > 1) {\r\n          if (baseOut == 16 || baseOut == 8) {\r\n            i = baseOut == 16 ? 4 : 3;\r\n            for (--len; len % i; len++) str += '0';\r\n            xd = convertBase(str, base, baseOut);\r\n            for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n            // xd[0] will always be be 1\r\n            for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n          } else {\r\n            str = str.charAt(0) + '.' + str.slice(1);\r\n          }\r\n        }\r\n\r\n        str =  str + (e < 0 ? 'p' : 'p+') + e;\r\n      } else if (e < 0) {\r\n        for (; ++e;) str = '0' + str;\r\n        str = '0.' + str;\r\n      } else {\r\n        if (++e > len) for (e -= len; e-- ;) str += '0';\r\n        else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n      }\r\n    }\r\n\r\n    str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n  }\r\n\r\n  return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n  if (arr.length > len) {\r\n    arr.length = len;\r\n    return true;\r\n  }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n *  abs\r\n *  acos\r\n *  acosh\r\n *  add\r\n *  asin\r\n *  asinh\r\n *  atan\r\n *  atanh\r\n *  atan2\r\n *  cbrt\r\n *  ceil\r\n *  clamp\r\n *  clone\r\n *  config\r\n *  cos\r\n *  cosh\r\n *  div\r\n *  exp\r\n *  floor\r\n *  hypot\r\n *  ln\r\n *  log\r\n *  log2\r\n *  log10\r\n *  max\r\n *  min\r\n *  mod\r\n *  mul\r\n *  pow\r\n *  random\r\n *  round\r\n *  set\r\n *  sign\r\n *  sin\r\n *  sinh\r\n *  sqrt\r\n *  sub\r\n *  sum\r\n *  tan\r\n *  tanh\r\n *  trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n  return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n  return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n  return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n  return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n  return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n  return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n  return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n  return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|Decimal} The y-coordinate.\r\n * x {number|string|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0)               = ±pi\r\n * atan2(±0, +0)               = ±0\r\n * atan2(±0, -x)               = ±pi for x > 0\r\n * atan2(±0, x)                = ±0 for x > 0\r\n * atan2(-y, ±0)               = -pi/2 for y > 0\r\n * atan2(y, ±0)                = pi/2 for y > 0\r\n * atan2(±y, -Infinity)        = ±pi for finite y > 0\r\n * atan2(±y, +Infinity)        = ±0 for finite y > 0\r\n * atan2(±Infinity, x)         = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n  y = new this(y);\r\n  x = new this(x);\r\n  var r,\r\n    pr = this.precision,\r\n    rm = this.rounding,\r\n    wpr = pr + 4;\r\n\r\n  // Either NaN\r\n  if (!y.s || !x.s) {\r\n    r = new this(NaN);\r\n\r\n  // Both ±Infinity\r\n  } else if (!y.d && !x.d) {\r\n    r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n    r.s = y.s;\r\n\r\n  // x is ±Infinity or y is ±0\r\n  } else if (!x.d || y.isZero()) {\r\n    r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n    r.s = y.s;\r\n\r\n  // y is ±Infinity or x is ±0\r\n  } else if (!y.d || x.isZero()) {\r\n    r = getPi(this, wpr, 1).times(0.5);\r\n    r.s = y.s;\r\n\r\n  // Both non-zero and finite\r\n  } else if (x.s < 0) {\r\n    this.precision = wpr;\r\n    this.rounding = 1;\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n    x = getPi(this, wpr, 1);\r\n    this.precision = pr;\r\n    this.rounding = rm;\r\n    r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n  } else {\r\n    r = this.atan(divide(y, x, wpr, 1));\r\n  }\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n  return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n  return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|Decimal}\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n  return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n *   precision  {number}\r\n *   rounding   {number}\r\n *   toExpNeg   {number}\r\n *   toExpPos   {number}\r\n *   maxE       {number}\r\n *   minE       {number}\r\n *   modulo     {number}\r\n *   crypto     {boolean|number}\r\n *   defaults   {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n  if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n  var i, p, v,\r\n    useDefaults = obj.defaults === true,\r\n    ps = [\r\n      'precision', 1, MAX_DIGITS,\r\n      'rounding', 0, 8,\r\n      'toExpNeg', -EXP_LIMIT, 0,\r\n      'toExpPos', 0, EXP_LIMIT,\r\n      'maxE', 0, EXP_LIMIT,\r\n      'minE', -EXP_LIMIT, 0,\r\n      'modulo', 0, 9\r\n    ];\r\n\r\n  for (i = 0; i < ps.length; i += 3) {\r\n    if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n    if ((v = obj[p]) !== void 0) {\r\n      if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n      else throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n  if ((v = obj[p]) !== void 0) {\r\n    if (v === true || v === false || v === 0 || v === 1) {\r\n      if (v) {\r\n        if (typeof crypto != 'undefined' && crypto &&\r\n          (crypto.getRandomValues || crypto.randomBytes)) {\r\n          this[p] = true;\r\n        } else {\r\n          throw Error(cryptoUnavailable);\r\n        }\r\n      } else {\r\n        this[p] = false;\r\n      }\r\n    } else {\r\n      throw Error(invalidArgument + p + ': ' + v);\r\n    }\r\n  }\r\n\r\n  return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n  return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n  return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n  var i, p, ps;\r\n\r\n  /*\r\n   * The Decimal constructor and exported function.\r\n   * Return a new Decimal instance.\r\n   *\r\n   * v {number|string|Decimal} A numeric value.\r\n   *\r\n   */\r\n  function Decimal(v) {\r\n    var e, i, t,\r\n      x = this;\r\n\r\n    // Decimal called without new.\r\n    if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n    // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n    // which points to Object.\r\n    x.constructor = Decimal;\r\n\r\n    // Duplicate.\r\n    if (isDecimalInstance(v)) {\r\n      x.s = v.s;\r\n\r\n      if (external) {\r\n        if (!v.d || v.e > Decimal.maxE) {\r\n\r\n          // Infinity.\r\n          x.e = NaN;\r\n          x.d = null;\r\n        } else if (v.e < Decimal.minE) {\r\n\r\n          // Zero.\r\n          x.e = 0;\r\n          x.d = [0];\r\n        } else {\r\n          x.e = v.e;\r\n          x.d = v.d.slice();\r\n        }\r\n      } else {\r\n        x.e = v.e;\r\n        x.d = v.d ? v.d.slice() : v.d;\r\n      }\r\n\r\n      return;\r\n    }\r\n\r\n    t = typeof v;\r\n\r\n    if (t === 'number') {\r\n      if (v === 0) {\r\n        x.s = 1 / v < 0 ? -1 : 1;\r\n        x.e = 0;\r\n        x.d = [0];\r\n        return;\r\n      }\r\n\r\n      if (v < 0) {\r\n        v = -v;\r\n        x.s = -1;\r\n      } else {\r\n        x.s = 1;\r\n      }\r\n\r\n      // Fast path for small integers.\r\n      if (v === ~~v && v < 1e7) {\r\n        for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n        if (external) {\r\n          if (e > Decimal.maxE) {\r\n            x.e = NaN;\r\n            x.d = null;\r\n          } else if (e < Decimal.minE) {\r\n            x.e = 0;\r\n            x.d = [0];\r\n          } else {\r\n            x.e = e;\r\n            x.d = [v];\r\n          }\r\n        } else {\r\n          x.e = e;\r\n          x.d = [v];\r\n        }\r\n\r\n        return;\r\n\r\n      // Infinity, NaN.\r\n      } else if (v * 0 !== 0) {\r\n        if (!v) x.s = NaN;\r\n        x.e = NaN;\r\n        x.d = null;\r\n        return;\r\n      }\r\n\r\n      return parseDecimal(x, v.toString());\r\n\r\n    } else if (t !== 'string') {\r\n      throw Error(invalidArgument + v);\r\n    }\r\n\r\n    // Minus sign?\r\n    if ((i = v.charCodeAt(0)) === 45) {\r\n      v = v.slice(1);\r\n      x.s = -1;\r\n    } else {\r\n      // Plus sign?\r\n      if (i === 43) v = v.slice(1);\r\n      x.s = 1;\r\n    }\r\n\r\n    return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n  }\r\n\r\n  Decimal.prototype = P;\r\n\r\n  Decimal.ROUND_UP = 0;\r\n  Decimal.ROUND_DOWN = 1;\r\n  Decimal.ROUND_CEIL = 2;\r\n  Decimal.ROUND_FLOOR = 3;\r\n  Decimal.ROUND_HALF_UP = 4;\r\n  Decimal.ROUND_HALF_DOWN = 5;\r\n  Decimal.ROUND_HALF_EVEN = 6;\r\n  Decimal.ROUND_HALF_CEIL = 7;\r\n  Decimal.ROUND_HALF_FLOOR = 8;\r\n  Decimal.EUCLID = 9;\r\n\r\n  Decimal.config = Decimal.set = config;\r\n  Decimal.clone = clone;\r\n  Decimal.isDecimal = isDecimalInstance;\r\n\r\n  Decimal.abs = abs;\r\n  Decimal.acos = acos;\r\n  Decimal.acosh = acosh;        // ES6\r\n  Decimal.add = add;\r\n  Decimal.asin = asin;\r\n  Decimal.asinh = asinh;        // ES6\r\n  Decimal.atan = atan;\r\n  Decimal.atanh = atanh;        // ES6\r\n  Decimal.atan2 = atan2;\r\n  Decimal.cbrt = cbrt;          // ES6\r\n  Decimal.ceil = ceil;\r\n  Decimal.clamp = clamp;\r\n  Decimal.cos = cos;\r\n  Decimal.cosh = cosh;          // ES6\r\n  Decimal.div = div;\r\n  Decimal.exp = exp;\r\n  Decimal.floor = floor;\r\n  Decimal.hypot = hypot;        // ES6\r\n  Decimal.ln = ln;\r\n  Decimal.log = log;\r\n  Decimal.log10 = log10;        // ES6\r\n  Decimal.log2 = log2;          // ES6\r\n  Decimal.max = max;\r\n  Decimal.min = min;\r\n  Decimal.mod = mod;\r\n  Decimal.mul = mul;\r\n  Decimal.pow = pow;\r\n  Decimal.random = random;\r\n  Decimal.round = round;\r\n  Decimal.sign = sign;          // ES6\r\n  Decimal.sin = sin;\r\n  Decimal.sinh = sinh;          // ES6\r\n  Decimal.sqrt = sqrt;\r\n  Decimal.sub = sub;\r\n  Decimal.sum = sum;\r\n  Decimal.tan = tan;\r\n  Decimal.tanh = tanh;          // ES6\r\n  Decimal.trunc = trunc;        // ES6\r\n\r\n  if (obj === void 0) obj = {};\r\n  if (obj) {\r\n    if (obj.defaults !== true) {\r\n      ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n      for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n    }\r\n  }\r\n\r\n  Decimal.config(obj);\r\n\r\n  return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n  return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n  return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n  return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n  var i, n,\r\n    t = new this(0);\r\n\r\n  external = false;\r\n\r\n  for (i = 0; i < arguments.length;) {\r\n    n = new this(arguments[i++]);\r\n    if (!n.d) {\r\n      if (n.s) {\r\n        external = true;\r\n        return new this(1 / 0);\r\n      }\r\n      t = n;\r\n    } else if (t.d) {\r\n      t = t.plus(n.times(n));\r\n    }\r\n  }\r\n\r\n  external = true;\r\n\r\n  return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n  return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n  return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|Decimal} The argument of the logarithm.\r\n * y {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n  return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n  return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n  return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n  return maxOrMin(this, arguments, 'lt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n  return maxOrMin(this, arguments, 'gt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n  return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n  return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The base.\r\n * y {number|string|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n  return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n  var d, e, k, n,\r\n    i = 0,\r\n    r = new this(1),\r\n    rd = [];\r\n\r\n  if (sd === void 0) sd = this.precision;\r\n  else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n  k = Math.ceil(sd / LOG_BASE);\r\n\r\n  if (!this.crypto) {\r\n    for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n  // Browsers supporting crypto.getRandomValues.\r\n  } else if (crypto.getRandomValues) {\r\n    d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n    for (; i < k;) {\r\n      n = d[i];\r\n\r\n      // 0 <= n < 4294967296\r\n      // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n      if (n >= 4.29e9) {\r\n        d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n      } else {\r\n\r\n        // 0 <= n <= 4289999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd[i++] = n % 1e7;\r\n      }\r\n    }\r\n\r\n  // Node.js supporting crypto.randomBytes.\r\n  } else if (crypto.randomBytes) {\r\n\r\n    // buffer\r\n    d = crypto.randomBytes(k *= 4);\r\n\r\n    for (; i < k;) {\r\n\r\n      // 0 <= n < 2147483648\r\n      n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n      // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n      if (n >= 2.14e9) {\r\n        crypto.randomBytes(4).copy(d, i);\r\n      } else {\r\n\r\n        // 0 <= n <= 2139999999\r\n        // 0 <= (n % 1e7) <= 9999999\r\n        rd.push(n % 1e7);\r\n        i += 4;\r\n      }\r\n    }\r\n\r\n    i = k / 4;\r\n  } else {\r\n    throw Error(cryptoUnavailable);\r\n  }\r\n\r\n  k = rd[--i];\r\n  sd %= LOG_BASE;\r\n\r\n  // Convert trailing digits to zeros according to sd.\r\n  if (k && sd) {\r\n    n = mathpow(10, LOG_BASE - sd);\r\n    rd[i] = (k / n | 0) * n;\r\n  }\r\n\r\n  // Remove trailing words which are zero.\r\n  for (; rd[i] === 0; i--) rd.pop();\r\n\r\n  // Zero?\r\n  if (i < 0) {\r\n    e = 0;\r\n    rd = [0];\r\n  } else {\r\n    e = -1;\r\n\r\n    // Remove leading words which are zero and adjust exponent accordingly.\r\n    for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n    // Count the digits of the first word of rd to determine leading zeros.\r\n    for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n    // Adjust the exponent for leading zeros of the first word of rd.\r\n    if (k < LOG_BASE) e -= LOG_BASE - k;\r\n  }\r\n\r\n  r.e = e;\r\n  r.d = rd;\r\n\r\n  return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n  return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n *   1    if x > 0,\r\n *  -1    if x < 0,\r\n *   0    if x is 0,\r\n *  -0    if x is -0,\r\n *   NaN  otherwise\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n  x = new this(x);\r\n  return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n  return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n  return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n  return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n  return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n  var i = 0,\r\n    args = arguments,\r\n    x = new this(args[i]);\r\n\r\n  external = false;\r\n  for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n  external = true;\r\n\r\n  return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n  return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n  return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n  return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import { get, set } from \"lodash\";\nimport dayjs from \"dayjs\";\nimport utc from \"dayjs/plugin/utc\";\ndayjs.extend(utc);\n\nexport type ModuleName = \"Common.Api\";\n\nexport enum LogLevel {\n  Error,\n  Warning,\n  Info,\n  Debug,\n}\nexport class Logger {\n  private logLevel: LogLevel;\n  private name: string;\n  constructor(params: { name: string; logLevel?: LogLevel }) {\n    this.logLevel = params.logLevel !== undefined ? params.logLevel : LogLevel.Error;\n    this.name = params.name;\n  }\n\n  set level(logLevel: LogLevel) {\n    this.logLevel = logLevel;\n  }\n  get time(): string {\n    return dayjs().utc().format(\"YYYY/MM/DD HH:mm:ss UTC\");\n  }\n  get moduleName(): string {\n    return this.name;\n  }\n\n  private isLogLevel(level: LogLevel): boolean {\n    return level <= this.logLevel;\n  }\n\n  public error(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Error)) return this;\n    console.error(this.time, this.name, \"sdk logger error\", ...props);\n    return this;\n  }\n\n  public logWithError(...props): Logger {\n    // this.error(...props)\n    const msg = props.map((arg) => (typeof arg === \"object\" ? JSON.stringify(arg) : arg)).join(\", \");\n    throw new Error(msg);\n  }\n\n  public warning(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Warning)) return this;\n    console.warn(this.time, this.name, \"sdk logger warning\", ...props);\n    return this;\n  }\n\n  public info(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Info)) return this;\n    console.info(this.time, this.name, \"sdk logger info\", ...props);\n    return this;\n  }\n\n  public debug(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Debug)) return this;\n    console.debug(this.time, this.name, \"sdk logger debug\", ...props);\n    return this;\n  }\n}\n\nconst moduleLoggers: { [key in ModuleName]?: Logger } = {};\nconst moduleLevels: { [key in ModuleName]?: LogLevel } = {};\n\nexport function createLogger(moduleName: string): Logger {\n  let logger = get(moduleLoggers, moduleName);\n  if (!logger) {\n    // default level is error\n    const logLevel = get(moduleLevels, moduleName);\n\n    logger = new Logger({ name: moduleName, logLevel });\n    set(moduleLoggers, moduleName, logger);\n  }\n\n  return logger;\n}\n\nexport function setLoggerLevel(moduleName: string, level: LogLevel): void {\n  set(moduleLevels, moduleName, level);\n\n  const logger = get(moduleLoggers, moduleName);\n  if (logger) logger.level = level;\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { Fraction, Percent, Price, Token, TokenAmount } from \"../module\";\nimport { ReplaceType } from \"../raydium/type\";\n\nimport { tryParsePublicKey } from \"./pubKey\";\n\nexport async function sleep(ms: number): Promise<void> {\n  new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function getTimestamp(): number {\n  return new Date().getTime();\n}\n\nexport function notInnerObject(v: unknown): v is Record<string, any> {\n  return (\n    typeof v === \"object\" &&\n    v !== null &&\n    ![Token, TokenAmount, PublicKey, Fraction, BN, Price, Percent].some((o) => typeof o === \"object\" && v instanceof o)\n  );\n}\n\nexport function jsonInfo2PoolKeys<T>(jsonInfo: T): ReplaceType<T, string, PublicKey> {\n  // @ts-expect-error no need type for inner code\n  return typeof jsonInfo === \"string\"\n    ? tryParsePublicKey(jsonInfo)\n    : Array.isArray(jsonInfo)\n    ? jsonInfo.map((k) => jsonInfo2PoolKeys(k))\n    : notInnerObject(jsonInfo)\n    ? Object.fromEntries(Object.entries(jsonInfo).map(([k, v]) => [k, jsonInfo2PoolKeys(v)]))\n    : jsonInfo;\n}\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN, parseBigNumberish, Rounding } from \"../common/bignumber\";\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\nimport { Currency } from \"./currency\";\n\nconst logger = createLogger(\"Raydium_amount\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nexport function splitNumber(num: string, decimals: number): [string, string] {\n  let integral = \"0\";\n  let fractional = \"0\";\n\n  if (num.includes(\".\")) {\n    const splited = num.split(\".\");\n    if (splited.length === 2) {\n      [integral, fractional] = splited;\n      fractional = fractional.padEnd(decimals, \"0\");\n    } else {\n      logger.logWithError(`invalid number string, num: ${num}`);\n    }\n  } else {\n    integral = num;\n  }\n\n  // fix decimals is 0\n  return [integral, fractional.slice(0, decimals) || fractional];\n}\n\nexport class TokenAmount extends Fraction {\n  public readonly token: Token;\n  protected logger: Logger;\n\n  public constructor(token: Token, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(token.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), token.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.token = token;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n  public gt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"gt token not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"lt token not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"add token not equals\");\n    return new TokenAmount(this.token, this.raw.add(other.raw));\n  }\n\n  public subtract(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"sub token not equals\");\n    return new TokenAmount(this.token, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.token.decimals) this.logger.logWithError(\"decimals overflow\");\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.token.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n\nexport class CurrencyAmount extends Fraction {\n  public readonly currency: Currency;\n  protected logger: Logger;\n\n  public constructor(currency: Currency, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(currency.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), currency.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.currency = currency;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n\n  /**\n   * a greater than b\n   */\n  public gt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"gt currency not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"lt currency not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"add currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.add(other.raw));\n  }\n\n  public sub(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"sub currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.currency.decimals) this.logger.logWithError(\"decimals overflow\");\n\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.currency.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { Token } from \"../module/token\";\nimport { Price } from \"../module/price\";\nimport { Currency } from \"../module/currency\";\nimport { TokenAmount, CurrencyAmount } from \"../module/amount\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { SplToken, TokenJson } from \"../raydium/token/type\";\nimport { ReplaceType } from \"../raydium/type\";\nimport { createLogger } from \"./logger\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\n\nexport enum Rounding {\n  ROUND_DOWN,\n  ROUND_HALF_UP,\n  ROUND_UP,\n}\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_TWO = new BN(2);\nexport const BN_THREE = new BN(3);\nexport const BN_FIVE = new BN(5);\nexport const BN_TEN = new BN(10);\nexport const BN_100 = new BN(100);\nexport const BN_1000 = new BN(1000);\nexport const BN_10000 = new BN(10000);\nexport type BigNumberish = BN | string | number | bigint;\nexport type Numberish = number | string | bigint | Fraction | BN;\n\nconst MAX_SAFE = 0x1fffffffffffff;\n\nexport function parseBigNumberish(value: BigNumberish): BN {\n  const logger = createLogger(\"Raydium_parseBigNumberish\");\n  // BN\n  if (value instanceof BN) {\n    return value;\n  }\n\n  if (typeof value === \"string\") {\n    if (value.match(/^-?[0-9]+$/)) {\n      return new BN(value);\n    }\n    logger.logWithError(`invalid BigNumberish string: ${value}`);\n  }\n\n  if (typeof value === \"number\") {\n    if (value % 1) {\n      logger.logWithError(`BigNumberish number underflow: ${value}`);\n    }\n\n    if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n      logger.logWithError(`BigNumberish number overflow: ${value}`);\n    }\n\n    return new BN(String(value));\n  }\n\n  if (typeof value === \"bigint\") {\n    return new BN(value.toString());\n  }\n  logger.error(`invalid BigNumberish value: ${value}`);\n  return new BN(0); // never reach, because logWithError will throw error\n}\n\nexport function tenExponential(shift: BigNumberish): BN {\n  return BN_TEN.pow(parseBigNumberish(shift));\n}\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n  denominator: string;\n  numerator: string;\n  sign?: string;\n  int?: string;\n  dec?: string;\n} {\n  if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n  if (n instanceof BN) {\n    return { numerator: n.toString(), denominator: \"1\" };\n  }\n\n  if (n instanceof Fraction) {\n    return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n  }\n\n  const s = String(n);\n  const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  const denominator = \"1\" + \"0\".repeat(dec.length);\n  const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n  return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const dm = a.divmod(b);\n\n  // Fast case - exact division\n  if (dm.mod.isZero()) return dm.div;\n\n  // Round up\n  return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n  const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n  if (n instanceof BN) return n;\n  return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n  //  to complete math format(may have decimal), not int\n  if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n  if (value instanceof Price) return value.adjusted;\n\n  // to complete math format(may have decimal), not BN\n  if (value instanceof TokenAmount)\n    try {\n      return toFraction(value.toExact());\n    } catch {\n      return new Fraction(BN_ZERO);\n    }\n\n  // do not ideal with other fraction value\n  if (value instanceof Fraction) return value;\n\n  // wrap to Fraction\n  const n = String(value);\n  const details = parseNumberInfo(n);\n  return new Fraction(details.numerator, details.denominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n  n: Numberish,\n  options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n  const { numerator, denominator } = parseNumberInfo(n);\n  return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n  token: TokenJson | Token | SplToken;\n  numberPrice: Numberish;\n  decimalDone?: boolean;\n}): Price {\n  const { token, numberPrice, decimalDone } = params;\n  const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n  const { numerator, denominator } = parseNumberInfo(numberPrice);\n  const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n  const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n  return new Price({\n    baseToken: usdCurrency,\n    denominator: parsedDenominator.toString(),\n    quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n    numerator: parsedNumerator.toString(),\n  });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n  const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n  const amountBigNumber = toBN(mul(amount, 10 ** usdCurrency.decimals)!);\n  return new CurrencyAmount(usdCurrency, amountBigNumber);\n}\n\nexport function toTotalPrice(amount: Numberish | undefined, price: Price | undefined): CurrencyAmount {\n  if (!price || !amount) return toUsdCurrency(0);\n  return toUsdCurrency(mul(amount, price)!);\n}\n\nexport function decimalToFraction(n: Decimal | undefined): Fraction | undefined {\n  if (n == null) return undefined;\n  const { numerator, denominator } = parseNumberInfo(n.toString());\n  return new Fraction(numerator, denominator);\n}\n\nexport function isDecimal(val: unknown): boolean {\n  return val instanceof Decimal;\n}\n\nexport function recursivelyDecimalToFraction<T>(info: T): ReplaceType<T, Decimal, Fraction> {\n  // @ts-expect-error no need type for inner code\n  return isDecimal(info)\n    ? decimalToFraction(info as any)\n    : Array.isArray(info)\n    ? info.map((k) => recursivelyDecimalToFraction(k))\n    : notInnerObject(info)\n    ? Object.fromEntries(Object.entries(info as any).map(([k, v]) => [k, recursivelyDecimalToFraction(v)]))\n    : info;\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { PublicKeyish, SOLMint, validateAndParsePublicKey } from \"../common/pubKey\";\nimport { TOKEN_WSOL } from \"../raydium/token/constant\";\n\n/**\n * A token is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n */\nexport interface TokenProps {\n  mint: PublicKeyish;\n  decimals: number;\n  symbol?: string;\n  name?: string;\n  skipMint?: boolean;\n  isToken2022?: boolean;\n}\n\nexport class Token {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n  public readonly isToken2022: boolean;\n\n  public readonly mint: PublicKey;\n  public static readonly WSOL: Token = new Token({\n    ...TOKEN_WSOL,\n    mint: TOKEN_WSOL.address,\n  });\n\n  /**\n   *\n   * @param mint - pass \"sol\" as mint will auto generate wsol token config\n   */\n  public constructor({ mint, decimals, symbol, name, skipMint = false, isToken2022 = false }: TokenProps) {\n    if (mint === SOLMint.toBase58() || (mint instanceof PublicKey && SOLMint.equals(mint))) {\n      this.decimals = TOKEN_WSOL.decimals;\n      this.symbol = TOKEN_WSOL.symbol;\n      this.name = TOKEN_WSOL.name;\n      this.mint = new PublicKey(TOKEN_WSOL.address);\n      this.isToken2022 = false;\n      return;\n    }\n\n    this.decimals = decimals;\n    this.symbol = symbol || mint.toString().substring(0, 6);\n    this.name = name || mint.toString().substring(0, 6);\n    this.mint = skipMint ? PublicKey.default : validateAndParsePublicKey({ publicKey: mint });\n    this.isToken2022 = isToken2022;\n  }\n\n  public equals(other: Token): boolean {\n    // short circuit on reference equality\n    if (this === other) {\n      return true;\n    }\n    return this.mint.equals(other.mint);\n  }\n}\n","import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { AccountMeta, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\n\ninterface AccountMetaProps {\n  pubkey: PublicKey;\n  isSigner?: boolean;\n  isWritable?: boolean;\n}\n\nexport function accountMeta({ pubkey, isSigner = false, isWritable = true }: AccountMetaProps): AccountMeta {\n  return {\n    pubkey,\n    isWritable,\n    isSigner,\n  };\n}\n\nexport const commonSystemAccountMeta = [\n  accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n  accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n];\n\nexport type PublicKeyish = PublicKey | string;\n\nexport function validateAndParsePublicKey({\n  publicKey: orgPubKey,\n  transformSol,\n}: {\n  publicKey: PublicKeyish;\n  transformSol?: boolean;\n}): PublicKey {\n  const publicKey = tryParsePublicKey(orgPubKey.toString());\n\n  if (publicKey instanceof PublicKey) {\n    if (transformSol && publicKey.equals(SOLMint)) return WSOLMint;\n    return publicKey;\n  }\n\n  if (transformSol && publicKey.toString() === SOLMint.toBase58()) return WSOLMint;\n\n  if (typeof publicKey === \"string\") {\n    if (publicKey === PublicKey.default.toBase58()) return PublicKey.default;\n    try {\n      const key = new PublicKey(publicKey);\n      return key;\n    } catch {\n      throw new Error(\"invalid public key\");\n    }\n  }\n\n  throw new Error(\"invalid public key\");\n}\n\nexport function tryParsePublicKey(v: string): PublicKey | string {\n  try {\n    return new PublicKey(v);\n  } catch (e) {\n    return v;\n  }\n}\n\nexport const MEMO_PROGRAM_ID = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const RENT_PROGRAM_ID = new PublicKey(\"SysvarRent111111111111111111111111111111111\");\nexport const CLOCK_PROGRAM_ID = new PublicKey(\"SysvarC1ock11111111111111111111111111111111\");\nexport const METADATA_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\");\nexport const INSTRUCTION_PROGRAM_ID = new PublicKey(\"Sysvar1nstructions1111111111111111111111111\");\n\nexport const RAYMint = new PublicKey(\"4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R\");\nexport const PAIMint = new PublicKey(\"Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS\");\nexport const SRMMint = new PublicKey(\"SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt\");\nexport const USDCMint = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\nexport const USDTMint = new PublicKey(\"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\");\nexport const mSOLMint = new PublicKey(\"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So\");\nexport const stSOLMint = new PublicKey(\"7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj\");\nexport const USDHMint = new PublicKey(\"USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX\");\nexport const NRVMint = new PublicKey(\"NRVwhjBQiUPYtfDT5zRBVJajzFQHaBUNtC7SNVvqRFa\");\nexport const ANAMint = new PublicKey(\"ANAxByE6G2WjFp7A4NqtWYXb3mgruyzZYg3spfxe6Lbo\");\nexport const ETHMint = new PublicKey(\"7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs\");\nexport const WSOLMint = new PublicKey(\"So11111111111111111111111111111111111111112\");\nexport const SOLMint = PublicKey.default;\n\nexport function solToWSol(mint: PublicKeyish): PublicKey {\n  return validateAndParsePublicKey({ publicKey: mint, transformSol: true });\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { TokenInfo } from \"./type\";\n\nexport const SOL_INFO: TokenInfo = {\n  chainId: 101,\n  address: PublicKey.default.toBase58(),\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"SOL\",\n  name: \"solana\",\n  logoURI: `https://img.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"raydium\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n\nexport const TOKEN_WSOL: TokenInfo = {\n  chainId: 101,\n  address: \"So11111111111111111111111111111111111111112\",\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"WSOL\",\n  name: \"Wrapped SOL\",\n  logoURI: `https://img.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"raydium\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\nimport _Decimal from \"decimal.js-light\";\n\nimport { BigNumberish, parseBigNumberish, Rounding } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport toFormat, { WrappedBig } from \"./formatter\";\n\nconst logger = createLogger(\"module/fraction\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nconst Decimal = toFormat(_Decimal);\n\nconst toSignificantRounding = {\n  [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\n  [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\n  [Rounding.ROUND_UP]: Decimal.ROUND_UP,\n};\n\nconst toFixedRounding = {\n  [Rounding.ROUND_DOWN]: _Big.roundDown,\n  [Rounding.ROUND_HALF_UP]: _Big.roundHalfUp,\n  [Rounding.ROUND_UP]: _Big.roundUp,\n};\n\nexport class Fraction {\n  public readonly numerator: BN;\n  public readonly denominator: BN;\n\n  public constructor(numerator: BigNumberish, denominator: BigNumberish = new BN(1)) {\n    this.numerator = parseBigNumberish(numerator);\n    this.denominator = parseBigNumberish(denominator);\n  }\n\n  public get quotient(): BN {\n    return this.numerator.div(this.denominator);\n  }\n\n  public invert(): Fraction {\n    return new Fraction(this.denominator, this.numerator);\n  }\n\n  public add(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.add(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).add(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public sub(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.sub(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).sub(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public mul(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.numerator), this.denominator.mul(otherParsed.denominator));\n  }\n\n  public div(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.denominator), this.denominator.mul(otherParsed.numerator));\n  }\n\n  public toSignificant(\n    significantDigits: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(significantDigits)) logger.logWithError(`${significantDigits} is not an integer.`);\n    if (significantDigits <= 0) logger.logWithError(`${significantDigits} is not positive.`);\n\n    Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] });\n    const quotient = new Decimal(this.numerator.toString())\n      .div(this.denominator.toString())\n      .toSignificantDigits(significantDigits);\n    return quotient.toFormat(quotient.decimalPlaces(), format);\n  }\n\n  public toFixed(\n    decimalPlaces: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(decimalPlaces)) logger.logWithError(`${decimalPlaces} is not an integer.`);\n    if (decimalPlaces < 0) logger.logWithError(`${decimalPlaces} is negative.`);\n\n    Big.DP = decimalPlaces;\n    Big.RM = toFixedRounding[rounding] || 1;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);\n  }\n\n  public isZero(): boolean {\n    return this.numerator.isZero();\n  }\n}\n","import Big, { BigConstructor, BigSource, RoundingMode } from \"big.js\";\nimport Decimal, { Config, Numeric } from \"decimal.js-light\";\nimport _toFarmat from \"toformat\";\n\ntype TakeStatic<T> = { [P in keyof T]: T[P] };\ninterface FormatOptions {\n  decimalSeparator?: string;\n  groupSeparator?: string;\n  groupSize?: number;\n  fractionGroupSeparator?: string;\n  fractionGroupSize?: number;\n}\ninterface WrappedBigConstructor extends TakeStatic<BigConstructor> {\n  new (value: BigSource): WrappedBig;\n  (value: BigSource): WrappedBig;\n  (): WrappedBigConstructor;\n\n  format: FormatOptions;\n}\nexport interface WrappedBig extends Big {\n  add(n: BigSource): WrappedBig;\n  abs(): WrappedBig;\n  div(n: BigSource): WrappedBig;\n  minus(n: BigSource): WrappedBig;\n  mod(n: BigSource): WrappedBig;\n  mul(n: BigSource): WrappedBig;\n  plus(n: BigSource): WrappedBig;\n  pow(exp: number): WrappedBig;\n  round(dp?: number, rm?: RoundingMode): WrappedBig;\n  sqrt(): WrappedBig;\n  sub(n: BigSource): WrappedBig;\n  times(n: BigSource): WrappedBig;\n  toFormat(): string;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\ntype DecimalConstructor = typeof Decimal;\ninterface WrappedDecimalConstructor extends TakeStatic<DecimalConstructor> {\n  new (value: Numeric): WrappedDecimal;\n  clone(config?: Config): WrappedDecimalConstructor;\n  config(config: Config): WrappedDecimal;\n  set(config: Config): WrappedDecimal;\n  format: FormatOptions;\n}\nexport interface WrappedDecimal extends Decimal {\n  absoluteValue(): WrappedDecimal;\n  abs(): WrappedDecimal;\n  dividedBy(y: Numeric): WrappedDecimal;\n  div(y: Numeric): WrappedDecimal;\n  dividedToIntegerBy(y: Numeric): WrappedDecimal;\n  idiv(y: Numeric): WrappedDecimal;\n  logarithm(base?: Numeric): WrappedDecimal;\n  log(base?: Numeric): WrappedDecimal;\n  minus(y: Numeric): WrappedDecimal;\n  sub(y: Numeric): WrappedDecimal;\n  modulo(y: Numeric): WrappedDecimal;\n  mod(y: Numeric): WrappedDecimal;\n  naturalExponetial(): WrappedDecimal;\n  exp(): WrappedDecimal;\n  naturalLogarithm(): WrappedDecimal;\n  ln(): WrappedDecimal;\n  negated(): WrappedDecimal;\n  neg(): WrappedDecimal;\n  plus(y: Numeric): WrappedDecimal;\n  add(y: Numeric): WrappedDecimal;\n  squareRoot(): WrappedDecimal;\n  sqrt(): WrappedDecimal;\n  times(y: Numeric): WrappedDecimal;\n  mul(y: Numeric): WrappedDecimal;\n  toWrappedDecimalPlaces(dp?: number, rm?: number): WrappedDecimal;\n  todp(dp?: number, rm?: number): WrappedDecimal;\n  toInteger(): WrappedDecimal;\n  toint(): WrappedDecimal;\n  toPower(y: Numeric): WrappedDecimal;\n  pow(y: Numeric): WrappedDecimal;\n  toSignificantDigits(sd?: number, rm?: number): WrappedDecimal;\n  tosd(sd?: number, rm?: number): WrappedDecimal;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\nconst toFormat: {\n  (fn: BigConstructor): WrappedBigConstructor;\n  (fn: DecimalConstructor): WrappedDecimalConstructor;\n} = _toFarmat;\nexport default toFormat;\n","import { BigNumberish, Rounding, tenExponential } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Raydium_price\");\n\ninterface PriceProps {\n  baseToken: Token;\n  denominator: BigNumberish;\n  quoteToken: Token;\n  numerator: BigNumberish;\n}\n\nexport class Price extends Fraction {\n  public readonly baseToken: Token; // input i.e. denominator\n  public readonly quoteToken: Token; // output i.e. numerator\n  // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\n  public readonly scalar: Fraction;\n\n  // denominator and numerator _must_ be raw, i.e. in the native representation\n  public constructor(params: PriceProps) {\n    const { baseToken, quoteToken, numerator, denominator } = params;\n    super(numerator, denominator);\n\n    this.baseToken = baseToken;\n    this.quoteToken = quoteToken;\n    this.scalar = new Fraction(tenExponential(baseToken.decimals), tenExponential(quoteToken.decimals));\n  }\n\n  public get raw(): Fraction {\n    return new Fraction(this.numerator, this.denominator);\n  }\n\n  public get adjusted(): Fraction {\n    return super.mul(this.scalar);\n  }\n\n  public invert(): Price {\n    return new Price({\n      baseToken: this.quoteToken,\n      quoteToken: this.baseToken,\n      denominator: this.numerator,\n      numerator: this.denominator,\n    });\n  }\n\n  public mul(other: Price): Price {\n    if (this.quoteToken !== other.baseToken) logger.logWithError(\"mul token not equals\");\n\n    const fraction = super.mul(other);\n    return new Price({\n      baseToken: this.baseToken,\n      quoteToken: other.quoteToken,\n      denominator: fraction.denominator,\n      numerator: fraction.numerator,\n    });\n  }\n\n  public toSignificant(significantDigits = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { SOL_INFO } from \"../raydium/token/constant\";\n\nimport { Token } from \"./token\";\n\ninterface CurrencyProps {\n  decimals: number;\n  symbol?: string;\n  name?: string;\n}\n/**\n * A currency is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n * The only instance of the base class `Currency` is SOL.\n */\nexport class Currency {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n\n  /**\n   * The only instance of the base class `Currency`.\n   */\n  public static readonly SOL: Currency = new Currency(SOL_INFO);\n\n  /**\n   * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.SOL`.\n   * @param decimals - decimals of the currency\n   * @param symbol - symbol of the currency\n   * @param name - name of the currency\n   */\n  public constructor({ decimals, symbol = \"UNKNOWN\", name = \"UNKNOWN\" }: CurrencyProps) {\n    this.decimals = decimals;\n    this.symbol = symbol;\n    this.name = name;\n  }\n\n  public equals(other: Currency): boolean {\n    return this === other;\n  }\n}\n\n/**\n * Compares two currencies for equality\n */\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\n  if (currencyA instanceof Token && currencyB instanceof Token) {\n    return currencyA.equals(currencyB);\n  } else if (currencyA instanceof Token || currencyB instanceof Token) {\n    return false;\n  } else {\n    return currencyA === currencyB;\n  }\n}\n","import { Rounding } from \"../common/bignumber\";\nimport BN from \"bn.js\";\nimport { Fraction } from \"./fraction\";\n\nexport const _100_PERCENT = new Fraction(new BN(100));\n\nexport class Percent extends Fraction {\n  public toSignificant(significantDigits = 5, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = 2, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import {\n  Connection,\n  PublicKey,\n  sendAndConfirmTransaction,\n  Signer,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\nimport axios from \"axios\";\n\nimport { SignAllTransactions, ComputeBudgetConfig } from \"@/raydium/type\";\nimport { TxVersion } from \"./txType\";\nimport { Owner } from \"../owner\";\nimport { getRecentBlockHash, addComputeBudget, checkLegacyTxSize, checkV0TxSize, printSimulate } from \"./txUtils\";\nimport { CacheLTA, getMultipleLookupTableInfo, LOOKUP_TABLE_CACHE } from \"./lookupTable\";\n\ninterface SolanaFeeInfo {\n  min: number;\n  max: number;\n  avg: number;\n  priorityTx: number;\n  nonVotes: number;\n  priorityRatio: number;\n  avgCuPerBlock: number;\n  blockspaceUsageRatio: number;\n}\ntype SolanaFeeInfoJson = {\n  \"1\": SolanaFeeInfo;\n  \"5\": SolanaFeeInfo;\n  \"15\": SolanaFeeInfo;\n};\n\ninterface TxBuilderInit {\n  connection: Connection;\n  feePayer: PublicKey;\n  owner?: Owner;\n  signAllTransactions?: SignAllTransactions;\n}\n\nexport interface AddInstructionParam {\n  addresses?: Record<string, PublicKey>;\n  instructions?: TransactionInstruction[];\n  endInstructions?: TransactionInstruction[];\n  lookupTableAddress?: string[];\n  signers?: Signer[];\n  instructionTypes?: string[];\n  endInstructionTypes?: string[];\n}\n\nexport interface TxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transaction: Transaction;\n  instructionTypes: string[];\n  signers: Signer[];\n  execute: () => Promise<{ txId: string; signedTx: Transaction }>;\n  extInfo: T;\n}\n\nexport interface TxV0BuildData<T = Record<string, any>> extends Omit<TxBuildData<T>, \"transaction\" | \"execute\"> {\n  builder: TxBuilder;\n  transaction: VersionedTransaction;\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: () => Promise<{ txId: string; signedTx: VersionedTransaction }>;\n}\n\nexport interface ExecuteParam {\n  sequentially: boolean;\n  onTxUpdate?: (completeTxs: { txId: string; status: \"success\" | \"error\" | \"sent\" }[]) => void;\n}\nexport interface MultiTxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transactions: Transaction[];\n  instructionTypes: string[];\n  signers: Signer[][];\n  execute: (executeParams?: ExecuteParam) => Promise<{ txIds: string[]; signedTxs: Transaction[] }>;\n  extInfo: T;\n}\n\nexport interface MultiTxV0BuildData<T = Record<string, any>>\n  extends Omit<MultiTxBuildData<T>, \"transactions\" | \"execute\"> {\n  builder: TxBuilder;\n  transactions: VersionedTransaction[];\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (executeParams?: ExecuteParam) => Promise<{ txIds: string[]; signedTxs: VersionedTransaction[] }>;\n}\n\nexport type MakeMultiTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? MultiTxBuildData<O>\n  : MultiTxV0BuildData<O>;\n\nexport type MakeTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? TxBuildData<O>\n  : TxV0BuildData<O>;\n\nexport class TxBuilder {\n  private connection: Connection;\n  private owner?: Owner;\n  private instructions: TransactionInstruction[] = [];\n  private endInstructions: TransactionInstruction[] = [];\n  private lookupTableAddress: string[] = [];\n  private signers: Signer[] = [];\n  private instructionTypes: string[] = [];\n  private endInstructionTypes: string[] = [];\n  private feePayer: PublicKey;\n  private signAllTransactions?: SignAllTransactions;\n\n  constructor(params: TxBuilderInit) {\n    this.connection = params.connection;\n    this.feePayer = params.feePayer;\n    this.signAllTransactions = params.signAllTransactions;\n    this.owner = params.owner;\n  }\n\n  get AllTxData(): {\n    instructions: TransactionInstruction[];\n    endInstructions: TransactionInstruction[];\n    signers: Signer[];\n    instructionTypes: string[];\n    endInstructionTypes: string[];\n    lookupTableAddress: string[];\n  } {\n    return {\n      instructions: this.instructions,\n      endInstructions: this.endInstructions,\n      signers: this.signers,\n      instructionTypes: this.instructionTypes,\n      endInstructionTypes: this.endInstructionTypes,\n      lookupTableAddress: this.lookupTableAddress,\n    };\n  }\n\n  get allInstructions(): TransactionInstruction[] {\n    return [...this.instructions, ...this.endInstructions];\n  }\n\n  public async getComputeBudgetConfig(): Promise<ComputeBudgetConfig | undefined> {\n    const json = (\n      await axios.get<SolanaFeeInfoJson>(`https://solanacompass.com/api/fees?cacheFreshTime=${5 * 60 * 1000}`)\n    ).data;\n    const { avg } = json?.[15] ?? {};\n    if (!avg) return undefined;\n    return {\n      units: 600000,\n      microLamports: Math.min(Math.ceil((avg * 1000000) / 600000), 25000),\n    };\n  }\n\n  public addCustomComputeBudget(config?: ComputeBudgetConfig) {\n    if (config) {\n      const { instructions, instructionTypes } = addComputeBudget(config);\n      this.instructions.unshift(...instructions);\n      this.instructionTypes.unshift(...instructionTypes);\n      return true;\n    }\n    return false;\n  }\n\n  public async calComputeBudget({\n    config: propConfig,\n    defaultIns,\n  }: {\n    config?: ComputeBudgetConfig;\n    defaultIns?: TransactionInstruction[];\n  }): Promise<void> {\n    try {\n      const config = propConfig || (await this.getComputeBudgetConfig());\n      if (this.addCustomComputeBudget(config)) return;\n      defaultIns && this.instructions.unshift(...defaultIns);\n    } catch {\n      defaultIns && this.instructions.unshift(...defaultIns);\n    }\n  }\n\n  public addInstruction({\n    instructions = [],\n    endInstructions = [],\n    signers = [],\n    instructionTypes = [],\n    endInstructionTypes = [],\n    lookupTableAddress = [],\n  }: AddInstructionParam): TxBuilder {\n    this.instructions.push(...instructions);\n    this.endInstructions.push(...endInstructions);\n    this.signers.push(...signers);\n    this.instructionTypes.push(...instructionTypes);\n    this.endInstructionTypes.push(...endInstructionTypes);\n    this.lookupTableAddress.push(...lookupTableAddress.filter((address) => address !== PublicKey.default.toString()));\n    return this;\n  }\n\n  public async versionBuild<O = Record<string, any>>({\n    txVersion,\n    extInfo,\n  }: {\n    txVersion?: TxVersion;\n    extInfo?: O;\n  }): Promise<MakeTxData<TxVersion.LEGACY, O> | MakeTxData<TxVersion.V0, O>> {\n    if (txVersion === TxVersion.V0) return (await this.buildV0({ ...(extInfo || {}) })) as MakeTxData<TxVersion.V0, O>;\n    return this.build<O>(extInfo) as MakeTxData<TxVersion.LEGACY, O>;\n  }\n\n  public build<O = Record<string, any>>(extInfo?: O): MakeTxData<TxVersion.LEGACY, O> {\n    const transaction = new Transaction();\n    if (this.allInstructions.length) transaction.add(...this.allInstructions);\n    transaction.feePayer = this.feePayer;\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async () => {\n        const recentBlockHash = await getRecentBlockHash(this.connection);\n        transaction.recentBlockhash = recentBlockHash;\n        if (this.signers.length) transaction.sign(...this.signers);\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          return {\n            txId: await sendAndConfirmTransaction(this.connection, transaction, this.signers),\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions([transaction]);\n          return {\n            txId: await this.connection.sendRawTransaction(txs[0].serialize(), { skipPreflight: true }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please connect wallet first\");\n      },\n      extInfo: extInfo || ({} as O),\n    };\n  }\n\n  public buildMultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.LEGACY>[];\n    extInfo?: T;\n  }): MultiTxBuildData {\n    const { extraPreBuildData = [], extInfo } = params;\n    const { transaction } = this.build(extInfo);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.transaction.instructions.length > 0);\n\n    const allTransactions: Transaction[] = [transaction, ...filterExtraBuildData.map((data) => data.transaction)];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      execute: async (executeParams?: ExecuteParam) => {\n        const { sequentially, onTxUpdate } = executeParams || {};\n        const recentBlockHash = await getRecentBlockHash(this.connection);\n        if (this.owner?.isKeyPair) {\n          return {\n            txIds: await await Promise.all(\n              allTransactions.map(async (tx, idx) => {\n                tx.recentBlockhash = recentBlockHash;\n                return await sendAndConfirmTransaction(this.connection, tx, allSigners[idx]);\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const partialSignedTxs = allTransactions.map((tx, idx) => {\n            tx.recentBlockhash = recentBlockHash;\n            if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n            return tx;\n          });\n          printSimulate(partialSignedTxs);\n          const signedTxs = await this.signAllTransactions(partialSignedTxs);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: { txId: string; status: \"success\" | \"error\" | \"sent\" }[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight: true });\n              processedTxs.push({ txId, status: \"sent\" });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight: true });\n              txIds.push(txId);\n            }\n            return {\n              txIds,\n              signedTxs,\n            };\n          }\n        }\n        throw new Error(\"please connect wallet first\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async versionMultiBuild<T extends TxVersion, O = Record<string, any>>({\n    extraPreBuildData,\n    txVersion,\n    extInfo,\n  }: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[] | MakeTxData<TxVersion.LEGACY>[];\n    txVersion?: T;\n    extInfo?: O;\n  }): Promise<MakeMultiTxData<T, O>> {\n    if (txVersion === TxVersion.V0)\n      return (await this.buildV0MultiTx({\n        extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.V0>[],\n        buildProps: extInfo || {},\n      })) as MakeMultiTxData<T, O>;\n    return this.buildMultiTx<O>({\n      extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.LEGACY>[],\n      extInfo,\n    }) as MakeMultiTxData<T, O>;\n  }\n\n  public async buildV0<O = Record<string, any>>(\n    props?: O & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n    },\n  ): Promise<MakeTxData<TxVersion.V0, O>> {\n    const { lookupTableCache = {}, lookupTableAddress = [], forerunCreate, ...extInfo } = props || {};\n    const lookupTableAddressAccount = {\n      ...LOOKUP_TABLE_CACHE,\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...lookupTableAddress, ...this.lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const messageV0 = new TransactionMessage({\n      payerKey: this.feePayer,\n      recentBlockhash: forerunCreate ? PublicKey.default.toBase58() : await getRecentBlockHash(this.connection),\n      instructions: [...this.allInstructions],\n    }).compileToV0Message(Object.values(lookupTableAddressAccount));\n    const transaction = new VersionedTransaction(messageV0);\n    transaction.sign(this.signers);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async () => {\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          transaction.sign([this.owner.signer as Signer]);\n          return {\n            txId: await this.connection.sendTransaction(transaction, { skipPreflight: true }),\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions<VersionedTransaction>([transaction]);\n          return {\n            txId: await this.connection.sendTransaction(txs[0], { skipPreflight: true }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please connect wallet first\");\n      },\n      extInfo: (extInfo || {}) as O,\n    };\n  }\n\n  public async buildV0MultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[];\n    buildProps?: T & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n    };\n  }): Promise<MultiTxV0BuildData> {\n    const { extraPreBuildData = [], buildProps } = params;\n    const { transaction } = await this.buildV0(buildProps);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.builder.instructions.length > 0);\n\n    const allTransactions: VersionedTransaction[] = [\n      transaction,\n      ...filterExtraBuildData.map((data) => data.transaction),\n    ];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    allTransactions.forEach(async (tx, idx) => {\n      tx.sign(allSigners[idx]);\n    });\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      buildProps,\n      execute: async (executeParams?: ExecuteParam) => {\n        printSimulate(allTransactions);\n        const { sequentially, onTxUpdate } = executeParams || {};\n        if (this.owner?.isKeyPair) {\n          allTransactions.forEach((tx) => tx.sign([this.owner!.signer as Signer]));\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx);\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: { txId: string; status: \"success\" | \"error\" | \"sent\" }[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight: true });\n              processedTxs.push({ txId, status: \"sent\" });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight: true });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please connect wallet first\");\n      },\n      extInfo: buildProps || {},\n    };\n  }\n\n  public async sizeCheckBuild(\n    props?: Record<string, any> & { autoComputeBudget?: boolean },\n  ): Promise<MultiTxBuildData> {\n    const { autoComputeBudget = false, ...extInfo } = props || {};\n\n    let computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } = {\n      instructions: [],\n      instructionTypes: [],\n    };\n\n    if (autoComputeBudget) {\n      const computeConfig = autoComputeBudget ? await this.getComputeBudgetConfig() : undefined;\n      computeBudgetData =\n        autoComputeBudget && computeConfig\n          ? addComputeBudget(computeConfig)\n          : { instructions: [], instructionTypes: [] };\n    }\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n\n    const allTransactions: Transaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = autoComputeBudget ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      const _signerStrs = new Set<string>(\n        _itemIns.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signer = [..._signerStrs.values()].map((i) => new PublicKey(i));\n\n      if (\n        (instructionQueue.length < 12 &&\n          checkLegacyTxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, signers: _signer })) ||\n        checkLegacyTxSize({ instructions: _itemIns, payer: this.feePayer, signers: _signer })\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n\n        // if add computeBudget still not exceed tx size limit\n        if (\n          checkLegacyTxSize({\n            instructions: autoComputeBudget\n              ? [...computeBudgetData.instructions, ...instructionQueue]\n              : [...instructionQueue],\n            payer: this.feePayer,\n            signers: _signer,\n          })\n        ) {\n          allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n        } else {\n          allTransactions.push(new Transaction().add(...instructionQueue));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        checkLegacyTxSize({\n          instructions: autoComputeBudget\n            ? [...computeBudgetData.instructions, ...instructionQueue]\n            : [...instructionQueue],\n          payer: this.feePayer,\n          signers: _signers.map((s) => s.publicKey),\n        })\n      ) {\n        allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n      } else {\n        allTransactions.push(new Transaction().add(...instructionQueue));\n      }\n      allSigners.push(_signers);\n    }\n    allTransactions.forEach((tx) => (tx.feePayer = this.feePayer));\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: ExecuteParam) => {\n        const { sequentially, onTxUpdate } = executeParams || {};\n        const recentBlockHash = await getRecentBlockHash(this.connection);\n        allTransactions.forEach(async (tx, idx) => {\n          tx.recentBlockhash = recentBlockHash;\n          if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx, idx) => {\n                return await sendAndConfirmTransaction(this.connection, tx, allSigners[idx]);\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: { txId: string; status: \"success\" | \"error\" | \"sent\" }[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight: true });\n              processedTxs.push({ txId, status: \"sent\" });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight: true });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please connect wallet first\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async sizeCheckBuildV0(\n    props?: Record<string, any> & {\n      autoComputeBudget?: boolean;\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n    },\n  ): Promise<MultiTxV0BuildData> {\n    const { autoComputeBudget = false, lookupTableCache = {}, lookupTableAddress = [], ...extInfo } = props || {};\n    const lookupTableAddressAccount = {\n      ...LOOKUP_TABLE_CACHE,\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...this.lookupTableAddress, ...lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    let computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } = {\n      instructions: [],\n      instructionTypes: [],\n    };\n\n    if (autoComputeBudget) {\n      const computeConfig = autoComputeBudget ? await this.getComputeBudgetConfig() : undefined;\n      computeBudgetData =\n        autoComputeBudget && computeConfig\n          ? addComputeBudget(computeConfig)\n          : { instructions: [], instructionTypes: [] };\n    }\n\n    const blockHash = await getRecentBlockHash(this.connection);\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n\n    const allTransactions: VersionedTransaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = autoComputeBudget ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      if (\n        (instructionQueue.length < 12 &&\n          checkV0TxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, lookupTableAddressAccount })) ||\n        checkV0TxSize({ instructions: _itemIns, payer: this.feePayer, lookupTableAddressAccount })\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n\n        const lookupTableAddress: undefined | CacheLTA = {};\n        for (const item of [...new Set<string>(allLTA)]) {\n          if (lookupTableAddressAccount[item] !== undefined) lookupTableAddress[item] = lookupTableAddressAccount[item];\n        }\n        // if add computeBudget still not exceed tx size limit\n        if (\n          autoComputeBudget &&\n          checkV0TxSize({\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n            payer: this.feePayer,\n            lookupTableAddressAccount,\n            recentBlockhash: blockHash,\n          })\n        ) {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        } else {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n            instructions: [...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        autoComputeBudget &&\n        checkV0TxSize({\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          payer: this.feePayer,\n          lookupTableAddressAccount,\n          recentBlockhash: blockHash,\n        })\n      ) {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      } else {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      }\n      allSigners.push(_signers);\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      buildProps: props,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: ExecuteParam) => {\n        const { sequentially, onTxUpdate } = executeParams || {};\n        allTransactions.map(async (tx, idx) => {\n          if (allSigners[idx].length) tx.sign(allSigners[idx]);\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight: true });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: { txId: string; status: \"success\" | \"error\" | \"sent\" }[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight: true });\n              processedTxs.push({ txId, status: \"sent\" });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              this.connection.onSignature(\n                txId,\n                (signatureResult) => {\n                  const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                  if (targetTxIdx > -1) processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                  onTxUpdate?.([...processedTxs]);\n                  checkSendTx();\n                },\n                \"processed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight: true });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please connect wallet first\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n}\n","export enum TxVersion {\n  \"V0\",\n  \"LEGACY\",\n}\n\nexport const InstructionType = {\n  CreateAccount: \"CreateAccount\",\n  InitAccount: \"InitAccount\",\n  CreateATA: \"CreateATA\",\n  CloseAccount: \"CloseAccount\",\n  TransferAmount: \"TransferAmount\",\n  InitMint: \"InitMint\",\n  MintTo: \"MintTo\",\n\n  InitMarket: \"InitMarket\", // create market main ins\n  Util1216OwnerClaim: \"Util1216OwnerClaim\", // owner claim token ins\n\n  SetComputeUnitPrice: \"SetComputeUnitPrice\",\n  SetComputeUnitLimit: \"SetComputeUnitLimit\",\n\n  // CLMM\n  ClmmCreatePool: \"ClmmCreatePool\",\n  ClmmOpenPosition: \"ClmmOpenPosition\",\n  ClmmIncreasePosition: \"ClmmIncreasePosition\",\n  ClmmDecreasePosition: \"ClmmDecreasePosition\",\n  ClmmClosePosition: \"ClmmClosePosition\",\n  ClmmSwapBaseIn: \"ClmmSwapBaseIn\",\n  ClmmSwapBaseOut: \"ClmmSwapBaseOut\",\n  ClmmInitReward: \"ClmmInitReward\",\n  ClmmSetReward: \"ClmmSetReward\",\n  ClmmCollectReward: \"ClmmCollectReward\",\n\n  AmmV4Swap: \"AmmV4Swap\",\n  AmmV4AddLiquidity: \"AmmV4AddLiquidity\",\n  AmmV4RemoveLiquidity: \"AmmV4RemoveLiquidity\",\n  AmmV4SimulatePoolInfo: \"AmmV4SimulatePoolInfo\",\n  AmmV4SwapBaseIn: \"AmmV4SwapBaseIn\",\n  AmmV4SwapBaseOut: \"AmmV4SwapBaseOut\",\n  AmmV4CreatePool: \"AmmV4CreatePool\",\n  AmmV4InitPool: \"AmmV4InitPool\",\n\n  AmmV5AddLiquidity: \"AmmV5AddLiquidity\",\n  AmmV5RemoveLiquidity: \"AmmV5RemoveLiquidity\",\n  AmmV5SimulatePoolInfo: \"AmmV5SimulatePoolInfo\",\n  AmmV5SwapBaseIn: \"AmmV5SwapBaseIn\",\n  AmmV5SwapBaseOut: \"AmmV5SwapBaseOut\",\n\n  RouteSwap: \"RouteSwap\",\n  RouteSwap1: \"RouteSwap1\",\n  RouteSwap2: \"RouteSwap2\",\n\n  FarmV3Deposit: \"FarmV3Deposit\",\n  FarmV3Withdraw: \"FarmV3Withdraw\",\n  FarmV3CreateLedger: \"FarmV3CreateLedger\",\n\n  FarmV5Deposit: \"FarmV5Deposit\",\n  FarmV5Withdraw: \"FarmV5Withdraw\",\n  FarmV5CreateLedger: \"FarmV5CreateLedger\",\n\n  FarmV6Deposit: \"FarmV6Deposit\",\n  FarmV6Withdraw: \"FarmV6Withdraw\",\n  FarmV6Create: \"FarmV6Create\",\n  FarmV6Restart: \"FarmV6Restart\",\n  FarmV6CreatorAddReward: \"FarmV6CreatorAddReward\",\n  FarmV6CreatorWithdraw: \"FarmV6CreatorWithdraw\",\n};\n","import {\n  Connection,\n  PublicKey,\n  ComputeBudgetProgram,\n  SimulatedTransactionResponse,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  Keypair,\n  EpochInfo,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { createLogger } from \"../logger\";\nimport { InstructionType } from \"./txType\";\nimport { CacheLTA } from \"./lookupTable\";\n\nimport { ComputeBudgetConfig } from \"@/raydium/type\";\n\nconst logger = createLogger(\"Raydium_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n  instructions: TransactionInstruction[];\n  instructionTypes: string[];\n} {\n  const ins: TransactionInstruction[] = [];\n  const insTypes: string[] = [];\n  if (config.microLamports) {\n    ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n    insTypes.push(InstructionType.SetComputeUnitPrice);\n  }\n  if (config.units) {\n    ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n    insTypes.push(InstructionType.SetComputeUnitLimit);\n  }\n\n  return {\n    instructions: ins,\n    instructionTypes: insTypes,\n  };\n}\n\nexport async function getRecentBlockHash(connection: Connection): Promise<string> {\n  try {\n    return (await connection.getLatestBlockhash?.())?.blockhash || (await connection.getRecentBlockhash()).blockhash;\n  } catch {\n    return (await connection.getRecentBlockhash()).blockhash;\n  }\n}\n\n/**\n * Forecast transaction size\n */\nexport function forecastTransactionSize(instructions: TransactionInstruction[], signers: PublicKey[]): boolean {\n  if (instructions.length < 1) logger.logWithError(`no instructions provided: ${instructions.toString()}`);\n  if (signers.length < 1) logger.logWithError(`no signers provided:, ${signers.toString()}`);\n\n  const transaction = new Transaction();\n  transaction.recentBlockhash = \"11111111111111111111111111111111\";\n  transaction.feePayer = signers[0];\n  transaction.add(...instructions);\n\n  try {\n    return Buffer.from(transaction.serialize({ verifySignatures: false })).toString(\"base64\").length < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\n/**\n * Simulates multiple instruction\n */\n/**\n * Simulates multiple instruction\n */\nexport async function simulateMultipleInstruction(\n  connection: Connection,\n  instructions: TransactionInstruction[],\n  keyword: string,\n  batchRequest = true,\n): Promise<string[]> {\n  const feePayer = new PublicKey(\"RaydiumSimuLateTransaction11111111111111111\");\n\n  const transactions: Transaction[] = [];\n\n  let transaction = new Transaction();\n  transaction.feePayer = feePayer;\n\n  for (const instruction of instructions) {\n    if (!forecastTransactionSize([...transaction.instructions, instruction], [feePayer])) {\n      transactions.push(transaction);\n      transaction = new Transaction();\n      transaction.feePayer = feePayer;\n    }\n    transaction.add(instruction);\n  }\n  if (transaction.instructions.length > 0) {\n    transactions.push(transaction);\n  }\n\n  let results: SimulatedTransactionResponse[] = [];\n\n  try {\n    results = await simulateTransaction(connection, transactions, batchRequest);\n    if (results.find((i) => i.err !== null)) throw Error(\"rpc simulateTransaction error\");\n  } catch (error) {\n    if (error instanceof Error) {\n      logger.logWithError(\"failed to simulate for instructions\", \"RPC_ERROR\", {\n        message: error.message,\n      });\n    }\n  }\n\n  const logs: string[] = [];\n  for (const result of results) {\n    logger.debug(\"simulate result:\", result);\n\n    if (result.logs) {\n      const filteredLog = result.logs.filter((log) => log && log.includes(keyword));\n      logger.debug(\"filteredLog:\", logs);\n      if (!filteredLog.length) logger.logWithError(\"simulate log not match keyword\", \"keyword\", keyword);\n      logs.push(...filteredLog);\n    }\n  }\n\n  return logs;\n}\n\nexport function parseSimulateLogToJson(log: string, keyword: string): any {\n  const results = log.match(/{[\"\\w:,]+}/g);\n  if (!results || results.length !== 1) {\n    return logger.logWithError(`simulate log fail to match json, keyword: ${keyword}`);\n  }\n\n  return results[0];\n}\n\nexport function parseSimulateValue(log: string, key: string): any {\n  const reg = new RegExp(`\"${key}\":(\\\\d+)`, \"g\");\n\n  const results = reg.exec(log);\n  if (!results || results.length !== 2) {\n    return logger.logWithError(`simulate log fail to match key\", key: ${key}`);\n  }\n\n  return results[1];\n}\n\nexport interface ProgramAddress {\n  publicKey: PublicKey;\n  nonce: number;\n}\nexport function findProgramAddress(\n  seeds: Array<Buffer | Uint8Array>,\n  programId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  const [publicKey, nonce] = PublicKey.findProgramAddressSync(seeds, programId);\n  return { publicKey, nonce };\n}\n\nexport async function simulateTransaction(\n  connection: Connection,\n  transactions: Transaction[],\n  batchRequest?: boolean,\n): Promise<any[]> {\n  let results: any[] = [];\n  if (batchRequest) {\n    const getLatestBlockhash = await connection.getLatestBlockhash();\n\n    const encodedTransactions: string[] = [];\n    for (const transaction of transactions) {\n      transaction.recentBlockhash = getLatestBlockhash.blockhash;\n      transaction.lastValidBlockHeight = getLatestBlockhash.lastValidBlockHeight;\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const message = transaction._compile();\n      const signData = message.serialize();\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const wireTransaction = transaction._serialize(signData);\n      const encodedTransaction = wireTransaction.toString(\"base64\");\n\n      encodedTransactions.push(encodedTransaction);\n    }\n\n    const batch = encodedTransactions.map((keys) => {\n      const args = connection._buildArgs([keys], undefined, \"base64\");\n      return {\n        methodName: \"simulateTransaction\",\n        args,\n      };\n    });\n\n    const reqData: { methodName: string; args: any[] }[][] = [];\n    const itemReqIndex = 20;\n    for (let i = 0; i < Math.ceil(batch.length / itemReqIndex); i++) {\n      reqData.push(batch.slice(i * itemReqIndex, (i + 1) * itemReqIndex));\n    }\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    results = await (\n      await Promise.all(\n        reqData.map(async (i) => (await (connection as any)._rpcBatchRequest(i)).map((ii) => ii.result.value)),\n      )\n    ).flat();\n  } else {\n    try {\n      results = await Promise.all(\n        transactions.map(async (transaction) => await (await connection.simulateTransaction(transaction)).value),\n      );\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(\"failed to get info for multiple accounts\", \"RPC_ERROR\", {\n          message: error.message,\n        });\n      }\n    }\n  }\n\n  return results;\n}\n\nexport function checkLegacyTxSize({\n  instructions,\n  payer,\n  signers,\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  signers: PublicKey[];\n}): boolean {\n  return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n  instructions,\n  payer,\n  lookupTableAddressAccount,\n  recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  lookupTableAddressAccount?: CacheLTA;\n  recentBlockhash?: string;\n}): boolean {\n  const transactionMessage = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash,\n    instructions,\n  });\n\n  const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n  try {\n    const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n    return buildLength < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n  time: 0,\n  data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n  if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n    const data = await connection.getEpochInfo();\n    epochInfoCache = {\n      time: Date.now(),\n      data,\n    };\n    return data;\n  } else {\n    return epochInfoCache.data;\n  }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n  if (Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return Buffer.from(arr);\n  }\n};\n\nexport function printSimulate(transactions: Transaction[] | VersionedTransaction[]): string[] {\n  const allBase64: string[] = [];\n  transactions.forEach((transaction) => {\n    if (transaction instanceof Transaction) {\n      if (!transaction.recentBlockhash) transaction.recentBlockhash = TOKEN_PROGRAM_ID.toBase58();\n      if (!transaction.feePayer) transaction.feePayer = Keypair.generate().publicKey;\n    }\n    let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n    if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n    const base64 = serialized.toString(\"base64\");\n    allBase64.push(base64);\n  });\n  console.log(\"simulate tx string:\", allBase64);\n\n  return allBase64;\n}\n","import { Connection, PublicKey, AddressLookupTableAccount } from \"@solana/web3.js\";\nimport { getMultipleAccountsInfo } from \"../accountInfo\";\n\nexport interface CacheLTA {\n  [key: string]: AddressLookupTableAccount;\n}\n\nexport async function getMultipleLookupTableInfo({\n  connection,\n  address,\n}: {\n  connection: Connection;\n  address: PublicKey[];\n}): Promise<CacheLTA> {\n  const dataInfos = await getMultipleAccountsInfo(\n    connection,\n    [...new Set<string>(address.map((i) => i.toString()))].map((i) => new PublicKey(i)),\n  );\n\n  const outDict: CacheLTA = {};\n  for (let i = 0; i < address.length; i++) {\n    const info = dataInfos[i];\n    const key = address[i];\n    if (!info) continue;\n    const lookupAccount = new AddressLookupTableAccount({\n      key,\n      state: AddressLookupTableAccount.deserialize(info.data),\n    });\n    outDict[key.toString()] = lookupAccount;\n    LOOKUP_TABLE_CACHE[key.toString()] = lookupAccount;\n  }\n\n  return outDict;\n}\n\nexport const LOOKUP_TABLE_CACHE: CacheLTA = {\n  \"2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17\": new AddressLookupTableAccount({\n    key: new PublicKey(\"2immgwYNHBbyVQKVGCEkgWpi53bLwWNRMB5G2nbgYV17\"),\n    state: AddressLookupTableAccount.deserialize(\n      Buffer.from(\n        \"AQAAAP//////////d49+DAAAAAAAAQZMWvw7GUNJdaccNBVnb57OKakxL2BHLYvhRwVILRsgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKkG3fbh7nWP3hhCXbzkbM3athr8TYO5DSf+vfko2KGL/AVKU1D4XciC1hSlVnJ4iilt3x6rq9CmBniISTL07vagBqfVFxksXFEhjMlMPUrxf1ja7gibof1E49vZigAAAAAGp9UXGMd0yShWY5hpHV62i164o5tLbVxzVVshAAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUbIScv+6Yw2LHF/6K0ZjUPibbSWXCirYPGuuVl7zT789IUPLW4CpHr4JNCatp3ELXDLKMv6JJ+37le50lbBJ2LvDQdRqCgtphMF/imcN7mY5YRx2xE1A3MQ+L4QRaYK9u4GRfZP3LsAd00a+IkCpA22UNQMKdq5BFbJuwuOLqc8zxCTDlqxBG8J0HcxtfogQHDK06ukzfaXiNDKAob1MqBHS9lJxDYCwz8gd5DtFqNSTKG5l1zxIaKpDP/sffi2is1H9aKveyXSu5StXElYRl9SD5As0DHE4N0GLnf84/siiKXVyp4Ez121kLcUui/jLLFZEz/BwZK3Ilf9B9OcsEAeDMKAy2vjGSxQODgBz0QwGA+eP4ZjIjrIAQaXENv31QfLlOdXSRCkaybRniDHF4C8YcwhcvsqrOVuTP4B2Na+9wLdtrB31uz2rtlFI5kahdsnp/d1SrASDInYCtTYtdoke4kX+hoKWcEWM4Tle8pTUkUVv4BxS6fje/EzKBE4Qu9N9LMnrw/JNO0hqMVB4rk/2ou4AB1loQ7FZoPwut2o4KZB+0p9xnbrQKw038qjpHar+PyDwvxBRcu5hpHw3dguezeWv+IwvgW5icu8EGkhGa9AkFPPJT7VMSFb8xowveU=\",\n        \"base64\",\n      ),\n    ),\n  }),\n};\n","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\nimport { chunkArray } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"../raydium/type\";\n\ninterface MultipleAccountsJsonRpcResponse {\n  jsonrpc: string;\n  id: string;\n  error?: {\n    code: number;\n    message: string;\n  };\n  result: {\n    context: { slot: number };\n    value: { data: Array<string>; executable: boolean; lamports: number; owner: string; rentEpoch: number }[];\n  };\n}\n\nexport interface GetMultipleAccountsInfoConfig {\n  batchRequest?: boolean;\n  commitment?: Commitment;\n}\n\nconst logger = createLogger(\"Raydium_accountInfo_util\");\n\nexport async function getMultipleAccountsInfo(\n  connection: Connection,\n  publicKeys: PublicKey[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<(AccountInfo<Buffer> | null)[]> {\n  const { batchRequest, commitment = \"confirmed\" } = {\n    batchRequest: false,\n    ...config,\n  };\n\n  const chunkedKeys = chunkArray(publicKeys, 100);\n  let results: (AccountInfo<Buffer> | null)[][] = new Array(chunkedKeys.length).fill([]);\n\n  if (batchRequest) {\n    const batch = chunkedKeys.map((keys) => {\n      const args = connection._buildArgs([keys.map((key) => key.toBase58())], commitment, \"base64\");\n      return {\n        methodName: \"getMultipleAccounts\",\n        args,\n      };\n    });\n\n    const _batch = chunkArray(batch, 10);\n\n    const unsafeResponse: MultipleAccountsJsonRpcResponse[] = await (\n      await Promise.all(_batch.map(async (i) => await (connection as any)._rpcBatchRequest(i)))\n    ).flat();\n    results = unsafeResponse.map((unsafeRes: MultipleAccountsJsonRpcResponse) => {\n      if (unsafeRes.error)\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${unsafeRes.error.message}`);\n\n      return unsafeRes.result.value.map((accountInfo) => {\n        if (accountInfo) {\n          const { data, executable, lamports, owner, rentEpoch } = accountInfo;\n\n          if (data.length !== 2 && data[1] !== \"base64\") logger.logWithError(`info must be base64 encoded, RPC_ERROR`);\n\n          return {\n            data: Buffer.from(data[0], \"base64\"),\n            executable,\n            lamports,\n            owner: new PublicKey(owner),\n            rentEpoch,\n          };\n        }\n        return null;\n      });\n    });\n  } else {\n    try {\n      results = (await Promise.all(\n        chunkedKeys.map((keys) => connection.getMultipleAccountsInfo(keys, commitment)),\n      )) as (AccountInfo<Buffer> | null)[][];\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${error.message}`);\n      }\n    }\n  }\n\n  return results.flat();\n}\n\nexport async function getMultipleAccountsInfoWithCustomFlags<T extends { pubkey: PublicKey }>(\n  connection: Connection,\n  publicKeysWithCustomFlag: T[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<({ accountInfo: AccountInfo<Buffer> | null } & T)[]> {\n  const multipleAccountsInfo = await getMultipleAccountsInfo(\n    connection,\n    publicKeysWithCustomFlag.map((o) => o.pubkey),\n    config,\n  );\n\n  return publicKeysWithCustomFlag.map((o, idx) => ({ ...o, accountInfo: multipleAccountsInfo[idx] }));\n}\n\nexport enum AccountType {\n  Uninitialized,\n  Mint,\n  Account,\n}\nexport const ACCOUNT_TYPE_SIZE = 1;\n\nexport async function fetchMultipleMintInfos({\n  connection,\n  mints,\n}: {\n  connection: Connection;\n  mints: PublicKey[];\n}): Promise<ReturnTypeFetchMultipleMintInfos> {\n  if (mints.length === 0) return {};\n  const mintInfos = await getMultipleAccountsInfoWithCustomFlags(\n    connection,\n    mints.map((i) => ({ pubkey: i })),\n  );\n\n  const mintK: ReturnTypeFetchMultipleMintInfos = {};\n  for (const i of mintInfos) {\n    const t = unpackMint(i.pubkey, i.accountInfo, i.accountInfo?.owner);\n    mintK[i.pubkey.toString()] = {\n      ...t,\n      feeConfig: getTransferFeeConfig(t) ?? undefined,\n    };\n  }\n\n  return mintK;\n}\n","/**\n * https://youmightnotneed.com/lodash/\n */\n\nexport function chunkArray<T>(arr: T[], chunkSize = 1, cache: T[][] = []): T[][] {\n  const tmp = [...arr];\n  if (chunkSize <= 0) return cache;\n  while (tmp.length) cache.push(tmp.splice(0, chunkSize));\n  return cache;\n}\n\nexport function intersection<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => arr.includes(item)));\n}\n\nexport function xor<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => !arr.includes(item)));\n}\n\nexport function uniq<T>(arr: T[]): T[] {\n  return [...new Set(arr)];\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\n// raydium\nexport const FARM_PROGRAM_ID_V3 = new PublicKey(\"EhhTKczWMGQt46ynNeRX1WfeagwwJd7ufHvCDjRxjo5Q\");\n// \"fusion\"\nexport const FARM_PROGRAM_ID_V5 = new PublicKey(\"9KEPoZmtHUrBbhWN1v1KWLMkkvwY6WLtAVUCPRtRjP4z\");\n// echosystem\nexport const FARM_PROGRAM_ID_V6 = new PublicKey(\"FarmqiPv5eAj3j1GMdMCMUGXqPUvmquZtMy86QH6rzhG\");\n\nexport const UTIL1216 = new PublicKey(\"CLaimxFqjHzgTJtAGHU47NPhg6qrc5sCnpC4tBLyABQS\");\n\nexport const OPEN_BOOK_PROGRAM = new PublicKey(\"srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX\");\nexport const SERUM_PROGRAM_ID_V3 = new PublicKey(\"9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin\");\n\nexport const AMM_V4 = new PublicKey(\"675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8\");\nexport const AMM_STABLE = new PublicKey(\"5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h\");\nexport const CLMM_PROGRAM_ID = new PublicKey(\"CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK\");\nexport const Router = new PublicKey(\"routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS\");\n\nexport const IDO_PROGRAM_ID_V1 = new PublicKey(\"6FJon3QE27qgPVggARueB22hLvoh22VzJpXv4rBEoSLF\");\nexport const IDO_PROGRAM_ID_V2 = new PublicKey(\"CC12se5To1CdEuw7fDS27B7Geo5jJyL7t5UK2B44NgiH\");\nexport const IDO_PROGRAM_ID_V3 = new PublicKey(\"9HzJyW1qZsEiSfMUf6L2jo3CcTKAyBmSyKdwQeYisHrC\");\nexport const IDO_PROGRAM_ID_V4 = new PublicKey(\"DropEU8AvevN3UrXWXTMuz3rqnMczQVNjq3kcSdW2SQi\");\n\nexport const IDO_ALL_PROGRAM = {\n  IDO_PROGRAM_ID_V1,\n  IDO_PROGRAM_ID_V2,\n  IDO_PROGRAM_ID_V3,\n  IDO_PROGRAM_ID_V4,\n};\n\nexport const ALL_PROGRAM_ID = {\n  AMM_V4,\n  AMM_STABLE,\n  CLMM_PROGRAM_ID,\n\n  FARM_PROGRAM_ID_V3,\n  FARM_PROGRAM_ID_V5,\n  FARM_PROGRAM_ID_V6,\n\n  OPEN_BOOK_PROGRAM,\n  SERUM_PROGRAM_ID_V3,\n\n  UTIL1216,\n\n  Router,\n};\n\nexport type ProgramIdConfig = Partial<typeof ALL_PROGRAM_ID>;\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { findProgramAddress } from \"./txTool/txUtils\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nexport function getATAAddress(\n  owner: PublicKey,\n  mint: PublicKey,\n  programId?: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [owner.toBuffer(), (programId ?? TOKEN_PROGRAM_ID).toBuffer(), mint.toBuffer()],\n    new PublicKey(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n  );\n}\n","import { EpochInfo } from \"@solana/web3.js\";\nimport { TransferFeeConfig, TransferFee } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\n\nimport { GetTransferAmountFee } from \"../raydium/type\";\nimport { TransferFeeDataBaseType } from \"../api/type\";\n\nconst POINT = 10_000;\nexport function getTransferAmountFee(\n  amount: BN,\n  feeConfig: TransferFeeConfig | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function getTransferAmountFeeV2(\n  amount: BN,\n  _feeConfig: TransferFeeDataBaseType | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (_feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n  const feeConfig = {\n    ..._feeConfig,\n    olderTransferFee: {\n      epoch: BigInt(_feeConfig.olderTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,\n    },\n    newerTransferFee: {\n      epoch: BigInt(_feeConfig.newerTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,\n    },\n  };\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function minExpirationTime(\n  expirationTime1: number | undefined,\n  expirationTime2: number | undefined,\n): number | undefined {\n  if (expirationTime1 === undefined) return expirationTime2;\n  if (expirationTime2 === undefined) return expirationTime1;\n\n  return Math.min(expirationTime1, expirationTime2);\n}\n\nexport function BNDivCeil(bn1: BN, bn2: BN): BN {\n  const { div, mod } = bn1.divmod(bn2);\n\n  if (mod.gt(new BN(0))) {\n    return div.add(new BN(1));\n  } else {\n    return div;\n  }\n}\n","import BN from \"bn.js\";\n\nexport const ZERO = new BN(0);\nexport const ONE = new BN(1);\nexport const NEGATIVE_ONE = new BN(-1);\n\nexport const Q64 = new BN(1).shln(64);\nexport const Q128 = new BN(1).shln(128);\n\nexport const MaxU64 = Q64.sub(ONE);\n\nexport const U64Resolution = 64;\n\nexport const MaxUint128 = Q128.subn(1);\n\nexport const MIN_TICK = -443636;\nexport const MAX_TICK = -MIN_TICK;\n\nexport const MIN_SQRT_PRICE_X64: BN = new BN(\"4295048016\");\nexport const MAX_SQRT_PRICE_X64: BN = new BN(\"79226673521066979257578248091\");\n\n// export const MIN_TICK_ARRAY_START_INDEX = -307200;\n// export const MAX_TICK_ARRAY_START_INDEX = 306600;\n\nexport const BIT_PRECISION = 16;\nexport const LOG_B_2_X32 = \"59543866431248\";\nexport const LOG_B_P_ERR_MARGIN_LOWER_X64 = \"184467440737095516\";\nexport const LOG_B_P_ERR_MARGIN_UPPER_X64 = \"15793534762490258745\";\n\nexport const FEE_RATE_DENOMINATOR = new BN(10).pow(new BN(6));\n\nexport enum Fee {\n  rate_500 = 500, //  500 / 10e6 = 0.0005\n  rate_3000 = 3000, // 3000/ 10e6 = 0.003\n  rate_10000 = 10000, // 10000 /10e6 = 0.01\n}\nexport const TICK_SPACINGS: { [amount in Fee]: number } = {\n  [Fee.rate_500]: 10,\n  [Fee.rate_3000]: 60,\n  [Fee.rate_10000]: 200,\n};\n\nexport const mockCreatePoolInfo = {\n  version: 6,\n  liquidity: ZERO,\n  tickCurrent: 0,\n  observationIndex: 0,\n  observationUpdateDuration: 0,\n  feeGrowthGlobalX64A: ZERO,\n  feeGrowthGlobalX64B: ZERO,\n  protocolFeesTokenA: ZERO,\n  protocolFeesTokenB: ZERO,\n  swapInAmountTokenA: ZERO,\n  swapOutAmountTokenB: ZERO,\n  swapInAmountTokenB: ZERO,\n  swapOutAmountTokenA: ZERO,\n  tickArrayBitmap: [],\n\n  rewardInfos: [],\n\n  day: {\n    volume: 0,\n    volumeFee: 0,\n    feeA: 0,\n    feeB: 0,\n    feeApr: 0,\n    rewardApr: { A: 0, B: 0, C: 0 },\n    apr: 0,\n    priceMax: 0,\n    priceMin: 0,\n  },\n  week: {\n    volume: 0,\n    volumeFee: 0,\n    feeA: 0,\n    feeB: 0,\n    feeApr: 0,\n    rewardApr: { A: 0, B: 0, C: 0 },\n    apr: 0,\n    priceMax: 0,\n    priceMin: 0,\n  },\n  month: {\n    volume: 0,\n    volumeFee: 0,\n    feeA: 0,\n    feeB: 0,\n    feeApr: 0,\n    rewardApr: { A: 0, B: 0, C: 0 },\n    apr: 0,\n    priceMax: 0,\n    priceMin: 0,\n  },\n  tvl: 0,\n};\n\nexport const mockV3CreatePoolInfo = {\n  tvl: 0,\n  volumeQuote: 0,\n  mintAmountA: 0,\n  mintAmountB: 0,\n  rewardDefaultInfos: [],\n  farmUpcomingCount: 0,\n  farmOngoingCount: 0,\n  farmFinishedCount: 0,\n\n  day: {\n    volume: 0,\n    volumeQuote: 0,\n    volumeFee: 0,\n    apr: 0,\n    feeApr: 0,\n    priceMin: 0,\n    priceMax: 0,\n    rewardApr: [0],\n  },\n  week: {\n    volume: 0,\n    volumeQuote: 0,\n    volumeFee: 0,\n    apr: 0,\n    feeApr: 0,\n    priceMin: 0,\n    priceMax: 0,\n    rewardApr: [0],\n  },\n  month: {\n    volume: 0,\n    volumeQuote: 0,\n    volumeFee: 0,\n    apr: 0,\n    feeApr: 0,\n    priceMin: 0,\n    priceMax: 0,\n    rewardApr: [0],\n  },\n  pooltype: [],\n};\n\nexport const U64_IGNORE_RANGE = new BN(\"18446744073700000000\");\n","import { PublicKey, EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport {\n  BIT_PRECISION,\n  Fee,\n  FEE_RATE_DENOMINATOR,\n  LOG_B_2_X32,\n  LOG_B_P_ERR_MARGIN_LOWER_X64,\n  LOG_B_P_ERR_MARGIN_UPPER_X64,\n  MAX_SQRT_PRICE_X64,\n  MAX_TICK,\n  MaxU64,\n  MaxUint128,\n  MIN_SQRT_PRICE_X64,\n  MIN_TICK,\n  NEGATIVE_ONE,\n  ONE,\n  Q64,\n  U64Resolution,\n  ZERO,\n  Q128,\n} from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { PoolUtils } from \"./pool\";\nimport { Tick, TickArray, TickUtils } from \"./tick\";\nimport { ReturnTypeGetLiquidityAmountOut, TickArrayBitmapExtensionType } from \"../type\";\nimport { ApiV3PoolInfoConcentratedItem } from \"@/api/type\";\nimport { getTransferAmountFeeV2, minExpirationTime } from \"@/common/transfer\";\nimport { TickQuery } from \"./tickQuery\";\n\nexport class MathUtil {\n  public static mulDivRoundingUp(a: BN, b: BN, denominator: BN): BN {\n    const numerator = a.mul(b);\n    let result = numerator.div(denominator);\n    if (!numerator.mod(denominator).eq(ZERO)) {\n      result = result.add(ONE);\n    }\n    return result;\n  }\n\n  public static mulDivFloor(a: BN, b: BN, denominator: BN): BN {\n    if (denominator.eq(ZERO)) {\n      throw new Error(\"division by 0\");\n    }\n    return a.mul(b).div(denominator);\n  }\n\n  public static mulDivCeil(a: BN, b: BN, denominator: BN): BN {\n    if (denominator.eq(ZERO)) {\n      throw new Error(\"division by 0\");\n    }\n    const numerator = a.mul(b).add(denominator.sub(ONE));\n    return numerator.div(denominator);\n  }\n\n  public static x64ToDecimal(num: BN, decimalPlaces?: number): Decimal {\n    return new Decimal(num.toString()).div(Decimal.pow(2, 64)).toDecimalPlaces(decimalPlaces);\n  }\n\n  public static decimalToX64(num: Decimal): BN {\n    return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed());\n  }\n\n  public static wrappingSubU128(n0: BN, n1: BN): BN {\n    return n0.add(Q128).sub(n1).mod(Q128);\n  }\n}\n\n// sqrt price math\nfunction mulRightShift(val: BN, mulBy: BN): BN {\n  return signedRightShift(val.mul(mulBy), 64, 256);\n}\n\nfunction signedLeftShift(n0: BN, shiftBy: number, bitWidth: number): BN {\n  const twosN0 = n0.toTwos(bitWidth).shln(shiftBy);\n  twosN0.imaskn(bitWidth + 1);\n  return twosN0.fromTwos(bitWidth);\n}\n\nfunction signedRightShift(n0: BN, shiftBy: number, bitWidth: number): BN {\n  const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy);\n  twoN0.imaskn(bitWidth - shiftBy + 1);\n  return twoN0.fromTwos(bitWidth - shiftBy);\n}\n\nexport class SqrtPriceMath {\n  public static sqrtPriceX64ToPrice(sqrtPriceX64: BN, decimalsA: number, decimalsB: number): Decimal {\n    return MathUtil.x64ToDecimal(sqrtPriceX64)\n      .pow(2)\n      .mul(Decimal.pow(10, decimalsA - decimalsB));\n  }\n\n  public static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN {\n    return MathUtil.decimalToX64(price.mul(Decimal.pow(10, decimalsB - decimalsA)).sqrt());\n  }\n\n  public static getNextSqrtPriceX64FromInput(sqrtPriceX64: BN, liquidity: BN, amountIn: BN, zeroForOne: boolean): BN {\n    if (!sqrtPriceX64.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64 must greater than 0\");\n    }\n    if (!liquidity.gt(ZERO)) {\n      throw new Error(\"liquidity must greater than 0\");\n    }\n\n    return zeroForOne\n      ? this.getNextSqrtPriceFromTokenAmountARoundingUp(sqrtPriceX64, liquidity, amountIn, true)\n      : this.getNextSqrtPriceFromTokenAmountBRoundingDown(sqrtPriceX64, liquidity, amountIn, true);\n  }\n\n  public static getNextSqrtPriceX64FromOutput(sqrtPriceX64: BN, liquidity: BN, amountOut: BN, zeroForOne: boolean): BN {\n    if (!sqrtPriceX64.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64 must greater than 0\");\n    }\n    if (!liquidity.gt(ZERO)) {\n      throw new Error(\"liquidity must greater than 0\");\n    }\n\n    return zeroForOne\n      ? this.getNextSqrtPriceFromTokenAmountBRoundingDown(sqrtPriceX64, liquidity, amountOut, false)\n      : this.getNextSqrtPriceFromTokenAmountARoundingUp(sqrtPriceX64, liquidity, amountOut, false);\n  }\n\n  private static getNextSqrtPriceFromTokenAmountARoundingUp(\n    sqrtPriceX64: BN,\n    liquidity: BN,\n    amount: BN,\n    add: boolean,\n  ): BN {\n    if (amount.eq(ZERO)) return sqrtPriceX64;\n    const liquidityLeftShift = liquidity.shln(U64Resolution);\n\n    if (add) {\n      const numerator1 = liquidityLeftShift;\n      const denominator = liquidityLeftShift.add(amount.mul(sqrtPriceX64));\n      if (denominator.gte(numerator1)) {\n        return MathUtil.mulDivCeil(numerator1, sqrtPriceX64, denominator);\n      }\n      return MathUtil.mulDivRoundingUp(numerator1, ONE, numerator1.div(sqrtPriceX64).add(amount));\n    } else {\n      const amountMulSqrtPrice = amount.mul(sqrtPriceX64);\n      if (!liquidityLeftShift.gt(amountMulSqrtPrice)) {\n        throw new Error(\"getNextSqrtPriceFromTokenAmountARoundingUp,liquidityLeftShift must gt amountMulSqrtPrice\");\n      }\n      const denominator = liquidityLeftShift.sub(amountMulSqrtPrice);\n      return MathUtil.mulDivCeil(liquidityLeftShift, sqrtPriceX64, denominator);\n    }\n  }\n\n  private static getNextSqrtPriceFromTokenAmountBRoundingDown(\n    sqrtPriceX64: BN,\n    liquidity: BN,\n    amount: BN,\n    add: boolean,\n  ): BN {\n    const deltaY = amount.shln(U64Resolution);\n    if (add) {\n      return sqrtPriceX64.add(deltaY.div(liquidity));\n    } else {\n      const amountDivLiquidity = MathUtil.mulDivRoundingUp(deltaY, ONE, liquidity);\n      if (!sqrtPriceX64.gt(amountDivLiquidity)) {\n        throw new Error(\"getNextSqrtPriceFromTokenAmountBRoundingDown sqrtPriceX64 must gt amountDivLiquidity\");\n      }\n      return sqrtPriceX64.sub(amountDivLiquidity);\n    }\n  }\n\n  public static getSqrtPriceX64FromTick(tick: number): BN {\n    if (!Number.isInteger(tick)) {\n      throw new Error(\"tick must be integer\");\n    }\n    if (tick < MIN_TICK || tick > MAX_TICK) {\n      throw new Error(\"tick must be in MIN_TICK and MAX_TICK\");\n    }\n    const tickAbs: number = tick < 0 ? tick * -1 : tick;\n\n    let ratio: BN = (tickAbs & 0x1) != 0 ? new BN(\"18445821805675395072\") : new BN(\"18446744073709551616\");\n    if ((tickAbs & 0x2) != 0) ratio = mulRightShift(ratio, new BN(\"18444899583751176192\"));\n    if ((tickAbs & 0x4) != 0) ratio = mulRightShift(ratio, new BN(\"18443055278223355904\"));\n    if ((tickAbs & 0x8) != 0) ratio = mulRightShift(ratio, new BN(\"18439367220385607680\"));\n    if ((tickAbs & 0x10) != 0) ratio = mulRightShift(ratio, new BN(\"18431993317065453568\"));\n    if ((tickAbs & 0x20) != 0) ratio = mulRightShift(ratio, new BN(\"18417254355718170624\"));\n    if ((tickAbs & 0x40) != 0) ratio = mulRightShift(ratio, new BN(\"18387811781193609216\"));\n    if ((tickAbs & 0x80) != 0) ratio = mulRightShift(ratio, new BN(\"18329067761203558400\"));\n    if ((tickAbs & 0x100) != 0) ratio = mulRightShift(ratio, new BN(\"18212142134806163456\"));\n    if ((tickAbs & 0x200) != 0) ratio = mulRightShift(ratio, new BN(\"17980523815641700352\"));\n    if ((tickAbs & 0x400) != 0) ratio = mulRightShift(ratio, new BN(\"17526086738831433728\"));\n    if ((tickAbs & 0x800) != 0) ratio = mulRightShift(ratio, new BN(\"16651378430235570176\"));\n    if ((tickAbs & 0x1000) != 0) ratio = mulRightShift(ratio, new BN(\"15030750278694412288\"));\n    if ((tickAbs & 0x2000) != 0) ratio = mulRightShift(ratio, new BN(\"12247334978884435968\"));\n    if ((tickAbs & 0x4000) != 0) ratio = mulRightShift(ratio, new BN(\"8131365268886854656\"));\n    if ((tickAbs & 0x8000) != 0) ratio = mulRightShift(ratio, new BN(\"3584323654725218816\"));\n    if ((tickAbs & 0x10000) != 0) ratio = mulRightShift(ratio, new BN(\"696457651848324352\"));\n    if ((tickAbs & 0x20000) != 0) ratio = mulRightShift(ratio, new BN(\"26294789957507116\"));\n    if ((tickAbs & 0x40000) != 0) ratio = mulRightShift(ratio, new BN(\"37481735321082\"));\n\n    if (tick > 0) ratio = MaxUint128.div(ratio);\n    return ratio;\n  }\n\n  public static getTickFromPrice(price: Decimal, decimalsA: number, decimalsB: number): number {\n    return SqrtPriceMath.getTickFromSqrtPriceX64(SqrtPriceMath.priceToSqrtPriceX64(price, decimalsA, decimalsB));\n  }\n\n  public static getTickFromSqrtPriceX64(sqrtPriceX64: BN): number {\n    if (sqrtPriceX64.gt(MAX_SQRT_PRICE_X64) || sqrtPriceX64.lt(MIN_SQRT_PRICE_X64)) {\n      throw new Error(\"Provided sqrtPrice is not within the supported sqrtPrice range.\");\n    }\n\n    const msb = sqrtPriceX64.bitLength() - 1;\n    const adjustedMsb = new BN(msb - 64);\n    const log2pIntegerX32 = signedLeftShift(adjustedMsb, 32, 128);\n\n    let bit = new BN(\"8000000000000000\", \"hex\");\n    let precision = 0;\n    let log2pFractionX64 = new BN(0);\n\n    let r = msb >= 64 ? sqrtPriceX64.shrn(msb - 63) : sqrtPriceX64.shln(63 - msb);\n\n    while (bit.gt(new BN(0)) && precision < BIT_PRECISION) {\n      r = r.mul(r);\n      const rMoreThanTwo = r.shrn(127);\n      r = r.shrn(63 + rMoreThanTwo.toNumber());\n      log2pFractionX64 = log2pFractionX64.add(bit.mul(rMoreThanTwo));\n      bit = bit.shrn(1);\n      precision += 1;\n    }\n\n    const log2pFractionX32 = log2pFractionX64.shrn(32);\n\n    const log2pX32 = log2pIntegerX32.add(log2pFractionX32);\n    const logbpX64 = log2pX32.mul(new BN(LOG_B_2_X32));\n\n    const tickLow = signedRightShift(logbpX64.sub(new BN(LOG_B_P_ERR_MARGIN_LOWER_X64)), 64, 128).toNumber();\n    const tickHigh = signedRightShift(logbpX64.add(new BN(LOG_B_P_ERR_MARGIN_UPPER_X64)), 64, 128).toNumber();\n\n    if (tickLow == tickHigh) {\n      return tickLow;\n    } else {\n      const derivedTickHighSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tickHigh);\n      return derivedTickHighSqrtPriceX64.lte(sqrtPriceX64) ? tickHigh : tickLow;\n    }\n  }\n}\n\n// tick math\nexport class TickMath {\n  public static getTickWithPriceAndTickspacing(\n    price: Decimal,\n    tickSpacing: number,\n    mintDecimalsA: number,\n    mintDecimalsB: number,\n  ): number {\n    const tick = SqrtPriceMath.getTickFromSqrtPriceX64(\n      SqrtPriceMath.priceToSqrtPriceX64(price, mintDecimalsA, mintDecimalsB),\n    );\n    let result = tick / tickSpacing;\n    if (result < 0) {\n      result = Math.floor(result);\n    } else {\n      result = Math.ceil(result);\n    }\n    return result * tickSpacing;\n  }\n\n  public static roundPriceWithTickspacing(\n    price: Decimal,\n    tickSpacing: number,\n    mintDecimalsA: number,\n    mintDecimalsB: number,\n  ): Decimal {\n    const tick = TickMath.getTickWithPriceAndTickspacing(price, tickSpacing, mintDecimalsA, mintDecimalsB);\n    const sqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    return SqrtPriceMath.sqrtPriceX64ToPrice(sqrtPriceX64, mintDecimalsA, mintDecimalsB);\n  }\n}\n\nexport class LiquidityMath {\n  public static addDelta(x: BN, y: BN): BN {\n    return x.add(y);\n  }\n\n  public static getTokenAmountAFromLiquidity(\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    roundUp: boolean,\n  ): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    if (!sqrtPriceX64A.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64A must greater than 0\");\n    }\n\n    const numerator1 = liquidity.ushln(U64Resolution);\n    const numerator2 = sqrtPriceX64B.sub(sqrtPriceX64A);\n\n    return roundUp\n      ? MathUtil.mulDivRoundingUp(MathUtil.mulDivCeil(numerator1, numerator2, sqrtPriceX64B), ONE, sqrtPriceX64A)\n      : MathUtil.mulDivFloor(numerator1, numerator2, sqrtPriceX64B).div(sqrtPriceX64A);\n  }\n\n  public static getTokenAmountBFromLiquidity(\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    roundUp: boolean,\n  ): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n    if (!sqrtPriceX64A.gt(ZERO)) {\n      throw new Error(\"sqrtPriceX64A must greater than 0\");\n    }\n\n    return roundUp\n      ? MathUtil.mulDivCeil(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64)\n      : MathUtil.mulDivFloor(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64);\n  }\n\n  public static getLiquidityFromTokenAmountA(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountA: BN, roundUp: boolean): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    const numerator = amountA.mul(sqrtPriceX64A).mul(sqrtPriceX64B);\n    const denominator = sqrtPriceX64B.sub(sqrtPriceX64A);\n    const result = numerator.div(denominator);\n\n    if (roundUp) {\n      return MathUtil.mulDivRoundingUp(result, ONE, MaxU64);\n    } else {\n      return result.shrn(U64Resolution);\n    }\n  }\n\n  public static getLiquidityFromTokenAmountB(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountB: BN): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n    return MathUtil.mulDivFloor(amountB, MaxU64, sqrtPriceX64B.sub(sqrtPriceX64A));\n  }\n\n  public static getLiquidityFromTokenAmounts(\n    sqrtPriceCurrentX64: BN,\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    amountA: BN,\n    amountB: BN,\n  ): BN {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {\n      return LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, amountA, false);\n    } else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {\n      const liquidity0 = LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceCurrentX64, sqrtPriceX64B, amountA, false);\n      const liquidity1 = LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceCurrentX64, amountB);\n      return liquidity0.lt(liquidity1) ? liquidity0 : liquidity1;\n    } else {\n      return LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, amountB);\n    }\n  }\n\n  public static getAmountsFromLiquidity(\n    sqrtPriceCurrentX64: BN,\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    roundUp: boolean,\n  ): { amountA: BN; amountB: BN } {\n    if (sqrtPriceX64A.gt(sqrtPriceX64B)) {\n      [sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];\n    }\n\n    if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {\n      return {\n        amountA: LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),\n        amountB: new BN(0),\n      };\n    } else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {\n      const amountA = LiquidityMath.getTokenAmountAFromLiquidity(\n        sqrtPriceCurrentX64,\n        sqrtPriceX64B,\n        liquidity,\n        roundUp,\n      );\n      const amountB = LiquidityMath.getTokenAmountBFromLiquidity(\n        sqrtPriceX64A,\n        sqrtPriceCurrentX64,\n        liquidity,\n        roundUp,\n      );\n      return { amountA, amountB };\n    } else {\n      return {\n        amountA: new BN(0),\n        amountB: LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),\n      };\n    }\n  }\n\n  public static getAmountsFromLiquidityWithSlippage(\n    sqrtPriceCurrentX64: BN,\n    sqrtPriceX64A: BN,\n    sqrtPriceX64B: BN,\n    liquidity: BN,\n    amountMax: boolean,\n    roundUp: boolean,\n    amountSlippage: number,\n  ): { amountSlippageA: BN; amountSlippageB: BN } {\n    const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(\n      sqrtPriceCurrentX64,\n      sqrtPriceX64A,\n      sqrtPriceX64B,\n      liquidity,\n      roundUp,\n    );\n    const coefficient = amountMax ? 1 + amountSlippage : 1 - amountSlippage;\n\n    const amount0Slippage = new BN(new Decimal(amountA.toString()).mul(coefficient).toFixed(0));\n    const amount1Slippage = new BN(new Decimal(amountB.toString()).mul(coefficient).toFixed(0));\n    return {\n      amountSlippageA: amount0Slippage,\n      amountSlippageB: amount1Slippage,\n    };\n  }\n\n  public static getAmountsOutFromLiquidity({\n    poolInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    slippage,\n    add,\n    epochInfo,\n    amountAddFee,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    slippage: number;\n    add: boolean;\n\n    epochInfo: EpochInfo;\n    amountAddFee: boolean;\n  }): ReturnTypeGetLiquidityAmountOut {\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n    const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n    const amounts = LiquidityMath.getAmountsFromLiquidity(sqrtPriceX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, add);\n\n    const [amountA, amountB] = [\n      getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, amountAddFee),\n      getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, amountAddFee),\n    ];\n    const [amountSlippageA, amountSlippageB] = [\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountA.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintA.extensions?.feeConfig,\n        epochInfo,\n        amountAddFee,\n      ),\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountB.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintB.extensions?.feeConfig,\n        epochInfo,\n        amountAddFee,\n      ),\n    ];\n\n    return {\n      liquidity,\n      amountA,\n      amountB,\n      amountSlippageA,\n      amountSlippageB,\n      expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n    };\n  }\n}\n\n// swap math\n\ntype SwapStep = {\n  sqrtPriceX64Next: BN;\n  amountIn: BN;\n  amountOut: BN;\n  feeAmount: BN;\n};\n\nexport interface StepComputations {\n  sqrtPriceStartX64: BN;\n  tickNext: number;\n  initialized: boolean;\n  sqrtPriceNextX64: BN;\n  amountIn: BN;\n  amountOut: BN;\n  feeAmount: BN;\n}\n\nexport abstract class SwapMath {\n  public static swapCompute(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayCache: { [key: string]: TickArray },\n    tickArrayBitmap: BN[],\n    tickarrayBitmapExtension: TickArrayBitmapExtensionType,\n    zeroForOne: boolean,\n    fee: number,\n    liquidity: BN,\n    currentTick: number,\n    tickSpacing: number,\n    currentSqrtPriceX64: BN,\n    amountSpecified: BN,\n    lastSavedTickArrayStartIndex: number,\n    sqrtPriceLimitX64?: BN,\n  ): {\n    amountCalculated: BN;\n    feeAmount: BN;\n    sqrtPriceX64: BN;\n    liquidity: BN;\n    tickCurrent: number;\n    accounts: PublicKey[];\n  } {\n    if (amountSpecified.eq(ZERO)) {\n      throw new Error(\"amountSpecified must not be 0\");\n    }\n    if (!sqrtPriceLimitX64) sqrtPriceLimitX64 = zeroForOne ? MIN_SQRT_PRICE_X64.add(ONE) : MAX_SQRT_PRICE_X64.sub(ONE);\n\n    if (zeroForOne) {\n      if (sqrtPriceLimitX64.lt(MIN_SQRT_PRICE_X64)) {\n        throw new Error(\"sqrtPriceX64 must greater than MIN_SQRT_PRICE_X64\");\n      }\n\n      if (sqrtPriceLimitX64.gte(currentSqrtPriceX64)) {\n        throw new Error(\"sqrtPriceX64 must smaller than current\");\n      }\n    } else {\n      if (sqrtPriceLimitX64.gt(MAX_SQRT_PRICE_X64)) {\n        throw new Error(\"sqrtPriceX64 must smaller than MAX_SQRT_PRICE_X64\");\n      }\n\n      if (sqrtPriceLimitX64.lte(currentSqrtPriceX64)) {\n        throw new Error(\"sqrtPriceX64 must greater than current\");\n      }\n    }\n    const baseInput = amountSpecified.gt(ZERO);\n\n    const state = {\n      amountSpecifiedRemaining: amountSpecified,\n      amountCalculated: ZERO,\n      sqrtPriceX64: currentSqrtPriceX64,\n      tick:\n        currentTick > lastSavedTickArrayStartIndex\n          ? Math.min(lastSavedTickArrayStartIndex + TickQuery.tickCount(tickSpacing) - 1, currentTick)\n          : lastSavedTickArrayStartIndex,\n      accounts: [] as PublicKey[],\n      liquidity,\n      feeAmount: new BN(0),\n    };\n    let tickAarrayStartIndex = lastSavedTickArrayStartIndex;\n    let tickArrayCurrent = tickArrayCache[lastSavedTickArrayStartIndex];\n    let loopCount = 0;\n    let t = !zeroForOne && tickArrayCurrent.startTickIndex === state.tick;\n    while (\n      !state.amountSpecifiedRemaining.eq(ZERO) &&\n      !state.sqrtPriceX64.eq(sqrtPriceLimitX64)\n      // state.tick < MAX_TICK &&\n      // state.tick > MIN_TICK\n    ) {\n      if (loopCount > 10) {\n        throw Error(\"liquidity limit\");\n      }\n      const step: Partial<StepComputations> = {};\n      step.sqrtPriceStartX64 = state.sqrtPriceX64;\n\n      const tickState: Tick | null = TickUtils.nextInitTick(tickArrayCurrent, state.tick, tickSpacing, zeroForOne, t);\n\n      let nextInitTick: Tick | null = tickState ? tickState : null; // TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne)\n      let tickArrayAddress: PublicKey | null = null;\n\n      if (!nextInitTick?.liquidityGross.gtn(0)) {\n        const nextInitTickArrayIndex = PoolUtils.nextInitializedTickArrayStartIndex(\n          {\n            tickCurrent: state.tick,\n            tickSpacing,\n            tickArrayBitmap,\n            exBitmapInfo: tickarrayBitmapExtension,\n          },\n          tickAarrayStartIndex,\n          zeroForOne,\n        );\n        if (!nextInitTickArrayIndex.isExist) {\n          throw Error(\"swapCompute LiquidityInsufficient\");\n        }\n        tickAarrayStartIndex = nextInitTickArrayIndex.nextStartIndex;\n\n        const { publicKey: expectedNextTickArrayAddress } = getPdaTickArrayAddress(\n          programId,\n          poolId,\n          tickAarrayStartIndex,\n        );\n        tickArrayAddress = expectedNextTickArrayAddress;\n        tickArrayCurrent = tickArrayCache[tickAarrayStartIndex];\n\n        nextInitTick = TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne);\n      }\n\n      step.tickNext = nextInitTick.tick;\n      step.initialized = nextInitTick.liquidityGross.gtn(0);\n      if (lastSavedTickArrayStartIndex !== tickAarrayStartIndex && tickArrayAddress) {\n        state.accounts.push(tickArrayAddress);\n        lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n      }\n      if (step.tickNext < MIN_TICK) {\n        step.tickNext = MIN_TICK;\n      } else if (step.tickNext > MAX_TICK) {\n        step.tickNext = MAX_TICK;\n      }\n\n      step.sqrtPriceNextX64 = SqrtPriceMath.getSqrtPriceX64FromTick(step.tickNext);\n      let targetPrice: BN;\n      if (\n        (zeroForOne && step.sqrtPriceNextX64.lt(sqrtPriceLimitX64)) ||\n        (!zeroForOne && step.sqrtPriceNextX64.gt(sqrtPriceLimitX64))\n      ) {\n        targetPrice = sqrtPriceLimitX64;\n      } else {\n        targetPrice = step.sqrtPriceNextX64;\n      }\n      [state.sqrtPriceX64, step.amountIn, step.amountOut, step.feeAmount] = SwapMath.swapStepCompute(\n        state.sqrtPriceX64,\n        targetPrice,\n        state.liquidity,\n        state.amountSpecifiedRemaining,\n        fee,\n      );\n\n      state.feeAmount = state.feeAmount.add(step.feeAmount);\n\n      if (baseInput) {\n        state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.sub(step.amountIn.add(step.feeAmount));\n        state.amountCalculated = state.amountCalculated.sub(step.amountOut);\n      } else {\n        state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.add(step.amountOut);\n        state.amountCalculated = state.amountCalculated.add(step.amountIn.add(step.feeAmount));\n      }\n      if (state.sqrtPriceX64.eq(step.sqrtPriceNextX64)) {\n        if (step.initialized) {\n          let liquidityNet = nextInitTick.liquidityNet;\n          if (zeroForOne) liquidityNet = liquidityNet.mul(NEGATIVE_ONE);\n          state.liquidity = LiquidityMath.addDelta(state.liquidity, liquidityNet);\n        }\n        t = step.tickNext != state.tick && !zeroForOne && tickArrayCurrent.startTickIndex === step.tickNext;\n        state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n      } else if (state.sqrtPriceX64 != step.sqrtPriceStartX64) {\n        const _T = SqrtPriceMath.getTickFromSqrtPriceX64(state.sqrtPriceX64);\n        t = _T != state.tick && !zeroForOne && tickArrayCurrent.startTickIndex === _T;\n        state.tick = _T;\n      }\n      ++loopCount;\n    }\n\n    try {\n      const { nextStartIndex: tickAarrayStartIndex, isExist } = TickQuery.nextInitializedTickArray(\n        state.tick,\n        tickSpacing,\n        zeroForOne,\n        tickArrayBitmap,\n        tickarrayBitmapExtension,\n      );\n      if (isExist && lastSavedTickArrayStartIndex !== tickAarrayStartIndex) {\n        state.accounts.push(getPdaTickArrayAddress(programId, poolId, tickAarrayStartIndex).publicKey);\n        lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n      }\n    } catch (e) {\n      /* empty */\n    }\n\n    return {\n      amountCalculated: state.amountCalculated,\n      feeAmount: state.feeAmount,\n      sqrtPriceX64: state.sqrtPriceX64,\n      liquidity: state.liquidity,\n      tickCurrent: state.tick,\n      accounts: state.accounts,\n    };\n  }\n  // public static swapCompute(\n  //   programId: PublicKey,\n  //   poolId: PublicKey,\n  //   tickArrayCache: { [key: string]: TickArray },\n  //   tickArrayBitmap: BN[],\n  //   tickarrayBitmapExtension: TickArrayBitmapExtensionType,\n  //   zeroForOne: boolean,\n  //   fee: number,\n  //   liquidity: BN,\n  //   currentTick: number,\n  //   tickSpacing: number,\n  //   currentSqrtPriceX64: BN,\n  //   amountSpecified: BN,\n  //   lastSavedTickArrayStartIndex: number,\n  //   sqrtPriceLimitX64?: BN,\n  // ): {\n  //   amountCalculated: BN;\n  //   feeAmount: BN;\n  //   sqrtPriceX64: BN;\n  //   liquidity: BN;\n  //   tickCurrent: number;\n  //   accounts: PublicKey[];\n  // } {\n  //   if (amountSpecified.eq(ZERO)) {\n  //     throw new Error(\"amountSpecified must not be 0\");\n  //   }\n  //   if (!sqrtPriceLimitX64) sqrtPriceLimitX64 = zeroForOne ? MIN_SQRT_PRICE_X64.add(ONE) : MAX_SQRT_PRICE_X64.sub(ONE);\n\n  //   if (zeroForOne) {\n  //     if (sqrtPriceLimitX64.lt(MIN_SQRT_PRICE_X64)) {\n  //       throw new Error(\"sqrtPriceX64 must greater than MIN_SQRT_PRICE_X64\");\n  //     }\n\n  //     if (sqrtPriceLimitX64.gte(currentSqrtPriceX64)) {\n  //       throw new Error(\"sqrtPriceX64 must smaller than current\");\n  //     }\n  //   } else {\n  //     if (sqrtPriceLimitX64.gt(MAX_SQRT_PRICE_X64)) {\n  //       throw new Error(\"sqrtPriceX64 must smaller than MAX_SQRT_PRICE_X64\");\n  //     }\n\n  //     if (sqrtPriceLimitX64.lte(currentSqrtPriceX64)) {\n  //       throw new Error(\"sqrtPriceX64 must greater than current\");\n  //     }\n  //   }\n  //   const baseInput = amountSpecified.gt(ZERO);\n\n  //   const state = {\n  //     amountSpecifiedRemaining: amountSpecified,\n  //     amountCalculated: ZERO,\n  //     sqrtPriceX64: currentSqrtPriceX64,\n  //     tick:\n  //       currentTick > lastSavedTickArrayStartIndex\n  //         ? Math.min(lastSavedTickArrayStartIndex + TickQuery.tickCount(tickSpacing) - 1, currentTick)\n  //         : lastSavedTickArrayStartIndex,\n  //     accounts: [] as PublicKey[],\n  //     liquidity,\n  //     feeAmount: new BN(0),\n  //   };\n  //   let tickAarrayStartIndex = lastSavedTickArrayStartIndex;\n  //   let tickArrayCurrent = tickArrayCache[lastSavedTickArrayStartIndex];\n  //   let loopCount = 0;\n  //   while (\n  //     !state.amountSpecifiedRemaining.eq(ZERO) &&\n  //     !state.sqrtPriceX64.eq(sqrtPriceLimitX64)\n  //     // state.tick < MAX_TICK &&\n  //     // state.tick > MIN_TICK\n  //   ) {\n  //     if (loopCount > 10) {\n  //       throw Error(\"liquidity limit\");\n  //     }\n  //     const step: Partial<StepComputations> = {};\n  //     step.sqrtPriceStartX64 = state.sqrtPriceX64;\n\n  //     const tickState: Tick | null = TickUtils.nextInitTick(tickArrayCurrent, state.tick, tickSpacing, zeroForOne);\n\n  //     let nextInitTick: Tick | null = tickState ? tickState : null; // TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne)\n  //     let tickArrayAddress: PublicKey | null = null;\n\n  //     if (!nextInitTick?.liquidityGross.gtn(0)) {\n  //       const nextInitTickArrayIndex = PoolUtils.nextInitializedTickArrayStartIndex(\n  //         {\n  //           tickCurrent: state.tick,\n  //           tickSpacing,\n  //           tickArrayBitmap,\n  //           exBitmapInfo: tickarrayBitmapExtension,\n  //         },\n  //         tickAarrayStartIndex,\n  //         zeroForOne,\n  //       );\n  //       if (!nextInitTickArrayIndex.isExist) {\n  //         throw Error(\"swapCompute LiquidityInsufficient\");\n  //       }\n  //       tickAarrayStartIndex = nextInitTickArrayIndex.nextStartIndex;\n\n  //       const { publicKey: expectedNextTickArrayAddress } = getPdaTickArrayAddress(\n  //         programId,\n  //         poolId,\n  //         tickAarrayStartIndex,\n  //       );\n  //       tickArrayAddress = expectedNextTickArrayAddress;\n  //       tickArrayCurrent = tickArrayCache[tickAarrayStartIndex];\n\n  //       nextInitTick = TickUtils.firstInitializedTick(tickArrayCurrent, zeroForOne);\n  //     }\n\n  //     step.tickNext = nextInitTick.tick;\n  //     step.initialized = nextInitTick.liquidityGross.gtn(0);\n  //     if (lastSavedTickArrayStartIndex !== tickAarrayStartIndex && tickArrayAddress) {\n  //       state.accounts.push(tickArrayAddress);\n  //       lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n  //     }\n  //     if (step.tickNext < MIN_TICK) {\n  //       step.tickNext = MIN_TICK;\n  //     } else if (step.tickNext > MAX_TICK) {\n  //       step.tickNext = MAX_TICK;\n  //     }\n\n  //     step.sqrtPriceNextX64 = SqrtPriceMath.getSqrtPriceX64FromTick(step.tickNext);\n  //     let targetPrice: BN;\n  //     if (\n  //       (zeroForOne && step.sqrtPriceNextX64.lt(sqrtPriceLimitX64)) ||\n  //       (!zeroForOne && step.sqrtPriceNextX64.gt(sqrtPriceLimitX64))\n  //     ) {\n  //       targetPrice = sqrtPriceLimitX64;\n  //     } else {\n  //       targetPrice = step.sqrtPriceNextX64;\n  //     }\n  //     [state.sqrtPriceX64, step.amountIn, step.amountOut, step.feeAmount] = SwapMath.swapStepCompute(\n  //       state.sqrtPriceX64,\n  //       targetPrice,\n  //       state.liquidity,\n  //       state.amountSpecifiedRemaining,\n  //       fee,\n  //     );\n\n  //     state.feeAmount = state.feeAmount.add(step.feeAmount);\n\n  //     if (baseInput) {\n  //       state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.sub(step.amountIn.add(step.feeAmount));\n  //       state.amountCalculated = state.amountCalculated.sub(step.amountOut);\n  //     } else {\n  //       state.amountSpecifiedRemaining = state.amountSpecifiedRemaining.add(step.amountOut);\n  //       state.amountCalculated = state.amountCalculated.add(step.amountIn.add(step.feeAmount));\n  //     }\n  //     if (state.sqrtPriceX64.eq(step.sqrtPriceNextX64)) {\n  //       if (step.initialized) {\n  //         let liquidityNet = nextInitTick.liquidityNet;\n  //         if (zeroForOne) liquidityNet = liquidityNet.mul(NEGATIVE_ONE);\n  //         state.liquidity = LiquidityMath.addDelta(state.liquidity, liquidityNet);\n  //       }\n  //       state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n  //     } else if (state.sqrtPriceX64 != step.sqrtPriceStartX64) {\n  //       state.tick = SqrtPriceMath.getTickFromSqrtPriceX64(state.sqrtPriceX64);\n  //     }\n  //     ++loopCount;\n  //   }\n\n  //   // try {\n  //   //   console.log('state.tick', state.tick)\n  //   //   const { nextStartIndex: tickAarrayStartIndex } = TickQuery.nextInitializedTickArray(\n  //   //     state.tick,\n  //   //     tickSpacing,\n  //   //     zeroForOne,\n  //   //     tickArrayBitmap,\n  //   //     tickarrayBitmapExtension,\n  //   //   );\n  //   //   if (\n  //   //     lastSavedTickArrayStartIndex !== tickAarrayStartIndex\n  //   //   ) {\n  //   //     state.accounts.push(getPdaTickArrayAddress(\n  //   //       programId,\n  //   //       poolId,\n  //   //       tickAarrayStartIndex,\n  //   //     ).publicKey)\n  //   //     lastSavedTickArrayStartIndex = tickAarrayStartIndex;\n  //   //   }\n  //   // } catch (e) { /* empty */ }\n\n  //   return {\n  //     amountCalculated: state.amountCalculated,\n  //     feeAmount: state.feeAmount,\n  //     sqrtPriceX64: state.sqrtPriceX64,\n  //     liquidity: state.liquidity,\n  //     tickCurrent: state.tick,\n  //     accounts: state.accounts,\n  //   };\n  // }\n\n  private static swapStepCompute(\n    sqrtPriceX64Current: BN,\n    sqrtPriceX64Target: BN,\n    liquidity: BN,\n    amountRemaining: BN,\n    feeRate: Fee,\n  ): [BN, BN, BN, BN] {\n    const swapStep: SwapStep = {\n      sqrtPriceX64Next: new BN(0),\n      amountIn: new BN(0),\n      amountOut: new BN(0),\n      feeAmount: new BN(0),\n    };\n\n    const zeroForOne = sqrtPriceX64Current.gte(sqrtPriceX64Target);\n    const baseInput = amountRemaining.gte(ZERO);\n\n    if (baseInput) {\n      const amountRemainingSubtractFee = MathUtil.mulDivFloor(\n        amountRemaining,\n        FEE_RATE_DENOMINATOR.sub(new BN(feeRate.toString())),\n        FEE_RATE_DENOMINATOR,\n      );\n      swapStep.amountIn = zeroForOne\n        ? LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64Target, sqrtPriceX64Current, liquidity, true)\n        : LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Current, sqrtPriceX64Target, liquidity, true);\n      if (amountRemainingSubtractFee.gte(swapStep.amountIn)) {\n        swapStep.sqrtPriceX64Next = sqrtPriceX64Target;\n      } else {\n        swapStep.sqrtPriceX64Next = SqrtPriceMath.getNextSqrtPriceX64FromInput(\n          sqrtPriceX64Current,\n          liquidity,\n          amountRemainingSubtractFee,\n          zeroForOne,\n        );\n      }\n    } else {\n      swapStep.amountOut = zeroForOne\n        ? LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Target, sqrtPriceX64Current, liquidity, false)\n        : LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64Current, sqrtPriceX64Target, liquidity, false);\n      if (amountRemaining.mul(NEGATIVE_ONE).gte(swapStep.amountOut)) {\n        swapStep.sqrtPriceX64Next = sqrtPriceX64Target;\n      } else {\n        swapStep.sqrtPriceX64Next = SqrtPriceMath.getNextSqrtPriceX64FromOutput(\n          sqrtPriceX64Current,\n          liquidity,\n          amountRemaining.mul(NEGATIVE_ONE),\n          zeroForOne,\n        );\n      }\n    }\n\n    const reachTargetPrice = sqrtPriceX64Target.eq(swapStep.sqrtPriceX64Next);\n\n    if (zeroForOne) {\n      if (!(reachTargetPrice && baseInput)) {\n        swapStep.amountIn = LiquidityMath.getTokenAmountAFromLiquidity(\n          swapStep.sqrtPriceX64Next,\n          sqrtPriceX64Current,\n          liquidity,\n          true,\n        );\n      }\n\n      if (!(reachTargetPrice && !baseInput)) {\n        swapStep.amountOut = LiquidityMath.getTokenAmountBFromLiquidity(\n          swapStep.sqrtPriceX64Next,\n          sqrtPriceX64Current,\n          liquidity,\n          false,\n        );\n      }\n    } else {\n      swapStep.amountIn =\n        reachTargetPrice && baseInput\n          ? swapStep.amountIn\n          : LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64Current, swapStep.sqrtPriceX64Next, liquidity, true);\n      swapStep.amountOut =\n        reachTargetPrice && !baseInput\n          ? swapStep.amountOut\n          : LiquidityMath.getTokenAmountAFromLiquidity(\n              sqrtPriceX64Current,\n              swapStep.sqrtPriceX64Next,\n              liquidity,\n              false,\n            );\n    }\n\n    if (!baseInput && swapStep.amountOut.gt(amountRemaining.mul(NEGATIVE_ONE))) {\n      swapStep.amountOut = amountRemaining.mul(NEGATIVE_ONE);\n    }\n    if (baseInput && !swapStep.sqrtPriceX64Next.eq(sqrtPriceX64Target)) {\n      swapStep.feeAmount = amountRemaining.sub(swapStep.amountIn);\n    } else {\n      swapStep.feeAmount = MathUtil.mulDivCeil(\n        swapStep.amountIn,\n        new BN(feeRate),\n        FEE_RATE_DENOMINATOR.sub(new BN(feeRate)),\n      );\n    }\n    return [swapStep.sqrtPriceX64Next, swapStep.amountIn, swapStep.amountOut, swapStep.feeAmount];\n  }\n}\n","import BN from \"bn.js\";\nexport function u16ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(2);\n  const view = new DataView(arr);\n  view.setUint16(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function i16ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(2);\n  const view = new DataView(arr);\n  view.setInt16(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function u32ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(4);\n  const view = new DataView(arr);\n  view.setUint32(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function i32ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(4);\n  const view = new DataView(arr);\n  view.setInt32(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function leadingZeros(bitNum: number, data: BN): number {\n  let i = 0;\n  for (let j = bitNum - 1; j >= 0; j--) {\n    if (!data.testn(j)) {\n      i++;\n    } else {\n      break;\n    }\n  }\n  return i;\n}\n\nexport function trailingZeros(bitNum: number, data: BN) {\n  let i = 0;\n  for (let j = 0; j < bitNum; j++) {\n    if (!data.testn(j)) {\n      i++;\n    } else {\n      break;\n    }\n  }\n  return i;\n}\n\nexport function isZero(bitNum: number, data: BN): boolean {\n  for (let i = 0; i < bitNum; i++) {\n    if (data.testn(i)) return false;\n  }\n  return true;\n}\n\nexport function mostSignificantBit(bitNum: number, data: BN): number | null {\n  if (isZero(bitNum, data)) return null;\n  else return leadingZeros(bitNum, data);\n}\n\nexport function leastSignificantBit(bitNum: number, data: BN): number | null {\n  if (isZero(bitNum, data)) return null;\n  else return trailingZeros(bitNum, data);\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { findProgramAddress, METADATA_PROGRAM_ID } from \"@/common\";\n\nimport { i32ToBytes, u16ToBytes } from \"./util\";\n\nexport const AMM_CONFIG_SEED = Buffer.from(\"amm_config\", \"utf8\");\nexport const POOL_SEED = Buffer.from(\"pool\", \"utf8\");\nexport const POOL_VAULT_SEED = Buffer.from(\"pool_vault\", \"utf8\");\nexport const POOL_REWARD_VAULT_SEED = Buffer.from(\"pool_reward_vault\", \"utf8\");\nexport const POSITION_SEED = Buffer.from(\"position\", \"utf8\");\nexport const TICK_ARRAY_SEED = Buffer.from(\"tick_array\", \"utf8\");\nexport const OPERATION_SEED = Buffer.from(\"operation\", \"utf8\");\nexport const POOL_TICK_ARRAY_BITMAP_SEED = Buffer.from(\"pool_tick_array_bitmap_extension\", \"utf8\");\n\nexport function getPdaAmmConfigId(\n  programId: PublicKey,\n  index: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([AMM_CONFIG_SEED, u16ToBytes(index)], programId);\n}\n\nexport function getPdaPoolId(\n  programId: PublicKey,\n  ammConfigId: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_SEED, ammConfigId.toBuffer(), mintA.toBuffer(), mintB.toBuffer()], programId);\n}\n\nexport function getPdaPoolVaultId(\n  programId: PublicKey,\n  poolId: PublicKey,\n  vaultMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_VAULT_SEED, poolId.toBuffer(), vaultMint.toBuffer()], programId);\n}\n\nexport function getPdaPoolRewardVaulId(\n  programId: PublicKey,\n  poolId: PublicKey,\n  rewardMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_REWARD_VAULT_SEED, poolId.toBuffer(), rewardMint.toBuffer()], programId);\n}\n\nexport function getPdaTickArrayAddress(\n  programId: PublicKey,\n  poolId: PublicKey,\n  startIndex: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([TICK_ARRAY_SEED, poolId.toBuffer(), i32ToBytes(startIndex)], programId);\n}\n\nexport function getPdaProtocolPositionAddress(\n  programId: PublicKey,\n  poolId: PublicKey,\n  tickLower: number,\n  tickUpper: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [POSITION_SEED, poolId.toBuffer(), i32ToBytes(tickLower), i32ToBytes(tickUpper)],\n    programId,\n  );\n}\n\nexport function getPdaPersonalPositionAddress(\n  programId: PublicKey,\n  nftMint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POSITION_SEED, nftMint.toBuffer()], programId);\n}\n\nexport function getPdaMetadataKey(mint: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [Buffer.from(\"metadata\", \"utf8\"), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n    METADATA_PROGRAM_ID,\n  );\n}\n\nexport function getPdaOperationAccount(programId: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([OPERATION_SEED], programId);\n}\n\nexport function getPdaExBitmapAccount(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_TICK_ARRAY_BITMAP_SEED, poolId.toBuffer()], programId);\n}\n","import { PublicKey, Connection, EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport {\n  ClmmPoolInfo,\n  ClmmPoolRewardInfo,\n  ClmmPoolRewardLayoutInfo,\n  ReturnTypeGetLiquidityAmountOut,\n  TickArrayBitmapExtensionType,\n  ReturnTypeFetchExBitmaps,\n  ReturnTypeFetchMultiplePoolTickArrays,\n  SDKParsedConcentratedInfo,\n  ReturnTypeComputeAmountOut,\n  ReturnTypeComputeAmountOutFormat,\n} from \"../type\";\n\nimport { ApiV3PoolInfoConcentratedItem } from \"@/api/type\";\n\nimport { ReturnTypeFetchMultipleMintInfos } from \"@/raydium/type\";\nimport { NEGATIVE_ONE, Q64, ZERO, MAX_TICK, MIN_TICK, MIN_SQRT_PRICE_X64, MAX_SQRT_PRICE_X64 } from \"./constants\";\nimport { MathUtil, SwapMath, SqrtPriceMath, LiquidityMath } from \"./math\";\nimport { getPdaTickArrayAddress, getPdaPersonalPositionAddress } from \"./pda\";\nimport { TickArray, TickUtils, TICK_ARRAY_BITMAP_SIZE, Tick } from \"./tick\";\nimport { TickArrayBitmap, TickArrayBitmapExtensionUtils } from \"./tickarrayBitmap\";\nimport { TickQuery } from \"./tickQuery\";\nimport { TickArrayBitmapExtensionLayout, PositionInfoLayout, TickArrayLayout } from \"../layout\";\nimport {\n  getMultipleAccountsInfo,\n  getMultipleAccountsInfoWithCustomFlags,\n  getTransferAmountFee,\n  getTransferAmountFeeV2,\n  minExpirationTime,\n  WSOLMint,\n  SOLMint,\n  solToWSol,\n} from \"../../../common\";\nimport { SOL_INFO } from \"../../token/constant\";\nimport { TokenAccountRaw } from \"../../account/types\";\nimport { Price, Percent, TokenAmount, Token } from \"../../../module\";\nimport { PositionUtils } from \"./position\";\nimport Decimal from \"decimal.js\";\n\nexport class PoolUtils {\n  public static getOutputAmountAndRemainAccounts(\n    poolInfo: ClmmPoolInfo,\n    tickArrayCache: { [key: string]: TickArray },\n    inputTokenMint: PublicKey,\n    inputAmount: BN,\n    sqrtPriceLimitX64?: BN,\n  ): {\n    expectedAmountOut: BN;\n    remainingAccounts: PublicKey[];\n    executionPrice: BN;\n    feeAmount: BN;\n  } {\n    const zeroForOne = inputTokenMint.equals(poolInfo.mintA.mint);\n\n    const allNeededAccounts: PublicKey[] = [];\n    const {\n      isExist,\n      startIndex: firstTickArrayStartIndex,\n      nextAccountMeta,\n    } = this.getFirstInitializedTickArray(poolInfo, zeroForOne);\n    if (!isExist || firstTickArrayStartIndex === undefined || !nextAccountMeta) throw new Error(\"Invalid tick array\");\n\n    // try {\n    //   const preTick = this.preInitializedTickArrayStartIndex(poolInfo, !zeroForOne)\n    //   if (preTick.isExist) {\n    //     const { publicKey: address } = getPdaTickArrayAddress(\n    //       poolInfo.programId,\n    //       poolInfo.id,\n    //       preTick.nextStartIndex\n    //     );\n    //     allNeededAccounts.push(address)\n    //   }\n    // } catch (e) { /* empty */ }\n\n    allNeededAccounts.push(nextAccountMeta);\n    const {\n      amountCalculated: outputAmount,\n      accounts: reaminAccounts,\n      sqrtPriceX64: executionPrice,\n      feeAmount,\n    } = SwapMath.swapCompute(\n      poolInfo.programId,\n      poolInfo.id,\n      tickArrayCache,\n      poolInfo.tickArrayBitmap,\n      poolInfo.exBitmapInfo,\n      zeroForOne,\n      poolInfo.ammConfig.tradeFeeRate,\n      poolInfo.liquidity,\n      poolInfo.tickCurrent,\n      poolInfo.tickSpacing,\n      poolInfo.sqrtPriceX64,\n      inputAmount,\n      firstTickArrayStartIndex,\n      sqrtPriceLimitX64,\n    );\n    allNeededAccounts.push(...reaminAccounts);\n    return {\n      expectedAmountOut: outputAmount.mul(NEGATIVE_ONE),\n      remainingAccounts: allNeededAccounts,\n      executionPrice,\n      feeAmount,\n    };\n  }\n\n  public static getInputAmountAndRemainAccounts(\n    poolInfo: ClmmPoolInfo,\n    tickArrayCache: { [key: string]: TickArray },\n    outputTokenMint: PublicKey,\n    outputAmount: BN,\n    sqrtPriceLimitX64?: BN,\n  ): { expectedAmountIn: BN; remainingAccounts: PublicKey[]; executionPrice: BN; feeAmount: BN } {\n    const zeroForOne = outputTokenMint.equals(poolInfo.mintB.mint);\n\n    const allNeededAccounts: PublicKey[] = [];\n    const {\n      isExist,\n      startIndex: firstTickArrayStartIndex,\n      nextAccountMeta,\n    } = this.getFirstInitializedTickArray(poolInfo, zeroForOne);\n    if (!isExist || firstTickArrayStartIndex === undefined || !nextAccountMeta) throw new Error(\"Invalid tick array\");\n\n    try {\n      const preTick = this.preInitializedTickArrayStartIndex(poolInfo, zeroForOne);\n      if (preTick.isExist) {\n        const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, preTick.nextStartIndex);\n        allNeededAccounts.push(address);\n      }\n    } catch (e) {\n      /* empty */\n    }\n\n    allNeededAccounts.push(nextAccountMeta);\n    const {\n      amountCalculated: inputAmount,\n      accounts: reaminAccounts,\n      sqrtPriceX64: executionPrice,\n      feeAmount,\n    } = SwapMath.swapCompute(\n      poolInfo.programId,\n      poolInfo.id,\n      tickArrayCache,\n      poolInfo.tickArrayBitmap,\n      poolInfo.exBitmapInfo,\n      zeroForOne,\n      poolInfo.ammConfig.tradeFeeRate,\n      poolInfo.liquidity,\n      poolInfo.tickCurrent,\n      poolInfo.tickSpacing,\n      poolInfo.sqrtPriceX64,\n      outputAmount.mul(NEGATIVE_ONE),\n      firstTickArrayStartIndex,\n      sqrtPriceLimitX64,\n    );\n    allNeededAccounts.push(...reaminAccounts);\n    return { expectedAmountIn: inputAmount, remainingAccounts: allNeededAccounts, executionPrice, feeAmount };\n  }\n\n  public static getFirstInitializedTickArray(\n    poolInfo: ClmmPoolInfo,\n    zeroForOne: boolean,\n  ):\n    | { isExist: true; startIndex: number; nextAccountMeta: PublicKey }\n    | { isExist: false; startIndex: undefined; nextAccountMeta: undefined } {\n    const { isInitialized, startIndex } = PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.tickSpacing, [\n      poolInfo.tickCurrent,\n    ])\n      ? TickArrayBitmapExtensionUtils.checkTickArrayIsInit(\n          TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing),\n          poolInfo.tickSpacing,\n          poolInfo.exBitmapInfo,\n        )\n      : TickUtils.checkTickArrayIsInitialized(\n          TickUtils.mergeTickArrayBitmap(poolInfo.tickArrayBitmap),\n          poolInfo.tickCurrent,\n          poolInfo.tickSpacing,\n        );\n\n    if (isInitialized) {\n      const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, startIndex);\n      return {\n        isExist: true,\n        startIndex,\n        nextAccountMeta: address,\n      };\n    }\n    const { isExist, nextStartIndex } = this.nextInitializedTickArrayStartIndex(\n      poolInfo,\n      TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing),\n      zeroForOne,\n    );\n    if (isExist) {\n      const { publicKey: address } = getPdaTickArrayAddress(poolInfo.programId, poolInfo.id, nextStartIndex);\n      return {\n        isExist: true,\n        startIndex: nextStartIndex,\n        nextAccountMeta: address,\n      };\n    }\n    return { isExist: false, nextAccountMeta: undefined, startIndex: undefined };\n  }\n\n  public static preInitializedTickArrayStartIndex(\n    poolInfo: ClmmPoolInfo,\n    zeroForOne: boolean,\n  ): { isExist: boolean; nextStartIndex: number } {\n    const currentOffset = Math.floor(poolInfo.tickCurrent / TickQuery.tickCount(poolInfo.tickSpacing));\n\n    const result: number[] = !zeroForOne\n      ? TickUtils.searchLowBitFromStart(\n          poolInfo.tickArrayBitmap,\n          poolInfo.exBitmapInfo,\n          currentOffset - 1,\n          1,\n          poolInfo.tickSpacing,\n        )\n      : TickUtils.searchHightBitFromStart(\n          poolInfo.tickArrayBitmap,\n          poolInfo.exBitmapInfo,\n          currentOffset + 1,\n          1,\n          poolInfo.tickSpacing,\n        );\n\n    return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 };\n  }\n\n  public static nextInitializedTickArrayStartIndex(\n    poolInfo:\n      | {\n          tickCurrent: number;\n          tickSpacing: number;\n          tickArrayBitmap: BN[];\n          exBitmapInfo: TickArrayBitmapExtensionType;\n        }\n      | ClmmPoolInfo,\n    lastTickArrayStartIndex: number,\n    zeroForOne: boolean,\n  ): { isExist: boolean; nextStartIndex: number } {\n    lastTickArrayStartIndex = TickQuery.getArrayStartIndex(poolInfo.tickCurrent, poolInfo.tickSpacing);\n\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n      const { isInit: startIsInit, tickIndex: startIndex } = TickArrayBitmap.nextInitializedTickArrayStartIndex(\n        TickUtils.mergeTickArrayBitmap(poolInfo.tickArrayBitmap),\n        lastTickArrayStartIndex,\n        poolInfo.tickSpacing,\n        zeroForOne,\n      );\n      if (startIsInit) {\n        return { isExist: true, nextStartIndex: startIndex };\n      }\n      lastTickArrayStartIndex = startIndex;\n\n      const { isInit, tickIndex } = TickArrayBitmapExtensionUtils.nextInitializedTickArrayFromOneBitmap(\n        lastTickArrayStartIndex,\n        poolInfo.tickSpacing,\n        zeroForOne,\n        poolInfo.exBitmapInfo,\n      );\n      if (isInit) return { isExist: true, nextStartIndex: tickIndex };\n\n      lastTickArrayStartIndex = tickIndex;\n\n      if (lastTickArrayStartIndex < MIN_TICK || lastTickArrayStartIndex > MAX_TICK)\n        return { isExist: false, nextStartIndex: 0 };\n    }\n\n    // const tickArrayBitmap = TickUtils.mergeTickArrayBitmap(\n    //   poolInfo.tickArrayBitmap\n    // );\n    // const currentOffset = TickUtils.getTickArrayOffsetInBitmapByTick(\n    //   poolInfo.tickCurrent,\n    //   poolInfo.tickSpacing\n    // );\n    // const result: number[] = zeroForOne ? TickUtils.searchLowBitFromStart(\n    //   tickArrayBitmap,\n    //   currentOffset - 1,\n    //   0,\n    //   1,\n    //   poolInfo.tickSpacing\n    // ) : TickUtils.searchHightBitFromStart(\n    //   tickArrayBitmap,\n    //   currentOffset,\n    //   1024,\n    //   1,\n    //   poolInfo.tickSpacing\n    // );\n\n    // return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 }\n  }\n\n  public static async updatePoolRewardInfos({\n    connection,\n    apiPoolInfo,\n    chainTime,\n    poolLiquidity,\n    rewardInfos,\n  }: {\n    connection: Connection;\n    apiPoolInfo: ApiV3PoolInfoConcentratedItem;\n    chainTime: number;\n    poolLiquidity: BN;\n    rewardInfos: ClmmPoolRewardLayoutInfo[];\n  }): Promise<ClmmPoolRewardInfo[]> {\n    const nRewardInfo: ClmmPoolRewardInfo[] = [];\n    for (let i = 0; i < rewardInfos.length; i++) {\n      const _itemReward = rewardInfos[i];\n      const apiRewardProgram =\n        apiPoolInfo.rewardDefaultInfos[i]?.mint.programId ??\n        (await connection.getAccountInfo(_itemReward.tokenMint))?.owner;\n      if (apiRewardProgram === undefined) throw Error(\"get new reward mint info error\");\n\n      const itemReward: ClmmPoolRewardInfo = {\n        ..._itemReward,\n        perSecond: MathUtil.x64ToDecimal(_itemReward.emissionsPerSecondX64),\n        remainingRewards: undefined,\n        tokenProgramId: new PublicKey(apiRewardProgram),\n      };\n\n      if (itemReward.tokenMint.equals(PublicKey.default)) continue;\n      if (chainTime <= itemReward.openTime.toNumber() || poolLiquidity.eq(ZERO)) {\n        nRewardInfo.push(itemReward);\n        continue;\n      }\n\n      const latestUpdateTime = new BN(Math.min(itemReward.endTime.toNumber(), chainTime));\n      const timeDelta = latestUpdateTime.sub(itemReward.lastUpdateTime);\n      const rewardGrowthDeltaX64 = MathUtil.mulDivFloor(timeDelta, itemReward.emissionsPerSecondX64, poolLiquidity);\n      const rewardGrowthGlobalX64 = itemReward.rewardGrowthGlobalX64.add(rewardGrowthDeltaX64);\n      const rewardEmissionedDelta = MathUtil.mulDivFloor(timeDelta, itemReward.emissionsPerSecondX64, Q64);\n      const rewardTotalEmissioned = itemReward.rewardTotalEmissioned.add(rewardEmissionedDelta);\n      nRewardInfo.push({\n        ...itemReward,\n        rewardGrowthGlobalX64,\n        rewardTotalEmissioned,\n        lastUpdateTime: latestUpdateTime,\n      });\n    }\n    return nRewardInfo;\n  }\n\n  public static isOverflowDefaultTickarrayBitmap(tickSpacing: number, tickarrayStartIndexs: number[]): boolean {\n    const { maxTickBoundary, minTickBoundary } = this.tickRange(tickSpacing);\n\n    for (const tickIndex of tickarrayStartIndexs) {\n      const tickarrayStartIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n\n      if (tickarrayStartIndex >= maxTickBoundary || tickarrayStartIndex < minTickBoundary) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  public static tickRange(tickSpacing: number): {\n    maxTickBoundary: number;\n    minTickBoundary: number;\n  } {\n    let maxTickBoundary = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n    let minTickBoundary = -maxTickBoundary;\n\n    if (maxTickBoundary > MAX_TICK) {\n      maxTickBoundary = MAX_TICK;\n    }\n    if (minTickBoundary < MIN_TICK) {\n      minTickBoundary = MIN_TICK;\n    }\n    return { maxTickBoundary, minTickBoundary };\n  }\n\n  public static get_tick_array_offset(tickarrayStartIndex: number, tickSpacing: number): number {\n    if (!TickQuery.checkIsValidStartIndex(tickarrayStartIndex, tickSpacing)) {\n      throw new Error(\"No enough initialized tickArray\");\n    }\n\n    return (tickarrayStartIndex / TickQuery.tickCount(tickSpacing)) * TICK_ARRAY_BITMAP_SIZE;\n  }\n\n  static async fetchExBitmaps({\n    connection,\n    exBitmapAddress,\n    batchRequest,\n  }: {\n    connection: Connection;\n    exBitmapAddress: PublicKey[];\n    batchRequest: boolean;\n  }): Promise<ReturnTypeFetchExBitmaps> {\n    const fetchedBitmapAccount = await getMultipleAccountsInfoWithCustomFlags(\n      connection,\n      exBitmapAddress.map((i) => ({ pubkey: i })),\n      { batchRequest },\n    );\n\n    const returnTypeFetchExBitmaps: ReturnTypeFetchExBitmaps = {};\n    for (const item of fetchedBitmapAccount) {\n      if (item.accountInfo === null) continue;\n\n      returnTypeFetchExBitmaps[item.pubkey.toString()] = TickArrayBitmapExtensionLayout.decode(item.accountInfo.data);\n    }\n    return returnTypeFetchExBitmaps;\n  }\n\n  // deprecated, new api doesn't need\n  // static async fetchMultiplePoolInfos({\n  //   connection,\n  //   poolKeys,\n  //   ownerInfo,\n  //   chainTime,\n  //   batchRequest = false,\n  //   updateOwnerRewardAndFee = true,\n  // }: {\n  //   connection: Connection;\n  //   poolKeys: ApiV3PoolInfoConcentratedItem[];\n  //   ownerInfo?: { wallet: PublicKey; tokenAccounts: TokenAccountRaw[] };\n  //   chainTime: number;\n  //   batchRequest?: boolean;\n  //   updateOwnerRewardAndFee?: boolean;\n  // }): Promise<ReturnTypeFetchMultiplePoolInfos> {\n  //   const poolAccountInfos = await getMultipleAccountsInfo(\n  //     connection,\n  //     poolKeys.map((i) => new PublicKey(i.id)),\n  //     { batchRequest },\n  //   );\n  //   const exBitmapAddress: { [poolId: string]: PublicKey } = {};\n  //   for (let index = 0; index < poolKeys.length; index++) {\n  //     const apiPoolInfo = poolKeys[index];\n  //     const accountInfo = poolAccountInfos[index];\n\n  //     if (accountInfo === null) continue;\n  //     exBitmapAddress[apiPoolInfo.id] = getPdaExBitmapAccount(\n  //       accountInfo.owner,\n  //       new PublicKey(apiPoolInfo.id),\n  //     ).publicKey;\n  //   }\n\n  //   const exBitmapAccountInfos = await this.fetchExBitmaps({\n  //     connection,\n  //     exBitmapAddress: Object.values(exBitmapAddress),\n  //     batchRequest,\n  //   });\n\n  //   const programIds: PublicKey[] = [];\n\n  //   const poolsInfo: ReturnTypeFetchMultiplePoolInfos = {};\n\n  //   const updateRewardInfos: ClmmPoolRewardInfo[] = [];\n\n  //   for (let index = 0; index < poolKeys.length; index++) {\n  //     const apiPoolInfo = poolKeys[index];\n  //     const accountInfo = poolAccountInfos[index];\n  //     const exBitmapInfo = exBitmapAccountInfos[exBitmapAddress[apiPoolInfo.id].toString()];\n\n  //     if (accountInfo === null) continue;\n\n  //     const layoutAccountInfo = PoolInfoLayout.decode(accountInfo.data);\n  //     poolsInfo[apiPoolInfo.id] = {\n  //       state: {\n  //         id: new PublicKey(apiPoolInfo.id),\n  //         mintA: {\n  //           programId: new PublicKey(apiPoolInfo.mintA.programId),\n  //           mint: layoutAccountInfo.mintA,\n  //           vault: layoutAccountInfo.vaultA,\n  //           decimals: layoutAccountInfo.mintDecimalsA,\n  //         },\n  //         mintB: {\n  //           programId: new PublicKey(apiPoolInfo.mintB.programId),\n  //           mint: layoutAccountInfo.mintB,\n  //           vault: layoutAccountInfo.vaultB,\n  //           decimals: layoutAccountInfo.mintDecimalsB,\n  //         },\n  //         observationId: layoutAccountInfo.observationId,\n  //         ammConfig: {\n  //           ...apiPoolInfo.config,\n  //           fundOwner: apiPoolInfo.config.id,\n  //           id: new PublicKey(apiPoolInfo.config.id),\n  //         },\n\n  //         creator: layoutAccountInfo.creator,\n  //         programId: accountInfo.owner,\n  //         version: 6,\n\n  //         tickSpacing: layoutAccountInfo.tickSpacing,\n  //         liquidity: layoutAccountInfo.liquidity,\n  //         sqrtPriceX64: layoutAccountInfo.sqrtPriceX64,\n  //         currentPrice: SqrtPriceMath.sqrtPriceX64ToPrice(\n  //           layoutAccountInfo.sqrtPriceX64,\n  //           layoutAccountInfo.mintDecimalsA,\n  //           layoutAccountInfo.mintDecimalsB,\n  //         ),\n  //         tickCurrent: layoutAccountInfo.tickCurrent,\n  //         observationIndex: layoutAccountInfo.observationIndex,\n  //         observationUpdateDuration: layoutAccountInfo.observationUpdateDuration,\n  //         feeGrowthGlobalX64A: layoutAccountInfo.feeGrowthGlobalX64A,\n  //         feeGrowthGlobalX64B: layoutAccountInfo.feeGrowthGlobalX64B,\n  //         protocolFeesTokenA: layoutAccountInfo.protocolFeesTokenA,\n  //         protocolFeesTokenB: layoutAccountInfo.protocolFeesTokenB,\n  //         swapInAmountTokenA: layoutAccountInfo.swapInAmountTokenA,\n  //         swapOutAmountTokenB: layoutAccountInfo.swapOutAmountTokenB,\n  //         swapInAmountTokenB: layoutAccountInfo.swapInAmountTokenB,\n  //         swapOutAmountTokenA: layoutAccountInfo.swapOutAmountTokenA,\n  //         tickArrayBitmap: layoutAccountInfo.tickArrayBitmap,\n\n  //         rewardInfos: await PoolUtils.updatePoolRewardInfos({\n  //           connection,\n  //           apiPoolInfo,\n  //           chainTime,\n  //           poolLiquidity: layoutAccountInfo.liquidity,\n  //           rewardInfos: layoutAccountInfo.rewardInfos.filter((i) => !i.tokenMint.equals(PublicKey.default)),\n  //         }),\n\n  //         day: apiPoolInfo.day,\n  //         week: apiPoolInfo.week,\n  //         month: apiPoolInfo.month,\n  //         tvl: apiPoolInfo.tvl,\n  //         lookupTableAccount: new PublicKey(apiPoolInfo.lookupTableAccount),\n\n  //         startTime: layoutAccountInfo.startTime.toNumber(),\n\n  //         exBitmapInfo,\n  //       },\n  //     };\n\n  //     if (ownerInfo) {\n  //       updateRewardInfos.push(\n  //         ...poolsInfo[apiPoolInfo.id].state.rewardInfos.filter((i) => i.creator.equals(ownerInfo.wallet)),\n  //       );\n  //     }\n\n  //     if (!programIds.find((i) => i.equals(accountInfo.owner))) programIds.push(accountInfo.owner);\n  //   }\n\n  //   if (ownerInfo) {\n  //     const allMint = ownerInfo.tokenAccounts\n  //       .filter((i) => i.accountInfo.amount.eq(new BN(1)))\n  //       .map((i) => i.accountInfo.mint);\n  //     const allPositionKey: PublicKey[] = [];\n  //     for (const itemMint of allMint) {\n  //       for (const itemProgramId of programIds) {\n  //         allPositionKey.push(getPdaPersonalPositionAddress(itemProgramId, itemMint).publicKey);\n  //       }\n  //     }\n  //     const positionAccountInfos = await getMultipleAccountsInfo(connection, allPositionKey, { batchRequest });\n\n  //     const keyToTickArrayAddress: { [key: string]: PublicKey } = {};\n  //     for (const itemAccountInfo of positionAccountInfos) {\n  //       if (itemAccountInfo === null) continue;\n  //       const position = PositionInfoLayout.decode(itemAccountInfo.data);\n  //       const itemPoolId = position.poolId.toString();\n  //       const poolInfoA = poolsInfo[itemPoolId];\n  //       if (poolInfoA === undefined) continue;\n\n  //       const poolInfo = poolInfoA.state;\n\n  //       const priceLower = TickUtils._getTickPriceLegacy({\n  //         poolInfo,\n  //         tick: position.tickLower,\n  //         baseIn: true,\n  //       });\n  //       const priceUpper = TickUtils._getTickPriceLegacy({\n  //         poolInfo,\n  //         tick: position.tickUpper,\n  //         baseIn: true,\n  //       });\n  //       const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(\n  //         poolInfo.sqrtPriceX64,\n  //         priceLower.tickSqrtPriceX64,\n  //         priceUpper.tickSqrtPriceX64,\n  //         position.liquidity,\n  //         false,\n  //       );\n\n  //       const leverage = 1 / (1 - Math.sqrt(Math.sqrt(priceLower.price.div(priceUpper.price).toNumber())));\n\n  //       poolsInfo[itemPoolId].positionAccount = [\n  //         ...(poolsInfo[itemPoolId].positionAccount ?? []),\n  //         {\n  //           poolId: position.poolId,\n  //           nftMint: position.nftMint,\n\n  //           priceLower: priceLower.price,\n  //           priceUpper: priceUpper.price,\n  //           amountA,\n  //           amountB,\n  //           tickLower: position.tickLower,\n  //           tickUpper: position.tickUpper,\n  //           liquidity: position.liquidity,\n  //           feeGrowthInsideLastX64A: position.feeGrowthInsideLastX64A,\n  //           feeGrowthInsideLastX64B: position.feeGrowthInsideLastX64B,\n  //           tokenFeesOwedA: position.tokenFeesOwedA,\n  //           tokenFeesOwedB: position.tokenFeesOwedB,\n  //           rewardInfos: position.rewardInfos.map((i) => ({\n  //             ...i,\n  //             pendingReward: new BN(0),\n  //           })),\n\n  //           leverage,\n  //           tokenFeeAmountA: new BN(0),\n  //           tokenFeeAmountB: new BN(0),\n  //         },\n  //       ];\n\n  //       const tickArrayLowerAddress = TickUtils.getTickArrayAddressByTick(\n  //         poolsInfo[itemPoolId].state.programId,\n  //         position.poolId,\n  //         position.tickLower,\n  //         poolsInfo[itemPoolId].state.tickSpacing,\n  //       );\n  //       const tickArrayUpperAddress = TickUtils.getTickArrayAddressByTick(\n  //         poolsInfo[itemPoolId].state.programId,\n  //         position.poolId,\n  //         position.tickUpper,\n  //         poolsInfo[itemPoolId].state.tickSpacing,\n  //       );\n  //       keyToTickArrayAddress[\n  //         `${poolsInfo[itemPoolId].state.programId.toString()}-${position.poolId.toString()}-${position.tickLower}`\n  //       ] = tickArrayLowerAddress;\n  //       keyToTickArrayAddress[\n  //         `${poolsInfo[itemPoolId].state.programId.toString()}-${position.poolId.toString()}-${position.tickUpper}`\n  //       ] = tickArrayUpperAddress;\n  //     }\n\n  //     if (updateOwnerRewardAndFee) {\n  //       const tickArrayKeys = Object.values(keyToTickArrayAddress);\n  //       const tickArrayDatas = await getMultipleAccountsInfo(connection, tickArrayKeys, { batchRequest });\n  //       const tickArrayLayout: { [key: string]: TickArray } = {};\n  //       for (let index = 0; index < tickArrayKeys.length; index++) {\n  //         const tickArrayData = tickArrayDatas[index];\n  //         if (tickArrayData === null) continue;\n  //         const key = tickArrayKeys[index];\n  //         tickArrayLayout[key.toString()] = {\n  //           address: key,\n  //           ...TickArrayLayout.decode(tickArrayData.data),\n  //         };\n  //       }\n\n  //       for (const { state, positionAccount } of Object.values(poolsInfo)) {\n  //         if (!positionAccount) continue;\n  //         for (const itemPA of positionAccount) {\n  //           const keyLower = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickLower}`;\n  //           const keyUpper = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickUpper}`;\n  //           const tickArrayLower = tickArrayLayout[keyToTickArrayAddress[keyLower].toString()];\n  //           const tickArrayUpper = tickArrayLayout[keyToTickArrayAddress[keyUpper].toString()];\n  //           const tickLowerState: Tick =\n  //             tickArrayLower.ticks[TickUtils.getTickOffsetInArray(itemPA.tickLower, state.tickSpacing)];\n  //           const tickUpperState: Tick =\n  //             tickArrayUpper.ticks[TickUtils.getTickOffsetInArray(itemPA.tickUpper, state.tickSpacing)];\n  //           const { tokenFeeAmountA, tokenFeeAmountB } = PositionUtils.GetPositionFees(\n  //             state,\n  //             itemPA,\n  //             tickLowerState,\n  //             tickUpperState,\n  //           );\n  //           const rewardInfos = PositionUtils.GetPositionRewards(state, itemPA, tickLowerState, tickUpperState);\n  // itemPA.tokenFeeAmountA =\n  //             tokenFeeAmountA.gte(ZERO) && tokenFeeAmountA.lt(U64_IGNORE_RANGE) ? tokenFeeAmountA : ZERO\n  //           itemPA.tokenFeeAmountB =\n  //             tokenFeeAmountB.gte(ZERO) && tokenFeeAmountA.lt(U64_IGNORE_RANGE) ? tokenFeeAmountB : ZERO\n  //           for (let i = 0; i < rewardInfos.length; i++) {\n  //             itemPA.rewardInfos[i].pendingReward = rewardInfos[i].gte(ZERO) ? rewardInfos[i] : ZERO;\n  //           }\n  //         }\n  //       }\n  //     }\n  //   }\n\n  //   if (updateRewardInfos.length > 0) {\n  //     const vaults = updateRewardInfos.map((i) => i.tokenVault);\n  //     const rewardVaultInfos = await getMultipleAccountsInfo(connection, vaults, { batchRequest });\n  //     const rewardVaultAmount: { [mint: string]: BN } = {};\n  //     for (let index = 0; index < vaults.length; index++) {\n  //       const valutKey = vaults[index].toString();\n  //       const itemRewardVaultInfo = rewardVaultInfos[index];\n  //       if (itemRewardVaultInfo === null) continue;\n  //       const info = splAccountLayout.decode(itemRewardVaultInfo.data);\n  //       rewardVaultAmount[valutKey] = info.amount;\n  //     }\n  //     for (const item of updateRewardInfos) {\n  //       const vaultAmount = rewardVaultAmount[item.tokenVault.toString()];\n  //       item.remainingRewards =\n  //         vaultAmount !== undefined ? vaultAmount.sub(item.rewardTotalEmissioned.sub(item.rewardClaimed)) : ZERO;\n  //     }\n  //   }\n\n  //   return poolsInfo;\n  // }\n\n  static async fetchMultiplePoolTickArrays({\n    connection,\n    poolKeys,\n    batchRequest,\n  }: {\n    connection: Connection;\n    poolKeys: ClmmPoolInfo[];\n    batchRequest?: boolean;\n  }): Promise<ReturnTypeFetchMultiplePoolTickArrays> {\n    const tickArraysToPoolId: { [key: string]: PublicKey } = {};\n    const tickArrays: { pubkey: PublicKey }[] = [];\n    for (const itemPoolInfo of poolKeys) {\n      const currentTickArrayStartIndex = TickUtils.getTickArrayStartIndexByTick(\n        itemPoolInfo.tickCurrent,\n        itemPoolInfo.tickSpacing,\n      );\n      const startIndexArray = TickUtils.getInitializedTickArrayInRange(\n        itemPoolInfo.tickArrayBitmap,\n        itemPoolInfo.exBitmapInfo,\n        itemPoolInfo.tickSpacing,\n        currentTickArrayStartIndex,\n        7,\n      );\n      for (const itemIndex of startIndexArray) {\n        const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(\n          itemPoolInfo.programId,\n          itemPoolInfo.id,\n          itemIndex,\n        );\n        tickArrays.push({ pubkey: tickArrayAddress });\n        tickArraysToPoolId[tickArrayAddress.toString()] = itemPoolInfo.id;\n      }\n    }\n\n    const fetchedTickArrays = await getMultipleAccountsInfoWithCustomFlags(connection, tickArrays, { batchRequest });\n\n    const tickArrayCache: ReturnTypeFetchMultiplePoolTickArrays = {};\n\n    for (const itemAccountInfo of fetchedTickArrays) {\n      if (!itemAccountInfo.accountInfo) continue;\n      const poolId = tickArraysToPoolId[itemAccountInfo.pubkey.toString()];\n      if (!poolId) continue;\n      if (tickArrayCache[poolId.toString()] === undefined) tickArrayCache[poolId.toString()] = {};\n\n      const accountLayoutData = TickArrayLayout.decode(itemAccountInfo.accountInfo.data);\n\n      tickArrayCache[poolId.toString()][accountLayoutData.startTickIndex] = {\n        ...accountLayoutData,\n        address: itemAccountInfo.pubkey,\n      };\n    }\n    return tickArrayCache;\n  }\n\n  // deprecated, new api doesn't need\n  static async fetchPoolsAccountPosition({\n    pools,\n    connection,\n    ownerInfo,\n    batchRequest = false,\n    updateOwnerRewardAndFee = true,\n  }: {\n    pools: SDKParsedConcentratedInfo[];\n    connection: Connection;\n    ownerInfo: { wallet: PublicKey; tokenAccounts: TokenAccountRaw[] };\n    batchRequest?: boolean;\n    updateOwnerRewardAndFee?: boolean;\n  }): Promise<SDKParsedConcentratedInfo[]> {\n    const programIds: PublicKey[] = [];\n\n    for (let index = 0; index < pools.length; index++) {\n      const accountInfo = pools[index];\n\n      if (accountInfo === null) continue;\n\n      if (!programIds.find((i) => i.equals(accountInfo.state.programId))) programIds.push(accountInfo.state.programId);\n    }\n\n    if (ownerInfo) {\n      const allMint = ownerInfo.tokenAccounts.map((i) => i.accountInfo.mint);\n      const allPositionKey: PublicKey[] = [];\n      for (const itemMint of allMint) {\n        for (const itemProgramId of programIds) {\n          allPositionKey.push(getPdaPersonalPositionAddress(itemProgramId, itemMint).publicKey);\n        }\n      }\n      const positionAccountInfos = await getMultipleAccountsInfo(connection, allPositionKey, { batchRequest });\n      const keyToTickArrayAddress: { [key: string]: PublicKey } = {};\n      for (const itemAccountInfo of positionAccountInfos) {\n        if (itemAccountInfo === null) continue;\n        // TODO: add check\n\n        const position = PositionInfoLayout.decode(itemAccountInfo.data);\n        const itemPoolId = position.poolId.toString();\n        const poolInfoA = pools.find((pool) => pool.state.id.toBase58() === itemPoolId);\n        if (poolInfoA === undefined) continue;\n\n        const poolInfo = poolInfoA.state;\n\n        const priceLower = TickUtils._getTickPriceLegacy({\n          poolInfo,\n          tick: position.tickLower,\n          baseIn: true,\n        });\n        const priceUpper = TickUtils._getTickPriceLegacy({\n          poolInfo,\n          tick: position.tickUpper,\n          baseIn: true,\n        });\n        const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(\n          poolInfo.sqrtPriceX64,\n          priceLower.tickSqrtPriceX64,\n          priceUpper.tickSqrtPriceX64,\n          position.liquidity,\n          false,\n        );\n\n        const leverage = 1 / (1 - Math.sqrt(Math.sqrt(priceLower.price.div(priceUpper.price).toNumber())));\n\n        poolInfoA.positionAccount = [\n          ...(poolInfoA.positionAccount ?? []),\n          {\n            poolId: position.poolId,\n            nftMint: position.nftMint,\n\n            priceLower: priceLower.price,\n            priceUpper: priceUpper.price,\n            amountA,\n            amountB,\n            tickLower: position.tickLower,\n            tickUpper: position.tickUpper,\n            liquidity: position.liquidity,\n            feeGrowthInsideLastX64A: position.feeGrowthInsideLastX64A,\n            feeGrowthInsideLastX64B: position.feeGrowthInsideLastX64B,\n            tokenFeesOwedA: position.tokenFeesOwedA,\n            tokenFeesOwedB: position.tokenFeesOwedB,\n            rewardInfos: position.rewardInfos.map((i) => ({\n              ...i,\n              pendingReward: new BN(0),\n            })),\n\n            leverage,\n            tokenFeeAmountA: new BN(0),\n            tokenFeeAmountB: new BN(0),\n          },\n        ];\n\n        const tickArrayLowerAddress = await TickUtils.getTickArrayAddressByTick(\n          poolInfoA.state.programId,\n          position.poolId,\n          position.tickLower,\n          poolInfoA.state.tickSpacing,\n        );\n        const tickArrayUpperAddress = await TickUtils.getTickArrayAddressByTick(\n          poolInfoA.state.programId,\n          position.poolId,\n          position.tickUpper,\n          poolInfoA.state.tickSpacing,\n        );\n        keyToTickArrayAddress[\n          `${poolInfoA.state.programId.toString()}-${position.poolId.toString()}-${position.tickLower}`\n        ] = tickArrayLowerAddress;\n        keyToTickArrayAddress[\n          `${poolInfoA.state.programId.toString()}-${position.poolId.toString()}-${position.tickUpper}`\n        ] = tickArrayUpperAddress;\n      }\n\n      if (updateOwnerRewardAndFee) {\n        const tickArrayKeys = Object.values(keyToTickArrayAddress);\n        const tickArrayDatas = await getMultipleAccountsInfo(connection, tickArrayKeys, { batchRequest });\n        const tickArrayLayout = {};\n        for (let index = 0; index < tickArrayKeys.length; index++) {\n          const tickArrayData = tickArrayDatas[index];\n          if (tickArrayData === null) continue;\n          const key = tickArrayKeys[index].toString();\n          tickArrayLayout[key] = TickArrayLayout.decode(tickArrayData.data);\n        }\n\n        for (const { state, positionAccount } of pools) {\n          if (!positionAccount) continue;\n          for (const itemPA of positionAccount) {\n            const keyLower = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickLower}`;\n            const keyUpper = `${state.programId.toString()}-${state.id.toString()}-${itemPA.tickUpper}`;\n            const tickArrayLower = tickArrayLayout[keyToTickArrayAddress[keyLower].toString()];\n            const tickArrayUpper = tickArrayLayout[keyToTickArrayAddress[keyUpper].toString()];\n            const tickLowerState: Tick =\n              tickArrayLower.ticks[TickUtils.getTickOffsetInArray(itemPA.tickLower, state.tickSpacing)];\n            const tickUpperState: Tick =\n              tickArrayUpper.ticks[TickUtils.getTickOffsetInArray(itemPA.tickUpper, state.tickSpacing)];\n            const { tokenFeeAmountA, tokenFeeAmountB } = await PositionUtils.GetPositionFees(\n              state,\n              itemPA,\n              tickLowerState,\n              tickUpperState,\n            );\n            const rewardInfos = await PositionUtils.GetPositionRewards(state, itemPA, tickLowerState, tickUpperState);\n            itemPA.tokenFeeAmountA = tokenFeeAmountA.gte(new BN(0)) ? tokenFeeAmountA : new BN(0);\n            itemPA.tokenFeeAmountB = tokenFeeAmountB.gte(new BN(0)) ? tokenFeeAmountB : new BN(0);\n            for (let i = 0; i < rewardInfos.length; i++) {\n              itemPA.rewardInfos[i].pendingReward = rewardInfos[i].gte(new BN(0)) ? rewardInfos[i] : new BN(0);\n            }\n          }\n        }\n      }\n    }\n    return pools;\n  }\n\n  static computeAmountOut({\n    poolInfo,\n    tickArrayCache,\n    baseMint,\n    token2022Infos,\n    epochInfo,\n    amountIn,\n    slippage,\n    priceLimit = new Decimal(0),\n  }: {\n    poolInfo: ClmmPoolInfo;\n    tickArrayCache: { [key: string]: TickArray };\n    baseMint: PublicKey;\n\n    token2022Infos: ReturnTypeFetchMultipleMintInfos;\n    epochInfo: EpochInfo;\n\n    amountIn: BN;\n    slippage: number;\n    priceLimit?: Decimal;\n  }): ReturnTypeComputeAmountOut {\n    let sqrtPriceLimitX64: BN;\n    if (priceLimit.equals(new Decimal(0))) {\n      sqrtPriceLimitX64 = baseMint.equals(poolInfo.mintA.mint)\n        ? MIN_SQRT_PRICE_X64.add(new BN(1))\n        : MAX_SQRT_PRICE_X64.sub(new BN(1));\n    } else {\n      sqrtPriceLimitX64 = SqrtPriceMath.priceToSqrtPriceX64(\n        priceLimit,\n        poolInfo.mintA.decimals,\n        poolInfo.mintB.decimals,\n      );\n    }\n\n    const realAmountIn = getTransferAmountFee(\n      amountIn,\n      token2022Infos[baseMint.toString()]?.feeConfig,\n      epochInfo,\n      false,\n    );\n\n    const {\n      expectedAmountOut: _expectedAmountOut,\n      remainingAccounts,\n      executionPrice: _executionPriceX64,\n      feeAmount,\n    } = PoolUtils.getOutputAmountAndRemainAccounts(\n      poolInfo,\n      tickArrayCache,\n      baseMint,\n      realAmountIn.amount.sub(realAmountIn.fee ?? ZERO),\n      sqrtPriceLimitX64,\n    );\n\n    const outMint = poolInfo.mintA.mint.equals(baseMint) ? poolInfo.mintB.mint : poolInfo.mintA.mint;\n    const amountOut = getTransferAmountFee(\n      _expectedAmountOut,\n      token2022Infos[outMint.toString()]?.feeConfig,\n      epochInfo,\n      false,\n    );\n\n    const _executionPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      _executionPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const executionPrice = baseMint.equals(poolInfo.mintA.mint) ? _executionPrice : new Decimal(1).div(_executionPrice);\n\n    const _minAmountOut = _expectedAmountOut\n      .mul(new BN(Math.floor((1 - slippage) * 10000000000)))\n      .div(new BN(10000000000));\n    const minAmountOut = getTransferAmountFee(\n      _minAmountOut,\n      token2022Infos[outMint.toString()]?.feeConfig,\n      epochInfo,\n      false,\n    );\n\n    const poolPrice = poolInfo.mintA.mint.equals(baseMint)\n      ? poolInfo.currentPrice\n      : new Decimal(1).div(poolInfo.currentPrice);\n\n    const _numerator = new Decimal(executionPrice).sub(poolPrice).abs();\n    const _denominator = poolPrice;\n    const priceImpact = new Percent(\n      new Decimal(_numerator).mul(10 ** 15).toFixed(0),\n      new Decimal(_denominator).mul(10 ** 15).toFixed(0),\n    );\n\n    return {\n      realAmountIn,\n      amountOut,\n      minAmountOut,\n      expirationTime: minExpirationTime(realAmountIn.expirationTime, amountOut.expirationTime),\n      currentPrice: poolInfo.currentPrice,\n      executionPrice,\n      priceImpact,\n      fee: feeAmount,\n\n      remainingAccounts,\n    };\n  }\n\n  static async computeAmountOutFormat({\n    poolInfo,\n    tickArrayCache,\n    token2022Infos,\n    amountIn,\n    tokenOut: _tokenOut,\n    slippage,\n    epochInfo,\n  }: {\n    poolInfo: ClmmPoolInfo;\n    tickArrayCache: { [key: string]: TickArray };\n    token2022Infos: ReturnTypeFetchMultipleMintInfos;\n    amountIn: TokenAmount;\n    tokenOut: Token;\n    slippage: Percent;\n    epochInfo: EpochInfo;\n  }): Promise<ReturnTypeComputeAmountOutFormat> {\n    const inputMint = amountIn.token.equals(Token.WSOL) ? WSOLMint : amountIn.token.mint;\n    const _slippage = slippage.numerator.toNumber() / slippage.denominator.toNumber();\n    const tokenOut = _tokenOut.mint.equals(SOLMint)\n      ? new Token({ mint: \"sol\", decimals: SOL_INFO.decimals })\n      : _tokenOut;\n\n    const {\n      realAmountIn: _realAmountIn,\n      amountOut: _amountOut,\n      minAmountOut: _minAmountOut,\n      expirationTime,\n      currentPrice,\n      executionPrice,\n      priceImpact,\n      fee,\n      remainingAccounts,\n    } = await PoolUtils.computeAmountOut({\n      poolInfo,\n      tickArrayCache,\n      baseMint: inputMint,\n      amountIn: amountIn.raw,\n      slippage: _slippage,\n      token2022Infos,\n      epochInfo,\n    });\n\n    const realAmountIn = {\n      ..._realAmountIn,\n      amount: new TokenAmount(amountIn.token, _realAmountIn.amount),\n      fee: _realAmountIn.fee === undefined ? undefined : new TokenAmount(amountIn.token, _realAmountIn.fee),\n    };\n\n    const amountOut = {\n      ..._amountOut,\n      amount: new TokenAmount(tokenOut, _amountOut.amount),\n      fee: _amountOut.fee === undefined ? undefined : new TokenAmount(tokenOut, _amountOut.fee),\n    };\n    const minAmountOut = {\n      ..._minAmountOut,\n      amount: new TokenAmount(tokenOut, _minAmountOut.amount),\n      fee: _minAmountOut.fee === undefined ? undefined : new TokenAmount(tokenOut, _minAmountOut.fee),\n    };\n\n    const _currentPrice = new Price({\n      baseToken: amountIn.token,\n      denominator: new BN(10).pow(new BN(20 + amountIn.token.decimals)),\n      quoteToken: tokenOut,\n      numerator: currentPrice.mul(new Decimal(10 ** (20 + tokenOut.decimals))).toFixed(0),\n    });\n    const _executionPrice = new Price({\n      baseToken: amountIn.token,\n      denominator: new BN(10).pow(new BN(20 + amountIn.token.decimals)),\n      quoteToken: tokenOut,\n      numerator: executionPrice.mul(new Decimal(10 ** (20 + tokenOut.decimals))).toFixed(0),\n    });\n    const _fee = new TokenAmount(amountIn.token, fee);\n\n    return {\n      realAmountIn,\n      amountOut,\n      minAmountOut,\n      expirationTime,\n      currentPrice: _currentPrice,\n      executionPrice: _executionPrice,\n      priceImpact,\n      fee: _fee,\n      remainingAccounts,\n    };\n  }\n\n  static estimateAprsForPriceRangeMultiplier({\n    poolInfo,\n    aprType,\n    positionTickLowerIndex,\n    positionTickUpperIndex,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    aprType: \"day\" | \"week\" | \"month\";\n\n    positionTickLowerIndex: number;\n    positionTickUpperIndex: number;\n  }): {\n    feeApr: number;\n    rewardsApr: number[];\n    apr: number;\n  } {\n    const aprInfo = poolInfo[aprType];\n\n    const priceLower = TickUtils.getTickPrice({\n      poolInfo,\n      tick: positionTickLowerIndex,\n      baseIn: true,\n    }).price.toNumber();\n    const priceUpper = TickUtils.getTickPrice({\n      poolInfo,\n      tick: positionTickUpperIndex,\n      baseIn: true,\n    }).price.toNumber();\n\n    const _minPrice = Math.max(priceLower, aprInfo.priceMin);\n    const _maxPrice = Math.min(priceUpper, aprInfo.priceMax);\n\n    const sub = _maxPrice - _minPrice;\n\n    const userRange = priceUpper - priceLower;\n    const tradeRange = aprInfo.priceMax - aprInfo.priceMin;\n\n    let p: number;\n\n    if (sub <= 0) p = 0;\n    else if (userRange === sub) p = tradeRange / sub;\n    else if (tradeRange === sub) p = sub / userRange;\n    else p = (sub / tradeRange) * (sub / userRange);\n\n    return {\n      feeApr: aprInfo.feeApr * p,\n      rewardsApr: [aprInfo.rewardApr[0] ?? 0 * p, aprInfo.rewardApr[1] ?? 0 * p, aprInfo.rewardApr[2] ?? 0 * p],\n      apr: aprInfo.apr * p,\n    };\n  }\n\n  static estimateAprsForPriceRangeDelta({\n    poolInfo,\n    poolLiquidity,\n    aprType,\n    mintPrice,\n    liquidity,\n    positionTickLowerIndex,\n    positionTickUpperIndex,\n    chainTime,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolLiquidity: BN;\n    aprType: \"day\" | \"week\" | \"month\";\n\n    mintPrice: { [mint: string]: { value: number } };\n\n    liquidity: BN;\n    positionTickLowerIndex: number;\n    positionTickUpperIndex: number;\n\n    chainTime: number;\n  }): {\n    feeApr: number;\n    rewardsApr: number[];\n    apr: number;\n  } {\n    const aprTypeDay = aprType === \"day\" ? 1 : aprType === \"week\" ? 7 : aprType === \"month\" ? 30 : 0;\n    const aprInfo = poolInfo[aprType];\n    const mintPriceA = mintPrice[solToWSol(poolInfo.mintA.address).toString()];\n    const mintPriceB = mintPrice[solToWSol(poolInfo.mintB.address).toString()];\n    const mintDecimalsA = poolInfo.mintA.decimals;\n    const mintDecimalsB = poolInfo.mintB.decimals;\n\n    if (!aprInfo || !mintPriceA || !mintPriceB) return { feeApr: 0, rewardsApr: [0, 0, 0], apr: 0 };\n\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(positionTickLowerIndex);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(positionTickUpperIndex);\n\n    const { amountSlippageA: poolLiquidityA, amountSlippageB: poolLiquidityB } =\n      LiquidityMath.getAmountsFromLiquidityWithSlippage(\n        sqrtPriceX64,\n        sqrtPriceX64A,\n        sqrtPriceX64B,\n        poolLiquidity,\n        false,\n        false,\n        0,\n      );\n\n    const { amountSlippageA: userLiquidityA, amountSlippageB: userLiquidityB } =\n      LiquidityMath.getAmountsFromLiquidityWithSlippage(\n        sqrtPriceX64,\n        sqrtPriceX64A,\n        sqrtPriceX64B,\n        liquidity,\n        false,\n        false,\n        0,\n      );\n\n    const poolTvl = new Decimal(poolLiquidityA.toString())\n      .div(new Decimal(10).pow(mintDecimalsA))\n      .mul(mintPriceA.value)\n      .add(new Decimal(poolLiquidityB.toString()).div(new Decimal(10).pow(mintDecimalsB)).mul(mintPriceB.value));\n    const userTvl = new Decimal(userLiquidityA.toString())\n      .div(new Decimal(10).pow(mintDecimalsA))\n      .mul(mintPriceA.value)\n      .add(new Decimal(userLiquidityB.toString()).div(new Decimal(10).pow(mintDecimalsB)).mul(mintPriceB.value));\n\n    const p = userTvl.div(poolTvl.add(userTvl)).div(userTvl);\n\n    const feesPerYear = new Decimal(aprInfo.volumeFee).mul(365).div(aprTypeDay);\n    const feeApr = feesPerYear.mul(p).mul(100).toNumber();\n\n    const SECONDS_PER_YEAR = 3600 * 24 * 365;\n\n    const rewardsApr = poolInfo.rewardDefaultInfos.map((i) => {\n      const iDecimal = i.mint.decimals;\n      const iPrice = mintPrice[i.mint.address];\n\n      if (\n        chainTime < ((i as any).startTime ?? 0) ||\n        chainTime > ((i as any).endTime ?? 0) ||\n        !i.perSecond ||\n        !iPrice ||\n        iDecimal === undefined\n      )\n        return 0;\n\n      return new Decimal(iPrice.value)\n        .mul(new Decimal(i.perSecond).mul(SECONDS_PER_YEAR))\n        .div(new Decimal(10).pow(iDecimal))\n        .mul(p)\n        .mul(100)\n        .toNumber();\n    });\n\n    return {\n      feeApr,\n      rewardsApr,\n      apr: feeApr + rewardsApr.reduce((a, b) => a + b, 0),\n    };\n  }\n\n  static getLiquidityAmountOutFromAmountIn({\n    poolInfo,\n    inputA,\n    tickLower,\n    tickUpper,\n    amount,\n    slippage,\n    add,\n    epochInfo,\n    amountHasFee,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    inputA: boolean;\n    tickLower: number;\n    tickUpper: number;\n    amount: BN;\n    slippage: number;\n    add: boolean;\n    epochInfo: EpochInfo;\n    amountHasFee: boolean;\n  }): Promise<ReturnTypeGetLiquidityAmountOut> {\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n    const coefficient = add ? 1 - slippage : 1 + slippage;\n    const addFeeAmount = getTransferAmountFeeV2(\n      amount,\n      poolInfo[inputA ? \"mintA\" : \"mintB\"].extensions?.feeConfig,\n      epochInfo,\n      !amountHasFee,\n    );\n    const _amount = new BN(\n      new Decimal(addFeeAmount.amount.sub(addFeeAmount.fee ?? ZERO).toString()).mul(coefficient).toFixed(0),\n    );\n\n    let liquidity: BN;\n    if (sqrtPriceX64.lte(sqrtPriceX64A)) {\n      liquidity = inputA\n        ? LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, _amount, !add)\n        : new BN(0);\n    } else if (sqrtPriceX64.lte(sqrtPriceX64B)) {\n      const liquidity0 = LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64, sqrtPriceX64B, _amount, !add);\n      const liquidity1 = LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64, _amount);\n      liquidity = inputA ? liquidity0 : liquidity1;\n    } else {\n      liquidity = inputA\n        ? new BN(0)\n        : LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, _amount);\n    }\n\n    return PoolUtils.getAmountsFromLiquidity({\n      epochInfo,\n      poolInfo,\n      tickLower,\n      tickUpper,\n      liquidity,\n      slippage,\n      add,\n    });\n  }\n\n  static async getAmountsFromLiquidity({\n    epochInfo,\n    poolInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    slippage,\n    add,\n  }: {\n    epochInfo: EpochInfo;\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    slippage: number;\n    add: boolean;\n  }): Promise<ReturnTypeGetLiquidityAmountOut> {\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(tickUpper);\n\n    const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n    const amounts = LiquidityMath.getAmountsFromLiquidity(\n      SqrtPriceMath.priceToSqrtPriceX64(new Decimal(poolInfo.price), poolInfo.mintA.decimals, poolInfo.mintB.decimals),\n      sqrtPriceX64A,\n      sqrtPriceX64B,\n      liquidity,\n      add,\n    );\n    const [amountA, amountB] = [\n      getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, true),\n      getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, true),\n    ];\n    const [amountSlippageA, amountSlippageB] = [\n      getTransferAmountFeeV2(\n        amounts.amountA.muln(coefficientRe),\n        poolInfo.mintA.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n      getTransferAmountFeeV2(\n        amounts.amountB.muln(coefficientRe),\n        poolInfo.mintB.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n    ];\n\n    return {\n      liquidity,\n      amountA,\n      amountB,\n      amountSlippageA,\n      amountSlippageB,\n      expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n    };\n  }\n}\n\nexport function getLiquidityFromAmounts({\n  poolInfo,\n  tickLower,\n  tickUpper,\n  amountA,\n  amountB,\n  slippage,\n  add,\n  epochInfo,\n  amountHasFee,\n}: {\n  poolInfo: ApiV3PoolInfoConcentratedItem;\n  tickLower: number;\n  tickUpper: number;\n  amountA: BN;\n  amountB: BN;\n  slippage: number;\n  add: boolean;\n  epochInfo: EpochInfo;\n  amountHasFee: boolean;\n}): ReturnTypeGetLiquidityAmountOut {\n  const [_tickLower, _tickUpper, _amountA, _amountB] =\n    tickLower < tickUpper ? [tickLower, tickUpper, amountA, amountB] : [tickUpper, tickLower, amountB, amountA];\n  const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n    new Decimal(poolInfo.price),\n    poolInfo.mintA.decimals,\n    poolInfo.mintB.decimals,\n  );\n  const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(_tickLower);\n  const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(_tickUpper);\n\n  const [amountFeeA, amountFeeB] = [\n    getTransferAmountFeeV2(_amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, !amountHasFee),\n    getTransferAmountFeeV2(_amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, !amountHasFee),\n  ];\n\n  const liquidity = LiquidityMath.getLiquidityFromTokenAmounts(\n    sqrtPriceX64,\n    sqrtPriceX64A,\n    sqrtPriceX64B,\n    amountFeeA.amount.sub(amountFeeA.fee ?? ZERO),\n    amountFeeB.amount.sub(amountFeeB.fee ?? ZERO),\n  );\n\n  return LiquidityMath.getAmountsOutFromLiquidity({\n    poolInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    slippage,\n    add,\n    epochInfo,\n    amountAddFee: !amountHasFee,\n  });\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\n\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { TickArrayBitmapExtensionType } from \"../type\";\nimport { TickQuery } from \"./tickQuery\";\nimport { MIN_TICK, MAX_TICK } from \"./constants\";\nimport { SqrtPriceMath, TickMath } from \"./math\";\nimport { ClmmPoolInfo } from \"../type\";\nimport { ApiV3PoolInfoConcentratedItem } from \"@/api/type\";\n\nexport const TICK_ARRAY_SIZE = 60;\nexport const TICK_ARRAY_BITMAP_SIZE = 512;\n\nexport interface ReturnTypeGetTickPrice {\n  tick: number;\n  price: Decimal;\n  tickSqrtPriceX64: BN;\n}\n\nexport interface ReturnTypeGetPriceAndTick {\n  tick: number;\n  price: Decimal;\n}\n\nexport type Tick = {\n  tick: number;\n  liquidityNet: BN;\n  liquidityGross: BN;\n  feeGrowthOutsideX64A: BN;\n  feeGrowthOutsideX64B: BN;\n  rewardGrowthsOutsideX64: BN[];\n};\n\nexport type TickArray = {\n  address: PublicKey;\n  poolId: PublicKey;\n  startTickIndex: number;\n  ticks: Tick[];\n  initializedTickCount: number;\n};\n\nexport type TickState = {\n  tick: number;\n  liquidityNet: BN;\n  liquidityGross: BN;\n  feeGrowthOutsideX64A: BN;\n  feeGrowthOutsideX64B: BN;\n  tickCumulativeOutside: BN;\n  secondsPerLiquidityOutsideX64: BN;\n  secondsOutside: number;\n  rewardGrowthsOutside: BN[];\n};\n\nexport type TickArrayState = {\n  ammPool: PublicKey;\n  startTickIndex: number;\n  ticks: TickState[];\n  initializedTickCount: number;\n};\n\nexport class TickUtils {\n  public static getTickArrayAddressByTick(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickIndex: number,\n    tickSpacing: number,\n  ): PublicKey {\n    const startIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n    const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndex);\n    return tickArrayAddress;\n  }\n\n  public static getTickOffsetInArray(tickIndex: number, tickSpacing: number): number {\n    if (tickIndex % tickSpacing != 0) {\n      throw new Error(\"tickIndex % tickSpacing not equal 0\");\n    }\n    const startTickIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n    const offsetInArray = Math.floor((tickIndex - startTickIndex) / tickSpacing);\n    if (offsetInArray < 0 || offsetInArray >= TICK_ARRAY_SIZE) {\n      throw new Error(\"tick offset in array overflow\");\n    }\n    return offsetInArray;\n  }\n\n  public static getTickArrayBitIndex(tickIndex: number, tickSpacing: number): number {\n    const ticksInArray = TickQuery.tickCount(tickSpacing);\n\n    let startIndex: number = tickIndex / ticksInArray;\n    if (tickIndex < 0 && tickIndex % ticksInArray != 0) {\n      startIndex = Math.ceil(startIndex) - 1;\n    } else {\n      startIndex = Math.floor(startIndex);\n    }\n    return startIndex;\n  }\n\n  public static getTickArrayStartIndexByTick(tickIndex: number, tickSpacing: number): number {\n    return this.getTickArrayBitIndex(tickIndex, tickSpacing) * TickQuery.tickCount(tickSpacing);\n  }\n\n  public static getTickArrayOffsetInBitmapByTick(tick: number, tickSpacing: number): number {\n    const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n    const compressed = Math.floor(tick / multiplier) + 512;\n    return Math.abs(compressed);\n  }\n\n  public static checkTickArrayIsInitialized(\n    bitmap: BN,\n    tick: number,\n    tickSpacing: number,\n  ): {\n    isInitialized: boolean;\n    startIndex: number;\n  } {\n    const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n    const compressed = Math.floor(tick / multiplier) + 512;\n    const bitPos = Math.abs(compressed);\n    return {\n      isInitialized: bitmap.testn(bitPos),\n      startIndex: (bitPos - 512) * multiplier,\n    };\n  }\n\n  public static getNextTickArrayStartIndex(\n    lastTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): number {\n    return zeroForOne\n      ? lastTickArrayStartIndex - tickSpacing * TICK_ARRAY_SIZE\n      : lastTickArrayStartIndex + tickSpacing * TICK_ARRAY_SIZE;\n  }\n\n  public static mergeTickArrayBitmap(bns: BN[]): BN {\n    let b = new BN(0);\n    for (let i = 0; i < bns.length; i++) {\n      b = b.add(bns[i].shln(64 * i));\n    }\n    return b;\n  }\n\n  public static getInitializedTickArrayInRange(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    tickSpacing: number,\n    tickArrayStartIndex: number,\n    expectedCount: number,\n  ): number[] {\n    const tickArrayOffset = Math.floor(tickArrayStartIndex / (tickSpacing * TICK_ARRAY_SIZE));\n    return [\n      // find right of currenct offset\n      ...TickUtils.searchLowBitFromStart(\n        tickArrayBitmap,\n        exTickArrayBitmap,\n        tickArrayOffset - 1,\n        expectedCount,\n        tickSpacing,\n      ),\n\n      // find left of current offset\n      ...TickUtils.searchHightBitFromStart(\n        tickArrayBitmap,\n        exTickArrayBitmap,\n        tickArrayOffset,\n        expectedCount,\n        tickSpacing,\n      ),\n    ];\n  }\n\n  public static getAllInitializedTickArrayStartIndex(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    tickSpacing: number,\n  ): number[] {\n    // find from offset 0 to 1024\n    return TickUtils.searchHightBitFromStart(\n      tickArrayBitmap,\n      exTickArrayBitmap,\n      0,\n      TICK_ARRAY_BITMAP_SIZE,\n      tickSpacing,\n    );\n  }\n\n  public static getAllInitializedTickArrayInfo(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    tickSpacing: number,\n  ): {\n    tickArrayStartIndex: number;\n    tickArrayAddress: PublicKey;\n  }[] {\n    const result: {\n      tickArrayStartIndex: number;\n      tickArrayAddress: PublicKey;\n    }[] = [];\n    const allInitializedTickArrayIndex: number[] = TickUtils.getAllInitializedTickArrayStartIndex(\n      tickArrayBitmap,\n      exTickArrayBitmap,\n      tickSpacing,\n    );\n    for (const startIndex of allInitializedTickArrayIndex) {\n      const { publicKey: address } = getPdaTickArrayAddress(programId, poolId, startIndex);\n      result.push({\n        tickArrayStartIndex: startIndex,\n        tickArrayAddress: address,\n      });\n    }\n    return result;\n  }\n\n  public static getAllInitializedTickInTickArray(tickArray: TickArrayState): TickState[] {\n    return tickArray.ticks.filter((i) => i.liquidityGross.gtn(0));\n  }\n\n  public static searchLowBitFromStart(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    currentTickArrayBitStartIndex: number,\n    expectedCount: number,\n    tickSpacing: number,\n  ): number[] {\n    const tickArrayBitmaps = [\n      ...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),\n      tickArrayBitmap.slice(0, 8),\n      tickArrayBitmap.slice(8, 16),\n      ...exTickArrayBitmap.positiveTickArrayBitmap,\n    ].map((i) => TickUtils.mergeTickArrayBitmap(i));\n    const result: number[] = [];\n    while (currentTickArrayBitStartIndex >= -7680) {\n      const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);\n      const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;\n\n      if (tickArrayBitmaps[arrayIndex].testn(searchIndex)) result.push(currentTickArrayBitStartIndex);\n\n      currentTickArrayBitStartIndex--;\n      if (result.length === expectedCount) break;\n    }\n\n    const tickCount = TickQuery.tickCount(tickSpacing);\n    return result.map((i) => i * tickCount);\n  }\n\n  public static searchHightBitFromStart(\n    tickArrayBitmap: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n    currentTickArrayBitStartIndex: number,\n    expectedCount: number,\n    tickSpacing: number,\n  ): number[] {\n    const tickArrayBitmaps = [\n      ...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),\n      tickArrayBitmap.slice(0, 8),\n      tickArrayBitmap.slice(8, 16),\n      ...exTickArrayBitmap.positiveTickArrayBitmap,\n    ].map((i) => TickUtils.mergeTickArrayBitmap(i));\n    const result: number[] = [];\n    while (currentTickArrayBitStartIndex < 7680) {\n      const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);\n      const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;\n\n      if (tickArrayBitmaps[arrayIndex].testn(searchIndex)) result.push(currentTickArrayBitStartIndex);\n\n      currentTickArrayBitStartIndex++;\n      if (result.length === expectedCount) break;\n    }\n\n    const tickCount = TickQuery.tickCount(tickSpacing);\n    return result.map((i) => i * tickCount);\n  }\n\n  public static checkIsOutOfBoundary(tick: number): boolean {\n    return tick < MIN_TICK || tick > MAX_TICK;\n  }\n\n  public static nextInitTick(\n    tickArrayCurrent: TickArray,\n    currentTickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n    t: boolean,\n  ): Tick | null {\n    const currentTickArrayStartIndex = TickQuery.getArrayStartIndex(currentTickIndex, tickSpacing);\n    if (currentTickArrayStartIndex != tickArrayCurrent.startTickIndex) {\n      return null;\n    }\n    let offsetInArray = Math.floor((currentTickIndex - tickArrayCurrent.startTickIndex) / tickSpacing);\n\n    if (zeroForOne) {\n      while (offsetInArray >= 0) {\n        if (tickArrayCurrent.ticks[offsetInArray].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[offsetInArray];\n        }\n        offsetInArray = offsetInArray - 1;\n      }\n    } else {\n      if (!t) offsetInArray = offsetInArray + 1;\n      while (offsetInArray < TICK_ARRAY_SIZE) {\n        if (tickArrayCurrent.ticks[offsetInArray].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[offsetInArray];\n        }\n        offsetInArray = offsetInArray + 1;\n      }\n    }\n    return null;\n  }\n\n  public static firstInitializedTick(tickArrayCurrent: TickArray, zeroForOne: boolean): Tick {\n    if (zeroForOne) {\n      let i = TICK_ARRAY_SIZE - 1;\n      while (i >= 0) {\n        if (tickArrayCurrent.ticks[i].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[i];\n        }\n        i = i - 1;\n      }\n    } else {\n      let i = 0;\n      while (i < TICK_ARRAY_SIZE) {\n        if (tickArrayCurrent.ticks[i].liquidityGross.gtn(0)) {\n          return tickArrayCurrent.ticks[i];\n        }\n        i = i + 1;\n      }\n    }\n\n    throw Error(`firstInitializedTick check error: ${tickArrayCurrent} - ${zeroForOne}`);\n  }\n\n  public static _getTickPriceLegacy({\n    poolInfo,\n    tick,\n    baseIn,\n  }: {\n    poolInfo: ClmmPoolInfo;\n    tick: number;\n    baseIn: boolean;\n  }): ReturnTypeGetTickPrice {\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn\n      ? { tick, price: tickPrice, tickSqrtPriceX64 }\n      : { tick, price: new Decimal(1).div(tickPrice), tickSqrtPriceX64 };\n  }\n\n  public static _getPriceAndTickLegacy({\n    poolInfo,\n    price,\n    baseIn,\n  }: {\n    poolInfo: ClmmPoolInfo;\n    price: Decimal;\n    baseIn: boolean;\n  }): ReturnTypeGetPriceAndTick {\n    const _price = baseIn ? price : new Decimal(1).div(price);\n\n    const tick = TickMath.getTickWithPriceAndTickspacing(\n      _price,\n      poolInfo.ammConfig.tickSpacing,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn ? { tick, price: tickPrice } : { tick, price: new Decimal(1).div(tickPrice) };\n  }\n\n  public static getTickPrice({\n    poolInfo,\n    tick,\n    baseIn,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    tick: number;\n    baseIn: boolean;\n  }): ReturnTypeGetTickPrice {\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn\n      ? { tick, price: tickPrice, tickSqrtPriceX64 }\n      : { tick, price: new Decimal(1).div(tickPrice), tickSqrtPriceX64 };\n  }\n\n  public static getPriceAndTick({\n    poolInfo,\n    price,\n    baseIn,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    price: Decimal;\n    baseIn: boolean;\n  }): ReturnTypeGetPriceAndTick {\n    const _price = baseIn ? price : new Decimal(1).div(price);\n\n    const tick = TickMath.getTickWithPriceAndTickspacing(\n      _price,\n      poolInfo.config.tickSpacing,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);\n    const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(\n      tickSqrtPriceX64,\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n\n    return baseIn ? { tick, price: tickPrice } : { tick, price: new Decimal(1).div(tickPrice) };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN, { isBN } from \"bn.js\";\n\nimport {\n  bits,\n  blob,\n  Blob,\n  Layout,\n  offset as _offset,\n  seq as _seq,\n  Structure as _Structure,\n  u32 as _u32,\n  u8 as _u8,\n  UInt,\n  union as _union,\n  Union as _Union,\n} from \"./buffer-layout\";\n\nexport * from \"./buffer-layout\";\nexport { blob };\n\nexport class BNLayout<P extends string = \"\"> extends Layout<BN, P> {\n  blob: Layout<Buffer>;\n  signed: boolean;\n\n  constructor(span: number, signed: boolean, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends, but it desn't matter\n    super(span, property);\n    this.blob = blob(span);\n    this.signed = signed;\n  }\n\n  /** @override */\n  decode(b: Buffer, offset = 0): BN {\n    const num = new BN(this.blob.decode(b, offset), 10, \"le\");\n    if (this.signed) {\n      return num.fromTwos(this.span * 8).clone();\n    }\n    return num;\n  }\n\n  /** @override */\n  encode(src: BN, b: Buffer, offset = 0): number {\n    if (typeof src === \"number\") src = new BN(src); // src will pass a number accidently in union\n    if (this.signed) {\n      src = src.toTwos(this.span * 8);\n    }\n    return this.blob.encode(src.toArrayLike(Buffer, \"le\", this.span), b, offset);\n  }\n}\n\nexport class WideBits<P extends string = \"\"> extends Layout<Record<string, boolean>, P> {\n  _lower: any;\n  _upper: any;\n  // TODO: unknown\n  constructor(property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(8, property);\n    this._lower = bits(_u32(), false);\n    this._upper = bits(_u32(), false);\n  }\n\n  addBoolean(property: string): void {\n    if (this._lower.fields.length < 32) {\n      this._lower.addBoolean(property);\n    } else {\n      this._upper.addBoolean(property);\n    }\n  }\n\n  decode(b: Buffer, offset = 0): Record<string, boolean> {\n    const lowerDecoded = this._lower.decode(b, offset);\n    const upperDecoded = this._upper.decode(b, offset + this._lower.span);\n    return { ...lowerDecoded, ...upperDecoded };\n  }\n\n  encode(src: any /* TEMP */, b: Buffer, offset = 0): any {\n    return this._lower.encode(src, b, offset) + this._upper.encode(src, b, offset + this._lower.span);\n  }\n}\n\nexport function u8<P extends string = \"\">(property?: P): UInt<number, P> {\n  return new UInt(1, property);\n}\n\nexport function u32<P extends string = \"\">(property?: P): UInt<number, P> {\n  return new UInt(4, property);\n}\n\nexport function u64<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(8, false, property);\n}\n\nexport function u128<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(16, false, property);\n}\n\nexport function i8<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(1, true, property);\n}\n\nexport function i64<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(8, true, property);\n}\n\nexport function i128<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(16, true, property);\n}\n\nexport class WrappedLayout<T, U, P extends string = \"\"> extends Layout<U, P> {\n  layout: Layout<T>;\n  decoder: (data: T) => U;\n  encoder: (src: U) => T;\n\n  constructor(layout: Layout<T>, decoder: (data: T) => U, encoder: (src: U) => T, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(layout.span, property);\n    this.layout = layout;\n    this.decoder = decoder;\n    this.encoder = encoder;\n  }\n\n  decode(b: Buffer, offset?: number): U {\n    return this.decoder(this.layout.decode(b, offset));\n  }\n\n  encode(src: U, b: Buffer, offset?: number): number {\n    return this.layout.encode(this.encoder(src), b, offset);\n  }\n\n  getSpan(b: Buffer, offset?: number): number {\n    return this.layout.getSpan(b, offset);\n  }\n}\n\nexport function publicKey<P extends string = \"\">(property?: P): Layout<PublicKey, P> {\n  return new WrappedLayout(\n    blob(32),\n    (b: Buffer) => new PublicKey(b),\n    (key: PublicKey) => key.toBuffer(),\n    property,\n  );\n}\n\nexport class OptionLayout<T, P> extends Layout<T | null, P> {\n  layout: Layout<T>;\n  discriminator: Layout<number>;\n\n  constructor(layout: Layout<T>, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(-1, property);\n    this.layout = layout;\n    this.discriminator = _u8();\n  }\n\n  encode(src: T | null, b: Buffer, offset = 0): number {\n    if (src === null || src === undefined) {\n      return this.discriminator.encode(0, b, offset);\n    }\n    this.discriminator.encode(1, b, offset);\n    return this.layout.encode(src, b, offset + 1) + 1;\n  }\n\n  decode(b: Buffer, offset = 0): T | null {\n    const discriminator = this.discriminator.decode(b, offset);\n    if (discriminator === 0) {\n      return null;\n    } else if (discriminator === 1) {\n      return this.layout.decode(b, offset + 1);\n    }\n    throw new Error(\"Invalid option \" + this.property);\n  }\n\n  getSpan(b: Buffer, offset = 0): number {\n    const discriminator = this.discriminator.decode(b, offset);\n    if (discriminator === 0) {\n      return 1;\n    } else if (discriminator === 1) {\n      return this.layout.getSpan(b, offset + 1) + 1;\n    }\n    throw new Error(\"Invalid option \" + this.property);\n  }\n}\n\nexport function option<T, P extends string = \"\">(layout: Layout<T>, property?: P): Layout<T | null, P> {\n  return new OptionLayout<T, P>(layout, property);\n}\n\nexport function bool<P extends string = \"\">(property?: P): Layout<boolean, P> {\n  return new WrappedLayout(_u8(), decodeBool, encodeBool, property);\n}\n\nexport function decodeBool(value: number): boolean {\n  if (value === 0) {\n    return false;\n  } else if (value === 1) {\n    return true;\n  }\n  throw new Error(\"Invalid bool: \" + value);\n}\n\nexport function encodeBool(value: boolean): number {\n  return value ? 1 : 0;\n}\n\nexport function vec<T, P extends string = \"\">(elementLayout: Layout<T>, property?: P): Layout<T[], P> {\n  const length = _u32(\"length\");\n  const layout: Layout<{ values: T[] }> = struct([\n    length,\n    seq(elementLayout, _offset(length, -length.span), \"values\"),\n  ]) as any; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ values }) => values,\n    (values) => ({ values }),\n    property,\n  );\n}\n\nexport function tagged<T, P extends string = \"\">(tag: BN, layout: Layout<T>, property?: P): Layout<T, P> {\n  const wrappedLayout: Layout<{ tag: BN; data: T }> = struct([u64(\"tag\"), layout.replicate(\"data\")]) as any; // Something I don't know\n\n  function decodeTag({ tag: receivedTag, data }: { tag: BN; data: T }): T {\n    if (!receivedTag.eq(tag)) {\n      throw new Error(\"Invalid tag, expected: \" + tag.toString(\"hex\") + \", got: \" + receivedTag.toString(\"hex\"));\n    }\n    return data;\n  }\n\n  return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);\n}\n\nexport function vecU8<P extends string = \"\">(property?: P): Layout<Buffer, P> {\n  const length = _u32(\"length\");\n  const layout: Layout<{ data: Buffer }> = struct([length, blob(_offset(length, -length.span), \"data\")]) as any; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ data }) => data,\n    (data) => ({ data }),\n    property,\n  );\n}\n\nexport function str<P extends string = \"\">(property?: P): Layout<string, P> {\n  return new WrappedLayout(\n    vecU8(),\n    (data) => data.toString(\"utf-8\"),\n    (s) => Buffer.from(s, \"utf-8\"),\n    property,\n  );\n}\n\nexport interface EnumLayout<T, P extends string = \"\"> extends Layout<T, P> {\n  registry: Record<string, Layout<any>>;\n}\n\nexport function rustEnum<T, P extends string = \"\">(variants: Layout<any>[], property?: P): EnumLayout<T, P> {\n  const unionLayout = _union(_u8(), property);\n  variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));\n  return unionLayout as any; // ?why use UnionLayout? This must be a fault\n}\n\nexport function array<T, P extends string = \"\">(\n  elementLayout: Layout<T>,\n  length: number,\n  property?: P,\n): Layout<T[], P> {\n  const layout = struct([seq(elementLayout, length, \"values\")]) as any as Layout<{ values: T[] }>; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ values }) => values,\n    (values) => ({ values }),\n    property,\n  );\n}\n\nexport class Structure<T, P, D> extends _Structure<T, P, D> {\n  /** @override */\n  decode(b: Buffer, offset?: number): D {\n    return super.decode(b, offset);\n  }\n}\n\nexport function struct<T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n): T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n      Value,\n      P,\n      {\n        [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n          ? V\n          : any;\n      }\n    >\n  : any {\n  //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n  return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure<T extends Structure<any, any, any>> = T extends Structure<any, any, infer S>\n  ? S\n  : any;\nexport type GetStructureFromLayoutSchema<S> = Structure<any, any, S>;\n\nexport class Union<Schema> extends _Union<Schema> {\n  encodeInstruction(instruction: any): Buffer {\n    const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n    const b = Buffer.alloc(instructionMaxSpan);\n    return b.slice(0, this.encode(instruction, b));\n  }\n\n  decodeInstruction(instruction: any): Partial<Schema> {\n    return this.decode(instruction);\n  }\n}\nexport function union<UnionSchema extends { [key: string]: any } = any>(\n  discr: any,\n  defaultLayout?: any,\n  property?: string,\n): Union<UnionSchema> {\n  return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n  decode(b: Buffer, offset: number): Buffer {\n    const slice = super.decode(b, offset);\n    if (!slice.every((v) => v === 0)) {\n      throw new Error(\"nonzero padding bytes\");\n    }\n    return slice;\n  }\n}\n\nexport function zeros(length: number): Zeros {\n  return new Zeros(length);\n}\n\nexport function seq<T, P extends string = \"\", AnotherP extends string = \"\">(\n  elementLayout: Layout<T, P>,\n  count: number | BN | Layout<BN | number, P>,\n  property?: AnotherP,\n): Layout<T[], AnotherP> {\n  let parsedCount: number;\n  const superCount =\n    typeof count === \"number\"\n      ? count\n      : isBN(count)\n      ? count.toNumber()\n      : new Proxy(count as unknown as Layout<number> /* pretend to be Layout<number> */, {\n          get(target, property): any {\n            if (!parsedCount) {\n              // get count in targetLayout. note that count may be BN\n              const countProperty = Reflect.get(target, \"count\");\n\n              // let targetLayout's  property:count be a number\n              parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n              // record the count\n              Reflect.set(target, \"count\", parsedCount);\n            }\n            return Reflect.get(target, property);\n          },\n          set(target, property, value): any {\n            if (property === \"count\") {\n              parsedCount = value;\n            }\n            return Reflect.set(target, property, value);\n          },\n        });\n\n  // @ts-expect-error force type\n  return _seq(elementLayout, superCount, property);\n}\n","import {\n  bits as _bits,\n  BitStructure as _BitStructure,\n  blob as _blob,\n  Blob as _Blob,\n  cstr as _cstr,\n  f32 as _f32,\n  f32be as _f32be,\n  f64 as _f64,\n  f64be as _f64be,\n  greedy as _greedy,\n  Layout as _Layout,\n  ns64 as _ns64,\n  ns64be as _ns64be,\n  nu64 as _nu64,\n  nu64be as _nu64be,\n  offset as _offset,\n  s16 as _s16,\n  s16be as _s16be,\n  s24 as _s24,\n  s24be as _s24be,\n  s32 as _s32,\n  s32be as _s32be,\n  s40 as _s40,\n  s40be as _s40be,\n  s48 as _s48,\n  s48be as _s48be,\n  s8 as _s8,\n  seq as _seq,\n  struct as _struct,\n  Structure as _Structure,\n  u16 as _u16,\n  u16be as _u16be,\n  u24 as _u24,\n  u24be as _u24be,\n  u32 as _u32,\n  u32be as _u32be,\n  u40 as _u40,\n  u40be as _u40be,\n  u48 as _u48,\n  u48be as _u48be,\n  u8 as _u8,\n  UInt as _UInt,\n  union as _union,\n  Union as _Union,\n  unionLayoutDiscriminator as _unionLayoutDiscriminator,\n  utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout<T = any, P = \"\"> {\n  span: number;\n  property?: P;\n  decode(b: Buffer, offset?: number): T;\n  encode(src: T, b: Buffer, offset?: number): number;\n  getSpan(b: Buffer, offset?: number): number;\n  replicate<AP extends string>(name: AP): Layout<T, AP>;\n}\nexport interface LayoutConstructor {\n  new <T, P>(): Layout<T, P>; // for class extends syntex\n  new <T, P>(span?: T, property?: P): Layout<T, P>;\n  readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure<T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>\n  extends Layout<DecodeSchema, P> {\n  span: number;\n  decode(b: Buffer, offset?: number): DecodeSchema;\n  layoutFor<AP extends string>(property: AP): Layout<DecodeSchema[AP]>;\n  offsetOf<AP extends string>(property: AP): number;\n}\ninterface StructureConstructor {\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(): Structure<T, P, DecodeSchema>;\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(\n    fields: T,\n    property?: P,\n    decodePrefixes?: boolean,\n  ): Structure<T, P, DecodeSchema>;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union<UnionSchema extends { [key: string]: any } = any> extends Layout {\n  registry: object;\n  decode(b: Buffer, offset?: number): Partial<UnionSchema>;\n  addVariant(\n    variant: number,\n    layout: Structure<any, any, Partial<UnionSchema>> | Layout<any, keyof UnionSchema>,\n    property?: string,\n  ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n  new <UnionSchema extends { [key: string]: any } = any>(): Union<UnionSchema>;\n  new <UnionSchema extends { [key: string]: any } = any>(\n    discr: Layout<any, any>,\n    defaultLayout: Layout<any, any>,\n    property?: string,\n  ): Union<UnionSchema>;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure<T = unknown /* TEMP */, P = \"\"> = Layout<T, P>;\ninterface BitStructureConstructor {\n  new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt<T = any, P = \"\"> = Layout<T, P>;\ninterface UIntConstructor {\n  new <T, P>(span?: T, property?: P): UInt<T, P>;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob<P extends string = \"\"> = Layout<Buffer, P>;\ninterface BlobConstructor {\n  new (...params: ConstructorParameters<LayoutConstructor>): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as <P extends string = \"\">(elementSpan?: number, property?: P) => Layout<number, P>;\nexport const u8 = _u8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16 = _u16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24 = _u24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32 = _u32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40 = _u40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48 = _u48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64 = _nu64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16be = _u16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24be = _u24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32be = _u32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40be = _u40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48be = _u48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64be = _nu64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s8 = _s8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16 = _s16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24 = _s24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32 = _s32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40 = _s40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48 = _s48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64 = _ns64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16be = _s16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24be = _s24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32be = _s32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40be = _s40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48be = _s48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64be = _ns64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32 = _f32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32be = _f32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64 = _f64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64be = _f64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\n\nexport const struct = _struct as <T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n) => T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n      Value,\n      P,\n      {\n        [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n          ? V\n          : any;\n      }\n    >\n  : any;\n\nexport const seq = _seq as unknown as <T, P>(\n  elementLayout: Layout<T, string>,\n  count: number | Layout<number, string>,\n  property?: P,\n) => Layout<T[]>;\nexport const union = _union as <UnionSchema extends { [key: string]: any } = any>(\n  discr: Layout<any, any>,\n  defaultLayout?: any,\n  property?: string,\n) => Union<UnionSchema>;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as <P extends string = \"\">(\n  layout: Layout<any, P>,\n  property?: P,\n) => any;\nexport const blob = _blob as unknown as <P extends string = \"\">(\n  length: number | Layout<number, P>,\n  property?: P,\n) => Blob<P>;\nexport const cstr = _cstr as <P extends string = \"\">(property?: P) => Layout<string, P>;\nexport const utf8 = _utf8 as <P extends string = \"\">(maxSpan: number, property?: P) => Layout<string, P>;\nexport const bits = _bits as unknown as <T, P extends string = \"\">(\n  word: Layout<T>,\n  msb?: boolean,\n  property?: P,\n) => BitStructure<T, P>; // TODO: not quite sure\nexport const offset = _offset as unknown as <T, P extends string = \"\">(\n  layout: Layout<T, P>,\n  offset?: number,\n  property?: P,\n) => Layout<T, P>;\n\nexport type GetStructureSchema<T extends Structure> = T extends Structure<any, any, infer S> ? S : unknown;\n","import BN from \"bn.js\";\n\nimport { TickArrayBitmapExtensionType } from \"../type\";\n\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { TICK_ARRAY_BITMAP_SIZE, TICK_ARRAY_SIZE, TickUtils } from \"./tick\";\nimport { TickQuery } from \"./tickQuery\";\nimport { isZero, leadingZeros, leastSignificantBit, mostSignificantBit, trailingZeros } from \"./util\";\n\nexport const EXTENSION_TICKARRAY_BITMAP_SIZE = 14;\n\nexport class TickArrayBitmap {\n  public static maxTickInTickarrayBitmap(tickSpacing: number): number {\n    return tickSpacing * TICK_ARRAY_SIZE * TICK_ARRAY_BITMAP_SIZE;\n  }\n\n  public static getBitmapTickBoundary(\n    tickarrayStartIndex: number,\n    tickSpacing: number,\n  ): {\n    minValue: number;\n    maxValue: number;\n  } {\n    const ticksInOneBitmap = this.maxTickInTickarrayBitmap(tickSpacing);\n    let m = Math.floor(Math.abs(tickarrayStartIndex) / ticksInOneBitmap);\n    if (tickarrayStartIndex < 0 && Math.abs(tickarrayStartIndex) % ticksInOneBitmap != 0) m += 1;\n\n    const minValue = ticksInOneBitmap * m;\n\n    return tickarrayStartIndex < 0\n      ? { minValue: -minValue, maxValue: -minValue + ticksInOneBitmap }\n      : { minValue, maxValue: minValue + ticksInOneBitmap };\n  }\n\n  public static nextInitializedTickArrayStartIndex(\n    bitMap: BN,\n    lastTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): { isInit: boolean; tickIndex: number } {\n    if (!TickQuery.checkIsValidStartIndex(lastTickArrayStartIndex, tickSpacing))\n      throw Error(\"nextInitializedTickArrayStartIndex check error\");\n\n    const tickBoundary = this.maxTickInTickarrayBitmap(tickSpacing);\n    const nextTickArrayStartIndex = zeroForOne\n      ? lastTickArrayStartIndex - TickQuery.tickCount(tickSpacing)\n      : lastTickArrayStartIndex + TickQuery.tickCount(tickSpacing);\n\n    if (nextTickArrayStartIndex < -tickBoundary || nextTickArrayStartIndex >= tickBoundary) {\n      return { isInit: false, tickIndex: lastTickArrayStartIndex };\n    }\n\n    const multiplier = tickSpacing * TICK_ARRAY_SIZE;\n    let compressed = nextTickArrayStartIndex / multiplier + 512;\n\n    if (nextTickArrayStartIndex < 0 && nextTickArrayStartIndex % multiplier != 0) {\n      compressed--;\n    }\n\n    const bitPos = Math.abs(compressed);\n\n    if (zeroForOne) {\n      const offsetBitMap = bitMap.shln(1024 - bitPos - 1);\n      const nextBit = mostSignificantBit(1024, offsetBitMap);\n      if (nextBit !== null) {\n        const nextArrayStartIndex = (bitPos - nextBit - 512) * multiplier;\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        return { isInit: false, tickIndex: -tickBoundary };\n      }\n    } else {\n      const offsetBitMap = bitMap.shrn(bitPos);\n      const nextBit = leastSignificantBit(1024, offsetBitMap);\n      if (nextBit !== null) {\n        const nextArrayStartIndex = (bitPos + nextBit - 512) * multiplier;\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        return { isInit: false, tickIndex: tickBoundary - TickQuery.tickCount(tickSpacing) };\n      }\n    }\n  }\n}\n\nexport class TickArrayBitmapExtensionUtils {\n  public static getBitmapOffset(tickIndex: number, tickSpacing: number): number {\n    if (!TickQuery.checkIsValidStartIndex(tickIndex, tickSpacing)) {\n      throw new Error(\"No enough initialized tickArray\");\n    }\n    this.checkExtensionBoundary(tickIndex, tickSpacing);\n\n    const ticksInOneBitmap = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n    let offset = Math.floor(Math.abs(tickIndex) / ticksInOneBitmap) - 1;\n\n    if (tickIndex < 0 && Math.abs(tickIndex) % ticksInOneBitmap === 0) offset--;\n    return offset;\n  }\n\n  public static getBitmap(\n    tickIndex: number,\n    tickSpacing: number,\n    tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n  ): { offset: number; tickarrayBitmap: BN[] } {\n    const offset = this.getBitmapOffset(tickIndex, tickSpacing);\n    if (tickIndex < 0) {\n      return { offset, tickarrayBitmap: tickArrayBitmapExtension.negativeTickArrayBitmap[offset] };\n    } else {\n      return { offset, tickarrayBitmap: tickArrayBitmapExtension.positiveTickArrayBitmap[offset] };\n    }\n  }\n\n  public static checkExtensionBoundary(tickIndex: number, tickSpacing: number) {\n    const { positiveTickBoundary, negativeTickBoundary } = this.extensionTickBoundary(tickSpacing);\n\n    if (tickIndex >= negativeTickBoundary && tickIndex < positiveTickBoundary) {\n      throw Error(\"checkExtensionBoundary -> InvalidTickArrayBoundary\");\n    }\n  }\n\n  public static extensionTickBoundary(tickSpacing: number): {\n    positiveTickBoundary: number;\n    negativeTickBoundary: number;\n  } {\n    const positiveTickBoundary = TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n\n    const negativeTickBoundary = -positiveTickBoundary;\n\n    if (MAX_TICK <= positiveTickBoundary)\n      throw Error(`extensionTickBoundary check error: ${MAX_TICK}, ${positiveTickBoundary}`);\n    if (negativeTickBoundary <= MIN_TICK)\n      throw Error(`extensionTickBoundary check error: ${negativeTickBoundary}, ${MIN_TICK}`);\n\n    return { positiveTickBoundary, negativeTickBoundary };\n  }\n\n  public static checkTickArrayIsInit(\n    tickArrayStartIndex: number,\n    tickSpacing: number,\n    tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n  ): { isInitialized: boolean; startIndex: number } {\n    const { tickarrayBitmap } = this.getBitmap(tickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);\n\n    const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(tickArrayStartIndex, tickSpacing);\n\n    return {\n      isInitialized: TickUtils.mergeTickArrayBitmap(tickarrayBitmap).testn(tickArrayOffsetInBitmap),\n      startIndex: tickArrayStartIndex,\n    };\n  }\n\n  public static nextInitializedTickArrayFromOneBitmap(\n    lastTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n    tickArrayBitmapExtension: TickArrayBitmapExtensionType,\n  ): {\n    isInit: boolean;\n    tickIndex: number;\n  } {\n    const multiplier = TickQuery.tickCount(tickSpacing);\n    const nextTickArrayStartIndex = zeroForOne\n      ? lastTickArrayStartIndex - multiplier\n      : lastTickArrayStartIndex + multiplier;\n    const { tickarrayBitmap } = this.getBitmap(nextTickArrayStartIndex, tickSpacing, tickArrayBitmapExtension);\n\n    return this.nextInitializedTickArrayInBitmap(tickarrayBitmap, nextTickArrayStartIndex, tickSpacing, zeroForOne);\n  }\n\n  public static nextInitializedTickArrayInBitmap(\n    tickarrayBitmap: BN[],\n    nextTickArrayStartIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): {\n    isInit: boolean;\n    tickIndex: number;\n  } {\n    const { minValue: bitmapMinTickBoundary, maxValue: bitmapMaxTickBoundary } = TickArrayBitmap.getBitmapTickBoundary(\n      nextTickArrayStartIndex,\n      tickSpacing,\n    );\n\n    const tickArrayOffsetInBitmap = this.tickArrayOffsetInBitmap(nextTickArrayStartIndex, tickSpacing);\n    if (zeroForOne) {\n      // tick from upper to lower\n      // find from highter bits to lower bits\n      const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shln(\n        TICK_ARRAY_BITMAP_SIZE - 1 - tickArrayOffsetInBitmap,\n      );\n\n      const nextBit = isZero(512, offsetBitMap) ? null : leadingZeros(512, offsetBitMap);\n\n      if (nextBit !== null) {\n        const nextArrayStartIndex = nextTickArrayStartIndex - nextBit * TickQuery.tickCount(tickSpacing);\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        // not found til to the end\n        return { isInit: false, tickIndex: bitmapMinTickBoundary };\n      }\n    } else {\n      // tick from lower to upper\n      // find from lower bits to highter bits\n      const offsetBitMap = TickUtils.mergeTickArrayBitmap(tickarrayBitmap).shrn(tickArrayOffsetInBitmap);\n\n      const nextBit = isZero(512, offsetBitMap) ? null : trailingZeros(512, offsetBitMap);\n\n      if (nextBit !== null) {\n        const nextArrayStartIndex = nextTickArrayStartIndex + nextBit * TickQuery.tickCount(tickSpacing);\n        return { isInit: true, tickIndex: nextArrayStartIndex };\n      } else {\n        // not found til to the end\n        return { isInit: false, tickIndex: bitmapMaxTickBoundary - TickQuery.tickCount(tickSpacing) };\n      }\n    }\n  }\n\n  public static tickArrayOffsetInBitmap(tickArrayStartIndex: number, tickSpacing: number): number {\n    const m = Math.abs(tickArrayStartIndex) % TickArrayBitmap.maxTickInTickarrayBitmap(tickSpacing);\n    let tickArrayOffsetInBitmap = Math.floor(m / TickQuery.tickCount(tickSpacing));\n    if (tickArrayStartIndex < 0 && m != 0) {\n      tickArrayOffsetInBitmap = TICK_ARRAY_BITMAP_SIZE - tickArrayOffsetInBitmap;\n    }\n    return tickArrayOffsetInBitmap;\n  }\n}\n","import { blob, bool, i128, publicKey, s32, seq, struct, u128, u16, u32, u64, u8 } from \"@/marshmallow\";\n\nimport { TICK_ARRAY_SIZE } from \"./utils/tick\";\nimport { EXTENSION_TICKARRAY_BITMAP_SIZE } from \"./utils/tickarrayBitmap\";\n\nexport const AmmConfigLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  u16(\"index\"),\n  publicKey(\"\"),\n  u32(\"protocolFeeRate\"),\n  u32(\"tradeFeeRate\"),\n  u16(\"tickSpacing\"),\n  seq(u64(), 8, \"\"),\n]);\n\nexport const ObservationLayout = struct([\n  u32(\"blockTimestamp\"),\n  u128(\"sqrtPriceX64\"),\n  u128(\"cumulativeTimePriceX64\"),\n  seq(u128(), 1, \"\"),\n]);\nexport const ObservationInfoLayout = struct([\n  blob(8),\n  bool(\"initialized\"),\n  publicKey(\"poolId\"),\n  seq(ObservationLayout, 1000, \"observations\"),\n  seq(u128(), 5, \"\"),\n]);\n\nexport const RewardInfo = struct([\n  u8(\"rewardState\"),\n  u64(\"openTime\"),\n  u64(\"endTime\"),\n  u64(\"lastUpdateTime\"),\n  u128(\"emissionsPerSecondX64\"),\n  u64(\"rewardTotalEmissioned\"),\n  u64(\"rewardClaimed\"),\n  publicKey(\"tokenMint\"),\n  publicKey(\"tokenVault\"),\n  publicKey(\"creator\"),\n  u128(\"rewardGrowthGlobalX64\"),\n]);\nexport const PoolInfoLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  publicKey(\"ammConfig\"),\n  publicKey(\"creator\"),\n  publicKey(\"mintA\"),\n  publicKey(\"mintB\"),\n  publicKey(\"vaultA\"),\n  publicKey(\"vaultB\"),\n  publicKey(\"observationId\"),\n  u8(\"mintDecimalsA\"),\n  u8(\"mintDecimalsB\"),\n  u16(\"tickSpacing\"),\n  u128(\"liquidity\"),\n  u128(\"sqrtPriceX64\"),\n  s32(\"tickCurrent\"),\n  u16(\"observationIndex\"),\n  u16(\"observationUpdateDuration\"),\n  u128(\"feeGrowthGlobalX64A\"),\n  u128(\"feeGrowthGlobalX64B\"),\n  u64(\"protocolFeesTokenA\"),\n  u64(\"protocolFeesTokenB\"),\n\n  u128(\"swapInAmountTokenA\"),\n  u128(\"swapOutAmountTokenB\"),\n  u128(\"swapInAmountTokenB\"),\n  u128(\"swapOutAmountTokenA\"),\n\n  u8(\"status\"),\n\n  seq(u8(), 7, \"\"),\n\n  seq(RewardInfo, 3, \"rewardInfos\"),\n  seq(u64(), 16, \"tickArrayBitmap\"),\n\n  u64(\"totalFeesTokenA\"),\n  u64(\"totalFeesClaimedTokenA\"),\n  u64(\"totalFeesTokenB\"),\n  u64(\"totalFeesClaimedTokenB\"),\n\n  u64(\"fundFeesTokenA\"),\n  u64(\"fundFeesTokenB\"),\n\n  u64(\"startTime\"),\n\n  seq(u64(), 15 * 4 - 3, \"padding\"),\n]);\n\nexport const PositionRewardInfoLayout = struct([u128(\"growthInsideLastX64\"), u64(\"rewardAmountOwed\")]);\nexport const PositionInfoLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  publicKey(\"nftMint\"),\n  publicKey(\"poolId\"),\n\n  s32(\"tickLower\"),\n  s32(\"tickUpper\"),\n  u128(\"liquidity\"),\n  u128(\"feeGrowthInsideLastX64A\"),\n  u128(\"feeGrowthInsideLastX64B\"),\n  u64(\"tokenFeesOwedA\"),\n  u64(\"tokenFeesOwedB\"),\n\n  seq(PositionRewardInfoLayout, 3, \"rewardInfos\"),\n\n  seq(u64(), 8, \"\"),\n]);\n\nexport type ClmmPositionLayout = ReturnType<typeof PositionInfoLayout.decode>;\n\nexport const ProtocolPositionLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  publicKey(\"poolId\"),\n  s32(\"tickLowerIndex\"),\n  s32(\"tickUpperIndex\"),\n  u128(\"liquidity\"),\n  u128(\"feeGrowthInsideLastX64A\"),\n  u128(\"feeGrowthInsideLastX64B\"),\n  u64(\"tokenFeesOwedA\"),\n  u64(\"tokenFeesOwedB\"),\n  seq(u128(), 3, \"rewardGrowthInside\"),\n\n  seq(u64(), 8, \"\"),\n]);\n\nexport const TickLayout = struct([\n  s32(\"tick\"),\n  i128(\"liquidityNet\"),\n  u128(\"liquidityGross\"),\n  u128(\"feeGrowthOutsideX64A\"),\n  u128(\"feeGrowthOutsideX64B\"),\n  seq(u128(), 3, \"rewardGrowthsOutsideX64\"),\n\n  seq(u32(), 13, \"\"),\n]);\n\nexport const TickArrayLayout = struct([\n  blob(8),\n  publicKey(\"poolId\"),\n  s32(\"startTickIndex\"),\n  seq(TickLayout, TICK_ARRAY_SIZE, \"ticks\"),\n  u8(\"initializedTickCount\"),\n\n  seq(u8(), 115, \"\"),\n]);\n\nexport const OperationLayout = struct([blob(329), seq(publicKey(), 100, \"whitelistMints\")]);\n\nexport const TickArrayBitmapExtensionLayout = struct([\n  blob(8),\n  publicKey(\"poolId\"),\n  seq(seq(u64(), 8), EXTENSION_TICKARRAY_BITMAP_SIZE, \"positiveTickArrayBitmap\"),\n  seq(seq(u64(), 8), EXTENSION_TICKARRAY_BITMAP_SIZE, \"negativeTickArrayBitmap\"),\n]);\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { getMultipleAccountsInfo } from \"@/common\";\nimport { TickArrayLayout } from \"../layout\";\n\nimport { MAX_TICK, MIN_TICK } from \"./constants\";\nimport { getPdaTickArrayAddress } from \"./pda\";\nimport { Tick, TICK_ARRAY_SIZE, TickArray, TickUtils } from \"./tick\";\nimport { TickArrayBitmapExtensionType } from \"../type\";\n\nexport const FETCH_TICKARRAY_COUNT = 15;\n\nexport declare type PoolVars = {\n  key: PublicKey;\n  tokenA: PublicKey;\n  tokenB: PublicKey;\n  fee: number;\n};\n\nexport class TickQuery {\n  public static async getTickArrays(\n    connection: Connection,\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickCurrent: number,\n    tickSpacing: number,\n    tickArrayBitmapArray: BN[],\n    exTickArrayBitmap: TickArrayBitmapExtensionType,\n  ): Promise<{ [key: string]: TickArray }> {\n    const tickArraysToFetch: PublicKey[] = [];\n    const currentTickArrayStartIndex = TickUtils.getTickArrayStartIndexByTick(tickCurrent, tickSpacing);\n\n    const startIndexArray = TickUtils.getInitializedTickArrayInRange(\n      tickArrayBitmapArray,\n      exTickArrayBitmap,\n      tickSpacing,\n      currentTickArrayStartIndex,\n      Math.floor(FETCH_TICKARRAY_COUNT / 2),\n    );\n    for (let i = 0; i < startIndexArray.length; i++) {\n      const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndexArray[i]);\n      tickArraysToFetch.push(tickArrayAddress);\n    }\n\n    const fetchedTickArrays = (await getMultipleAccountsInfo(connection, tickArraysToFetch)).map((i) =>\n      i !== null ? TickArrayLayout.decode(i.data) : null,\n    );\n\n    const tickArrayCache: { [key: string]: TickArray } = {};\n    for (let i = 0; i < tickArraysToFetch.length; i++) {\n      const _info = fetchedTickArrays[i];\n      if (_info === null) continue;\n\n      tickArrayCache[_info.startTickIndex] = {\n        ..._info,\n        address: tickArraysToFetch[i],\n      };\n    }\n    return tickArrayCache;\n  }\n\n  public static nextInitializedTick(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayCache: { [key: string]: TickArray },\n    tickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): {\n    nextTick: Tick;\n    tickArrayAddress: PublicKey | undefined;\n    tickArrayStartTickIndex: number;\n  } {\n    let {\n      initializedTick: nextTick,\n      tickArrayAddress,\n      tickArrayStartTickIndex,\n    } = this.nextInitializedTickInOneArray(programId, poolId, tickArrayCache, tickIndex, tickSpacing, zeroForOne);\n    while (nextTick == undefined || nextTick.liquidityGross.lten(0)) {\n      tickArrayStartTickIndex = TickUtils.getNextTickArrayStartIndex(tickArrayStartTickIndex, tickSpacing, zeroForOne);\n      if (this.checkIsValidStartIndex(tickArrayStartTickIndex, tickSpacing)) {\n        throw new Error(\"No enough initialized tickArray\");\n      }\n      const cachedTickArray = tickArrayCache[tickArrayStartTickIndex];\n\n      if (cachedTickArray === undefined) continue;\n\n      const {\n        nextTick: _nextTick,\n        tickArrayAddress: _tickArrayAddress,\n        tickArrayStartTickIndex: _tickArrayStartTickIndex,\n      } = this.firstInitializedTickInOneArray(programId, poolId, cachedTickArray, zeroForOne);\n      [nextTick, tickArrayAddress, tickArrayStartTickIndex] = [_nextTick, _tickArrayAddress, _tickArrayStartTickIndex];\n    }\n    if (nextTick == undefined) {\n      throw new Error(\"No invaild tickArray cache\");\n    }\n    return { nextTick, tickArrayAddress, tickArrayStartTickIndex };\n  }\n\n  public static nextInitializedTickArray(\n    tickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n    tickArrayBitmap: BN[],\n    exBitmapInfo: TickArrayBitmapExtensionType,\n  ): {\n    isExist: boolean;\n    nextStartIndex: number;\n  } {\n    const currentOffset = Math.floor(tickIndex / TickQuery.tickCount(tickSpacing));\n    const result: number[] = zeroForOne\n      ? TickUtils.searchLowBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset - 1, 1, tickSpacing)\n      : TickUtils.searchHightBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset + 1, 1, tickSpacing);\n\n    return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 };\n  }\n\n  public static firstInitializedTickInOneArray(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArray: TickArray,\n    zeroForOne: boolean,\n  ): {\n    nextTick: Tick | undefined;\n    tickArrayAddress: PublicKey;\n    tickArrayStartTickIndex: number;\n  } {\n    let nextInitializedTick: Tick | undefined = undefined;\n    if (zeroForOne) {\n      let i = TICK_ARRAY_SIZE - 1;\n      while (i >= 0) {\n        const tickInArray = tickArray.ticks[i];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        i = i - 1;\n      }\n    } else {\n      let i = 0;\n      while (i < TICK_ARRAY_SIZE) {\n        const tickInArray = tickArray.ticks[i];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        i = i + 1;\n      }\n    }\n    const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, tickArray.startTickIndex);\n    return { nextTick: nextInitializedTick, tickArrayAddress, tickArrayStartTickIndex: tickArray.startTickIndex };\n  }\n\n  public static nextInitializedTickInOneArray(\n    programId: PublicKey,\n    poolId: PublicKey,\n    tickArrayCache: { [key: string]: TickArray },\n    tickIndex: number,\n    tickSpacing: number,\n    zeroForOne: boolean,\n  ): {\n    initializedTick: Tick | undefined;\n    tickArrayAddress: PublicKey | undefined;\n    tickArrayStartTickIndex: number;\n  } {\n    const startIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);\n    let tickPositionInArray = Math.floor((tickIndex - startIndex) / tickSpacing);\n    const cachedTickArray = tickArrayCache[startIndex];\n    if (cachedTickArray == undefined) {\n      return {\n        initializedTick: undefined,\n        tickArrayAddress: undefined,\n        tickArrayStartTickIndex: startIndex,\n      };\n    }\n    let nextInitializedTick: Tick | undefined = undefined;\n    if (zeroForOne) {\n      while (tickPositionInArray >= 0) {\n        const tickInArray = cachedTickArray.ticks[tickPositionInArray];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        tickPositionInArray = tickPositionInArray - 1;\n      }\n    } else {\n      tickPositionInArray = tickPositionInArray + 1;\n      while (tickPositionInArray < TICK_ARRAY_SIZE) {\n        const tickInArray = cachedTickArray.ticks[tickPositionInArray];\n        if (tickInArray.liquidityGross.gtn(0)) {\n          nextInitializedTick = tickInArray;\n          break;\n        }\n        tickPositionInArray = tickPositionInArray + 1;\n      }\n    }\n    const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndex);\n    return {\n      initializedTick: nextInitializedTick,\n      tickArrayAddress,\n      tickArrayStartTickIndex: cachedTickArray.startTickIndex,\n    };\n  }\n\n  public static getArrayStartIndex(tickIndex: number, tickSpacing: number): number {\n    const ticksInArray = this.tickCount(tickSpacing);\n    const start = Math.floor(tickIndex / ticksInArray);\n\n    return start * ticksInArray;\n  }\n\n  public static checkIsValidStartIndex(tickIndex: number, tickSpacing: number): boolean {\n    if (TickUtils.checkIsOutOfBoundary(tickIndex)) {\n      if (tickIndex > MAX_TICK) {\n        return false;\n      }\n      const minStartIndex = TickUtils.getTickArrayStartIndexByTick(MIN_TICK, tickSpacing);\n      return tickIndex == minStartIndex;\n    }\n    return tickIndex % this.tickCount(tickSpacing) == 0;\n  }\n\n  public static tickCount(tickSpacing: number): number {\n    return TICK_ARRAY_SIZE * tickSpacing;\n  }\n}\n","import BN from \"bn.js\";\n\nimport { ClmmPoolInfo, ClmmPoolPersonalPosition, ClmmPoolRewardInfo, SDKParsedConcentratedInfo } from \"../type\";\nimport { minExpirationTime, getTransferAmountFeeV2 } from \"@/common\";\nimport { Q64 } from \"./constants\";\nimport { MathUtil, SqrtPriceMath, LiquidityMath } from \"./math\";\nimport { Tick } from \"./tick\";\nimport { GetAmountParams, ReturnTypeGetLiquidityAmountOut } from \"../type\";\nimport Decimal from \"decimal.js\";\nimport { ClmmPositionLayout } from \"../layout\";\n\nexport class PositionUtils {\n  static getfeeGrowthInside(\n    poolState: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64A\" | \"feeGrowthGlobalX64B\">,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): { feeGrowthInsideX64A: BN; feeGrowthInsideBX64: BN } {\n    let feeGrowthBelowX64A = new BN(0);\n    let feeGrowthBelowX64B = new BN(0);\n    if (poolState.tickCurrent >= tickLowerState.tick) {\n      feeGrowthBelowX64A = tickLowerState.feeGrowthOutsideX64A;\n      feeGrowthBelowX64B = tickLowerState.feeGrowthOutsideX64B;\n    } else {\n      feeGrowthBelowX64A = poolState.feeGrowthGlobalX64A.sub(tickLowerState.feeGrowthOutsideX64A);\n      feeGrowthBelowX64B = poolState.feeGrowthGlobalX64B.sub(tickLowerState.feeGrowthOutsideX64B);\n    }\n\n    let feeGrowthAboveX64A = new BN(0);\n    let feeGrowthAboveX64B = new BN(0);\n    if (poolState.tickCurrent < tickUpperState.tick) {\n      feeGrowthAboveX64A = tickUpperState.feeGrowthOutsideX64A;\n      feeGrowthAboveX64B = tickUpperState.feeGrowthOutsideX64B;\n    } else {\n      feeGrowthAboveX64A = poolState.feeGrowthGlobalX64A.sub(tickUpperState.feeGrowthOutsideX64A);\n      feeGrowthAboveX64B = poolState.feeGrowthGlobalX64B.sub(tickUpperState.feeGrowthOutsideX64B);\n    }\n\n    const feeGrowthInsideX64A = MathUtil.wrappingSubU128(\n      MathUtil.wrappingSubU128(poolState.feeGrowthGlobalX64A, feeGrowthBelowX64A),\n      feeGrowthAboveX64A,\n    );\n    const feeGrowthInsideBX64 = MathUtil.wrappingSubU128(\n      MathUtil.wrappingSubU128(poolState.feeGrowthGlobalX64B, feeGrowthBelowX64B),\n      feeGrowthAboveX64B,\n    );\n    return { feeGrowthInsideX64A, feeGrowthInsideBX64 };\n  }\n\n  static GetPositionFees(\n    ammPool: ClmmPoolInfo,\n    positionState: ClmmPoolPersonalPosition,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): { tokenFeeAmountA: BN; tokenFeeAmountB: BN } {\n    const { feeGrowthInsideX64A, feeGrowthInsideBX64 } = this.getfeeGrowthInside(\n      ammPool,\n      tickLowerState,\n      tickUpperState,\n    );\n\n    const feeGrowthdeltaA = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideX64A, positionState.feeGrowthInsideLastX64A),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountA = positionState.tokenFeesOwedA.add(feeGrowthdeltaA);\n\n    const feeGrowthdelta1 = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideBX64, positionState.feeGrowthInsideLastX64B),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountB = positionState.tokenFeesOwedB.add(feeGrowthdelta1);\n\n    return { tokenFeeAmountA, tokenFeeAmountB };\n  }\n\n  static GetPositionFeesV2(\n    ammPool: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64A\" | \"feeGrowthGlobalX64B\">,\n    positionState: ClmmPositionLayout,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): { tokenFeeAmountA: BN; tokenFeeAmountB: BN } {\n    const { feeGrowthInsideX64A, feeGrowthInsideBX64 } = this.getfeeGrowthInside(\n      ammPool,\n      tickLowerState,\n      tickUpperState,\n    );\n\n    const feeGrowthdeltaA = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideX64A, positionState.feeGrowthInsideLastX64A),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountA = positionState.tokenFeesOwedA.add(feeGrowthdeltaA);\n\n    const feeGrowthdelta1 = MathUtil.mulDivFloor(\n      MathUtil.wrappingSubU128(feeGrowthInsideBX64, positionState.feeGrowthInsideLastX64B),\n      positionState.liquidity,\n      Q64,\n    );\n    const tokenFeeAmountB = positionState.tokenFeesOwedB.add(feeGrowthdelta1);\n\n    return { tokenFeeAmountA, tokenFeeAmountB };\n  }\n\n  static GetPositionRewardsV2(\n    ammPool: Pick<ClmmPoolInfo, \"tickCurrent\" | \"feeGrowthGlobalX64B\"> & {\n      rewardInfos: { rewardGrowthGlobalX64: BN }[];\n    },\n    positionState: ClmmPositionLayout,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): BN[] {\n    const rewards: BN[] = [];\n\n    const rewardGrowthsInside = this.getRewardGrowthInsideV2(\n      ammPool.tickCurrent,\n      tickLowerState,\n      tickUpperState,\n      ammPool.rewardInfos,\n    );\n    for (let i = 0; i < rewardGrowthsInside.length; i++) {\n      const rewardGrowthInside = rewardGrowthsInside[i];\n      const currRewardInfo = positionState.rewardInfos[i];\n\n      const rewardGrowthDelta = MathUtil.wrappingSubU128(rewardGrowthInside, currRewardInfo.growthInsideLastX64);\n      const amountOwedDelta = MathUtil.mulDivFloor(rewardGrowthDelta, positionState.liquidity, Q64);\n      const rewardAmountOwed = currRewardInfo.rewardAmountOwed.add(amountOwedDelta);\n      rewards.push(rewardAmountOwed);\n    }\n    return rewards;\n  }\n\n  static GetPositionRewards(\n    ammPool: ClmmPoolInfo,\n    positionState: ClmmPoolPersonalPosition,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n  ): BN[] {\n    const rewards: BN[] = [];\n\n    const rewardGrowthsInside = this.getRewardGrowthInside(\n      ammPool.tickCurrent,\n      tickLowerState,\n      tickUpperState,\n      ammPool.rewardInfos,\n    );\n    for (let i = 0; i < rewardGrowthsInside.length; i++) {\n      const rewardGrowthInside = rewardGrowthsInside[i];\n      const currRewardInfo = positionState.rewardInfos[i];\n\n      const rewardGrowthDelta = MathUtil.wrappingSubU128(rewardGrowthInside, currRewardInfo.growthInsideLastX64);\n      const amountOwedDelta = MathUtil.mulDivFloor(rewardGrowthDelta, positionState.liquidity, Q64);\n      const rewardAmountOwed = currRewardInfo.rewardAmountOwed.add(amountOwedDelta);\n      rewards.push(rewardAmountOwed);\n    }\n    return rewards;\n  }\n\n  static getRewardGrowthInside(\n    tickCurrentIndex: number,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n    rewardInfos: ClmmPoolRewardInfo[],\n  ): BN[] {\n    const rewardGrowthsInside: BN[] = [];\n    for (let i = 0; i < rewardInfos.length; i++) {\n      let rewardGrowthsBelow = new BN(0);\n      if (tickLowerState.liquidityGross.eqn(0)) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64;\n      } else if (tickCurrentIndex < tickLowerState.tick) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64.sub(tickLowerState.rewardGrowthsOutsideX64[i]);\n      } else {\n        rewardGrowthsBelow = tickLowerState.rewardGrowthsOutsideX64[i];\n      }\n\n      let rewardGrowthsAbove = new BN(0);\n      if (tickUpperState.liquidityGross.eqn(0)) {\n        //\n      } else if (tickCurrentIndex < tickUpperState.tick) {\n        rewardGrowthsAbove = tickUpperState.rewardGrowthsOutsideX64[i];\n      } else {\n        rewardGrowthsAbove = rewardInfos[i].rewardGrowthGlobalX64.sub(tickUpperState.rewardGrowthsOutsideX64[i]);\n      }\n\n      rewardGrowthsInside.push(\n        MathUtil.wrappingSubU128(\n          MathUtil.wrappingSubU128(rewardInfos[i].rewardGrowthGlobalX64, rewardGrowthsBelow),\n          rewardGrowthsAbove,\n        ),\n      );\n    }\n\n    return rewardGrowthsInside;\n  }\n\n  static getRewardGrowthInsideV2(\n    tickCurrentIndex: number,\n    tickLowerState: Tick,\n    tickUpperState: Tick,\n    rewardInfos: Pick<ClmmPoolRewardInfo, \"rewardGrowthGlobalX64\">[],\n  ): BN[] {\n    const rewardGrowthsInside: BN[] = [];\n    for (let i = 0; i < rewardInfos.length; i++) {\n      let rewardGrowthsBelow = new BN(0);\n      if (tickLowerState.liquidityGross.eqn(0)) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64;\n      } else if (tickCurrentIndex < tickLowerState.tick) {\n        rewardGrowthsBelow = rewardInfos[i].rewardGrowthGlobalX64.sub(tickLowerState.rewardGrowthsOutsideX64[i]);\n      } else {\n        rewardGrowthsBelow = tickLowerState.rewardGrowthsOutsideX64[i];\n      }\n\n      let rewardGrowthsAbove = new BN(0);\n      if (tickUpperState.liquidityGross.eqn(0)) {\n        //\n      } else if (tickCurrentIndex < tickUpperState.tick) {\n        rewardGrowthsAbove = tickUpperState.rewardGrowthsOutsideX64[i];\n      } else {\n        rewardGrowthsAbove = rewardInfos[i].rewardGrowthGlobalX64.sub(tickUpperState.rewardGrowthsOutsideX64[i]);\n      }\n\n      rewardGrowthsInside.push(\n        MathUtil.wrappingSubU128(\n          MathUtil.wrappingSubU128(rewardInfos[i].rewardGrowthGlobalX64, rewardGrowthsBelow),\n          rewardGrowthsAbove,\n        ),\n      );\n    }\n\n    return rewardGrowthsInside;\n  }\n\n  static getAmountsFromLiquidity({\n    poolInfo,\n    ownerPosition,\n    liquidity,\n    slippage,\n    add,\n    epochInfo,\n  }: GetAmountParams): ReturnTypeGetLiquidityAmountOut {\n    const sqrtPriceX64 = SqrtPriceMath.priceToSqrtPriceX64(\n      new Decimal(poolInfo.price),\n      poolInfo.mintA.decimals,\n      poolInfo.mintB.decimals,\n    );\n    const sqrtPriceX64A = SqrtPriceMath.getSqrtPriceX64FromTick(ownerPosition.tickLower);\n    const sqrtPriceX64B = SqrtPriceMath.getSqrtPriceX64FromTick(ownerPosition.tickUpper);\n\n    const coefficientRe = add ? 1 + slippage : 1 - slippage;\n\n    const amounts = LiquidityMath.getAmountsFromLiquidity(sqrtPriceX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, add);\n\n    const [amountA, amountB] = [\n      getTransferAmountFeeV2(amounts.amountA, poolInfo.mintA.extensions?.feeConfig, epochInfo, true),\n      getTransferAmountFeeV2(amounts.amountB, poolInfo.mintB.extensions?.feeConfig, epochInfo, true),\n    ];\n    const [amountSlippageA, amountSlippageB] = [\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountA.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintA.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n      getTransferAmountFeeV2(\n        new BN(new Decimal(amounts.amountB.toString()).mul(coefficientRe).toFixed(0)),\n        poolInfo.mintB.extensions?.feeConfig,\n        epochInfo,\n        true,\n      ),\n    ];\n\n    return {\n      liquidity,\n      amountA,\n      amountB,\n      amountSlippageA,\n      amountSlippageB,\n      expirationTime: minExpirationTime(amountA.expirationTime, amountB.expirationTime),\n    };\n  }\n}\n","import { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport {\n  PublicKey,\n  TransactionInstruction,\n  ComputeBudgetProgram,\n  SystemProgram,\n  Connection,\n  Keypair,\n  Signer,\n} from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport {\n  createLogger,\n  parseBigNumberish,\n  RENT_PROGRAM_ID,\n  METADATA_PROGRAM_ID,\n  InstructionType,\n  getATAAddress,\n  MEMO_PROGRAM_ID,\n} from \"@/common\";\nimport { bool, s32, struct, u128, u64, u8 } from \"@/marshmallow\";\nimport {\n  ReturnTypeMakeInstructions,\n  ClmmPoolPersonalPosition,\n  OpenPositionFromLiquidityExtInfo,\n  ManipulateLiquidityExtInfo,\n  ClosePositionExtInfo,\n  InitRewardExtInfo,\n  OpenPositionFromBaseExtInfo,\n} from \"./type\";\nimport { ClmmPositionLayout, ObservationInfoLayout } from \"./layout\";\nimport {\n  getPdaPoolId,\n  getPdaPoolVaultId,\n  getPdaTickArrayAddress,\n  getPdaMetadataKey,\n  getPdaProtocolPositionAddress,\n  getPdaPersonalPositionAddress,\n  getPdaOperationAccount,\n  getPdaExBitmapAccount,\n  getPdaPoolRewardVaulId,\n} from \"./utils/pda\";\nimport { TickUtils } from \"./utils/tick\";\nimport { PoolUtils } from \"./utils/pool\";\nimport { generatePubKey } from \"../account/util\";\nimport { ApiV3Token, ApiV3PoolInfoConcentratedItem, ClmmKeys } from \"@/api/type\";\n\nconst logger = createLogger(\"Raydium_Clmm\");\n\nconst anchorDataBuf = {\n  createPool: [233, 146, 209, 142, 207, 104, 64, 188],\n  initReward: [95, 135, 192, 196, 242, 129, 230, 68],\n  setRewardEmissions: [112, 52, 167, 75, 32, 201, 211, 137],\n  openPosition: [77, 184, 74, 214, 112, 86, 241, 199],\n  closePosition: [123, 134, 81, 0, 49, 68, 98, 98],\n  increaseLiquidity: [133, 29, 89, 223, 69, 238, 176, 10],\n  decreaseLiquidity: [58, 127, 188, 62, 79, 82, 196, 96],\n  swap: [43, 4, 237, 11, 26, 201, 30, 98], // [248, 198, 158, 145, 225, 117, 135, 200],\n  collectReward: [18, 237, 166, 197, 34, 16, 213, 144],\n};\n\ninterface CreatePoolInstruction {\n  connection: Connection;\n  programId: PublicKey;\n  owner: PublicKey;\n  mintA: ApiV3Token;\n  mintB: ApiV3Token;\n  ammConfigId: PublicKey;\n  initialPriceX64: BN;\n  startTime: BN;\n  forerunCreate?: boolean;\n}\n\nexport class ClmmInstrument {\n  static createPoolInstruction(\n    programId: PublicKey,\n    poolId: PublicKey,\n    poolCreator: PublicKey,\n    ammConfigId: PublicKey,\n    observationId: PublicKey,\n    mintA: PublicKey,\n    mintVaultA: PublicKey,\n    mintProgramIdA: PublicKey,\n    mintB: PublicKey,\n    mintVaultB: PublicKey,\n    mintProgramIdB: PublicKey,\n    exTickArrayBitmap: PublicKey,\n    sqrtPriceX64: BN,\n    startTime: BN,\n  ): TransactionInstruction {\n    const dataLayout = struct([u128(\"sqrtPriceX64\"), u64(\"startTime\")]);\n\n    const keys = [\n      { pubkey: poolCreator, isSigner: true, isWritable: true },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: mintA, isSigner: false, isWritable: false },\n      { pubkey: mintB, isSigner: false, isWritable: false },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n      { pubkey: observationId, isSigner: false, isWritable: false },\n      { pubkey: exTickArrayBitmap, isSigner: false, isWritable: true },\n      { pubkey: mintProgramIdA, isSigner: false, isWritable: false },\n      { pubkey: mintProgramIdB, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        sqrtPriceX64,\n        startTime,\n      },\n      data,\n    );\n    const aData = Buffer.from([...anchorDataBuf.createPool, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static async createPoolInstructions(props: CreatePoolInstruction): Promise<\n    ReturnTypeMakeInstructions<{\n      poolId: PublicKey;\n      observationId: PublicKey;\n      mintAVault: PublicKey;\n      mintBVault: PublicKey;\n    }>\n  > {\n    const { connection, programId, owner, mintA, mintB, ammConfigId, initialPriceX64, startTime, forerunCreate } =\n      props;\n    const observationId = generatePubKey({ fromPublicKey: owner, programId });\n    const [mintAAddress, mintBAddress] = [new PublicKey(mintA.address), new PublicKey(mintB.address)];\n    const ins = [\n      SystemProgram.createAccountWithSeed({\n        fromPubkey: owner,\n        basePubkey: owner,\n        seed: observationId.seed,\n        newAccountPubkey: observationId.publicKey,\n        lamports: forerunCreate ? 0 : await connection.getMinimumBalanceForRentExemption(ObservationInfoLayout.span),\n        space: ObservationInfoLayout.span,\n        programId,\n      }),\n    ];\n\n    const { publicKey: poolId } = getPdaPoolId(programId, ammConfigId, mintAAddress, mintBAddress);\n    const { publicKey: mintAVault } = getPdaPoolVaultId(programId, poolId, mintAAddress);\n    const { publicKey: mintBVault } = getPdaPoolVaultId(programId, poolId, mintBAddress);\n\n    ins.push(\n      this.createPoolInstruction(\n        programId,\n        poolId,\n        owner,\n        ammConfigId,\n        observationId.publicKey,\n        mintAAddress,\n        mintAVault,\n        new PublicKey(mintA.programId || TOKEN_PROGRAM_ID),\n        mintBAddress,\n        mintBVault,\n        new PublicKey(mintB.programId || TOKEN_PROGRAM_ID),\n        getPdaExBitmapAccount(programId, poolId).publicKey,\n        initialPriceX64,\n        startTime,\n      ),\n    );\n\n    return {\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.CreateAccount, InstructionType.ClmmCreatePool],\n      address: { poolId, observationId: observationId.publicKey, mintAVault, mintBVault },\n      lookupTableAddress: [],\n    };\n  }\n\n  static openPositionFromLiquidityInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: PublicKey,\n    metadataAccount: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    personalPosition: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    tokenVaultA: PublicKey,\n    tokenVaultB: PublicKey,\n    tokenMintA: PublicKey,\n    tokenMintB: PublicKey,\n\n    tickLowerIndex: number,\n    tickUpperIndex: number,\n    tickArrayLowerStartIndex: number,\n    tickArrayUpperStartIndex: number,\n    liquidity: BN,\n    amountMaxA: BN,\n    amountMaxB: BN,\n    withMetadata: \"create\" | \"no-create\",\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      s32(\"tickLowerIndex\"),\n      s32(\"tickUpperIndex\"),\n      s32(\"tickArrayLowerStartIndex\"),\n      s32(\"tickArrayUpperStartIndex\"),\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      bool(\"withMetadata\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n      { pubkey: positionNftMint, isSigner: true, isWritable: true },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: metadataAccount, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: tokenMintA, isSigner: false, isWritable: false },\n      { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        tickLowerIndex,\n        tickUpperIndex,\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n        liquidity,\n        amountMaxA,\n        amountMaxB,\n        withMetadata: withMetadata === \"create\",\n        baseFlag: false,\n        optionBaseFlag: 0,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.openPosition, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static async openPositionInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    amountMaxA,\n    amountMaxB,\n    withMetadata,\n    getEphemeralSigners,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      feePayer: PublicKey;\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    amountMaxA: BN;\n    amountMaxB: BN;\n    withMetadata: \"create\" | \"no-create\";\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<ReturnTypeMakeInstructions> {\n    const signers: Signer[] = [];\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    let nftMintAccount;\n    if (getEphemeralSigners) {\n      nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n    } else {\n      const _k = Keypair.generate();\n      signers.push(_k);\n      nftMintAccount = _k.publicKey;\n    }\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n    const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n    const ins = this.openPositionFromLiquidityInstruction(\n      programId,\n      ownerInfo.feePayer,\n      id,\n      ownerInfo.wallet,\n      nftMintAccount,\n      positionNftAccount,\n      metadataAccount,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      personalPosition,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolInfo.mintA.address),\n      new PublicKey(poolInfo.mintB.address),\n\n      tickLower,\n      tickUpper,\n      tickArrayLowerStartIndex,\n      tickArrayUpperStartIndex,\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      withMetadata,\n    );\n\n    return {\n      signers,\n      instructions: [ins],\n      instructionTypes: [InstructionType.ClmmOpenPosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n      address: {\n        nftMint: nftMintAccount,\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        metadataAccount,\n        personalPosition,\n        protocolPosition,\n      },\n    };\n  }\n\n  static async openPositionFromBaseInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    base,\n    baseAmount,\n    otherAmountMax,\n    withMetadata,\n    getEphemeralSigners,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      feePayer: PublicKey;\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    tickLower: number;\n    tickUpper: number;\n\n    base: \"MintA\" | \"MintB\";\n    baseAmount: BN;\n\n    otherAmountMax: BN;\n    withMetadata: \"create\" | \"no-create\";\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<ReturnTypeMakeInstructions<OpenPositionFromBaseExtInfo>> {\n    const signers: Signer[] = [];\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    let nftMintAccount: PublicKey;\n    if (getEphemeralSigners) {\n      nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n    } else {\n      const _k = Keypair.generate();\n      signers.push(_k);\n      nftMintAccount = _k.publicKey;\n    }\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n    const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n    const ins = this.openPositionFromBaseInstruction(\n      programId,\n      ownerInfo.feePayer,\n      id,\n      ownerInfo.wallet,\n      nftMintAccount,\n      positionNftAccount,\n      metadataAccount,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      personalPosition,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolInfo.mintA.address),\n      new PublicKey(poolInfo.mintB.address),\n\n      tickLower,\n      tickUpper,\n      tickArrayLowerStartIndex,\n      tickArrayUpperStartIndex,\n\n      withMetadata,\n\n      base,\n      baseAmount,\n\n      otherAmountMax,\n      PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n      ])\n        ? getPdaExBitmapAccount(programId, id).publicKey\n        : undefined,\n    );\n\n    return {\n      address: {\n        nftMint: nftMintAccount,\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        metadataAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      instructions: [ins],\n      signers,\n      instructionTypes: [InstructionType.ClmmOpenPosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static openPositionFromBaseInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: PublicKey,\n    metadataAccount: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    personalPosition: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    tokenVaultA: PublicKey,\n    tokenVaultB: PublicKey,\n    tokenMintA: PublicKey,\n    tokenMintB: PublicKey,\n\n    tickLowerIndex: number,\n    tickUpperIndex: number,\n    tickArrayLowerStartIndex: number,\n    tickArrayUpperStartIndex: number,\n\n    withMetadata: \"create\" | \"no-create\",\n    base: \"MintA\" | \"MintB\",\n    baseAmount: BN,\n\n    otherAmountMax: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      s32(\"tickLowerIndex\"),\n      s32(\"tickUpperIndex\"),\n      s32(\"tickArrayLowerStartIndex\"),\n      s32(\"tickArrayUpperStartIndex\"),\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      bool(\"withMetadata\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: positionNftOwner, isSigner: false, isWritable: false },\n      { pubkey: positionNftMint, isSigner: true, isWritable: true },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: metadataAccount, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultA, isSigner: false, isWritable: true },\n      { pubkey: tokenVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: tokenMintA, isSigner: false, isWritable: false },\n      { pubkey: tokenMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        tickLowerIndex,\n        tickUpperIndex,\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n        liquidity: new BN(0),\n        amountMaxA: base === \"MintA\" ? baseAmount : otherAmountMax,\n        amountMaxB: base === \"MintA\" ? otherAmountMax : baseAmount,\n        withMetadata: withMetadata === \"create\",\n        baseFlag: base === \"MintA\",\n        optionBaseFlag: 1,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.openPosition, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static async openPositionFromLiquidityInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    tickLower,\n    tickUpper,\n    liquidity,\n    amountMaxA,\n    amountMaxB,\n    withMetadata,\n    getEphemeralSigners,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    tickLower: number;\n    tickUpper: number;\n    liquidity: BN;\n    amountMaxA: BN;\n    amountMaxB: BN;\n    withMetadata: \"create\" | \"no-create\";\n    getEphemeralSigners?: (k: number) => any;\n  }): Promise<ReturnTypeMakeInstructions<OpenPositionFromLiquidityExtInfo[\"address\"]>> {\n    let nftMintAccount: PublicKey;\n    const signers: Keypair[] = [];\n    if (getEphemeralSigners) {\n      nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n    } else {\n      const _k = Keypair.generate();\n      signers.push(_k);\n      nftMintAccount = _k.publicKey;\n    }\n\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(tickLower, poolInfo.config.tickSpacing);\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(tickUpper, poolInfo.config.tickSpacing);\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, nftMintAccount, TOKEN_PROGRAM_ID);\n    const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, nftMintAccount);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(programId, id, tickLower, tickUpper);\n\n    const ins = this.openPositionFromLiquidityInstruction(\n      programId,\n      ownerInfo.wallet,\n      id,\n      ownerInfo.wallet,\n      nftMintAccount,\n      positionNftAccount,\n      metadataAccount,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      personalPosition,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolKeys.mintA.address),\n      new PublicKey(poolKeys.mintB.address),\n\n      tickLower,\n      tickUpper,\n      tickArrayLowerStartIndex,\n      tickArrayUpperStartIndex,\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      withMetadata,\n      PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n      ])\n        ? getPdaExBitmapAccount(programId, id).publicKey\n        : undefined,\n    );\n\n    return {\n      address: {\n        nftMint: nftMintAccount,\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        metadataAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      instructions: [ins],\n      signers,\n      instructionTypes: [InstructionType.ClmmOpenPosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static closePositionInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftMint: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([]);\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: true },\n      { pubkey: positionNftMint, isSigner: false, isWritable: true },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({}, data);\n\n    const aData = Buffer.from([...anchorDataBuf.closePosition, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static closePositionInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    ownerPosition,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n    ownerInfo: {\n      wallet: PublicKey;\n    };\n  }): ReturnTypeMakeInstructions<ClosePositionExtInfo[\"address\"]> {\n    const programId = new PublicKey(poolInfo.programId);\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n\n    const ins: TransactionInstruction[] = [];\n    ins.push(\n      this.closePositionInstruction(\n        programId,\n        ownerInfo.wallet,\n        ownerPosition.nftMint,\n        positionNftAccount,\n        personalPosition,\n      ),\n    );\n\n    return {\n      address: {\n        positionNftAccount,\n        personalPosition,\n      },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmClosePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static increasePositionFromLiquidityInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n\n    poolId: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    mintVaultA: PublicKey,\n    mintVaultB: PublicKey,\n    mintMintA: PublicKey,\n    mintMintB: PublicKey,\n\n    liquidity: BN,\n    amountMaxA: BN,\n    amountMaxB: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: mintMintA, isSigner: false, isWritable: false },\n      { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        liquidity,\n        amountMaxA,\n        amountMaxB,\n        optionBaseFlag: 0,\n        baseFlag: false,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.increaseLiquidity, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static increasePositionFromLiquidityInstructions({\n    poolInfo,\n    poolKeys,\n    ownerPosition,\n    ownerInfo,\n    liquidity,\n    amountMaxA,\n    amountMaxB,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    liquidity: BN;\n    amountMaxA: BN;\n    amountMaxB: BN;\n  }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickLower,\n      poolInfo.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickUpper,\n      poolInfo.config.tickSpacing,\n    );\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      programId,\n      id,\n      ownerPosition.tickLower,\n      ownerPosition.tickUpper,\n    );\n\n    const ins = this.increasePositionFromLiquidityInstruction(\n      programId,\n      ownerInfo.wallet,\n      positionNftAccount,\n      personalPosition,\n      id,\n      protocolPosition,\n      tickArrayLower,\n      tickArrayUpper,\n      ownerInfo.tokenAccountA,\n      ownerInfo.tokenAccountB,\n      new PublicKey(poolKeys.vault.A),\n      new PublicKey(poolKeys.vault.B),\n      new PublicKey(poolInfo.mintA.address),\n      new PublicKey(poolInfo.mintB.address),\n\n      liquidity,\n      amountMaxA,\n      amountMaxB,\n      PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n        tickArrayLowerStartIndex,\n        tickArrayUpperStartIndex,\n      ])\n        ? getPdaExBitmapAccount(programId, id).publicKey\n        : undefined,\n    );\n\n    return {\n      address: {\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      signers: [],\n      instructions: [ins],\n      instructionTypes: [InstructionType.ClmmIncreasePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static increasePositionFromBaseInstructions({\n    poolInfo,\n    poolKeys,\n    ownerPosition,\n    ownerInfo,\n    base,\n    baseAmount,\n    otherAmountMax,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPoolPersonalPosition;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    base: \"MintA\" | \"MintB\";\n    baseAmount: BN;\n\n    otherAmountMax: BN;\n  }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickLower,\n      poolInfo.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickUpper,\n      poolInfo.config.tickSpacing,\n    );\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(programId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(programId, id, tickArrayUpperStartIndex);\n\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, TOKEN_PROGRAM_ID);\n\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(programId, ownerPosition.nftMint);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      programId,\n      id,\n      ownerPosition.tickLower,\n      ownerPosition.tickUpper,\n    );\n\n    return {\n      address: {\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      instructions: [\n        this.increasePositionFromBaseInstruction(\n          programId,\n          ownerInfo.wallet,\n          positionNftAccount,\n          personalPosition,\n          id,\n          protocolPosition,\n          tickArrayLower,\n          tickArrayUpper,\n          ownerInfo.tokenAccountA,\n          ownerInfo.tokenAccountB,\n          new PublicKey(poolKeys.vault.A),\n          new PublicKey(poolKeys.vault.B),\n          new PublicKey(poolInfo.mintA.address),\n          new PublicKey(poolInfo.mintB.address),\n\n          base,\n          baseAmount,\n\n          otherAmountMax,\n          PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n            tickArrayLowerStartIndex,\n            tickArrayUpperStartIndex,\n          ])\n            ? getPdaExBitmapAccount(programId, id).publicKey\n            : undefined,\n        ),\n      ],\n      signers: [],\n      instructionTypes: [InstructionType.ClmmIncreasePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static increasePositionFromBaseInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n\n    poolId: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    mintVaultA: PublicKey,\n    mintVaultB: PublicKey,\n    mintMintA: PublicKey,\n    mintMintB: PublicKey,\n\n    base: \"MintA\" | \"MintB\",\n    baseAmount: BN,\n\n    otherAmountMax: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      u128(\"liquidity\"),\n      u64(\"amountMaxA\"),\n      u64(\"amountMaxB\"),\n      u8(\"optionBaseFlag\"),\n      bool(\"baseFlag\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n    ];\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: mintMintA, isSigner: false, isWritable: false },\n      { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        liquidity: new BN(0),\n        amountMaxA: base === \"MintA\" ? baseAmount : otherAmountMax,\n        amountMaxB: base === \"MintA\" ? otherAmountMax : baseAmount,\n        baseFlag: base === \"MintA\",\n        optionBaseFlag: 1,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.increaseLiquidity, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static decreaseLiquidityInstruction(\n    programId: PublicKey,\n    positionNftOwner: PublicKey,\n    positionNftAccount: PublicKey,\n    personalPosition: PublicKey,\n\n    poolId: PublicKey,\n    protocolPosition: PublicKey,\n    tickArrayLower: PublicKey,\n    tickArrayUpper: PublicKey,\n    ownerTokenAccountA: PublicKey,\n    ownerTokenAccountB: PublicKey,\n    mintVaultA: PublicKey,\n    mintVaultB: PublicKey,\n    mintMintA: PublicKey,\n    mintMintB: PublicKey,\n    rewardAccounts: {\n      poolRewardVault: PublicKey;\n      ownerRewardVault: PublicKey;\n      rewardMint: PublicKey;\n    }[],\n\n    liquidity: BN,\n    amountMinA: BN,\n    amountMinB: BN,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([u128(\"liquidity\"), u64(\"amountMinA\"), u64(\"amountMinB\")]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n      ...rewardAccounts\n        .map((i) => [\n          { pubkey: i.poolRewardVault, isSigner: false, isWritable: true },\n          { pubkey: i.ownerRewardVault, isSigner: false, isWritable: true },\n          { pubkey: i.rewardMint, isSigner: false, isWritable: false },\n        ])\n        .flat(),\n    ];\n\n    const keys = [\n      { pubkey: positionNftOwner, isSigner: true, isWritable: false },\n      { pubkey: positionNftAccount, isSigner: false, isWritable: false },\n      { pubkey: personalPosition, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: protocolPosition, isSigner: false, isWritable: true },\n      { pubkey: mintVaultA, isSigner: false, isWritable: true },\n      { pubkey: mintVaultB, isSigner: false, isWritable: true },\n      { pubkey: tickArrayLower, isSigner: false, isWritable: true },\n      { pubkey: tickArrayUpper, isSigner: false, isWritable: true },\n\n      { pubkey: ownerTokenAccountA, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccountB, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: mintMintA, isSigner: false, isWritable: false },\n      { pubkey: mintMintB, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        liquidity,\n        amountMinA,\n        amountMinB,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.decreaseLiquidity, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static decreaseLiquidityInstructions({\n    poolInfo,\n    poolKeys,\n    ownerPosition,\n    ownerInfo,\n    liquidity,\n    amountMinA,\n    amountMinB,\n    programId,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerPosition: ClmmPositionLayout;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n      rewardAccounts: PublicKey[];\n    };\n\n    liquidity: BN;\n    amountMinA: BN;\n    amountMinB: BN;\n    programId?: PublicKey;\n  }): ReturnTypeMakeInstructions<ManipulateLiquidityExtInfo[\"address\"]> {\n    const [poolProgramId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const tickArrayLowerStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickLower,\n      poolInfo.config.tickSpacing,\n    );\n    const tickArrayUpperStartIndex = TickUtils.getTickArrayStartIndexByTick(\n      ownerPosition.tickUpper,\n      poolInfo.config.tickSpacing,\n    );\n\n    const { publicKey: tickArrayLower } = getPdaTickArrayAddress(poolProgramId, id, tickArrayLowerStartIndex);\n    const { publicKey: tickArrayUpper } = getPdaTickArrayAddress(poolProgramId, id, tickArrayUpperStartIndex);\n    const { publicKey: positionNftAccount } = getATAAddress(ownerInfo.wallet, ownerPosition.nftMint, programId);\n\n    const { publicKey: personalPosition } = getPdaPersonalPositionAddress(poolProgramId, ownerPosition.nftMint);\n    const { publicKey: protocolPosition } = getPdaProtocolPositionAddress(\n      poolProgramId,\n      id,\n      ownerPosition.tickLower,\n      ownerPosition.tickUpper,\n    );\n\n    const rewardAccounts: {\n      poolRewardVault: PublicKey;\n      ownerRewardVault: PublicKey;\n      rewardMint: PublicKey;\n    }[] = [];\n    for (let i = 0; i < poolInfo.rewardDefaultInfos.length; i++) {\n      rewardAccounts.push({\n        poolRewardVault: new PublicKey(poolKeys.rewardInfos[i].vault),\n        ownerRewardVault: ownerInfo.rewardAccounts[i],\n        rewardMint: new PublicKey(poolInfo.rewardDefaultInfos[i].mint.address),\n      });\n    }\n\n    const ins: TransactionInstruction[] = [];\n    ins.push(\n      this.decreaseLiquidityInstruction(\n        poolProgramId,\n        ownerInfo.wallet,\n        positionNftAccount,\n        personalPosition,\n        id,\n        protocolPosition,\n        tickArrayLower,\n        tickArrayUpper,\n        ownerInfo.tokenAccountA,\n        ownerInfo.tokenAccountB,\n        new PublicKey(poolKeys.vault.A),\n        new PublicKey(poolKeys.vault.B),\n        new PublicKey(poolInfo.mintA.address),\n        new PublicKey(poolInfo.mintB.address),\n        rewardAccounts,\n\n        liquidity,\n        amountMinA,\n        amountMinB,\n        PoolUtils.isOverflowDefaultTickarrayBitmap(poolInfo.config.tickSpacing, [\n          tickArrayLowerStartIndex,\n          tickArrayUpperStartIndex,\n        ])\n          ? getPdaExBitmapAccount(poolProgramId, id).publicKey\n          : undefined,\n      ),\n    );\n\n    return {\n      address: {\n        tickArrayLower,\n        tickArrayUpper,\n        positionNftAccount,\n        personalPosition,\n        protocolPosition,\n      },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmDecreasePosition],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static swapInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    ammConfigId: PublicKey,\n    inputTokenAccount: PublicKey,\n    outputTokenAccount: PublicKey,\n    inputVault: PublicKey,\n    outputVault: PublicKey,\n    inputMint: PublicKey,\n    outputMint: PublicKey,\n    tickArray: PublicKey[],\n    observationId: PublicKey,\n\n    amount: BN,\n    otherAmountThreshold: BN,\n    sqrtPriceLimitX64: BN,\n    isBaseInput: boolean,\n\n    exTickArrayBitmap?: PublicKey,\n  ): TransactionInstruction {\n    const dataLayout = struct([\n      u64(\"amount\"),\n      u64(\"otherAmountThreshold\"),\n      u128(\"sqrtPriceLimitX64\"),\n      bool(\"isBaseInput\"),\n    ]);\n\n    const remainingAccounts = [\n      ...(exTickArrayBitmap ? [{ pubkey: exTickArrayBitmap, isSigner: false, isWritable: true }] : []),\n      ...tickArray.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n    ];\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: false },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: inputTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: outputTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: inputVault, isSigner: false, isWritable: true },\n      { pubkey: outputVault, isSigner: false, isWritable: true },\n\n      { pubkey: observationId, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: inputMint, isSigner: false, isWritable: false },\n      { pubkey: outputMint, isSigner: false, isWritable: false },\n\n      ...remainingAccounts,\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        amount,\n        otherAmountThreshold,\n        sqrtPriceLimitX64,\n        isBaseInput,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.swap, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static makeSwapBaseInInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    inputMint,\n    amountIn,\n    amountOutMin,\n    sqrtPriceLimitX64,\n    remainingAccounts,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    inputMint: PublicKey;\n\n    amountIn: BN;\n    amountOutMin: BN;\n    sqrtPriceLimitX64: BN;\n\n    remainingAccounts: PublicKey[];\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const [mintAVault, mintBVault] = [new PublicKey(poolKeys.vault.A), new PublicKey(poolKeys.vault.B)];\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const isInputMintA = poolInfo.mintA.address === inputMint.toString();\n    const ins = [\n      this.swapInstruction(\n        programId,\n        ownerInfo.wallet,\n\n        id,\n        new PublicKey(poolInfo.config.id),\n\n        isInputMintA ? ownerInfo.tokenAccountA : ownerInfo.tokenAccountB,\n        isInputMintA ? ownerInfo.tokenAccountB : ownerInfo.tokenAccountA,\n\n        isInputMintA ? mintAVault : mintBVault,\n        isInputMintA ? mintBVault : mintAVault,\n\n        isInputMintA ? mintA : mintB,\n        isInputMintA ? mintB : mintA,\n\n        remainingAccounts,\n        // poolInfo.observationId, // to do get from api\n        mintAVault,\n        amountIn,\n        amountOutMin,\n        sqrtPriceLimitX64,\n        true,\n        getPdaExBitmapAccount(programId, id).publicKey,\n      ),\n    ];\n    return {\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmSwapBaseIn],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n      address: {},\n    };\n  }\n\n  static initRewardInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    operationId: PublicKey,\n    ammConfigId: PublicKey,\n\n    ownerTokenAccount: PublicKey,\n    rewardProgramId: PublicKey,\n    rewardMint: PublicKey,\n    rewardVault: PublicKey,\n\n    openTime: number,\n    endTime: number,\n    emissionsPerSecondX64: BN,\n  ): TransactionInstruction {\n    const dataLayout = struct([u64(\"openTime\"), u64(\"endTime\"), u128(\"emissionsPerSecondX64\")]);\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: operationId, isSigner: false, isWritable: true },\n      { pubkey: rewardMint, isSigner: false, isWritable: false },\n      { pubkey: rewardVault, isSigner: false, isWritable: true },\n\n      { pubkey: rewardProgramId, isSigner: false, isWritable: false },\n      { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n      { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        openTime: parseBigNumberish(openTime),\n        endTime: parseBigNumberish(endTime),\n        emissionsPerSecondX64,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.initReward, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static initRewardInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    rewardInfo,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccount: PublicKey;\n    };\n    rewardInfo: {\n      programId: PublicKey;\n      mint: PublicKey;\n      openTime: number;\n      endTime: number;\n      emissionsPerSecondX64: BN;\n    };\n  }): ReturnTypeMakeInstructions<InitRewardExtInfo[\"address\"]> {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const poolRewardVault = getPdaPoolRewardVaulId(programId, id, rewardInfo.mint).publicKey;\n    const operationId = getPdaOperationAccount(programId).publicKey;\n    const ins = [\n      this.initRewardInstruction(\n        programId,\n        ownerInfo.wallet,\n        id,\n        operationId,\n        new PublicKey(poolInfo.config.id),\n\n        ownerInfo.tokenAccount,\n        rewardInfo.programId,\n        rewardInfo.mint,\n        poolRewardVault,\n\n        rewardInfo.openTime,\n        rewardInfo.endTime,\n        rewardInfo.emissionsPerSecondX64,\n      ),\n    ];\n    return {\n      address: { poolRewardVault, operationId },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmInitReward],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static setRewardInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n    operationId: PublicKey,\n    ammConfigId: PublicKey,\n\n    ownerTokenAccount: PublicKey,\n    rewardVault: PublicKey,\n    rewardMint: PublicKey,\n\n    rewardIndex: number,\n    openTime: number,\n    endTime: number,\n    emissionsPerSecondX64: BN,\n  ): TransactionInstruction {\n    const dataLayout = struct([u8(\"rewardIndex\"), u128(\"emissionsPerSecondX64\"), u64(\"openTime\"), u64(\"endTime\")]);\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: ammConfigId, isSigner: false, isWritable: false },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: operationId, isSigner: false, isWritable: true },\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n\n      { pubkey: rewardVault, isSigner: false, isWritable: true },\n      { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: rewardMint, isSigner: false, isWritable: true },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        rewardIndex,\n        emissionsPerSecondX64,\n        openTime: parseBigNumberish(openTime),\n        endTime: parseBigNumberish(endTime),\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.setRewardEmissions, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static setRewardInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    rewardInfo,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccount: PublicKey;\n    };\n    rewardInfo: {\n      mint: PublicKey;\n      openTime: number;\n      endTime: number;\n      emissionsPerSecondX64: BN;\n    };\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n\n    let rewardIndex: number | undefined;\n    let rewardVault: PublicKey | undefined;\n    let rewardMint: PublicKey | undefined;\n    for (let index = 0; index < poolInfo.rewardDefaultInfos.length; index++)\n      if (poolInfo.rewardDefaultInfos[index].mint.address === rewardInfo.mint.toString()) {\n        rewardIndex = index;\n        rewardVault = new PublicKey(poolKeys.rewardInfos[index].vault);\n        rewardMint = new PublicKey(poolKeys.rewardInfos[index].mint.address);\n      }\n\n    if (rewardIndex === undefined || rewardVault === undefined)\n      logger.logWithError(\"reward mint check error\", \"no reward mint\", poolInfo.rewardDefaultInfos);\n\n    const operationId = getPdaOperationAccount(programId).publicKey;\n\n    const ins = [\n      this.setRewardInstruction(\n        programId,\n        ownerInfo.wallet,\n        id,\n        operationId,\n        new PublicKey(poolInfo.config.id),\n\n        ownerInfo.tokenAccount,\n        rewardVault!,\n        rewardMint!,\n\n        rewardIndex!,\n        rewardInfo.openTime,\n        rewardInfo.endTime,\n        rewardInfo.emissionsPerSecondX64,\n      ),\n    ];\n    return {\n      address: { rewardVault: rewardVault!, operationId },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmSetReward],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static collectRewardInstruction(\n    programId: PublicKey,\n    payer: PublicKey,\n    poolId: PublicKey,\n\n    ownerTokenAccount: PublicKey,\n    rewardVault: PublicKey,\n    rewardMint: PublicKey,\n\n    rewardIndex: number,\n  ): TransactionInstruction {\n    const dataLayout = struct([u8(\"rewardIndex\")]);\n\n    const keys = [\n      { pubkey: payer, isSigner: true, isWritable: true },\n      { pubkey: ownerTokenAccount, isSigner: false, isWritable: true },\n      { pubkey: poolId, isSigner: false, isWritable: true },\n      { pubkey: rewardVault, isSigner: false, isWritable: true },\n      { pubkey: rewardMint, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n      { pubkey: MEMO_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode(\n      {\n        rewardIndex,\n      },\n      data,\n    );\n\n    const aData = Buffer.from([...anchorDataBuf.collectReward, ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n\n  static collectRewardInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    rewardMint,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccount: PublicKey;\n    };\n    rewardMint: PublicKey;\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    let rewardIndex: number | undefined;\n    let rewardVault: PublicKey | undefined;\n    for (let index = 0; index < poolInfo.rewardDefaultInfos.length; index++)\n      if (poolInfo.rewardDefaultInfos[index].mint.address === rewardMint.toString()) {\n        rewardIndex = index;\n        rewardVault = new PublicKey(poolKeys.rewardInfos[index].vault);\n      }\n\n    if (rewardIndex === undefined || rewardVault === undefined)\n      logger.logWithError(\"reward mint check error\", \"no reward mint\", poolInfo.rewardDefaultInfos);\n\n    const ins = [\n      this.collectRewardInstruction(\n        programId,\n        ownerInfo.wallet,\n        id,\n\n        ownerInfo.tokenAccount,\n        rewardVault!,\n        rewardMint,\n\n        rewardIndex!,\n      ),\n    ];\n    return {\n      address: { rewardVault: rewardVault! },\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmCollectReward],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    };\n  }\n\n  static swapBaseOutInstructions({\n    poolInfo,\n    poolKeys,\n    ownerInfo,\n    outputMint,\n    amountOut,\n    amountInMax,\n    sqrtPriceLimitX64,\n    remainingAccounts,\n  }: {\n    poolInfo: ApiV3PoolInfoConcentratedItem;\n    poolKeys: ClmmKeys;\n\n    ownerInfo: {\n      wallet: PublicKey;\n      tokenAccountA: PublicKey;\n      tokenAccountB: PublicKey;\n    };\n\n    outputMint: PublicKey;\n\n    amountOut: BN;\n    amountInMax: BN;\n    sqrtPriceLimitX64: BN;\n\n    remainingAccounts: PublicKey[];\n  }): ReturnTypeMakeInstructions {\n    const [programId, id] = [new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)];\n    const [mintAVault, mintBVault] = [new PublicKey(poolKeys.vault.A), new PublicKey(poolKeys.vault.B)];\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n    const isInputMintA = poolInfo.mintA.address === outputMint.toString();\n    const ins = [\n      this.swapInstruction(\n        programId,\n        ownerInfo.wallet,\n\n        id,\n        new PublicKey(poolInfo.config.id),\n\n        isInputMintA ? ownerInfo.tokenAccountB : ownerInfo.tokenAccountA,\n        isInputMintA ? ownerInfo.tokenAccountA : ownerInfo.tokenAccountB,\n\n        isInputMintA ? mintBVault : mintAVault,\n        isInputMintA ? mintAVault : mintBVault,\n\n        isInputMintA ? mintA : mintB,\n        isInputMintA ? mintB : mintA,\n\n        remainingAccounts,\n        // poolInfo.observationId, // to do\n        mintAVault,\n        amountOut,\n        amountInMax,\n        sqrtPriceLimitX64,\n        false,\n      ),\n    ];\n    return {\n      signers: [],\n      instructions: ins,\n      instructionTypes: [InstructionType.ClmmSwapBaseOut],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n      address: {},\n    };\n  }\n}\n","import { AccountInfo, PublicKey, RpcResponseAndContext, Keypair, GetProgramAccountsResponse } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { createLogger, getATAAddress } from \"@/common\";\n\nimport { splAccountLayout } from \"./layout\";\nimport { TokenAccount, TokenAccountRaw } from \"./types\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\nconst logger = createLogger(\"Raydium_Util\");\n\nexport interface ParseTokenAccount {\n  owner: PublicKey;\n  solAccountResp?: AccountInfo<Buffer> | null;\n  tokenAccountResp: RpcResponseAndContext<GetProgramAccountsResponse>;\n}\n\nexport function parseTokenAccountResp({ owner, solAccountResp, tokenAccountResp }: ParseTokenAccount): {\n  tokenAccounts: TokenAccount[];\n  tokenAccountRawInfos: TokenAccountRaw[];\n} {\n  const tokenAccounts: TokenAccount[] = [];\n  const tokenAccountRawInfos: TokenAccountRaw[] = [];\n\n  for (const { pubkey, account } of tokenAccountResp.value) {\n    const accountInfo = splAccountLayout.decode(account.data);\n    const { mint, amount } = accountInfo;\n    tokenAccounts.push({\n      publicKey: pubkey,\n      mint,\n      amount,\n      isAssociated: getATAAddress(owner, mint, account.owner).publicKey.equals(pubkey),\n      isNative: false,\n      programId: account.owner,\n    });\n    // todo programId should get from api\n    tokenAccountRawInfos.push({ pubkey, accountInfo, programId: account.owner });\n  }\n\n  if (solAccountResp) {\n    tokenAccounts.push({\n      mint: PublicKey.default,\n      amount: new BN(solAccountResp.lamports),\n      isNative: true,\n      programId: solAccountResp.owner,\n    });\n  }\n\n  return {\n    tokenAccounts,\n    tokenAccountRawInfos,\n  };\n}\n\nexport function generatePubKey({\n  fromPublicKey,\n  programId = TOKEN_PROGRAM_ID,\n}: {\n  fromPublicKey: PublicKey;\n  programId: PublicKey;\n}): { publicKey: PublicKey; seed: string } {\n  const seed = Keypair.generate().publicKey.toBase58().slice(0, 32);\n  const publicKey = createWithSeed(fromPublicKey, seed, programId);\n  return { publicKey, seed };\n}\n\nfunction createWithSeed(fromPublicKey: PublicKey, seed: string, programId: PublicKey): PublicKey {\n  const buffer = Buffer.concat([fromPublicKey.toBuffer(), Buffer.from(seed), programId.toBuffer()]);\n  const publicKeyBytes = sha256(buffer);\n  return new PublicKey(publicKeyBytes);\n}\n","import { publicKey, struct, u32, u64, u8 } from \"@/marshmallow\";\n\nexport const splAccountLayout = struct([\n  publicKey(\"mint\"),\n  publicKey(\"owner\"),\n  u64(\"amount\"),\n  u32(\"delegateOption\"),\n  publicKey(\"delegate\"),\n  u8(\"state\"),\n  u32(\"isNativeOption\"),\n  u64(\"isNative\"),\n  u64(\"delegatedAmount\"),\n  u32(\"closeAuthorityOption\"),\n  publicKey(\"closeAuthority\"),\n]);\n",null,null,null,null,"import { TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey, TransactionInstruction, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\n\nimport { parseBigNumberish, BN_ZERO, BN_ONE } from \"@/common/bignumber\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { createLogger } from \"@/common/logger\";\nimport { accountMeta, RENT_PROGRAM_ID } from \"@/common/pubKey\";\nimport { AmmV4Keys, AmmV5Keys } from \"@/api/type\";\nimport { struct, u8, u64 } from \"@/marshmallow\";\n\nimport {\n  addLiquidityLayout,\n  removeLiquidityLayout,\n  fixedSwapInLayout,\n  fixedSwapOutLayout,\n  initPoolLayout,\n} from \"./layout\";\nimport { MODEL_DATA_PUBKEY } from \"./stable\";\nimport {\n  LiquidityAddInstructionParams,\n  RemoveLiquidityInstruction,\n  SwapFixedInInstructionParamsV4,\n  SwapFixedOutInstructionParamsV4,\n  SwapInstructionParams,\n  InitPoolInstructionParamsV4,\n} from \"./type\";\nimport { jsonInfo2PoolKeys } from \"@/common/utility\";\nimport { InstructionReturn } from \"../type\";\nimport BN from \"bn.js\";\n\nconst logger = createLogger(\"Raydium_liquidity_instruction\");\nexport function makeAddLiquidityInstruction(params: LiquidityAddInstructionParams): TransactionInstruction {\n  const { poolInfo, poolKeys, userKeys, baseAmountIn, quoteAmountIn, fixedSide } = params;\n\n  const data = Buffer.alloc(addLiquidityLayout.span);\n  addLiquidityLayout.encode(\n    {\n      instruction: 3,\n      baseAmountIn: parseBigNumberish(baseAmountIn),\n      quoteAmountIn: parseBigNumberish(quoteAmountIn),\n      fixedSide: fixedSide === \"base\" ? BN_ZERO : BN_ONE,\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    // amm\n    accountMeta({ pubkey: new PublicKey(poolInfo.id) }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.targetOrders) }),\n    accountMeta({ pubkey: new PublicKey(poolInfo.lpMint.address) }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.A) }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.B) }),\n  ];\n\n  if (poolInfo.pooltype.includes(\"StablePool\")) {\n    keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n  }\n\n  keys.push(\n    // serum\n    accountMeta({ pubkey: new PublicKey(poolInfo.marketId), isWritable: false }),\n    // user\n    accountMeta({ pubkey: userKeys.baseTokenAccount }),\n    accountMeta({ pubkey: userKeys.quoteTokenAccount }),\n    accountMeta({ pubkey: userKeys.lpTokenAccount }),\n    accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n  );\n\n  return new TransactionInstruction({\n    programId: new PublicKey(poolInfo.programId),\n    keys,\n    data,\n  });\n}\n\nexport function removeLiquidityInstruction(params: RemoveLiquidityInstruction): TransactionInstruction {\n  const { poolInfo, poolKeys: poolKeyProps, userKeys, amountIn } = params;\n  const poolKeys = jsonInfo2PoolKeys(poolKeyProps);\n\n  let version = 4;\n  if (poolInfo.pooltype.includes(\"StablePool\")) version = 5;\n\n  if (version === 4 || version === 5) {\n    const data = Buffer.alloc(removeLiquidityLayout.span);\n    removeLiquidityLayout.encode(\n      {\n        instruction: 4,\n        amountIn: parseBigNumberish(amountIn),\n      },\n      data,\n    );\n\n    const keys = [\n      // system\n      accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n      // amm\n      accountMeta({ pubkey: poolKeys.id }),\n      accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n      accountMeta({ pubkey: poolKeys.openOrders }),\n      accountMeta({ pubkey: poolKeys.targetOrders }),\n      accountMeta({ pubkey: poolKeys.mintLp.address }),\n      accountMeta({ pubkey: poolKeys.vault.A }),\n      accountMeta({ pubkey: poolKeys.vault.B }),\n    ];\n\n    if (version === 5) {\n      keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n    } else {\n      keys.push(accountMeta({ pubkey: poolKeys.withdrawQueue }));\n      keys.push(accountMeta({ pubkey: poolKeys.vault.Lp }));\n    }\n\n    keys.push(\n      // serum\n      accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n      accountMeta({ pubkey: poolKeys.marketId }),\n      accountMeta({ pubkey: poolKeys.marketBaseVault }),\n      accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n      accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n      // user\n      accountMeta({ pubkey: userKeys.lpTokenAccount }),\n      accountMeta({ pubkey: userKeys.baseTokenAccount }),\n      accountMeta({ pubkey: userKeys.quoteTokenAccount }),\n      accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n      // serum orderbook\n      accountMeta({ pubkey: poolKeys.marketEventQueue }),\n      accountMeta({ pubkey: poolKeys.marketBids }),\n      accountMeta({ pubkey: poolKeys.marketAsks }),\n    );\n\n    return new TransactionInstruction({\n      programId: poolKeys.programId,\n      keys,\n      data,\n    });\n  }\n\n  // logger.logWithError(\"invalid version\", \"poolKeys.version\", version);\n  return new TransactionInstruction({ programId: poolKeys.programId, keys: [] }); // won't reach\n}\n\nexport function createPoolV4InstructionV2({\n  programId,\n  ammId,\n  ammAuthority,\n  ammOpenOrders,\n  lpMint,\n  coinMint,\n  pcMint,\n  coinVault,\n  pcVault,\n  withdrawQueue,\n  ammTargetOrders,\n  poolTempLp,\n  marketProgramId,\n  marketId,\n  userWallet,\n  userCoinVault,\n  userPcVault,\n  userLpVault,\n  nonce,\n  openTime,\n  coinAmount,\n  pcAmount,\n  ammConfigId,\n  feeDestinationId,\n}: {\n  programId: PublicKey;\n  ammId: PublicKey;\n  ammAuthority: PublicKey;\n  ammOpenOrders: PublicKey;\n  lpMint: PublicKey;\n  coinMint: PublicKey;\n  pcMint: PublicKey;\n  coinVault: PublicKey;\n  pcVault: PublicKey;\n  withdrawQueue: PublicKey;\n  ammTargetOrders: PublicKey;\n  poolTempLp: PublicKey;\n  marketProgramId: PublicKey;\n  marketId: PublicKey;\n  userWallet: PublicKey;\n  userCoinVault: PublicKey;\n  userPcVault: PublicKey;\n  userLpVault: PublicKey;\n  ammConfigId: PublicKey;\n  feeDestinationId: PublicKey;\n\n  nonce: number;\n  openTime: BN;\n  coinAmount: BN;\n  pcAmount: BN;\n}): InstructionReturn {\n  const dataLayout = struct([u8(\"instruction\"), u8(\"nonce\"), u64(\"openTime\"), u64(\"pcAmount\"), u64(\"coinAmount\")]);\n\n  const keys = [\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: ammId, isSigner: false, isWritable: true },\n    { pubkey: ammAuthority, isSigner: false, isWritable: false },\n    { pubkey: ammOpenOrders, isSigner: false, isWritable: true },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n    { pubkey: coinMint, isSigner: false, isWritable: false },\n    { pubkey: pcMint, isSigner: false, isWritable: false },\n    { pubkey: coinVault, isSigner: false, isWritable: true },\n    { pubkey: pcVault, isSigner: false, isWritable: true }, //12\n    { pubkey: ammTargetOrders, isSigner: false, isWritable: true }, //13\n    { pubkey: ammConfigId, isSigner: false, isWritable: false },\n    { pubkey: feeDestinationId, isSigner: false, isWritable: true },\n    { pubkey: marketProgramId, isSigner: false, isWritable: false },\n    { pubkey: marketId, isSigner: false, isWritable: false },\n    { pubkey: userWallet, isSigner: true, isWritable: true },\n    { pubkey: userCoinVault, isSigner: false, isWritable: true },\n    { pubkey: userPcVault, isSigner: false, isWritable: true },\n    { pubkey: userLpVault, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode({ instruction: 1, nonce, openTime, coinAmount, pcAmount }, data);\n\n  return {\n    instruction: new TransactionInstruction({\n      keys,\n      programId,\n      data,\n    }),\n    instructionType: InstructionType.AmmV4CreatePool,\n  };\n}\n\nexport function simulatePoolInfoInstruction(poolKeys: AmmV4Keys | AmmV5Keys): TransactionInstruction {\n  const simulatePoolLayout = struct([u8(\"instruction\"), u8(\"simulateType\")]);\n  const data = Buffer.alloc(simulatePoolLayout.span);\n  simulatePoolLayout.encode(\n    {\n      instruction: 12,\n      simulateType: 0,\n    },\n    data,\n  );\n\n  const keys = [\n    // amm\n    accountMeta({ pubkey: new PublicKey(poolKeys.id), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.A), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.B), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.mintLp.address), isWritable: false }),\n    // serum\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketId), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n  ];\n\n  return new TransactionInstruction({\n    programId: new PublicKey(poolKeys.programId),\n    keys,\n    data,\n  });\n}\n\nexport function makeSwapFixedInInstruction(\n  { poolKeys: propPoolKeys, userKeys, amountIn, minAmountOut }: SwapFixedInInstructionParamsV4,\n  version: number,\n): TransactionInstruction {\n  const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n  const data = Buffer.alloc(fixedSwapInLayout.span);\n  fixedSwapInLayout.encode(\n    {\n      instruction: 9,\n      amountIn: parseBigNumberish(amountIn),\n      minAmountOut: parseBigNumberish(minAmountOut),\n    },\n    data,\n  );\n  const keys = [\n    // amm\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.id }),\n    accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.openOrders }),\n  ];\n\n  if (version === 4) keys.push(accountMeta({ pubkey: poolKeys.targetOrders }));\n  keys.push(accountMeta({ pubkey: poolKeys.vault.A }), accountMeta({ pubkey: poolKeys.vault.B }));\n  if (version === 5) keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n  keys.push(\n    // serum\n    accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.marketId }),\n    accountMeta({ pubkey: poolKeys.marketBids }),\n    accountMeta({ pubkey: poolKeys.marketAsks }),\n    accountMeta({ pubkey: poolKeys.marketEventQueue }),\n    accountMeta({ pubkey: poolKeys.marketBaseVault }),\n    accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n    accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n    // user\n    accountMeta({ pubkey: userKeys.tokenAccountIn }),\n    accountMeta({ pubkey: userKeys.tokenAccountOut }),\n    accountMeta({ pubkey: userKeys.owner, isWritable: false }),\n  );\n\n  return new TransactionInstruction({\n    programId: poolKeys.programId,\n    keys,\n    data,\n  });\n}\n\nexport function makeSwapFixedOutInstruction(\n  { poolKeys: propPoolKeys, userKeys, maxAmountIn, amountOut }: SwapFixedOutInstructionParamsV4,\n  version: number,\n): TransactionInstruction {\n  const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n  const data = Buffer.alloc(fixedSwapOutLayout.span);\n  fixedSwapOutLayout.encode(\n    {\n      instruction: 11,\n      maxAmountIn: parseBigNumberish(maxAmountIn),\n      amountOut: parseBigNumberish(amountOut),\n    },\n    data,\n  );\n\n  const keys = [\n    accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n    // amm\n    accountMeta({ pubkey: poolKeys.id }),\n    accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.openOrders }),\n    accountMeta({ pubkey: poolKeys.targetOrders }),\n    accountMeta({ pubkey: poolKeys.vault.A }),\n    accountMeta({ pubkey: poolKeys.vault.B }),\n  ];\n\n  if (version === 5) keys.push(accountMeta({ pubkey: MODEL_DATA_PUBKEY }));\n\n  keys.push(\n    // serum\n    accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.marketId }),\n    accountMeta({ pubkey: poolKeys.marketBids }),\n    accountMeta({ pubkey: poolKeys.marketAsks }),\n    accountMeta({ pubkey: poolKeys.marketEventQueue }),\n    accountMeta({ pubkey: poolKeys.marketBaseVault }),\n    accountMeta({ pubkey: poolKeys.marketQuoteVault }),\n    accountMeta({ pubkey: poolKeys.marketAuthority, isWritable: false }),\n    accountMeta({ pubkey: userKeys.tokenAccountIn }),\n    accountMeta({ pubkey: userKeys.tokenAccountOut }),\n    accountMeta({ pubkey: userKeys.owner, isWritable: false, isSigner: true }),\n  );\n\n  return new TransactionInstruction({\n    programId: poolKeys.programId,\n    keys,\n    data,\n  });\n}\n\nexport function makeAMMSwapInstruction(params: SwapInstructionParams): TransactionInstruction {\n  const { poolKeys, version, userKeys, amountIn, amountOut, fixedSide } = params;\n  if (version === 4 || version === 5) {\n    const props = { poolKeys, userKeys };\n    if (fixedSide === \"in\") {\n      return makeSwapFixedInInstruction(\n        {\n          ...props,\n          amountIn,\n          minAmountOut: amountOut,\n        },\n        version,\n      );\n    } else if (fixedSide === \"out\") {\n      return makeSwapFixedOutInstruction(\n        {\n          ...props,\n          maxAmountIn: amountIn,\n          amountOut,\n        },\n        version,\n      );\n    }\n    logger.logWithError(\"invalid params\", \"params\", params);\n  }\n\n  logger.logWithError(\"invalid version\", \"poolKeys.version\", version);\n  throw new Error(\"invalid version\");\n}\n\nexport function makeInitPoolInstructionV4({\n  poolKeys: propPoolKeys,\n  userKeys,\n  startTime,\n}: InitPoolInstructionParamsV4): TransactionInstruction {\n  const data = Buffer.alloc(initPoolLayout.span);\n  initPoolLayout.encode(\n    {\n      instruction: 0,\n      // nonce: poolKeys.nonce, // to do fix\n      nonce: 5,\n      startTime: parseBigNumberish(startTime),\n    },\n    data,\n  );\n  const poolKeys = jsonInfo2PoolKeys(propPoolKeys);\n\n  const keys = [\n    // system\n    accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n    accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n    accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n    // amm\n    accountMeta({ pubkey: poolKeys.id }),\n    accountMeta({ pubkey: poolKeys.authority, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.openOrders }),\n    accountMeta({ pubkey: poolKeys.mintLp.address }),\n    accountMeta({ pubkey: poolKeys.mintA.address, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.mintB.address, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.vault.A, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.vault.B, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.withdrawQueue }),\n    accountMeta({ pubkey: poolKeys.targetOrders }),\n    accountMeta({ pubkey: userKeys.lpTokenAccount }),\n    accountMeta({ pubkey: poolKeys.vault.Lp, isWritable: false }),\n    // serum\n    accountMeta({ pubkey: poolKeys.marketProgramId, isWritable: false }),\n    accountMeta({ pubkey: poolKeys.marketId, isWritable: false }),\n    // user\n    accountMeta({ pubkey: userKeys.payer, isSigner: true }),\n  ];\n\n  return new TransactionInstruction({\n    programId: poolKeys.programId,\n    keys,\n    data,\n  });\n}\n\nexport function makeSimulatePoolInfoInstruction({ poolKeys }: { poolKeys: AmmV4Keys | AmmV5Keys }): {\n  instruction: TransactionInstruction;\n} {\n  const LAYOUT = struct([u8(\"instruction\"), u8(\"simulateType\")]);\n  const data = Buffer.alloc(LAYOUT.span);\n  LAYOUT.encode(\n    {\n      instruction: 12,\n      simulateType: 0,\n    },\n    data,\n  );\n\n  const keys = [\n    // amm\n    accountMeta({ pubkey: new PublicKey(poolKeys.id), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.authority), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.openOrders), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.A), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.vault.B), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.mintLp.address), isWritable: false }),\n    // serum\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketId), isWritable: false }),\n    accountMeta({ pubkey: new PublicKey(poolKeys.marketEventQueue), isWritable: false }),\n  ];\n\n  return {\n    instruction: new TransactionInstruction({\n      programId: new PublicKey(poolKeys.programId),\n      keys,\n      data,\n    }),\n  };\n}\n","import { GetStructureSchema, publicKey, seq, struct, u128, u64, u8 } from \"@/marshmallow\";\n\nexport const fixedSwapInLayout = struct([u8(\"instruction\"), u64(\"amountIn\"), u64(\"minAmountOut\")]);\nexport const fixedSwapOutLayout = struct([u8(\"instruction\"), u64(\"maxAmountIn\"), u64(\"amountOut\")]);\n\nexport const createPoolV4Layout = struct([u8(\"instruction\"), u8(\"nonce\")]);\nexport const initPoolLayout = struct([u8(\"instruction\"), u8(\"nonce\"), u64(\"startTime\")]);\n/* ================= state layouts ================= */\nexport const liquidityStateV4Layout = struct([\n  u64(\"status\"),\n  u64(\"nonce\"),\n  u64(\"maxOrder\"),\n  u64(\"depth\"),\n  u64(\"baseDecimal\"),\n  u64(\"quoteDecimal\"),\n  u64(\"state\"),\n  u64(\"resetFlag\"),\n  u64(\"minSize\"),\n  u64(\"volMaxCutRatio\"),\n  u64(\"amountWaveRatio\"),\n  u64(\"baseLotSize\"),\n  u64(\"quoteLotSize\"),\n  u64(\"minPriceMultiplier\"),\n  u64(\"maxPriceMultiplier\"),\n  u64(\"systemDecimalValue\"),\n  u64(\"minSeparateNumerator\"),\n  u64(\"minSeparateDenominator\"),\n  u64(\"tradeFeeNumerator\"),\n  u64(\"tradeFeeDenominator\"),\n  u64(\"pnlNumerator\"),\n  u64(\"pnlDenominator\"),\n  u64(\"swapFeeNumerator\"),\n  u64(\"swapFeeDenominator\"),\n  u64(\"baseNeedTakePnl\"),\n  u64(\"quoteNeedTakePnl\"),\n  u64(\"quoteTotalPnl\"),\n  u64(\"baseTotalPnl\"),\n  u64(\"poolOpenTime\"),\n  u64(\"punishPcAmount\"),\n  u64(\"punishCoinAmount\"),\n  u64(\"orderbookToInitTime\"),\n  // u128('poolTotalDepositPc'),\n  // u128('poolTotalDepositCoin'),\n  u128(\"swapBaseInAmount\"),\n  u128(\"swapQuoteOutAmount\"),\n  u64(\"swapBase2QuoteFee\"),\n  u128(\"swapQuoteInAmount\"),\n  u128(\"swapBaseOutAmount\"),\n  u64(\"swapQuote2BaseFee\"),\n  // amm vault\n  publicKey(\"baseVault\"),\n  publicKey(\"quoteVault\"),\n  // mint\n  publicKey(\"baseMint\"),\n  publicKey(\"quoteMint\"),\n  publicKey(\"lpMint\"),\n  // market\n  publicKey(\"openOrders\"),\n  publicKey(\"marketId\"),\n  publicKey(\"marketProgramId\"),\n  publicKey(\"targetOrders\"),\n  publicKey(\"withdrawQueue\"),\n  publicKey(\"lpVault\"),\n  publicKey(\"owner\"),\n  // true circulating supply without lock up\n  u64(\"lpReserve\"),\n  seq(u64(), 3, \"padding\"),\n]);\n\nexport type LiquidityStateLayoutV4 = typeof liquidityStateV4Layout;\nexport type LiquidityStateV4 = GetStructureSchema<LiquidityStateLayoutV4>;\n\nexport const liquidityStateV5Layout = struct([\n  u64(\"accountType\"),\n  u64(\"status\"),\n  u64(\"nonce\"),\n  u64(\"maxOrder\"),\n  u64(\"depth\"),\n  u64(\"baseDecimal\"),\n  u64(\"quoteDecimal\"),\n  u64(\"state\"),\n  u64(\"resetFlag\"),\n  u64(\"minSize\"),\n  u64(\"volMaxCutRatio\"),\n  u64(\"amountWaveRatio\"),\n  u64(\"baseLotSize\"),\n  u64(\"quoteLotSize\"),\n  u64(\"minPriceMultiplier\"),\n  u64(\"maxPriceMultiplier\"),\n  u64(\"systemDecimalsValue\"),\n  u64(\"abortTradeFactor\"),\n  u64(\"priceTickMultiplier\"),\n  u64(\"priceTick\"),\n  // Fees\n  u64(\"minSeparateNumerator\"),\n  u64(\"minSeparateDenominator\"),\n  u64(\"tradeFeeNumerator\"),\n  u64(\"tradeFeeDenominator\"),\n  u64(\"pnlNumerator\"),\n  u64(\"pnlDenominator\"),\n  u64(\"swapFeeNumerator\"),\n  u64(\"swapFeeDenominator\"),\n  // OutPutData\n  u64(\"baseNeedTakePnl\"),\n  u64(\"quoteNeedTakePnl\"),\n  u64(\"quoteTotalPnl\"),\n  u64(\"baseTotalPnl\"),\n  u64(\"poolOpenTime\"),\n  u64(\"punishPcAmount\"),\n  u64(\"punishCoinAmount\"),\n  u64(\"orderbookToInitTime\"),\n  u128(\"swapBaseInAmount\"),\n  u128(\"swapQuoteOutAmount\"),\n  u128(\"swapQuoteInAmount\"),\n  u128(\"swapBaseOutAmount\"),\n  u64(\"swapQuote2BaseFee\"),\n  u64(\"swapBase2QuoteFee\"),\n\n  publicKey(\"baseVault\"),\n  publicKey(\"quoteVault\"),\n  publicKey(\"baseMint\"),\n  publicKey(\"quoteMint\"),\n  publicKey(\"lpMint\"),\n\n  publicKey(\"modelDataAccount\"),\n  publicKey(\"openOrders\"),\n  publicKey(\"marketId\"),\n  publicKey(\"marketProgramId\"),\n  publicKey(\"targetOrders\"),\n  publicKey(\"owner\"),\n  seq(u64(), 64, \"padding\"),\n]);\n\nexport const addLiquidityLayout = struct([\n  u8(\"instruction\"),\n  u64(\"baseAmountIn\"),\n  u64(\"quoteAmountIn\"),\n  u64(\"fixedSide\"),\n]);\n\nexport const removeLiquidityLayout = struct([u8(\"instruction\"), u64(\"amountIn\")]);\n\nexport type LiquidityStateLayoutV5 = typeof liquidityStateV5Layout;\nexport type LiquidityStateV5 = GetStructureSchema<LiquidityStateLayoutV5>;\n\nexport type LiquidityState = LiquidityStateV4 | LiquidityStateV5;\nexport type LiquidityStateLayout = LiquidityStateLayoutV4 | LiquidityStateLayoutV5;\n\n/* ================= index ================= */\n// version => liquidity state layout\nexport const LIQUIDITY_VERSION_TO_STATE_LAYOUT: {\n  [version: number]: LiquidityStateLayout;\n} = {\n  4: liquidityStateV4Layout,\n  5: liquidityStateV5Layout,\n};\n\nexport const createPoolFeeLayout = struct([u64(\"fee\")]);\n","import { Connection, PublicKey } from \"@solana/web3.js\";\n\nimport { seq, struct, u64 } from \"@/marshmallow\";\n\nexport const MODEL_DATA_PUBKEY = new PublicKey(\"CDSr3ssLcRB6XYPJwAfFt18MZvEZp4LjHcvzBVZ45duo\");\nconst ELEMENT_SIZE = 50000;\n\nexport const DataElement = struct([u64(\"x\"), u64(\"y\"), u64(\"price\")]);\n\nexport const modelDataInfoLayout = struct([\n  u64(\"accountType\"),\n  u64(\"status\"),\n  u64(\"multiplier\"),\n  u64(\"validDataCount\"),\n  seq(DataElement, ELEMENT_SIZE, \"DataElement\"),\n]);\n\nexport interface StableModelLayout {\n  accountType: number;\n  status: number;\n  multiplier: number;\n  validDataCount: number;\n  DataElement: { x: number; y: number; price: number }[];\n}\n\nfunction estimateRangeByXyReal(_xReal: number, _yReal: number): number[] {\n  return [0, ELEMENT_SIZE - 2];\n}\n\nfunction estimateRangeByX(_x: number): number[] {\n  return [0, ELEMENT_SIZE - 2];\n}\n\nfunction estimateRangeByY(_y: number): number[] {\n  return [0, ELEMENT_SIZE - 2];\n}\n\nfunction getMininumRangeByXyReal(\n  layoutData: StableModelLayout,\n  xReal: number,\n  yReal: number,\n): [number, number, boolean] {\n  const [min, max] = estimateRangeByXyReal(xReal, yReal);\n  let minRangeIdx = min;\n  let maxRangeIdx = max;\n  let mid = 0;\n  const target = (xReal * layoutData.multiplier) / yReal;\n  while (minRangeIdx <= maxRangeIdx) {\n    mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n    if (mid === 0 || mid >= ELEMENT_SIZE - 2) {\n      return [mid, mid, false];\n    }\n    const cur = (layoutData.DataElement[mid].x * layoutData.multiplier) / layoutData.DataElement[mid].y;\n    const left = (layoutData.DataElement[mid - 1].x * layoutData.multiplier) / layoutData.DataElement[mid - 1].y;\n    const right = (layoutData.DataElement[mid + 1].x * layoutData.multiplier) / layoutData.DataElement[mid + 1].y;\n\n    if (target === cur) {\n      return [mid, mid, true];\n    } else if (target === left) {\n      return [mid - 1, mid - 1, true];\n    } else if (target === right) {\n      return [mid + 1, mid + 1, true];\n    } else if (target < left) {\n      maxRangeIdx = mid - 1;\n    } else if (target > left && target < cur) {\n      return [mid - 1, mid, true];\n    } else if (target > cur && target < right) {\n      return [mid, mid + 1, true];\n    } else {\n      minRangeIdx = mid + 1;\n    }\n  }\n  return [mid, mid, false];\n}\nfunction getRatio(layoutData: StableModelLayout, xReal: number, yReal: number): number {\n  const [minRangeIdx, maxRangeIdx, find] = getMininumRangeByXyReal(layoutData, xReal, yReal);\n\n  if (!find) {\n    return 0;\n  }\n\n  if (minRangeIdx === maxRangeIdx) {\n    const x = layoutData.DataElement[minRangeIdx].x;\n    const ratio = (xReal * layoutData.multiplier) / x;\n    return ratio;\n  } else {\n    const x1 = layoutData.DataElement[minRangeIdx].x;\n    const y1 = layoutData.DataElement[minRangeIdx].y;\n    const x2 = layoutData.DataElement[maxRangeIdx].x;\n    const y2 = layoutData.DataElement[maxRangeIdx].y;\n\n    const xDenominator = yReal * (x2 * y1 - x1 * y2);\n    const xNumerator1 = x1 * xDenominator;\n    const xNumerator2 = (x2 - x1) * (xReal * y1 - x1 * yReal) * y2;\n\n    const xNumerator = xNumerator1 + xNumerator2;\n    const ratio = (xReal * layoutData.multiplier * xDenominator) / xNumerator;\n    return ratio;\n  }\n}\n\nfunction realToTable(layoutData: StableModelLayout, realValue: number, ratio: number): number {\n  return (realValue * layoutData.multiplier) / ratio;\n}\n\nfunction tableToReal(layoutData: StableModelLayout, tableValue: number, ratio: number): number {\n  return (tableValue * ratio) / layoutData.multiplier;\n}\n\nfunction getMinimumRangeByX(layoutData: StableModelLayout, x: number): [number, number, boolean] {\n  const [min, max] = estimateRangeByX(x);\n  let minRangeIdx = min;\n  let maxRangeIdx = max;\n  let mid = 0;\n  const target = x;\n  while (minRangeIdx < maxRangeIdx) {\n    mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n\n    if (mid <= 0 || mid > ELEMENT_SIZE - 2) {\n      return [mid, mid, false];\n    }\n    const cur = layoutData.DataElement[mid].x;\n    const left = layoutData.DataElement[mid - 1].x;\n    const right = layoutData.DataElement[mid + 1].x;\n\n    if (target === cur) return [mid, mid, true];\n    else if (target === left) return [mid - 1, mid - 1, true];\n    else if (target === right) return [mid + 1, mid + 1, true];\n    else if (target < left) maxRangeIdx = mid - 1;\n    else if (target > left && target < cur) return [mid - 1, mid, true];\n    else if (target > cur && target < right) return [mid, mid + 1, true];\n    else minRangeIdx = mid + 1;\n  }\n  return [mid, mid, false];\n}\n\nfunction getMinimumRangeByY(layoutData: StableModelLayout, y: number): [number, number, boolean] {\n  const [min, max] = estimateRangeByY(y);\n  let minRangeIdx = min;\n  let maxRangeIdx = max;\n  let mid = 0;\n  const target = y;\n  while (minRangeIdx <= maxRangeIdx) {\n    mid = Math.floor((maxRangeIdx + minRangeIdx) / 2);\n    if (mid <= 0 || mid >= ELEMENT_SIZE - 2) {\n      return [mid, mid, false];\n    }\n\n    const cur = layoutData.DataElement[mid].y;\n    const left = layoutData.DataElement[mid - 1].y;\n    const right = layoutData.DataElement[mid + 1].y;\n    if (target === cur) return [mid, mid, true];\n    else if (target === left) return [mid - 1, mid - 1, true];\n    else if (target === right) return [mid + 1, mid + 1, true];\n    else if (target < right) {\n      minRangeIdx = mid + 1;\n    } else if (target < left && target > cur) return [mid - 1, mid, true];\n    else if (target < cur && target > right) return [mid, mid + 1, true];\n    else maxRangeIdx = mid - 1;\n  }\n  return [mid, mid, false];\n}\n\nfunction getDataByX(\n  layoutData: StableModelLayout,\n  x: number,\n  dx: number,\n  priceUp: boolean,\n): [number, number, boolean, boolean] {\n  const xWithDx = priceUp ? x + dx : x - dx;\n  const [minIdx, maxIdx, find] = getMinimumRangeByX(layoutData, xWithDx);\n  if (!find) return [0, 0, false, find];\n\n  if (minIdx === maxIdx) return [layoutData.DataElement[maxIdx].price, layoutData.DataElement[maxIdx].y, false, find];\n  else {\n    const x1 = layoutData.DataElement[minIdx].x;\n    const x2 = layoutData.DataElement[maxIdx].x;\n    const p1 = layoutData.DataElement[minIdx].price;\n    const p2 = layoutData.DataElement[maxIdx].price;\n    const y1 = layoutData.DataElement[minIdx].y;\n    const y2 = layoutData.DataElement[maxIdx].y;\n\n    if (x >= x1 && x <= x2) {\n      if (priceUp) return [p2, y2, true, find];\n      else return [p1, y1, true, find];\n    } else {\n      let p, y;\n      if (priceUp) {\n        p = p1 + ((p2 - p1) * (x - x1)) / (x2 - x1);\n        y = y1 - ((xWithDx - x1) * layoutData.multiplier) / p2;\n      } else {\n        p = p1 + ((p2 - p1) * (x - x1)) / (x2 - x1);\n        y = y2 + ((x2 - xWithDx) * layoutData.multiplier) / p1;\n      }\n      return [p, y, false, find];\n    }\n  }\n}\n\nfunction getDataByY(\n  layoutData: StableModelLayout,\n  y: number,\n  dy: number,\n  priceUp: boolean,\n): [number, number, boolean, boolean] {\n  const yWithDy = priceUp ? y - dy : y + dy;\n  const [minIdx, maxIdx, find] = getMinimumRangeByY(layoutData, yWithDy);\n  if (!find) return [0, 0, false, find];\n  if (minIdx === maxIdx) return [layoutData.DataElement[maxIdx].price, layoutData.DataElement[maxIdx].x, false, find];\n  else {\n    const x1 = layoutData.DataElement[minIdx].x;\n    const x2 = layoutData.DataElement[maxIdx].x;\n    const p1 = layoutData.DataElement[minIdx].price;\n    const p2 = layoutData.DataElement[maxIdx].price;\n    const y1 = layoutData.DataElement[minIdx].y;\n    const y2 = layoutData.DataElement[maxIdx].y;\n\n    if (y >= y2 && y <= y1) {\n      return priceUp ? [p2, x2, true, find] : [p1, x1, true, find];\n    } else {\n      let p, x;\n      if (priceUp) {\n        p = p1 + ((p2 - p1) * (y1 - y)) / (y1 - y2);\n        x = x1 + (p2 * (y1 - yWithDy)) / layoutData.multiplier;\n      } else {\n        p = p1 + ((p2 - p1) * (y1 - y)) / (y1 - y2);\n        x = x2 - (p1 * (yWithDy - y2)) / layoutData.multiplier;\n      }\n      return [p, x, false, find];\n    }\n  }\n}\n\nfunction getMidPrice(layoutData: StableModelLayout, x: number): number {\n  const ret = getDataByX(layoutData, x, 0, false);\n  if (ret[3]) return ret[0];\n  else return 0;\n}\n\nexport function getDyByDxBaseIn(layoutData: StableModelLayout, xReal: number, yReal: number, dxReal: number): number {\n  const ratio = getRatio(layoutData, xReal, yReal);\n  const x = realToTable(layoutData, xReal, ratio);\n  const y = realToTable(layoutData, yReal, ratio);\n  const dx = realToTable(layoutData, dxReal, ratio);\n  const priceUp = true;\n  const [p, y2, lessTrade, find] = getDataByX(layoutData, x, dx, priceUp);\n  if (!find) return 0;\n  if (lessTrade) {\n    const dyReal = (dxReal * layoutData.multiplier) / p;\n    return dyReal;\n  } else {\n    const dy = y - y2;\n    const dyReal = tableToReal(layoutData, dy, ratio);\n    return dyReal;\n  }\n}\n\nexport function getDxByDyBaseIn(layoutData: StableModelLayout, xReal: number, yReal: number, dyReal: number): number {\n  const ratio = getRatio(layoutData, xReal, yReal);\n  const x = realToTable(layoutData, xReal, ratio);\n  const y = realToTable(layoutData, yReal, ratio);\n  const dy = realToTable(layoutData, dyReal, ratio);\n  const priceUp = false;\n  const [p, x2, lessTrade, find] = getDataByY(layoutData, y, dy, priceUp);\n  if (!find) return 0;\n  if (lessTrade) {\n    const dxReal = (dyReal * p) / layoutData.multiplier;\n    return dxReal;\n  } else {\n    const dx = x - x2;\n    const dxReal = tableToReal(layoutData, dx, ratio);\n    return dxReal;\n  }\n}\n\nexport function formatLayout(buffer: Buffer): StableModelLayout {\n  const layoutInfo = modelDataInfoLayout.decode(buffer);\n  return {\n    accountType: layoutInfo.accountType.toNumber(),\n    status: layoutInfo.status.toNumber(),\n    multiplier: layoutInfo.multiplier.toNumber(),\n    validDataCount: layoutInfo.validDataCount.toNumber(),\n    DataElement: layoutInfo.DataElement.map((item: any) => ({\n      x: item.x.toNumber(),\n      y: item.y.toNumber(),\n      price: item.price.toNumber(),\n    })),\n  };\n}\n\nexport function getStablePrice(\n  layoutData: StableModelLayout,\n  coinReal: number,\n  pcReal: number,\n  baseCoin: boolean,\n): number {\n  const price =\n    getMidPrice(layoutData, realToTable(layoutData, coinReal, getRatio(layoutData, coinReal, pcReal))) /\n    layoutData.multiplier;\n  return baseCoin ? price : 1 / price;\n}\n\nexport class StableLayout {\n  private readonly connection: Connection;\n  private _layoutData: StableModelLayout = {\n    accountType: 0,\n    status: 0,\n    multiplier: 0,\n    validDataCount: 0,\n    DataElement: [],\n  };\n\n  constructor({ connection }: { connection: Connection }) {\n    this.connection = connection;\n  }\n\n  get stableModelData(): StableModelLayout {\n    return this._layoutData;\n  }\n\n  public async initStableModelLayout(): Promise<void> {\n    if (this._layoutData.validDataCount === 0) {\n      if (this.connection) {\n        const acc = await this.connection.getAccountInfo(MODEL_DATA_PUBKEY);\n        if (acc) this._layoutData = formatLayout(acc?.data);\n      }\n    }\n  }\n}\n"],"mappings":"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","names":[]}