{"version":3,"sources":["jsdelivr-header.js","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/index.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/poolModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/cachedContent.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/common.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/types/clmmpool.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/utils.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/decimal.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/errors/errors.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/types/constants.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/types/sui.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/types/clmm_type.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/types/liquidity.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/apr.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/tick.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/clmm.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/swap.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/contracts.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/hex.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/CoinAssist.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/collect-fees.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/percentage.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/position.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/math/SplitSwap.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/numbers.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/objects.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/tick.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/transaction-util.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/tx-block.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/utils/deepbook-utils.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/rpcModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/positionModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/rewarderModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/routerModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/swapModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/tokenModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/routerModuleV2.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/modules/configModule.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/sdk.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/main.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/config/mainnet.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/config/testnet.ts","/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/src/config/config.ts"],"names":[],"mappings":"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","file":"/npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@cetusprotocol/cetus-sui-clmm-sdk@5.4.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { CetusClmmSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './math'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport { CetusClmmSDK, SdkOptions }\nexport default CetusClmmSDK\n","import { DynamicFieldPage, SuiObjectResponse, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { CachedContent, cacheTime24h, cacheTime5min, checkInvalidSuiAddress, getFutureTime } from '../utils'\nimport {\n  CreatePoolAddLiquidityParams,\n  CreatePoolParams,\n  FetchParams,\n  ClmmConfig,\n  Pool,\n  PoolImmutables,\n  Position,\n  PositionReward,\n  getPackagerConfigs,\n  CoinAsset,\n  PoolTransactionInfo,\n} from '../types'\nimport { printTransaction, TransactionUtil } from '../utils/transaction-util'\nimport { tickScore } from '../math'\nimport { asUintN, buildPool, buildPoolTransactionInfo, buildPositionReward, buildTickData, buildTickDataByEvent } from '../utils/common'\nimport { extractStructTagFromType, isSortedSymbols } from '../utils/contracts'\nimport { TickData } from '../types/clmmpool'\nimport {\n  ClmmFetcherModule,\n  ClmmIntegratePoolModule,\n  ClmmPartnerModule,\n  CLOCK_ADDRESS,\n  DataPage,\n  PageQuery,\n  PaginationArgs,\n  SuiObjectIdType,\n  SuiResource,\n} from '../types/sui'\nimport { CetusClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport {\n  ClmmpoolsError,\n  ConfigErrorCode,\n  PartnerErrorCode,\n  PoolErrorCode,\n  PositionErrorCode,\n  RouterErrorCode,\n  UtilsErrorCode,\n} from '../errors/errors'\nimport { RpcModule } from './rpcModule'\n\ntype GetTickParams = {\n  start: number[]\n  limit: number\n} & FetchParams\n\nexport type CreatePoolAndAddLiquidityRowResult = {\n  position: TransactionObjectArgument\n  coinAObject: TransactionObjectArgument\n  coinBObject: TransactionObjectArgument\n  transaction: Transaction\n  coinAType: string\n  coinBType: string\n}\n\n/**\n * Helper class to help interact with clmm pools with a pool router interface.\n */\nexport class PoolModule implements IModule {\n  protected _sdk: CetusClmmSDK\n\n  private readonly _cache: Record<string, CachedContent> = {}\n\n  constructor(sdk: CetusClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Gets a list of positions for the given positionHandle.\n   * @param {string} positionHandle The handle for the position.\n   * @returns {DataPage<Position>} A promise that resolves to an array of Position objects.\n   */\n  async getPositionList(positionHandle: string, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<Position>> {\n    const dataPage: DataPage<Position> = {\n      data: [],\n      hasNextPage: true,\n    }\n    const objects = await this._sdk.fullClient.getDynamicFieldsByPage(positionHandle, paginationArgs)\n\n    dataPage.hasNextPage = objects.hasNextPage\n    dataPage.nextCursor = objects.nextCursor\n\n    const positionObjectIDs = objects.data.map((item: any) => {\n      if (item.error != null) {\n        throw new ClmmpoolsError(\n          `when getPositionList get position objects error: ${item.error}, please check the rpc, contracts address config and position id.`,\n          ConfigErrorCode.InvalidConfig\n        )\n      }\n\n      return item.name.value\n    })\n\n    const allPosition: Position[] = await this._sdk.Position.getSipmlePositionList(positionObjectIDs)\n    dataPage.data = allPosition\n    return dataPage\n  }\n\n  /**\n   * Gets a list of pool immutables.\n   * @param {string[]} assignPoolIDs An array of pool IDs to get.\n   * @param {number} offset The offset to start at.\n   * @param {number} limit The number of pools to get.\n   * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n   * @returns {Promise<PoolImmutables[]>} array of PoolImmutable objects.\n   */\n  async getPoolImmutables(assignPoolIDs: string[] = [], offset = 0, limit = 100, forceRefresh = false): Promise<PoolImmutables[]> {\n    const { package_id } = this._sdk.sdkOptions.clmm_pool\n    const cacheKey = `${package_id}_getInitPoolEvent`\n    const cacheData = this.getCache<PoolImmutables[]>(cacheKey, forceRefresh)\n\n    const allPools: PoolImmutables[] = []\n    const filterPools: PoolImmutables[] = []\n\n    if (cacheData !== undefined) {\n      allPools.push(...cacheData)\n    }\n\n    if (allPools.length === 0) {\n      try {\n        const objects = await this._sdk.fullClient.queryEventsByPage({ MoveEventType: `${package_id}::factory::CreatePoolEvent` })\n\n        objects.data.forEach((object: any) => {\n          const fields = object.parsedJson\n          if (fields) {\n            allPools.push({\n              poolAddress: fields.pool_id,\n              tickSpacing: fields.tick_spacing,\n              coinTypeA: extractStructTagFromType(fields.coin_type_a).full_address,\n              coinTypeB: extractStructTagFromType(fields.coin_type_b).full_address,\n            })\n          }\n        })\n        this.updateCache(cacheKey, allPools, cacheTime24h)\n      } catch (error) {\n        console.log('getPoolImmutables', error)\n      }\n    }\n\n    const hasAssignPools = assignPoolIDs.length > 0\n    for (let index = 0; index < allPools.length; index += 1) {\n      const item = allPools[index]\n      if (hasAssignPools && !assignPoolIDs.includes(item.poolAddress)) continue\n      if (!hasAssignPools && (index < offset || index >= offset + limit)) continue\n      filterPools.push(item)\n    }\n    return filterPools\n  }\n\n  /**\n   * Gets a list of pools.\n   * @param {string[]} assignPools An array of pool IDs to get.\n   * @param {number} offset The offset to start at.\n   * @param {number} limit The number of pools to get.\n   * @returns {Promise<Pool[]>} array of Pool objects.\n   */\n  async getPools(assignPools: string[] = [], offset = 0, limit = 100): Promise<Pool[]> {\n    const allPool: Pool[] = []\n    let poolObjectIds: string[] = []\n\n    if (assignPools.length > 0) {\n      poolObjectIds = [...assignPools]\n    } else {\n      const poolImmutables = await this.getPoolImmutables([], offset, limit, false)\n      poolImmutables.forEach((item) => poolObjectIds.push(item.poolAddress))\n    }\n\n    const objectDataResponses = await this._sdk.fullClient.batchGetObjects(poolObjectIds, {\n      showContent: true,\n      showType: true,\n    })\n\n    for (const suiObj of objectDataResponses) {\n      if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `getPools error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n          PoolErrorCode.InvalidPoolObject\n        )\n      }\n\n      const pool = buildPool(suiObj)\n      allPool.push(pool)\n      const cacheKey = `${pool.poolAddress}_getPoolObject`\n      this.updateCache(cacheKey, pool, cacheTime24h)\n    }\n    return allPool\n  }\n\n  /**\n   * Gets a list of pool immutables.\n   * @param {PaginationArgs} paginationArgs The cursor and limit to start at.\n   * @returns {Promise<DataPage<PoolImmutables>>} Array of PoolImmutable objects.\n   */\n  async getPoolImmutablesWithPage(paginationArgs: PaginationArgs = 'all', forceRefresh = false): Promise<DataPage<PoolImmutables>> {\n    const { package_id } = this._sdk.sdkOptions.clmm_pool\n    const allPools: PoolImmutables[] = []\n    const dataPage: DataPage<PoolImmutables> = {\n      data: [],\n      hasNextPage: false,\n    }\n\n    const queryAll = paginationArgs === 'all'\n    const cacheAllKey = `${package_id}_getPoolImmutables`\n    if (queryAll) {\n      const cacheDate = this.getCache<PoolImmutables[]>(cacheAllKey, forceRefresh)\n      if (cacheDate) {\n        allPools.push(...cacheDate)\n      }\n    }\n    if (allPools.length === 0) {\n      try {\n        const moveEventType = `${package_id}::factory::CreatePoolEvent`\n        const objects = await this._sdk.fullClient.queryEventsByPage({ MoveEventType: moveEventType }, paginationArgs)\n        dataPage.hasNextPage = objects.hasNextPage\n        dataPage.nextCursor = objects.nextCursor\n        objects.data.forEach((object: any) => {\n          const fields = object.parsedJson\n          if (fields) {\n            const poolImmutables = {\n              poolAddress: fields.pool_id,\n              tickSpacing: fields.tick_spacing,\n              coinTypeA: extractStructTagFromType(fields.coin_type_a).full_address,\n              coinTypeB: extractStructTagFromType(fields.coin_type_b).full_address,\n            }\n            allPools.push(poolImmutables)\n          }\n        })\n      } catch (error) {\n        console.log('getPoolImmutables', error)\n      }\n    }\n    dataPage.data = allPools\n    if (queryAll) {\n      this.updateCache(`${package_id}_getPoolImmutables`, allPools, cacheTime24h)\n    }\n    return dataPage\n  }\n\n  /**\n   * Gets a list of pools.\n   * @param {string[]} assignPools An array of pool IDs to get.\n   * @param {PaginationArgs} paginationArgs The cursor and limit to start at.\n   * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n   * @returns {Promise<Pool[]>} An array of Pool objects.\n   */\n  async getPoolsWithPage(assignPools: string[] = [], paginationArgs: PaginationArgs = 'all', forceRefresh = false): Promise<Pool[]> {\n    const allPool: Pool[] = []\n    let poolObjectIds: string[] = []\n\n    if (assignPools.length > 0) {\n      poolObjectIds = [...assignPools]\n    } else {\n      const poolImmutables = (await this.getPoolImmutablesWithPage(paginationArgs, forceRefresh)).data\n      poolImmutables.forEach((item) => poolObjectIds.push(item.poolAddress))\n    }\n\n    const objectDataResponses: any[] = await this._sdk.fullClient.batchGetObjects(poolObjectIds, {\n      showContent: true,\n      showType: true,\n    })\n\n    for (const suiObj of objectDataResponses) {\n      if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `getPoolWithPages error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n          PoolErrorCode.InvalidPoolObject\n        )\n      }\n      const pool = buildPool(suiObj)\n      allPool.push(pool)\n      const cacheKey = `${pool.poolAddress}_getPoolObject`\n      this.updateCache(cacheKey, pool, cacheTime24h)\n    }\n    return allPool\n  }\n\n  /**\n   * Gets a pool by its object ID.\n   * @param {string} poolID The object ID of the pool to get.\n   * @param {true} forceRefresh Whether to force a refresh of the cache.\n   * @returns {Promise<Pool>} A promise that resolves to a Pool object.\n   */\n  async getPool(poolID: string, forceRefresh = true): Promise<Pool> {\n    const cacheKey = `${poolID}_getPoolObject`\n    const cacheData = this.getCache<Pool>(cacheKey, forceRefresh)\n    if (cacheData !== undefined) {\n      return cacheData\n    }\n    const object = (await this._sdk.fullClient.getObject({\n      id: poolID,\n      options: {\n        showType: true,\n        showContent: true,\n      },\n    })) as SuiObjectResponse\n\n    if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n      throw new ClmmpoolsError(\n        `getPool error code: ${object.error?.code ?? 'unknown error'}, please check config and object id`,\n        PoolErrorCode.InvalidPoolObject\n      )\n    }\n    const pool = buildPool(object)\n    this.updateCache(cacheKey, pool)\n    return pool\n  }\n\n  async getPoolByCoins(coins: string[], feeRate?: number): Promise<Pool[]> {\n    if (coins.length === 0) {\n      return []\n    }\n\n    // 0x2::sui::SUI -> 0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI\n    for (let i = 0; i < coins.length; i++) {\n      if (coins[i] === '0x2::sui::SUI') {\n        coins[i] = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI'\n      }\n    }\n\n    let url = this._sdk.sdkOptions.statsPoolsUrl!\n    if (!url) {\n      throw new ClmmpoolsError(`statsPoolsUrl is not set in the sdk options.`, PoolErrorCode.StatsPoolsUrlNotSet)\n    }\n    url += `?order_by=-fees&limit=100&has_mining=true&has_farming=true&no_incentives=true&display_all_pools=true&coin_type=${coins.join(\n      ','\n    )}`\n\n    const response = await fetch(url)\n    let json\n    try {\n      json = await response.json()\n    } catch (e) {\n      throw new ClmmpoolsError(`Failed tp [arse response from ${url}].`, RouterErrorCode.InvalidSwapCountUrl)\n    }\n    const pools = json.data.lp_list\n    if (!pools || pools.length === 0) {\n      throw new ClmmpoolsError(`Failed tp [arse response from ${url}].`, PoolErrorCode.PoolsNotFound)\n    }\n\n    const poolAddresses = []\n    for (const pool of pools) {\n      if (coins.includes(pool.coin_a_address) && coins.includes(pool.coin_b_address)) {\n        if (feeRate != null) {\n          if (pool.fee === feeRate.toString()) {\n            poolAddresses.push(pool.address)\n          }\n        } else {\n          poolAddresses.push(pool.address)\n        }\n      }\n    }\n\n    if (poolAddresses.length > 0) {\n      const poolObjects = await this.getPools(poolAddresses)\n      return poolObjects\n    }\n\n    return []\n  }\n\n  /**\n   * @deprecated\n   * Creates a transaction payload for creating multiple pools.\n   * @param {CreatePoolParams[]} paramss The parameters for the pools.\n   * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n   */\n  async creatPoolsTransactionPayload(paramss: CreatePoolParams[]): Promise<Transaction> {\n    for (const params of paramss) {\n      if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n        const swpaCoinTypeB = params.coinTypeB\n        params.coinTypeB = params.coinTypeA\n        params.coinTypeA = swpaCoinTypeB\n      }\n    }\n    const payload = await this.creatPool(paramss)\n    return payload\n  }\n\n  /**\n   * @deprecated rename to createPoolTransactionPayload\n   * Create a pool of clmmpool protocol. The pool is identified by (CoinTypeA, CoinTypeB, tick_spacing).\n   * @param {CreatePoolParams | CreatePoolAddLiquidityParams} params\n   * @returns {Promise<Transaction>}\n   */\n  async creatPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n    // If the coin types are not sorted, swap them and swap the metadata.\n    // You can refer to the documentation for the specific sorting rules. ## How to determine coinTypeA and coinTypeB ?\n    // https://cetus-1.gitbook.io/cetus-developer-docs/developer/via-sdk/features-available/create-clmm-pool\n    if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n      const swpaCoinTypeB = params.coinTypeB\n      params.coinTypeB = params.coinTypeA\n      params.coinTypeA = swpaCoinTypeB\n\n      const metadataB = params.metadata_b\n      params.metadata_b = params.metadata_a\n      params.metadata_a = metadataB\n    }\n    return await this.createPoolAndAddLiquidity(params)\n  }\n\n  /**\n   * Create a pool of clmmpool protocol. The pool is identified by (CoinTypeA, CoinTypeB, tick_spacing).\n   * @param {CreatePoolParams | CreatePoolAddLiquidityParams} params\n   * @returns {Promise<Transaction>}\n   */\n  async createPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n    if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n      const swpaCoinTypeB = params.coinTypeB\n      params.coinTypeB = params.coinTypeA\n      params.coinTypeA = swpaCoinTypeB\n      const metadataB = params.metadata_b\n      params.metadata_b = params.metadata_a\n      params.metadata_a = metadataB\n    }\n    return await this.createPoolAndAddLiquidity(params)\n  }\n\n  /**\n   * Create pool and add liquidity row. It will call `pool_creator_v2::create_pool_v2` function.\n   * This method will return the position, coin_a, coin_b. User can use these to build own transaction.\n   * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n   * @returns {Promise<CreatePoolAndAddLiquidityRowResult>} A promise that resolves to the transaction payload.\n   */\n  async createPoolTransactionRowPayload(params: CreatePoolAddLiquidityParams): Promise<CreatePoolAndAddLiquidityRowResult> {\n    // If the coin types are not sorted, swap them and swap the metadata.\n    // You can refer to the documentation for the specific sorting rules. ## How to determine coinTypeA and coinTypeB ?\n    // https://cetus-1.gitbook.io/cetus-developer-docs/developer/via-sdk/features-available/create-clmm-pool\n    if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n      const swpaCoinTypeB = params.coinTypeB\n      params.coinTypeB = params.coinTypeA\n      params.coinTypeA = swpaCoinTypeB\n      const metadataB = params.metadata_b\n      params.metadata_b = params.metadata_a\n      params.metadata_a = metadataB\n    }\n    return await this.createPoolAndAddLiquidityRow(params)\n  }\n\n  /**\n   * Gets the ClmmConfig object for the given package object ID.\n   * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n   * @returns the ClmmConfig object.\n   */\n  async getClmmConfigs(forceRefresh = false): Promise<ClmmConfig> {\n    const { package_id } = this._sdk.sdkOptions.clmm_pool\n    const cacheKey = `${package_id}_getInitEvent`\n    const cacheData = this.getCache<ClmmConfig>(cacheKey, forceRefresh)\n    if (cacheData !== undefined) {\n      return cacheData\n    }\n    const packageObject = await this._sdk.fullClient.getObject({\n      id: package_id,\n      options: { showPreviousTransaction: true },\n    })\n\n    const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n\n    const objects = (await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })).data\n\n    const clmmConfig: ClmmConfig = {\n      pools_id: '',\n      global_config_id: '',\n      global_vault_id: '',\n      admin_cap_id: '',\n    }\n\n    if (objects.length > 0) {\n      objects.forEach((item: any) => {\n        const fields = item.parsedJson as any\n\n        if (item.type) {\n          switch (extractStructTagFromType(item.type).full_address) {\n            case `${package_id}::config::InitConfigEvent`:\n              clmmConfig.global_config_id = fields.global_config_id\n              clmmConfig.admin_cap_id = fields.admin_cap_id\n              break\n            case `${package_id}::factory::InitFactoryEvent`:\n              clmmConfig.pools_id = fields.pools_id\n              break\n            case `${package_id}::rewarder::RewarderInitEvent`:\n              clmmConfig.global_vault_id = fields.global_vault_id\n              break\n            case `${package_id}::partner::InitPartnerEvent`:\n              clmmConfig.partners_id = fields.partners_id\n              break\n            default:\n              break\n          }\n        }\n      })\n      this.updateCache(cacheKey, clmmConfig, cacheTime24h)\n      return clmmConfig\n    }\n\n    return clmmConfig\n  }\n\n  /**\n   * Gets the SUI transaction response for a given transaction digest.\n   * @param digest - The digest of the transaction for which the SUI transaction response is requested.\n   * @param forceRefresh - A boolean flag indicating whether to force a refresh of the response.\n   * @returns A Promise that resolves with the SUI transaction block response or null if the response is not available.\n   */\n  async getSuiTransactionResponse(digest: string, forceRefresh = false): Promise<SuiTransactionBlockResponse | null> {\n    const cacheKey = `${digest}_getSuiTransactionResponse`\n    const cacheData = this.getCache<SuiTransactionBlockResponse>(cacheKey, forceRefresh)\n\n    if (cacheData !== undefined) {\n      return cacheData\n    }\n    let objects\n    try {\n      objects = (await this._sdk.fullClient.getTransactionBlock({\n        digest,\n        options: {\n          showEvents: true,\n          showEffects: true,\n          showBalanceChanges: true,\n          showInput: true,\n          showObjectChanges: true,\n        },\n      })) as SuiTransactionBlockResponse\n    } catch (error) {\n      objects = (await this._sdk.fullClient.getTransactionBlock({\n        digest,\n        options: {\n          showEvents: true,\n          showEffects: true,\n        },\n      })) as SuiTransactionBlockResponse\n    }\n\n    this.updateCache(cacheKey, objects, cacheTime24h)\n    return objects\n  }\n\n  async getPoolTransactionList({\n    poolId,\n    paginationArgs,\n    order = 'descending',\n    fullRpcUrl,\n  }: {\n    poolId: string\n    fullRpcUrl?: string\n    paginationArgs: PageQuery\n    order?: 'ascending' | 'descending' | null | undefined\n  }): Promise<DataPage<PoolTransactionInfo>> {\n    const { fullClient, sdkOptions } = this._sdk\n    let client\n    if (fullRpcUrl) {\n      client = new RpcModule({\n        url: fullRpcUrl,\n      })\n    } else {\n      client = fullClient\n    }\n    const data: DataPage<PoolTransactionInfo> = {\n      data: [],\n      hasNextPage: false,\n    }\n\n    const limit = 50\n    const query = paginationArgs\n    const userLimit = paginationArgs.limit || 10\n    do {\n      const res = await client.queryTransactionBlocksByPage({ ChangedObject: poolId }, { ...query, limit: 50 }, order)\n      res.data.forEach((item, index) => {\n        data.nextCursor = res.nextCursor\n        const dataList = buildPoolTransactionInfo(item, index, sdkOptions.clmm_pool.package_id, poolId)\n        data.data = [...data.data, ...dataList]\n      })\n      data.hasNextPage = res.hasNextPage\n      data.nextCursor = res.nextCursor\n      query.cursor = res.nextCursor\n    } while (data.data.length < userLimit && data.hasNextPage)\n\n    if (data.data.length > userLimit) {\n      data.data = data.data.slice(0, userLimit)\n      data.nextCursor = data.data[data.data.length - 1].tx\n    }\n\n    return data\n  }\n\n  /**\n   * @deprecated\n   * Create pool internal.\n   * @param {CreatePoolParams[]}params The parameters for the pools.\n   * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n   */\n  private async creatPool(params: CreatePoolParams[]): Promise<Transaction> {\n    const tx = new Transaction()\n    const { integrate, clmm_pool } = this.sdk.sdkOptions\n    const eventConfig = getPackagerConfigs(clmm_pool)\n    const globalPauseStatusObjectId = eventConfig.global_config_id\n    const poolsId = eventConfig.pools_id\n\n    params.forEach((params) => {\n      const args = [\n        tx.object(globalPauseStatusObjectId),\n        tx.object(poolsId),\n        tx.pure.u32(params.tick_spacing),\n        tx.pure.u128(params.initialize_sqrt_price),\n        tx.pure.string(params.uri),\n        tx.object(CLOCK_ADDRESS),\n      ]\n\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmIntegratePoolModule}::create_pool`,\n        typeArguments: [params.coinTypeA, params.coinTypeB],\n        arguments: args,\n      })\n    })\n\n    return tx\n  }\n\n  /**\n   * Create pool and add liquidity internal. It will call `pool_creator_v2::create_pool_v2` function in cetus integrate contract.\n   * It encapsulates the original create_pool_v2 method from the Cetus CLMM and processes the additional outputs for position and coin within a single move call.\n   * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n   * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n   */\n  private async createPoolAndAddLiquidity(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n\n    const tx = new Transaction()\n    tx.setSender(this.sdk.senderAddress)\n    const { integrate, clmm_pool } = this.sdk.sdkOptions\n    const eventConfig = getPackagerConfigs(clmm_pool)\n    const globalPauseStatusObjectId = eventConfig.global_config_id\n    const poolsId = eventConfig.pools_id\n\n    const allCoinAsset = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n    const primaryCoinAInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_a), params.coinTypeA, false, true)\n    const primaryCoinBInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_b), params.coinTypeB, false, true)\n\n    const args = [\n      tx.object(globalPauseStatusObjectId),\n      tx.object(poolsId),\n      tx.pure.u32(params.tick_spacing),\n      tx.pure.u128(params.initialize_sqrt_price),\n      tx.pure.string(params.uri),\n      tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n      tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n      primaryCoinAInputsR.targetCoin,\n      primaryCoinBInputsR.targetCoin,\n      tx.object(params.metadata_a),\n      tx.object(params.metadata_b),\n      tx.pure.bool(params.fix_amount_a),\n      tx.object(CLOCK_ADDRESS),\n    ]\n    tx.moveCall({\n      target: `${integrate.published_at}::pool_creator_v2::create_pool_v2`,\n      typeArguments: [params.coinTypeA, params.coinTypeB],\n      arguments: args,\n    })\n    TransactionUtil.buildTransferCoinToSender(this._sdk, tx, primaryCoinAInputsR.targetCoin, params.coinTypeA)\n    TransactionUtil.buildTransferCoinToSender(this._sdk, tx, primaryCoinBInputsR.targetCoin, params.coinTypeB)\n\n    return tx\n  }\n\n  /**\n   * Create pool and add liquidity row. It will call `pool_creator_v2::create_pool_v2` function.\n   * This method will return the position, coin_a, coin_b. User can use these to build own transaction.\n   * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n   * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n   */\n  private async createPoolAndAddLiquidityRow(params: CreatePoolAddLiquidityParams): Promise<CreatePoolAndAddLiquidityRowResult> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n\n    const tx = new Transaction()\n    const { clmm_pool } = this.sdk.sdkOptions\n    const eventConfig = getPackagerConfigs(clmm_pool)\n    const globalPauseStatusObjectId = eventConfig.global_config_id\n    const poolsId = eventConfig.pools_id\n    const allCoinAsset = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n    const primaryCoinAInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_a), params.coinTypeA, false, true)\n    const primaryCoinBInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_b), params.coinTypeB, false, true)\n\n    const args = [\n      tx.object(globalPauseStatusObjectId),\n      tx.object(poolsId),\n      tx.pure.u32(params.tick_spacing),\n      tx.pure.u128(params.initialize_sqrt_price),\n      tx.pure.string(params.uri),\n      tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n      tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n      primaryCoinAInputsR.targetCoin,\n      primaryCoinBInputsR.targetCoin,\n      tx.object(params.metadata_a),\n      tx.object(params.metadata_b),\n      tx.pure.bool(params.fix_amount_a),\n      tx.object(CLOCK_ADDRESS),\n    ]\n    const res: TransactionObjectArgument[] = tx.moveCall({\n      target: `${clmm_pool.published_at}::pool_creator::create_pool_v2`,\n      typeArguments: [params.coinTypeA, params.coinTypeB],\n      arguments: args,\n    })\n\n    return {\n      transaction: tx,\n      position: res[0],\n      coinAObject: res[1],\n      coinBObject: res[2],\n      coinAType: params.coinTypeA,\n      coinBType: params.coinTypeB,\n    }\n  }\n\n  /**\n   * Fetches ticks from the exchange.\n   * @param {FetchParams} params The parameters for the fetch.\n   * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n   */\n  async fetchTicks(params: FetchParams): Promise<TickData[]> {\n    let ticks: TickData[] = []\n    let start: number[] = []\n    const limit = 512\n\n    while (true) {\n      const data = await this.getTicks({\n        pool_id: params.pool_id,\n        coinTypeA: params.coinTypeA,\n        coinTypeB: params.coinTypeB,\n        start,\n        limit,\n      })\n      ticks = [...ticks, ...data]\n      if (data.length < limit) {\n        break\n      }\n      start = [Number(asUintN(BigInt(data[data.length - 1].index)))]\n    }\n    return ticks\n  }\n\n  /**\n   * Fetches ticks from the exchange using the simulation exec tx.\n   * @param {GetTickParams} params The parameters for the fetch.\n   * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n   */\n  private async getTicks(params: GetTickParams): Promise<TickData[]> {\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n    const ticks: TickData[] = []\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n    const tx = new Transaction()\n\n    const start = tx.makeMoveVec({\n      elements: params.start.map((index) => tx.pure.u32(index)),\n      type: 'u32',\n    })\n\n    const args = [tx.object(params.pool_id), start, tx.pure.u64(params.limit.toString())]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_ticks`,\n      arguments: args,\n      typeArguments,\n    })\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError(\n        'Invalid simulation account: Configuration requires a valid Sui address. Please check your SDK configuration.',\n        ConfigErrorCode.InvalidSimulateAccount\n      )\n    }\n\n    const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    if (simulateRes.error != null) {\n      throw new ClmmpoolsError(\n        `getTicks error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n        PoolErrorCode.InvalidTickObjectId\n      )\n    }\n\n    simulateRes.events?.forEach((item: any) => {\n      if (extractStructTagFromType(item.type).name === `FetchTicksResultEvent`) {\n        item.parsedJson.ticks.forEach((tick: any) => {\n          ticks.push(buildTickDataByEvent(tick))\n        })\n      }\n    })\n    return ticks\n  }\n\n  /**\n   * Fetches a list of position rewards from the exchange.\n   * @param {FetchParams} params The parameters for the fetch.\n   * @returns {Promise<PositionReward[]>} A promise that resolves to an array of position rewards.\n   */\n  async fetchPositionRewardList(params: FetchParams): Promise<PositionReward[]> {\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n    const allPosition: PositionReward[] = []\n    let start: SuiObjectIdType[] = []\n    const limit = 512\n\n    while (true) {\n      const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n      const tx = new Transaction()\n\n      const vecStart = tx.makeMoveVec({\n        elements: start.map((id) => tx.pure.address(id)),\n        type: undefined,\n      })\n      const args = [tx.object(params.pool_id), vecStart, tx.pure.u64(limit)]\n\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_positions`,\n        arguments: args,\n        typeArguments,\n      })\n\n      if (!checkInvalidSuiAddress(simulationAccount.address)) {\n        throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n      }\n      const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n        transactionBlock: tx,\n        sender: simulationAccount.address,\n      })\n\n      if (simulateRes.error != null) {\n        throw new ClmmpoolsError(\n          `fetch position reward error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n          PositionErrorCode.InvalidPositionRewardObject\n        )\n      }\n\n      const positionRewards: PositionReward[] = []\n      simulateRes?.events?.forEach((item: any) => {\n        if (extractStructTagFromType(item.type).name === `FetchPositionsEvent`) {\n          item.parsedJson.positions.forEach((item: any) => {\n            const positionReward = buildPositionReward(item)\n            positionRewards.push(positionReward)\n          })\n        }\n      })\n\n      allPosition.push(...positionRewards)\n\n      if (positionRewards.length < limit) {\n        break\n      } else {\n        start = [positionRewards[positionRewards.length - 1].pos_object_id]\n      }\n    }\n\n    return allPosition\n  }\n\n  /**\n   * Fetches ticks from the fullnode using the RPC API.\n   * @param {string} tickHandle The handle for the tick. Get tick handle from `sdk.Pool.getPool()`\n   * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n   */\n  async fetchTicksByRpc(tickHandle: string): Promise<TickData[]> {\n    let allTickData: TickData[] = []\n    let nextCursor: string | null = null\n    const limit = 50\n    while (true) {\n      const allTickId: SuiObjectIdType[] = []\n      const idRes: DynamicFieldPage = await this.sdk.fullClient.getDynamicFields({\n        parentId: tickHandle,\n        cursor: nextCursor,\n        limit,\n      })\n      nextCursor = idRes.nextCursor\n      idRes.data.forEach((item) => {\n        if (extractStructTagFromType(item.objectType).module === 'skip_list') {\n          allTickId.push(item.objectId)\n        }\n      })\n\n      allTickData = [...allTickData, ...(await this.getTicksByRpc(allTickId))]\n\n      if (!idRes.hasNextPage) {\n        break\n      }\n    }\n\n    return allTickData\n  }\n\n  /**\n   * Get ticks by tick object ids.\n   * @param {string} tickObjectId The object ids of the ticks.\n   * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n   */\n  private async getTicksByRpc(tickObjectId: string[]): Promise<TickData[]> {\n    const ticks: TickData[] = []\n    const objectDataResponses = await this.sdk.fullClient.batchGetObjects(tickObjectId, { showContent: true, showType: true })\n    for (const suiObj of objectDataResponses) {\n      if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `getTicksByRpc error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n          PoolErrorCode.InvalidTickObjectId\n        )\n      }\n\n      const tick = buildTickData(suiObj)\n      if (tick != null) {\n        ticks.push(tick)\n      }\n    }\n    return ticks\n  }\n\n  /**\n   * Gets the tick data for the given tick index.\n   * @param {string} tickHandle The handle for the tick.\n   * @param {number} tickIndex The index of the tick.\n   * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n   */\n  async getTickDataByIndex(tickHandle: string, tickIndex: number): Promise<TickData> {\n    const name = { type: 'u64', value: asUintN(BigInt(tickScore(tickIndex).toString())).toString() }\n    const res = await this.sdk.fullClient.getDynamicFieldObject({\n      parentId: tickHandle,\n      name,\n    })\n\n    if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n      throw new ClmmpoolsError(`get tick by index: ${tickIndex} error: ${res.error}`, PoolErrorCode.InvalidTickIndex)\n    }\n\n    return buildTickData(res)\n  }\n\n  /**\n   * Gets the tick data for the given object ID.\n   * @param {string} tickId The object ID of the tick.\n   * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n   */\n  async getTickDataByObjectId(tickId: string): Promise<TickData | null> {\n    const res = await this.sdk.fullClient.getObject({\n      id: tickId,\n      options: { showContent: true },\n    })\n\n    if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n      throw new ClmmpoolsError(\n        `getTicksByRpc error code: ${res.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n        PoolErrorCode.InvalidTickObjectId\n      )\n    }\n    return buildTickData(res)\n  }\n\n  /**\n   * Get partner ref fee amount\n   * @param {string}partner Partner object id\n   * @returns {Promise<CoinAsset[]>} A promise that resolves to an array of coin asset.\n   */\n  async getPartnerRefFeeAmount(partner: string, showDisplay = true): Promise<CoinAsset[]> {\n    const objectDataResponses = await this._sdk.fullClient.batchGetObjects([partner], {\n      showOwner: true,\n      showContent: true,\n      showDisplay,\n      showType: true,\n    })\n\n    if (objectDataResponses[0].data?.content?.dataType !== 'moveObject') {\n      throw new ClmmpoolsError(\n        `get partner by object id: ${partner} error: ${objectDataResponses[0].error}`,\n        PartnerErrorCode.NotFoundPartnerObject\n      )\n    }\n\n    const balance = (objectDataResponses[0].data.content.fields as any).balances\n\n    const objects = await this._sdk.fullClient.getDynamicFieldsByPage(balance.fields.id.id)\n\n    const coins: string[] = []\n    objects.data.forEach((object) => {\n      if (object.objectId != null) {\n        coins.push(object.objectId)\n      }\n    })\n\n    const refFee: CoinAsset[] = []\n    const object = await this._sdk.fullClient.batchGetObjects(coins, {\n      showOwner: true,\n      showContent: true,\n      showDisplay,\n      showType: true,\n    })\n    object.forEach((info: any) => {\n      if (info.error != null || info.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `get coin by object id: ${info.data.objectId} error: ${info.error}`,\n          PartnerErrorCode.InvalidParnterRefFeeFields\n        )\n      }\n\n      const coinAsset: CoinAsset = {\n        coinAddress: info.data.content.fields.name,\n        coinObjectId: info.data.objectId,\n        balance: BigInt(info.data.content.fields.value),\n      }\n      refFee.push(coinAsset)\n    })\n\n    return refFee\n  }\n\n  /**\n   * Claim partner ref fee.\n   * @param {string} partnerCap partner cap id.\n   * @param {string} partner partner id.\n   * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n   */\n  async claimPartnerRefFeePayload(partnerCap: string, partner: string, coinType: string): Promise<Transaction> {\n    const tx = new Transaction()\n    const { clmm_pool } = this.sdk.sdkOptions\n    const { global_config_id } = getPackagerConfigs(clmm_pool)\n    const typeArguments = [coinType]\n\n    const args = [tx.object(global_config_id), tx.object(partnerCap), tx.object(partner)]\n\n    tx.moveCall({\n      target: `${clmm_pool.published_at}::${ClmmPartnerModule}::claim_ref_fee`,\n      arguments: args,\n      typeArguments,\n    })\n\n    return tx\n  }\n\n  /**\n   * Updates the cache for the given key.\n   * @param key The key of the cache entry to update.\n   * @param data The data to store in the cache.\n   * @param time The time in minutes after which the cache entry should expire.\n   */\n  updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n    let cacheData = this._cache[key]\n    if (cacheData) {\n      cacheData.overdueTime = getFutureTime(time)\n      cacheData.value = data\n    } else {\n      cacheData = new CachedContent(data, getFutureTime(time))\n    }\n    this._cache[key] = cacheData\n  }\n\n  /**\n   * Gets the cache entry for the given key.\n   * @param key The key of the cache entry to get.\n   * @param forceRefresh Whether to force a refresh of the cache entry.\n   * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n   */\n  getCache<T>(key: string, forceRefresh = false): T | undefined {\n    const cacheData = this._cache[key]\n    const isValid = cacheData?.isValid()\n    if (!forceRefresh && isValid) {\n      return cacheData.value as T\n    }\n    if (!isValid) {\n      delete this._cache[key]\n    }\n    return undefined\n  }\n}\n","import { SuiResource } from '../types/sui'\n\nexport const cacheTime5min = 5 * 60 * 1000\nexport const cacheTime24h = 24 * 60 * 60 * 1000\n\nexport function getFutureTime(interval: number) {\n  return Date.parse(new Date().toString()) + interval\n}\n\n/**\n * Defines the structure of a CachedContent object, used for caching resources in memory.\n */\nexport class CachedContent {\n  overdueTime: number\n\n  value: SuiResource | null\n\n  constructor(value: SuiResource | null, overdueTime = 0) {\n    this.overdueTime = overdueTime\n    this.value = value\n  }\n\n  isValid(): boolean {\n    if (this.value === null) {\n      return false\n    }\n    if (this.overdueTime === 0) {\n      return true\n    }\n    if (Date.parse(new Date().toString()) > this.overdueTime) {\n      return false\n    }\n    return true\n  }\n}\n","import BN from 'bn.js'\nimport { fromB64, fromHEX } from '@mysten/bcs'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\nimport { PaginatedTransactionResponse, SuiObjectResponse, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport {\n  ClmmPositionStatus,\n  Pool,\n  poolFilterEvenTypes,\n  PoolTransactionInfo,\n  Position,\n  PositionReward,\n  PositionTransactionInfo,\n  Rewarder,\n} from '../types'\nimport { MathUtil } from '../math'\nimport { NFT } from '../types/sui'\nimport { extractStructTagFromType } from './contracts'\nimport { TickData } from '../types/clmmpool'\nimport { d, decimalsMultiplier } from './numbers'\nimport {\n  getMoveObjectType,\n  getObjectDeletedResponse,\n  getObjectDisplay,\n  getObjectFields,\n  getObjectId,\n  getObjectNotExistsResponse,\n  getObjectOwner,\n} from './objects'\nimport { ClmmpoolsError, PoolErrorCode, PositionErrorCode } from '../errors/errors'\n\n/**\n * Converts an amount to a decimal value, based on the number of decimals specified.\n * @param  {number | string} amount - The amount to convert to decimal.\n * @param  {number | string} decimals - The number of decimals to use in the conversion.\n * @returns {number} - Returns the converted amount as a number.\n */\nexport function toDecimalsAmount(amount: number | string, decimals: number | string): number {\n  const mul = decimalsMultiplier(d(decimals))\n\n  return Number(d(amount).mul(mul))\n}\n\n/**\n * Converts a bigint to an unsigned integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {string} - Returns the converted unsigned integer as a string.\n */\nexport function asUintN(int: bigint, bits = 32) {\n  return BigInt.asUintN(bits, BigInt(int)).toString()\n}\n\n/**\n * Converts a bigint to a signed integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {number} - Returns the converted signed integer as a number.\n */\nexport function asIntN(int: bigint, bits = 32) {\n  return Number(BigInt.asIntN(bits, BigInt(int)))\n}\n\n/**\n * Converts an amount in decimals to its corresponding numerical value.\n * @param {number|string} amount - The amount to convert.\n * @param {number|string} decimals - The number of decimal places used in the amount.\n * @returns {number} - Returns the converted numerical value.\n */\nexport function fromDecimalsAmount(amount: number | string, decimals: number | string): number {\n  const mul = decimalsMultiplier(d(decimals))\n\n  return Number(d(amount).div(mul))\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to an Ed25519 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Ed25519 key pair.\n */\nexport function secretKeyToEd25519Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Ed25519Keypair {\n  if (secretKey instanceof Uint8Array) {\n    const key = Buffer.from(secretKey)\n    return Ed25519Keypair.fromSecretKey(new Uint8Array(key))\n  }\n\n  const hexKey = ecode === 'hex' ? fromHEX(secretKey) : fromB64(secretKey)\n  return Ed25519Keypair.fromSecretKey(hexKey)\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to a Secp256k1 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Secp256k1 key pair.\n */\nexport function secretKeyToSecp256k1Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Secp256k1Keypair {\n  if (secretKey instanceof Uint8Array) {\n    const key = Buffer.from(secretKey)\n    return Secp256k1Keypair.fromSecretKey(new Uint8Array(key))\n  }\n  const hexKey = ecode === 'hex' ? fromHEX(secretKey) : fromB64(secretKey)\n  return Secp256k1Keypair.fromSecretKey(hexKey)\n}\n\n/**\n * Builds a pool name based on two coin types and tick spacing.\n * @param {string} coin_type_a - The type of the first coin.\n * @param {string} coin_type_b - The type of the second coin.\n * @param {string} tick_spacing - The tick spacing of the pool.\n * @returns {string} - The name of the pool.\n */\nfunction buildPoolName(coin_type_a: string, coin_type_b: string, tick_spacing: string) {\n  const coinNameA = extractStructTagFromType(coin_type_a).name\n  const coinNameB = extractStructTagFromType(coin_type_b).name\n  return `${coinNameA}-${coinNameB}[${tick_spacing}]`\n}\n\n/**\n * Builds a Pool object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} objects - The SuiObjectResponse containing information about the pool.\n * @returns {Pool} - The built Pool object.\n */\nexport function buildPool(objects: SuiObjectResponse): Pool {\n  const type = getMoveObjectType(objects) as string\n  const formatType = extractStructTagFromType(type)\n  const fields = getObjectFields(objects)\n  if (fields == null) {\n    throw new ClmmpoolsError(`Pool id ${getObjectId(objects)} not exists.`, PoolErrorCode.InvalidPoolObject)\n  }\n\n  const rewarders: Rewarder[] = []\n  fields.rewarder_manager.fields.rewarders.forEach((item: any) => {\n    const { emissions_per_second } = item.fields\n    const emissionSeconds = MathUtil.fromX64(new BN(emissions_per_second))\n    const emissionsEveryDay = Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24)\n\n    rewarders.push({\n      emissions_per_second,\n      coinAddress: extractStructTagFromType(item.fields.reward_coin.fields.name).source_address,\n      growth_global: item.fields.growth_global,\n      emissionsEveryDay,\n    })\n  })\n\n  const pool: Pool = {\n    poolAddress: getObjectId(objects),\n    poolType: type,\n    coinTypeA: formatType.type_arguments[0],\n    coinTypeB: formatType.type_arguments[1],\n    coinAmountA: fields.coin_a,\n    coinAmountB: fields.coin_b,\n    current_sqrt_price: fields.current_sqrt_price,\n    current_tick_index: asIntN(BigInt(fields.current_tick_index.fields.bits)),\n    fee_growth_global_a: fields.fee_growth_global_a,\n    fee_growth_global_b: fields.fee_growth_global_b,\n    fee_protocol_coin_a: fields.fee_protocol_coin_a,\n    fee_protocol_coin_b: fields.fee_protocol_coin_b,\n    fee_rate: fields.fee_rate,\n    is_pause: fields.is_pause,\n    liquidity: fields.liquidity,\n    position_manager: {\n      positions_handle: fields.position_manager.fields.positions.fields.id.id,\n      size: fields.position_manager.fields.positions.fields.size,\n    },\n    rewarder_infos: rewarders,\n    rewarder_last_updated_time: fields.rewarder_manager.fields.last_updated_time,\n    tickSpacing: fields.tick_spacing,\n    ticks_handle: fields.tick_manager.fields.ticks.fields.id.id,\n    uri: fields.url,\n    index: Number(fields.index),\n    name: '',\n  }\n  pool.name = buildPoolName(pool.coinTypeA, pool.coinTypeB, pool.tickSpacing)\n  return pool\n}\n\n/**\n * Builds an NFT object based on a response containing information about the NFT.\n * @param {any} objects - The response containing information about the NFT.\n * @returns {NFT} - The built NFT object.\n */\nexport function buildNFT(objects: any): NFT {\n  const fields = getObjectDisplay(objects).data\n  const nft: NFT = {\n    creator: '',\n    description: '',\n    image_url: '',\n    link: '',\n    name: '',\n    project_url: '',\n  }\n  if (fields) {\n    nft.creator = fields.creator\n    nft.description = fields.description\n    nft.image_url = fields.image_url\n    nft.link = fields.link\n    nft.name = fields.name\n    nft.project_url = fields.project_url\n  }\n  return nft\n}\n\n/** Builds a Position object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} object - The SuiObjectResponse containing information about the position.\n * @returns {Position} - The built Position object.\n */\nexport function buildPosition(object: SuiObjectResponse): Position {\n  if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n    throw new ClmmpoolsError(`Position not exists. Get Position error:${object.error}`, PositionErrorCode.InvalidPositionObject)\n  }\n\n  let nft: NFT = {\n    creator: '',\n    description: '',\n    image_url: '',\n    link: '',\n    name: '',\n    project_url: '',\n  }\n\n  let position = {\n    ...nft,\n    pos_object_id: '',\n    owner: '',\n    type: '',\n    coin_type_a: '',\n    coin_type_b: '',\n    liquidity: '',\n    tick_lower_index: 0,\n    tick_upper_index: 0,\n    index: 0,\n    pool: '',\n    reward_amount_owed_0: '0',\n    reward_amount_owed_1: '0',\n    reward_amount_owed_2: '0',\n    reward_growth_inside_0: '0',\n    reward_growth_inside_1: '0',\n    reward_growth_inside_2: '0',\n    fee_growth_inside_a: '0',\n    fee_owed_a: '0',\n    fee_growth_inside_b: '0',\n    fee_owed_b: '0',\n    position_status: ClmmPositionStatus.Exists,\n  }\n  let fields = getObjectFields(object)\n  if (fields) {\n    const type = getMoveObjectType(object) as string\n    const ownerWarp = getObjectOwner(object) as {\n      AddressOwner: string\n    }\n\n    if ('nft' in fields) {\n      fields = fields.nft.fields\n      nft.description = fields.description as string\n      nft.name = fields.name\n      nft.link = fields.url\n    } else {\n      nft = buildNFT(object)\n    }\n\n    position = {\n      ...nft,\n      pos_object_id: fields.id.id,\n      owner: ownerWarp.AddressOwner,\n      type,\n      liquidity: fields.liquidity,\n      coin_type_a: fields.coin_type_a.fields.name,\n      coin_type_b: fields.coin_type_b.fields.name,\n      tick_lower_index: asIntN(BigInt(fields.tick_lower_index.fields.bits)),\n      tick_upper_index: asIntN(BigInt(fields.tick_upper_index.fields.bits)),\n      index: fields.index,\n      pool: fields.pool,\n      reward_amount_owed_0: '0',\n      reward_amount_owed_1: '0',\n      reward_amount_owed_2: '0',\n      reward_growth_inside_0: '0',\n      reward_growth_inside_1: '0',\n      reward_growth_inside_2: '0',\n      fee_growth_inside_a: '0',\n      fee_owed_a: '0',\n      fee_growth_inside_b: '0',\n      fee_owed_b: '0',\n      position_status: ClmmPositionStatus.Exists,\n    }\n  }\n\n  const deletedResponse = getObjectDeletedResponse(object)\n  if (deletedResponse) {\n    position.pos_object_id = deletedResponse.objectId\n    position.position_status = ClmmPositionStatus.Deleted\n  }\n  const objectNotExistsResponse = getObjectNotExistsResponse(object)\n  if (objectNotExistsResponse) {\n    position.pos_object_id = objectNotExistsResponse\n    position.position_status = ClmmPositionStatus.NotExists\n  }\n\n  return position\n}\n\n/**\n * Builds a PositionReward object based on a response containing information about the reward.\n * @param {any} fields - The response containing information about the reward.\n * @returns {PositionReward} - The built PositionReward object.\n */\nexport function buildPositionReward(fields: any): PositionReward {\n  const rewarders = {\n    reward_amount_owed_0: '0',\n    reward_amount_owed_1: '0',\n    reward_amount_owed_2: '0',\n    reward_growth_inside_0: '0',\n    reward_growth_inside_1: '0',\n    reward_growth_inside_2: '0',\n  }\n  fields = 'fields' in fields ? fields.fields : fields\n\n  fields.rewards.forEach((item: any, index: number) => {\n    const { amount_owned, growth_inside } = 'fields' in item ? item.fields : item\n    if (index === 0) {\n      rewarders.reward_amount_owed_0 = amount_owned\n      rewarders.reward_growth_inside_0 = growth_inside\n    } else if (index === 1) {\n      rewarders.reward_amount_owed_1 = amount_owned\n      rewarders.reward_growth_inside_1 = growth_inside\n    } else if (index === 2) {\n      rewarders.reward_amount_owed_2 = amount_owned\n      rewarders.reward_growth_inside_2 = growth_inside\n    }\n  })\n\n  const tick_lower_index = 'fields' in fields.tick_lower_index ? fields.tick_lower_index.fields.bits : fields.tick_lower_index.bits\n  const tick_upper_index = 'fields' in fields.tick_upper_index ? fields.tick_upper_index.fields.bits : fields.tick_upper_index.bits\n\n  const possition: PositionReward = {\n    liquidity: fields.liquidity,\n    tick_lower_index: asIntN(BigInt(tick_lower_index)),\n    tick_upper_index: asIntN(BigInt(tick_upper_index)),\n    ...rewarders,\n    fee_growth_inside_a: fields.fee_growth_inside_a,\n    fee_owed_a: fields.fee_owned_a,\n    fee_growth_inside_b: fields.fee_growth_inside_b,\n    fee_owed_b: fields.fee_owned_b,\n    pos_object_id: fields.position_id,\n  }\n  return possition\n}\n\n/**\n * Builds a TickData object based on a response containing information about tick data.\n * It must check if the response contains the required fields.\n * @param {SuiObjectResponse} objects - The response containing information about tick data.\n * @returns {TickData} - The built TickData object.\n */\nexport function buildTickData(objects: SuiObjectResponse): TickData {\n  if (objects.error != null || objects.data?.content?.dataType !== 'moveObject') {\n    throw new ClmmpoolsError(`Tick not exists. Get tick data error:${objects.error}`, PoolErrorCode.InvalidTickObject)\n  }\n\n  const fields = getObjectFields(objects)\n\n  const valueItem = fields.value.fields.value.fields\n  const possition: TickData = {\n    objectId: getObjectId(objects),\n    index: asIntN(BigInt(valueItem.index.fields.bits)),\n    sqrtPrice: new BN(valueItem.sqrt_price),\n    liquidityNet: new BN(valueItem.liquidity_net.fields.bits),\n    liquidityGross: new BN(valueItem.liquidity_gross),\n    feeGrowthOutsideA: new BN(valueItem.fee_growth_outside_a),\n    feeGrowthOutsideB: new BN(valueItem.fee_growth_outside_b),\n    rewardersGrowthOutside: valueItem.rewards_growth_outside,\n  }\n\n  return possition\n}\n\n/**\n * Builds a TickData object based on a given event's fields.\n * @param {any} fields - The fields of an event.\n * @returns {TickData} - The built TickData object.\n * @throws {Error} If any required field is missing.\n */\nexport function buildTickDataByEvent(fields: any): TickData {\n  if (\n    !fields ||\n    !fields.index ||\n    !fields.sqrt_price ||\n    !fields.liquidity_net ||\n    !fields.liquidity_gross ||\n    !fields.fee_growth_outside_a ||\n    !fields.fee_growth_outside_b\n  ) {\n    throw new ClmmpoolsError(`Invalid tick fields.`, PoolErrorCode.InvalidTickFields)\n  }\n\n  // It's assumed that asIntN is a function that converts a BigInt to an integer.\n  const index = asIntN(BigInt(fields.index.bits))\n  const sqrtPrice = new BN(fields.sqrt_price)\n  const liquidityNet = new BN(fields.liquidity_net.bits)\n  const liquidityGross = new BN(fields.liquidity_gross)\n  const feeGrowthOutsideA = new BN(fields.fee_growth_outside_a)\n  const feeGrowthOutsideB = new BN(fields.fee_growth_outside_b)\n  const rewardersGrowthOutside = fields.rewards_growth_outside || []\n\n  const tick: TickData = {\n    objectId: '',\n    index,\n    sqrtPrice,\n    liquidityNet,\n    liquidityGross,\n    feeGrowthOutsideA,\n    feeGrowthOutsideB,\n    rewardersGrowthOutside,\n  }\n\n  return tick\n}\n\nexport function buildClmmPositionName(pool_index: number, position_index: number): string {\n  return `Cetus LP | Pool${pool_index}-${position_index}`\n}\n\nexport function buildPositionTransactionInfo(data: SuiTransactionBlockResponse, txIndex: number, filterIds: string[]) {\n  const list: PositionTransactionInfo[] = []\n  const { timestampMs, events } = data\n\n  const filterEvenTypes = [\n    'AddLiquidityEvent',\n    'RemoveLiquidityEvent',\n    'CollectFeeEvent',\n    'CollectRewardEvent',\n    'CollectRewardV2Event',\n    'HarvestEvent',\n  ]\n\n  events?.forEach((event, index) => {\n    const type = extractStructTagFromType(event.type).name\n    if (filterEvenTypes.includes(type)) {\n      const info: PositionTransactionInfo = {\n        txDigest: event.id.txDigest,\n        packageId: event.packageId,\n        transactionModule: event.transactionModule,\n        sender: event.sender,\n        type: event.type,\n        timestampMs: timestampMs || '0',\n        parsedJson: event.parsedJson,\n        index: `${txIndex}_${index}`,\n      }\n\n      switch (type) {\n        case 'CollectFeeEvent':\n          if (filterIds.includes(info.parsedJson.position) && (d(info.parsedJson.amount_a).gt(0) || d(info.parsedJson.amount_b).gt(0))) {\n            list.push(info)\n          }\n          break\n        case 'RemoveLiquidityEvent':\n        case 'AddLiquidityEvent':\n          if (d(info.parsedJson.amount_a).gt(0) || d(info.parsedJson.amount_b).gt(0)) {\n            list.push(info)\n          }\n          break\n        case 'CollectRewardEvent':\n        case 'HarvestEvent':\n        case 'CollectRewardV2Event':\n          if (\n            (filterIds.includes(info.parsedJson.position) || filterIds.includes(info.parsedJson.wrapped_position_id)) &&\n            d(info.parsedJson.amount).gt(0)\n          ) {\n            list.push(info)\n          }\n          break\n\n        default:\n          break\n      }\n    }\n  })\n\n  return list\n}\n\nexport function buildPoolTransactionInfo(data: SuiTransactionBlockResponse, txIndex: number, package_id: string, poolId: string) {\n  const list: PoolTransactionInfo[] = []\n  const { timestampMs, events } = data\n\n  events?.forEach((event: any, index) => {\n    const { name: type, address: packageAddress } = extractStructTagFromType(event.type)\n    if (poolFilterEvenTypes.includes(type) && packageAddress === package_id && poolId === event.parsedJson.pool) {\n      const info: PoolTransactionInfo = {\n        tx: event.id.txDigest,\n        sender: event.sender,\n        type: event.type,\n        block_time: timestampMs || '0',\n        index: `${txIndex}_${index}`,\n        parsedJson: event.parsedJson,\n      }\n      list.push(info)\n    }\n  })\n\n  return list\n}\n","import BN from 'bn.js'\nimport { ZERO } from '../math/utils'\nimport { Pool } from './clmm_type'\n\n/**\n * Represents tick data for a liquidity pool.\n */\nexport type TickData = {\n  /**\n   * The object identifier of the tick data.\n   */\n  objectId: string\n\n  /**\n   * The index of the tick.\n   */\n  index: number\n\n  /**\n   * The square root price value for the tick.\n   */\n  sqrtPrice: BN\n\n  /**\n   * The net liquidity value for the tick.\n   */\n  liquidityNet: BN\n\n  /**\n   * The gross liquidity value for the tick.\n   */\n  liquidityGross: BN\n\n  /**\n   * The fee growth outside coin A for the tick.\n   */\n  feeGrowthOutsideA: BN\n\n  /**\n   * The fee growth outside coin B for the tick.\n   */\n  feeGrowthOutsideB: BN\n\n  /**\n   * An array of rewarders' growth outside values for the tick.\n   */\n  rewardersGrowthOutside: BN[]\n}\n\n/**\n * Represents a tick for a liquidity pool.\n */\nexport type Tick = {\n  /**\n   * The index of the tick.\n   */\n  index: Bits\n\n  /**\n   * The square root price value for the tick (string representation).\n   */\n  sqrt_price: string\n\n  /**\n   * The net liquidity value for the tick (Bits format).\n   */\n  liquidity_net: Bits\n\n  /**\n   * The gross liquidity value for the tick (string representation).\n   */\n  liquidity_gross: string\n\n  /**\n   * The fee growth outside coin A for the tick (string representation).\n   */\n  fee_growth_outside_a: string\n\n  /**\n   * The fee growth outside coin B for the tick (string representation).\n   */\n  fee_growth_outside_b: string\n\n  /**\n   * An array of rewarders' growth outside values for the tick (array of string representations).\n   */\n  rewarders_growth_outside: string[3]\n}\n\n/**\n * Represents bits information.\n */\nexport type Bits = {\n  bits: string\n}\n\n/**\n * Represents data for a liquidity mining pool.\n */\nexport type ClmmpoolData = {\n  coinA: string\n  coinB: string\n  currentSqrtPrice: BN\n  currentTickIndex: number\n  feeGrowthGlobalA: BN\n  feeGrowthGlobalB: BN\n  feeProtocolCoinA: BN\n  feeProtocolCoinB: BN\n  feeRate: BN\n  liquidity: BN\n  tickIndexes: number[]\n  tickSpacing: number\n  ticks: Array<TickData>\n  collection_name: string\n}\n\n/**\n * Transforms a Pool object into ClmmpoolData format.\n * @param {Pool} pool - The liquidity pool object to transform.\n * @returns {ClmmpoolData} The transformed ClmmpoolData object.\n */\nexport function transClmmpoolDataWithoutTicks(pool: Pool): ClmmpoolData {\n  const poolData: ClmmpoolData = {\n    coinA: pool.coinTypeA, // string\n    coinB: pool.coinTypeB, // string\n    currentSqrtPrice: new BN(pool.current_sqrt_price), // BN\n    currentTickIndex: pool.current_tick_index, // number\n    feeGrowthGlobalA: new BN(pool.fee_growth_global_a), // BN\n    feeGrowthGlobalB: new BN(pool.fee_growth_global_b), // BN\n    feeProtocolCoinA: new BN(pool.fee_protocol_coin_a), // BN\n    feeProtocolCoinB: new BN(pool.fee_protocol_coin_b), // BN\n    feeRate: new BN(pool.fee_rate), // number\n    liquidity: new BN(pool.liquidity), // BN\n    tickIndexes: [], // number[]\n    tickSpacing: Number(pool.tickSpacing), // number\n    ticks: [], // Array<TickData>\n    collection_name: '',\n  }\n  return poolData\n}\n\n/**\n * Creates a Bits object from an index.\n * @param {number | string} index - The index value.\n * @returns {Bits} The created Bits object.\n */\nexport function newBits(index: number | string): Bits {\n  const index_BN = new BN(index)\n  if (index_BN.lt(ZERO)) {\n    return {\n      bits: index_BN\n        .neg()\n        .xor(new BN(2).pow(new BN(64)).sub(new BN(1)))\n        .add(new BN(1))\n        .toString(),\n    }\n  }\n  return {\n    bits: index_BN.toString(),\n  }\n}\n","import BN from 'bn.js'\nimport Decimal from '../utils/decimal'\n\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nexport const ZERO = new BN(0)\n\nexport const ONE = new BN(1)\n\nexport const TWO = new BN(2)\n\nexport const U128 = TWO.pow(new BN(128))\n\nexport const U64_MAX = TWO.pow(new BN(64)).sub(ONE)\n\nexport const U128_MAX = TWO.pow(new BN(128)).sub(ONE)\n\n/**\n * @category MathUtil\n */\nexport class MathUtil {\n  static toX64_BN(num: BN): BN {\n    return num.mul(new BN(2).pow(new BN(64)))\n  }\n\n  static toX64_Decimal(num: Decimal): Decimal {\n    return num.mul(Decimal.pow(2, 64))\n  }\n\n  static toX64(num: Decimal): BN {\n    return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed())\n  }\n\n  static fromX64(num: BN): Decimal {\n    return new Decimal(num.toString()).mul(Decimal.pow(2, -64))\n  }\n\n  static fromX64_Decimal(num: Decimal): Decimal {\n    return num.mul(Decimal.pow(2, -64))\n  }\n\n  static fromX64_BN(num: BN): BN {\n    return num.div(new BN(2).pow(new BN(64)))\n  }\n\n  static shiftRightRoundUp(n: BN): BN {\n    let result = n.shrn(64)\n\n    if (n.mod(U64_MAX).gt(ZERO)) {\n      result = result.add(ONE)\n    }\n\n    return result\n  }\n\n  static divRoundUp(n0: BN, n1: BN): BN {\n    const hasRemainder = !n0.mod(n1).eq(ZERO)\n    if (hasRemainder) {\n      return n0.div(n1).add(new BN(1))\n    }\n    return n0.div(n1)\n  }\n\n  static subUnderflowU128(n0: BN, n1: BN): BN {\n    if (n0.lt(n1)) {\n      return n0.sub(n1).add(U128_MAX)\n    }\n\n    return n0.sub(n1)\n  }\n\n  static checkUnsignedSub(n0: BN, n1: BN): BN {\n    const n = n0.sub(n1)\n    if (n.isNeg()) {\n      throw new ClmmpoolsError('Unsigned integer sub overflow', MathErrorCode.UnsignedIntegerOverflow)\n    }\n    return n\n  }\n\n  static checkMul(n0: BN, n1: BN, limit: number): BN {\n    const n = n0.mul(n1)\n    if (this.isOverflow(n, limit)) {\n      throw new ClmmpoolsError('Multiplication overflow', MathErrorCode.MulOverflow)\n    }\n    return n\n  }\n\n  static checkMulDivFloor(n0: BN, n1: BN, denom: BN, limit: number): BN {\n    if (denom.eq(ZERO)) {\n      throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n    }\n    const n = n0.mul(n1).div(denom)\n    if (this.isOverflow(n, limit)) {\n      throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n    }\n    return n\n  }\n\n  static checkMulDivCeil(n0: BN, n1: BN, denom: BN, limit: number): BN {\n    if (denom.eq(ZERO)) {\n      throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n    }\n    const n = n0.mul(n1).add(denom.sub(ONE)).div(denom)\n    if (this.isOverflow(n, limit)) {\n      throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n    }\n    return n\n  }\n\n  static checkMulDivRound(n0: BN, n1: BN, denom: BN, limit: number): BN {\n    if (denom.eq(ZERO)) {\n      throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n    }\n    const n = n0.mul(n1.add(denom.shrn(1))).div(denom)\n    if (this.isOverflow(n, limit)) {\n      throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n    }\n    return n\n  }\n\n  static checkMulShiftRight(n0: BN, n1: BN, shift: number, limit: number): BN {\n    const n = n0.mul(n1).div(new BN(2).pow(new BN(shift)))\n    // const n = n0.mul(n1).shrn(shift)\n    if (this.isOverflow(n, limit)) {\n      throw new ClmmpoolsError('Multiplication shift right overflow', MathErrorCode.MulShiftRightOverflow)\n    }\n    return n\n  }\n\n  static checkMulShiftRight64RoundUpIf(n0: BN, n1: BN, limit: number, roundUp: boolean): BN {\n    const p = n0.mul(n1)\n    const shoudRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n    const result = shoudRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n    if (this.isOverflow(result, limit)) {\n      throw new ClmmpoolsError('Multiplication shift right overflow', MathErrorCode.MulShiftRightOverflow)\n    }\n    return result\n  }\n\n  static checkMulShiftLeft(n0: BN, n1: BN, shift: number, limit: number): BN {\n    const n = n0.mul(n1).shln(shift)\n    if (this.isOverflow(n, limit)) {\n      throw new ClmmpoolsError('Multiplication shift left overflow', MathErrorCode.MulShiftLeftOverflow)\n    }\n    return n\n  }\n\n  static checkDivRoundUpIf(n0: BN, n1: BN, roundUp: boolean): BN {\n    if (n1.eq(ZERO)) {\n      throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n    }\n    if (roundUp) {\n      return this.divRoundUp(n0, n1)\n    }\n    return n0.div(n1)\n  }\n\n  static isOverflow(n: BN, bit: number): boolean {\n    return n.gte(TWO.pow(new BN(bit)))\n  }\n\n  static sign(v: BN): number {\n    const signBit = v.testn(127) ? 1 : 0\n    return signBit\n  }\n\n  static is_neg(v: BN): boolean {\n    return this.sign(v) === 1\n  }\n\n  static abs_u128(v: BN): BN {\n    if (v.gt(ZERO)) {\n      return v\n    }\n    return this.u128_neg(v.subn(1))\n  }\n\n  static u128_neg(v: BN): BN {\n    return v.uxor(new BN('ffffffffffffffffffffffffffffffff', 16))\n  }\n\n  static neg(v: BN): BN {\n    if (this.is_neg(v)) {\n      return v.abs()\n    }\n    return this.neg_from(v)\n  }\n\n  static abs(v: BN): BN {\n    if (this.sign(v) === 0) {\n      return v\n    }\n    return this.u128_neg(v.sub(new BN(1)))\n  }\n\n  static neg_from(v: BN): BN {\n    if (v.eq(ZERO)) {\n      return v\n    }\n    return this.u128_neg(v).add(new BN(1)).or(new BN(1).shln(127))\n  }\n}\n","import Decimal from 'decimal.js'\n\nDecimal.config({\n  precision: 64,\n  rounding: Decimal.ROUND_DOWN,\n  toExpNeg: -64,\n  toExpPos: 64,\n})\n\nexport default Decimal\n","export enum MathErrorCode {\n  IntegerDowncastOverflow = `IntegerDowncastOverflow`,\n  MulOverflow = `MultiplicationOverflow`,\n  MulDivOverflow = `MulDivOverflow`,\n  MulShiftRightOverflow = `MulShiftRightOverflow`,\n  MulShiftLeftOverflow = `MulShiftLeftOverflow`,\n  DivideByZero = `DivideByZero`,\n  UnsignedIntegerOverflow = `UnsignedIntegerOverflow`,\n  InvalidCoinAmount = `InvalidCoinAmount`,\n  InvalidLiquidityAmount = `InvalidLiquidityAmount`,\n  InvalidReserveAmount = `InvalidReserveAmount`,\n  InvalidSqrtPrice = `InvalidSqrtPrice`,\n  NotSupportedThisCoin = `NotSupportedThisCoin`,\n  InvalidTwoTickIndex = `InvalidTwoTickIndex`,\n}\n\nexport enum CoinErrorCode {\n  CoinAmountMaxExceeded = `CoinAmountMaxExceeded`,\n  CoinAmountMinSubceeded = `CoinAmountMinSubceeded `,\n  SqrtPriceOutOfBounds = `SqrtPriceOutOfBounds`,\n}\n\nexport enum SwapErrorCode {\n  InvalidSqrtPriceLimitDirection = `InvalidSqrtPriceLimitDirection`,\n  ZeroTradableAmount = `ZeroTradableAmount`,\n  AmountOutBelowMinimum = `AmountOutBelowMinimum`,\n  AmountInAboveMaximum = `AmountInAboveMaximum`,\n  NextTickNotFound = `NextTickNoutFound`,\n  TickArraySequenceInvalid = `TickArraySequenceInvalid`,\n  TickArrayCrossingAboveMax = `TickArrayCrossingAboveMax`,\n  TickArrayIndexNotInitialized = `TickArrayIndexNotInitialized`,\n  ParamsLengthNotEqual = `ParamsLengthNotEqual`,\n}\n\nexport enum PositionErrorCode {\n  InvalidTickEvent = `InvalidTickEvent`,\n  InvalidPositionObject = `InvalidPositionObject`,\n  InvalidPositionRewardObject = `InvalidPositionRewardObject`,\n}\n\nexport enum PoolErrorCode {\n  InvalidCoinTypeSequence = `InvalidCoinTypeSequence`,\n  InvalidTickIndex = `InvalidTickIndex`,\n  InvalidPoolObject = `InvalidPoolObject`,\n  InvalidTickObjectId = `InvalidTickObjectId`,\n  InvalidTickObject = `InvalidTickObject`,\n  InvalidTickFields = `InvalidTickFields`,\n  PoolsNotFound = `PoolsNotFound`,\n  StatsPoolsUrlNotSet = `StatsPoolsUrlNotSet`,\n}\n\nexport enum PartnerErrorCode {\n  NotFoundPartnerObject = `NotFoundPartnerObject`,\n  InvalidParnterRefFeeFields = `InvalidParnterRefFeeFields`,\n}\n\nexport enum ConfigErrorCode {\n  InvalidConfig = `InvalidConfig`,\n  InvalidConfigHandle = `InvalidConfigHandle`,\n  InvalidSimulateAccount = `InvalidSimulateAccount`,\n}\n\nexport enum UtilsErrorCode {\n  InvalidSendAddress = `InvalidSendAddress`,\n  InvalidRecipientAddress = `InvalidRecipientAddress`,\n  InvalidRecipientAndAmountLength = `InvalidRecipientAndAmountLength`,\n  InsufficientBalance = `InsufficientBalance`,\n  InvalidTarget = `InvalidTarget`,\n  InvalidTransactionBuilder = `InvalidTransactionBuilder`,\n}\n\nexport enum RouterErrorCode {\n  InvalidCoin = `InvalidCoin`,\n  NotFoundPath = `NotFoundPath`,\n  NoDowngradeNeedParams = `NoDowngradeNeedParams`,\n  InvalidSwapCountUrl = `InvalidSwapCountUrl`,\n  InvalidTransactionBuilder = `InvalidTransactionBuilder`,\n  InvalidServerResponse = `InvalidServerResponse`,\n}\n\nexport enum TypesErrorCode {\n  InvalidType = `InvalidType`,\n}\n\nexport type ClmmpoolsErrorCode =\n  | MathErrorCode\n  | SwapErrorCode\n  | CoinErrorCode\n  | PoolErrorCode\n  | PositionErrorCode\n  | PartnerErrorCode\n  | ConfigErrorCode\n  | UtilsErrorCode\n  | RouterErrorCode\n  | TypesErrorCode\n\nexport class ClmmpoolsError extends Error {\n  override message: string\n\n  errorCode?: ClmmpoolsErrorCode\n\n  constructor(message: string, errorCode?: ClmmpoolsErrorCode) {\n    super(message)\n    this.message = message\n    this.errorCode = errorCode\n  }\n\n  static isClmmpoolsErrorCode(e: any, code: ClmmpoolsErrorCode): boolean {\n    return e instanceof ClmmpoolsError && e.errorCode === code\n  }\n}\n","import BN from 'bn.js'\n\n/**\n * The maximum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_TICK_INDEX = 443636\n\n/**\n * The minimum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_TICK_INDEX = -443636\n\n/**\n * The maximum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_SQRT_PRICE = '79226673515401279992447579055'\n\n/**\n * The number of initialized ticks that a tick-array account can hold.\n * @category Constants\n */\nexport const TICK_ARRAY_SIZE = 64\n\n/**\n * The minimum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_SQRT_PRICE = '4295048016'\n\n/**\n * The denominator which the fee rate is divided on.\n * @category Constants\n */\nexport const FEE_RATE_DENOMINATOR = new BN(1_000_000)\n","import { TransactionArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\nimport { ClmmpoolsError, TypesErrorCode } from '../errors/errors'\n\n/**\n * Represents a SUI address, which is a string.\n */\nexport type SuiAddressType = string\n/**\n * Represents a SUI object identifier, which is a string.\n */\nexport type SuiObjectIdType = string\n/**\n * Represents a BigNumber, which can be a Decimal.Value, number, or string.\n */\nexport type BigNumber = Decimal.Value | number | string\n/**\n * The address representing the clock in the system.\n */\nexport const CLOCK_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000006'\n\n/**\n * Constants for different modules in the CLMM (Cryptocurrency Liquidity Mining Module).\n */\nexport const ClmmPartnerModule = 'partner'\nexport const ClmmIntegratePoolModule = 'pool_script'\nexport const ClmmIntegratePoolV2Module = 'pool_script_v2'\nexport const ClmmIntegratePoolV3Module = 'pool_script_v3'\nexport const ClmmIntegrateRouterModule = 'router'\nexport const ClmmIntegrateRouterWithPartnerModule = 'router_with_partner'\nexport const ClmmFetcherModule = 'fetcher_script'\nexport const ClmmExpectSwapModule = 'expect_swap'\nexport const ClmmIntegrateUtilsModule = 'utils'\n\n/**\n * The address for CoinInfo module.\n */\nexport const CoinInfoAddress = '0x1::coin::CoinInfo'\n/**\n * The address for CoinStore module.\n */\nexport const CoinStoreAddress = '0x1::coin::CoinStore'\n/**\n * Constants for different modules in the Deepbook system.\n */\n\nexport const DeepbookCustodianV2Moudle = 'custodian_v2'\nexport const DeepbookClobV2Moudle = 'clob_v2'\nexport const DeepbookEndpointsV2Moudle = 'endpoints_v2'\n\n/**\n * Represents a SUI resource, which can be of any type.\n */\nexport type SuiResource = any\n\n/**\n * Represents a paginated data page with optional cursor and limit.\n */\nexport type DataPage<T> = {\n  data: T[]\n  nextCursor?: any\n  hasNextPage: boolean\n}\n\n/**\n * Represents query parameters for pagination.\n */\nexport type PageQuery = {\n  cursor?: any\n  limit?: number | null\n}\n\n/**\n * Represents arguments for pagination, with options for fetching all data or using PageQuery.\n */\nexport type PaginationArgs = 'all' | PageQuery\n\n/**\n * Represents a Non-Fungible Token (NFT) with associated metadata.\n */\nexport type NFT = {\n  /**\n   * The address or identifier of the creator of the NFT.\n   */\n  creator: string\n\n  /**\n   * A description providing additional information about the NFT.\n   */\n  description: string\n\n  /**\n   * The URL to the image representing the NFT visually.\n   */\n  image_url: string\n\n  /**\n   * A link associated with the NFT, providing more details or interactions.\n   */\n  link: string\n\n  /**\n   * The name or title of the NFT.\n   */\n  name: string\n\n  /**\n   * The URL to the project or collection associated with the NFT.\n   */\n  project_url: string\n}\n\n/**\n * Represents a SUI struct tag.\n */\nexport type SuiStructTag = {\n  /**\n   * The full address of the struct.\n   */\n  full_address: string\n\n  /**\n   * The source address of the struct.\n   */\n  source_address: string\n\n  /**\n   * The address of the struct.\n   */\n  address: SuiAddressType\n\n  /**\n   * The module to which the struct belongs.\n   */\n  module: string\n\n  /**\n   * The name of the struct.\n   */\n  name: string\n\n  /**\n   * An array of type arguments (SUI addresses) for the struct.\n   */\n  type_arguments: SuiAddressType[]\n}\n\n/**\n * Represents basic SUI data types.\n */\nexport type SuiBasicTypes = 'address' | 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'u256'\n\n/**\n * Represents a SUI transaction argument, which can be of various types.\n */\nexport type SuiTxArg = TransactionArgument | string | number | bigint | boolean\n\n/**\n * Represents input types for SUI data.\n */\nexport type SuiInputTypes = 'object' | SuiBasicTypes\n\n/**\n * Gets the default SUI input type based on the provided value.\n * @param value - The value to determine the default input type for.\n * @returns The default SUI input type.\n * @throws Error if the type of the value is unknown.\n */\nexport const getDefaultSuiInputType = (value: any): SuiInputTypes => {\n  if (typeof value === 'string' && value.startsWith('0x')) {\n    return 'object' // Treat value as an object if it starts with '0x'.\n  }\n  if (typeof value === 'number' || typeof value === 'bigint') {\n    return 'u64' // Treat number or bigint values as 'u64' type.\n  }\n  if (typeof value === 'boolean') {\n    return 'bool' // Treat boolean values as 'bool' type.\n  }\n  throw new ClmmpoolsError(`Unknown type for value: ${value}`, TypesErrorCode.InvalidType)\n}\n","import BN from 'bn.js'\nimport { NFT, SuiAddressType, SuiObjectIdType } from './sui'\nimport { TickData } from './clmmpool'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\n/**\n * Enumerates the possible status values of a position within a liquidity mining module.\n */\nexport enum ClmmPositionStatus {\n  /**\n   * The position has been deleted or removed.\n   */\n  'Deleted' = 'Deleted',\n  /**\n   * The position exists and is active.\n   */\n  'Exists' = 'Exists',\n  /**\n   * The position does not exist or is not active.\n   */\n  'NotExists' = 'NotExists',\n}\n/**\n * Represents a package containing specific configuration or data.\n * @template T - The type of configuration or data contained in the package.\n */\nexport type Package<T = undefined> = {\n  /**\n   * The unique identifier of the package.\n   */\n  package_id: string\n  /**\n   * the package was published.\n   */\n  published_at: string\n  /**\n   * The version number of the package (optional).\n   */\n  version?: number\n  /**\n   * The configuration or data contained in the package (optional).\n   */\n  config?: T\n}\n/**\n *  The Cetus clmmpool's position NFT.\n */\nexport type Position = {\n  /**\n   * The unique identifier of the position object.\n   */\n  pos_object_id: SuiObjectIdType\n  /**\n   * The owner of the position.\n   */\n  owner: SuiObjectIdType\n  /**\n   * The liquidity pool associated with the position.\n   */\n  pool: SuiObjectIdType\n  /**\n   * The type of position represented by an address.\n   */\n  type: SuiAddressType\n  /**\n   * The index of the position.\n   */\n  index: number\n  /**\n   * The amount of liquidity held by the position.\n   */\n  liquidity: string\n  /**\n   * The lower tick index of the position range.\n   */\n  tick_lower_index: number\n  /**\n   * The upper tick index of the position range.\n   */\n  tick_upper_index: number\n  /**\n   * The status of the position within the liquidity mining module.\n   */\n  position_status: ClmmPositionStatus\n\n  /**\n   * The address type of the first coin in the position.\n   */\n  coin_type_a: SuiAddressType\n  /**\n   * The address type of the second coin in the position.\n   */\n  coin_type_b: SuiAddressType\n} & NFT &\n  PositionReward\n\n/**\n * Represents reward information associated with a liquidity mining position.\n */\nexport type PositionReward = {\n  /**\n   * The unique identifier of the position object.\n   */\n  pos_object_id: SuiObjectIdType\n\n  /**\n   * The amount of liquidity held by the position.\n   */\n  liquidity: string\n\n  /**\n   * The lower tick index of the position range.\n   */\n  tick_lower_index: number\n\n  /**\n   * The upper tick index of the position range.\n   */\n  tick_upper_index: number\n\n  /**\n   * The accumulated fee growth inside the first coin of the position.\n   */\n  fee_growth_inside_a: string\n\n  /**\n   * The accumulated fee owed in the first coin of the position.\n   */\n  fee_owed_a: string\n\n  /**\n   * The accumulated fee growth inside the second coin of the position.\n   */\n  fee_growth_inside_b: string\n\n  /**\n   * The accumulated fee owed in the second coin of the position.\n   */\n  fee_owed_b: string\n\n  /**\n   * The amount of reward owed in the first reward category.\n   */\n  reward_amount_owed_0: string\n\n  /**\n   * The amount of reward owed in the second reward category.\n   */\n  reward_amount_owed_1: string\n\n  /**\n   * The amount of reward owed in the third reward category.\n   */\n  reward_amount_owed_2: string\n\n  /**\n   * The accumulated reward growth inside the first reward category.\n   */\n  reward_growth_inside_0: string\n\n  /**\n   * The accumulated reward growth inside the second reward category.\n   */\n  reward_growth_inside_1: string\n\n  /**\n   * The accumulated reward growth inside the third reward category.\n   */\n  reward_growth_inside_2: string\n}\n\n/**\n * Represents a pair of coins used in a financial context.\n */\nexport type CoinPairType = {\n  /**\n   * The address type of the coin a in the pair.\n   */\n  coinTypeA: SuiAddressType\n\n  /**\n   * The address type of the coin b in the pair.\n   */\n  coinTypeB: SuiAddressType\n}\n\n/**\n * Represents immutable properties of a liquidity pool.\n */\nexport type PoolImmutables = {\n  /**\n   * The address of the liquidity pool.\n   */\n  poolAddress: string\n\n  /**\n   * The tick spacing value used in the pool.\n   */\n  tickSpacing: string\n} & CoinPairType\n/**\n * \"Pool\" is the core module of Clmm protocol, which defines the trading pairs of \"clmmpool\".\n */\nexport type Pool = {\n  /**\n   * Represents the type or category of a liquidity pool.\n   */\n  poolType: string\n  /**\n   * The amount of coin a.\n   */\n  coinAmountA: number\n  /**\n   * The amount of coin b.\n   */\n  coinAmountB: number\n  /**\n   * The current sqrt price\n   */\n  current_sqrt_price: number\n  /**\n   * The current tick index\n   */\n  current_tick_index: number\n  /**\n   * The global fee growth of coin a as Q64.64\n   */\n  fee_growth_global_b: number\n  /**\n   * The global fee growth of coin b as Q64.64\n   */\n  fee_growth_global_a: number\n  /**\n   * The amounts of coin a owend to protocol\n   */\n  fee_protocol_coin_a: number\n  /**\n   * The amounts of coin b owend to protocol\n   */\n  fee_protocol_coin_b: number\n  /**\n   * The numerator of fee rate, the denominator is 1_000_000.\n   */\n  fee_rate: number\n  /**\n   * is the pool pause\n   */\n  is_pause: boolean\n  /**\n   * The liquidity of current tick index\n   */\n  liquidity: number\n  /**\n   * The pool index\n   */\n  index: number\n  /**\n   * The positions manager\n   */\n  position_manager: {\n    positions_handle: string\n    size: number\n  }\n  /**\n   * The rewarder manager\n   */\n  rewarder_infos: Array<Rewarder>\n  rewarder_last_updated_time: string\n  /**\n   * The tick manager handle\n   */\n  ticks_handle: string\n  /**\n   * The url for pool and position\n   */\n  uri: string\n  /**\n   * The name for pool\n   */\n  name: string\n} & PoolImmutables\n\nexport type Rewarder = {\n  /**\n   * The coin address where rewards will be distributed.\n   */\n  coinAddress: string\n  /**\n   * The rate of emissions in coins per second.\n   */\n  emissions_per_second: number\n  /**\n   * The global growth factor influencing reward emissions.\n   */\n  growth_global: number\n  /**\n   * The total emissions in coins that occur every day.\n   */\n  emissionsEveryDay: number\n}\n/**\n * Configuration settings for the Cryptocurrency Liquidity Mining Module (CLMM).\n */\nexport type ClmmConfig = {\n  /**\n   * Identifier of the pools for liquidity mining.\n   */\n  pools_id: SuiObjectIdType\n\n  /**\n   * Identifier of the global configuration for the module.\n   */\n  global_config_id: SuiObjectIdType\n\n  /**\n   * Identifier of the administrative capacity for the module.\n   */\n  admin_cap_id: SuiObjectIdType\n\n  /**\n   * Identifier of the global vault for the module.\n   */\n  global_vault_id: SuiObjectIdType\n\n  /**\n   * Optional identifier of partners for the liquidity mining module.\n   */\n  partners_id?: SuiObjectIdType\n}\n\n/**\n * Represents an event to create a liquidity mining partner.\n */\nexport type CreatePartnerEvent = {\n  /**\n   * The name of the liquidity mining partner.\n   */\n  name: string\n\n  /**\n   * The recipient's address for the partner.\n   */\n  recipient: SuiAddressType\n\n  /**\n   * Identifier of the partner.\n   */\n  partner_id: SuiObjectIdType\n\n  /**\n   * Identifier of the partner's capacity.\n   */\n  partner_cap_id: SuiObjectIdType\n\n  /**\n   * The fee rate associated with the partner.\n   */\n  fee_rate: string\n\n  /**\n   * The starting epoch of the partnership.\n   */\n  start_epoch: string\n\n  /**\n   * The ending epoch of the partnership.\n   */\n  end_epoch: string\n}\n\n/**\n * Represents a coin asset with address, object ID, and balance information.\n */\nexport type CoinAsset = {\n  /**\n   * The address type of the coin asset.\n   */\n  coinAddress: SuiAddressType\n\n  /**\n   * The object identifier of the coin asset.\n   */\n  coinObjectId: SuiObjectIdType\n\n  /**\n   * The balance amount of the coin asset.\n   */\n  balance: bigint\n}\n\n/**\n * Represents a faucet coin configuration.\n */\nexport type FaucetCoin = {\n  /**\n   * The name or identifier of the transaction module.\n   */\n  transactionModule: string\n\n  /**\n   * The supply ID or object identifier of the faucet coin.\n   */\n  suplyID: SuiObjectIdType\n\n  /**\n   * The number of decimal places used for the faucet coin.\n   */\n  decimals: number\n}\n\n/**\n * Represents parameters for creating a liquidity pool.\n */\nexport type CreatePoolParams = {\n  /**\n   * The tick spacing value used for the pool.\n   */\n  tick_spacing: number\n\n  /**\n   * The initial square root price value for the pool.\n   */\n  initialize_sqrt_price: string\n\n  /**\n   * The Uniform Resource Identifier (URI) associated with the pool.\n   */\n  uri: string\n} & CoinPairType\n\n/**\n * Represents parameters for adding liquidity to a created liquidity pool.\n * Extends the CreatePoolParams type.\n */\nexport type CreatePoolAddLiquidityParams = CreatePoolParams & {\n  /**\n   * The amount of the first coin to be added as liquidity.\n   * Can be a number or a string.\n   */\n  amount_a: number | string\n\n  /**\n   * The amount of the second coin to be added as liquidity.\n   * Can be a number or a string.\n   */\n  amount_b: number | string\n\n  /**\n   * Indicates whether the amount of the first coin is fixed.\n   */\n  fix_amount_a: boolean\n\n  /**\n   * The lower tick index for liquidity provision.\n   */\n  tick_lower: number\n\n  /**\n   * The upper tick index for liquidity provision.\n   */\n  tick_upper: number\n\n  metadata_a: SuiObjectIdType\n  metadata_b: SuiObjectIdType\n\n  /**\n   * The allowed slippage percentage for the liquidity provision.\n   */\n  slippage: number\n}\n\nexport type FetchParams = {\n  pool_id: SuiObjectIdType\n} & CoinPairType\n\ntype CommonParams = {\n  /**\n   * The object id about which pool you want to operation.\n   */\n  pool_id: SuiObjectIdType\n  /**\n   * The object id about position.\n   */\n  pos_id: SuiObjectIdType\n}\n\nexport type AddLiquidityFixTokenParams = {\n  /**\n   * If fixed amount A, you must set amount_a, amount_b will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n   */\n  amount_a: number | string\n  /**\n   * If fixed amount B, you must set amount_b, amount_a will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n   */\n  amount_b: number | string\n  /**\n   * Price slippage point.\n   */\n  slippage: number\n  /**\n   * true means fixed coinA amount, false means fixed coinB amount\n   */\n  fix_amount_a: boolean\n  /**\n   * control whether or not to create a new position or add liquidity on existed position.\n   */\n  is_open: boolean\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityParams = {\n  /**\n   * The actual change in liquidity that has been added.\n   */\n  delta_liquidity: string\n  /**\n   * The max limit about used coin a amount\n   */\n  max_amount_a: number | string\n  /**\n   * The max limit about used coin b amount.\n   */\n  max_amount_b: number | string\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityCommonParams = {\n  /**\n   * Represents the index of the lower tick boundary.\n   */\n  tick_lower: string | number\n  /**\n   * Represents the index of the upper tick boundary.\n   */\n  tick_upper: string | number\n  /**\n   * If you already has one position, you can select collect fees while adding liquidity.\n   */\n  collect_fee: boolean\n  /**\n   * If these not empty, it will collect rewarder in this position, if you already open the position.\n   */\n  rewarder_coin_types: SuiAddressType[]\n} & CoinPairType &\n  CommonParams\n\n/**\n * Parameters for opening a position within a liquidity pool.\n * Extends the CoinPairType type.\n */\nexport type OpenPositionParams = CoinPairType & {\n  /**\n   * The lower tick index for the position.\n   */\n  tick_lower: string\n\n  /**\n   * The upper tick index for the position.\n   */\n  tick_upper: string\n\n  /**\n   * The object identifier of the liquidity pool.\n   */\n  pool_id: SuiObjectIdType\n}\n\n/**\n * Parameters for removing liquidity from a pool.\n * Extends the CoinPairType and CommonParams types.\n */\nexport type RemoveLiquidityParams = CoinPairType &\n  CommonParams & {\n    /**\n     * The change in liquidity amount to be removed.\n     */\n    delta_liquidity: string\n\n    /**\n     * The minimum amount of the first coin to be received.\n     */\n    min_amount_a: string\n\n    /**\n     * The minimum amount of the second coin to be received.\n     */\n    min_amount_b: string\n\n    /**\n     * Indicates whether to collect fees during the removal.\n     */\n    collect_fee: boolean\n\n    /**\n     * Coin types associated with rewarder contracts.\n     */\n    rewarder_coin_types: string[]\n  }\n\n/**\n * Parameters for closing a position within a liquidity pool.\n * Extends the CoinPairType, CommonParams, and CommonParams types.\n */\nexport type ClosePositionParams = CoinPairType &\n  CommonParams & {\n    /**\n     * Coin types associated with rewarder contracts.\n     */\n    rewarder_coin_types: SuiAddressType[]\n\n    /**\n     * The minimum amount of the first coin to be received.\n     */\n    min_amount_a: string\n\n    /**\n     * The minimum amount of the second coin to be received.\n     */\n    min_amount_b: string\n\n    /**\n     * Indicates whether to collect fees during the closing.\n     */\n    collect_fee: boolean\n  } & CoinPairType &\n  CommonParams\n/**\n * Represents parameters for collecting fees.\n */\nexport type CollectFeeParams = CommonParams & CoinPairType\n\n/**\n * Represents parameters for creating a test transfer transaction payload.\n */\nexport type createTestTransferTxPayloadParams = {\n  /**\n   * The recipient account address.\n   */\n  account: string\n\n  /**\n   * The value to transfer.\n   */\n  value: number\n}\n\n/**\n * Represents parameters for calculating rates in a swap.\n */\nexport type CalculateRatesParams = {\n  /**\n   * The number of decimal places for token A.\n   */\n  decimalsA: number\n\n  /**\n   * The number of decimal places for token B.\n   */\n  decimalsB: number\n\n  /**\n   * Specifies if the swap is from token A to token B.\n   */\n  a2b: boolean\n\n  /**\n   * Specifies if the swap amount is specified in token A.\n   */\n  byAmountIn: boolean\n\n  /**\n   * The amount to swap.\n   */\n  amount: BN\n\n  /**\n   * An array of tick data for swap ticks.\n   */\n  swapTicks: Array<TickData>\n\n  /**\n   * The current pool information.\n   */\n  currentPool: Pool\n}\n\n/**\n * Represents the result of calculating rates in a swap.\n */\nexport type CalculateRatesResult = {\n  /**\n   * The estimated amount in token A.\n   */\n  estimatedAmountIn: BN\n\n  /**\n   * The estimated amount in token B.\n   */\n  estimatedAmountOut: BN\n\n  /**\n   * The estimated ending square root price.\n   */\n  estimatedEndSqrtPrice: BN\n\n  /**\n   * The estimated fee amount.\n   */\n  estimatedFeeAmount: BN\n\n  /**\n   * Indicates if the estimated amount exceeds the limit.\n   */\n  isExceed: boolean\n\n  /**\n   * The extra compute limit.\n   */\n  extraComputeLimit: number\n\n  /**\n   * Specifies if the swap is from token A to token B.\n   */\n  aToB: boolean\n\n  /**\n   * Specifies if the swap amount is specified in token A.\n   */\n  byAmountIn: boolean\n\n  /**\n   * The amount to swap.\n   */\n  amount: BN\n\n  /**\n   * The price impact percentage.\n   */\n  priceImpactPct: number\n}\n\n/**\n * Represents parameters for a swap operation.\n */\nexport type SwapParams = {\n  /**\n   * The identifier of the pool.\n   */\n  pool_id: SuiObjectIdType\n\n  /**\n   * Specifies if the swap is from token A to token B.\n   */\n  a2b: boolean\n\n  /**\n   * Specifies if the swap amount is specified in token A.\n   */\n  by_amount_in: boolean\n\n  /**\n   * The swap amount.\n   */\n  amount: string\n\n  /**\n   * The amount limit for the swap.\n   */\n  amount_limit: string\n\n  /**\n   * The optional swap partner.\n   */\n  swap_partner?: string\n} & CoinPairType\n\n/**\n * Represents parameters for a pre-swap operation.\n */\nexport type PreSwapParams = {\n  /**\n   * The pool information for the pre-swap.\n   */\n  pool: Pool\n\n  /**\n   * The current square root price.\n   */\n  currentSqrtPrice: number\n\n  /**\n   * The number of decimal places for token A.\n   */\n  decimalsA: number\n\n  /**\n   * The number of decimal places for token B.\n   */\n  decimalsB: number\n\n  /**\n   * Specifies if the swap is from token A to token B.\n   */\n  a2b: boolean\n\n  /**\n   * Specifies if the swap amount is specified in token A.\n   */\n  byAmountIn: boolean\n\n  /**\n   * The swap amount.\n   */\n  amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for a pre-swap operation with multiple pools.\n */\nexport type PreSwapWithMultiPoolParams = {\n  /**\n   * An array of pool addresses for the pre-swap.\n   */\n  poolAddresses: string[]\n\n  /**\n   * Specifies if the swap is from token A to token B.\n   */\n  a2b: boolean\n\n  /**\n   * Specifies if the swap amount is specified in token A.\n   */\n  byAmountIn: boolean\n\n  /**\n   * The swap amount.\n   */\n  amount: string\n} & CoinPairType\n/**\n * If changes in liquidity are required before the swap, then this parameter should be passed.\n */\nexport type PreSwapLpChangeParams = {\n  /**\n   * Unique identifier for the liquidity pool involved in the transaction.\n   */\n  pool_id: string\n\n  /**\n   * Lower bound of the liquidity range. In AMM models, like Uniswap V3, liquidity is provided within specific price ranges. This represents the lower limit of that range.\n   */\n  tick_lower: number\n\n  /**\n   * Upper bound of the liquidity range, corresponding to the lower bound. This defines the upper limit of the range where liquidity is provided.\n   */\n  tick_upper: number\n\n  /**\n   * The change in liquidity, which can be a large number and is thus represented as a string. It can be positive or negative, indicating an increase or decrease in liquidity.\n   */\n  delta_liquidity: number\n\n  /**\n   * A boolean value indicating whether the 'delta_liquidity' represents an increase (true) or decrease (false) in liquidity.\n   */\n  is_increase: boolean\n}\n/**\n * Represents parameters for a transitional pre-swap operation with multiple pools.\n */\nexport type TransPreSwapWithMultiPoolParams = {\n  /**\n   * The address of the pool for the transitional pre-swap.\n   */\n  poolAddress: string\n\n  /**\n   * Specifies if the swap is from token A to token B.\n   */\n  a2b: boolean\n\n  /**\n   * Specifies if the swap amount is specified in token A.\n   */\n  byAmountIn: boolean\n\n  /**\n   * The swap amount.\n   */\n  amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for collecting rewarder fees.\n */\nexport type CollectRewarderParams = {\n  /**\n   * The identifier of the pool.\n   */\n  pool_id: SuiObjectIdType\n\n  /**\n   * The identifier of the position.\n   */\n  pos_id: SuiObjectIdType\n\n  /**\n   * Specifies if the fee should be collected.\n   */\n  collect_fee: boolean\n\n  /**\n   * An array of rewarder coin types.\n   */\n  rewarder_coin_types: SuiAddressType[]\n} & CoinPairType\n\n/**\n * Represents the amount owed by a rewarder.\n */\nexport type RewarderAmountOwed = {\n  /**\n   * The amount owed.\n   */\n  amount_owed: BN\n\n  /**\n   * The address of the coin.\n   */\n  coin_address: string\n}\n\n/**\n * Utility function to retrieve packager configurations from a package object.\n * @param {Package<T>} packageObj - The package object containing configurations.\n * @throws {Error} Throws an error if the package does not have a valid config.\n * @returns {T} The retrieved configuration.\n */\nexport function getPackagerConfigs<T>(packageObj: Package<T>) {\n  if (packageObj.config === undefined) {\n    throw new ClmmpoolsError(`package: ${packageObj.package_id}  not config in sdk SdkOptions`, ConfigErrorCode.InvalidConfig)\n  }\n  return packageObj.config\n}\n\nexport type PositionTransactionInfo = {\n  index: string\n  txDigest: string\n  packageId: string\n  transactionModule: string\n  sender: string\n  type: string\n  timestampMs: string\n  parsedJson: any\n}\n\nexport type PoolTransactionInfo = {\n  index: string\n  tx: string\n  sender: string\n  type: string\n  block_time: string\n  parsedJson: any\n}\n\nexport const poolFilterEvenTypes = ['RemoveLiquidityEvent', 'SwapEvent', 'AddLiquidityEvent']\n","import BN from 'bn.js'\n\n/**\n * Represents input data for adding liquidity to a pool.\n */\nexport type LiquidityInput = {\n  /**\n   * The amount of coin A.\n   */\n  coinAmountA: BN\n\n  /**\n   * The amount of coin B.\n   */\n  coinAmountB: BN\n\n  /**\n   * The maximum amount of token A.\n   */\n  tokenMaxA: BN\n\n  /**\n   * The maximum amount of token B.\n   */\n  tokenMaxB: BN\n\n  /**\n   * The liquidity amount.\n   */\n  liquidityAmount: BN\n\n  fix_amount_a: boolean\n}\n\n/**\n * Represents the direction of a swap.\n */\nexport enum SwapDirection {\n  /**\n   * Swap from coin A to coin B.\n   */\n  A2B = 'a2b',\n\n  /**\n   * Swap from coin B to coin A.\n   */\n  B2A = 'b2a',\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { TickMath } from './tick'\nimport { MathUtil } from './utils'\n\nconst D365 = new BN(365)\nconst H24 = new BN(24)\nconst S3600 = new BN(3600)\nconst B05 = new BN(0.5)\n\nexport function estPoolAPR(preBlockReward: BN, rewardPrice: BN, totalTradingFee: BN, totalLiquidityValue: BN): BN {\n  const annualRate = D365.mul(H24).mul(S3600).mul(B05)\n\n  const APR = annualRate.mul(preBlockReward.mul(rewardPrice).add(totalTradingFee).div(totalLiquidityValue))\n\n  return APR\n}\n\nfunction calculatePoolValidTVL(\n  amountA: BN,\n  amountB: BN,\n  decimalsA: number,\n  decimalsB: number,\n  coinAPrice: Decimal,\n  coinBPrice: Decimal\n): Decimal {\n  const poolValidAmountA = new Decimal(amountA.toString()).div(new Decimal(10 ** decimalsA))\n  const poolValidAmountB = new Decimal(amountB.toString()).div(new Decimal(10 ** decimalsB))\n\n  const TVL = poolValidAmountA.mul(coinAPrice).add(poolValidAmountB.mul(coinBPrice))\n\n  return TVL\n}\n\nexport type estPosAPRResult = {\n  feeAPR: Decimal\n  posRewarder0APR: Decimal\n  posRewarder1APR: Decimal\n  posRewarder2APR: Decimal\n}\n\nexport function estPositionAPRWithDeltaMethod(\n  currentTickIndex: number,\n  lowerTickIndex: number,\n  upperTickIndex: number,\n  currentSqrtPriceX64: BN,\n  poolLiquidity: BN,\n  decimalsA: number,\n  decimalsB: number,\n  decimalsRewarder0: number,\n  decimalsRewarder1: number,\n  decimalsRewarder2: number,\n  feeRate: number,\n  amountAStr: string,\n  amountBStr: string,\n  poolAmountA: BN,\n  poolAmountB: BN,\n  swapVolumeStr: string,\n  poolRewarders0Str: string,\n  poolRewarders1Str: string,\n  poolRewarders2Str: string,\n  coinAPriceStr: string,\n  coinBPriceStr: string,\n  rewarder0PriceStr: string,\n  rewarder1PriceStr: string,\n  rewarder2PriceStr: string\n): estPosAPRResult {\n  const amountA = new Decimal(amountAStr)\n  const amountB = new Decimal(amountBStr)\n  const swapVolume = new Decimal(swapVolumeStr)\n  const poolRewarders0 = new Decimal(poolRewarders0Str)\n  const poolRewarders1 = new Decimal(poolRewarders1Str)\n  const poolRewarders2 = new Decimal(poolRewarders2Str)\n  const coinAPrice = new Decimal(coinAPriceStr)\n  const coinBPrice = new Decimal(coinBPriceStr)\n  const rewarder0Price = new Decimal(rewarder0PriceStr)\n  const rewarder1Price = new Decimal(rewarder1PriceStr)\n  const rewarder2Price = new Decimal(rewarder2PriceStr)\n\n  const lowerSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(lowerTickIndex)\n  const upperSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(upperTickIndex)\n  const lowerSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(lowerSqrtPriceX64)).round()\n  const upperSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(upperSqrtPriceX64)).round()\n  const currentSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(currentSqrtPriceX64)).round()\n  let deltaLiquidity\n  const liquidityAmount0 = amountA\n    .mul(new Decimal(10 ** decimalsA))\n    .mul(upperSqrtPriceD.mul(lowerSqrtPriceD))\n    .div(upperSqrtPriceD.sub(lowerSqrtPriceD))\n    .round()\n  const liquidityAmount1 = amountB\n    .mul(new Decimal(10 ** decimalsB))\n    .div(upperSqrtPriceD.sub(lowerSqrtPriceD))\n    .round()\n  if (currentTickIndex < lowerTickIndex) {\n    deltaLiquidity = liquidityAmount0\n  } else if (currentTickIndex > upperTickIndex) {\n    deltaLiquidity = liquidityAmount1\n  } else {\n    deltaLiquidity = Decimal.min(liquidityAmount0, liquidityAmount1)\n  }\n  const deltaY = deltaLiquidity.mul(currentSqrtPriceD.sub(lowerSqrtPriceD))\n  const deltaX = deltaLiquidity.mul(upperSqrtPriceD.sub(currentSqrtPriceD)).div(currentSqrtPriceD.mul(upperSqrtPriceD))\n  const posValidTVL = deltaX\n    .div(new Decimal(10 ** decimalsA))\n    .mul(coinAPrice)\n    .add(deltaY.div(new Decimal(10 ** decimalsB).mul(coinBPrice)))\n  const poolValidTVL = calculatePoolValidTVL(poolAmountA, poolAmountB, decimalsA, decimalsB, coinAPrice, coinBPrice)\n  const posValidRate = posValidTVL.div(poolValidTVL)\n\n  const feeAPR = deltaLiquidity.eq(new Decimal(0))\n    ? new Decimal(0)\n    : new Decimal(feeRate / 10000)\n        .mul(swapVolume)\n        .mul(new Decimal(deltaLiquidity.toString()).div(new Decimal(poolLiquidity.toString()).add(new Decimal(deltaLiquidity.toString()))))\n        .div(posValidTVL)\n\n  const aprCoe = posValidRate.eq(new Decimal(0)) ? new Decimal(0) : posValidRate.mul(new Decimal(36500 / 7)).div(posValidTVL)\n  const posRewarder0APR = poolRewarders0\n    .div(new Decimal(10 ** decimalsRewarder0))\n    .mul(rewarder0Price)\n    .mul(aprCoe)\n  const posRewarder1APR = poolRewarders1\n    .div(new Decimal(10 ** decimalsRewarder1))\n    .mul(rewarder1Price)\n    .mul(aprCoe)\n  const posRewarder2APR = poolRewarders2\n    .div(new Decimal(10 ** decimalsRewarder2))\n    .mul(rewarder2Price)\n    .mul(aprCoe)\n  return {\n    feeAPR,\n    posRewarder0APR,\n    posRewarder1APR,\n    posRewarder2APR,\n  }\n}\n\nexport function estPositionAPRWithMultiMethod(\n  lowerUserPrice: number,\n  upperUserPrice: number,\n  lowerHistPrice: number,\n  upperHistPrice: number\n): Decimal {\n  const retroLower = Math.max(lowerUserPrice, lowerHistPrice)\n  const retroUpper = Math.min(upperUserPrice, upperHistPrice)\n  const retroRange = retroUpper - retroLower\n  const userRange = upperUserPrice - lowerUserPrice\n  const histRange = upperHistPrice - lowerHistPrice\n  const userRangeD = new Decimal(userRange.toString())\n  const histRangeD = new Decimal(histRange.toString())\n  const retroRangeD = new Decimal(retroRange.toString())\n\n  let m = new Decimal('0')\n  if (retroRange < 0) {\n    m = new Decimal('0')\n  } else if (userRange === retroRange) {\n    m = histRangeD.div(retroRangeD)\n  } else if (histRange === retroRange) {\n    m = retroRangeD.div(userRangeD)\n  } else {\n    m = retroRangeD.mul(retroRangeD).div(histRangeD).div(userRangeD)\n  }\n\n  return m\n}\n","/* eslint-disable import/no-unresolved */\n/* eslint-disable no-bitwise */\nimport BN from 'bn.js'\nimport { asIntN, d } from '../utils'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport Decimal from '../utils/decimal'\nimport { MathUtil } from './utils'\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nconst BIT_PRECISION = 14\nconst LOG_B_2_X32 = '59543866431248'\nconst LOG_B_P_ERR_MARGIN_LOWER_X64 = '184467440737095516'\nconst LOG_B_P_ERR_MARGIN_UPPER_X64 = '15793534762490258745'\nconst TICK_BOUND = 443636\n\nfunction signedShiftLeft(n0: BN, shiftBy: number, bitWidth: number) {\n  const twosN0 = n0.toTwos(bitWidth).shln(shiftBy)\n  twosN0.imaskn(bitWidth + 1)\n  return twosN0.fromTwos(bitWidth)\n}\n\nfunction signedShiftRight(n0: BN, shiftBy: number, bitWidth: number) {\n  const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy)\n  twoN0.imaskn(bitWidth - shiftBy + 1)\n  return twoN0.fromTwos(bitWidth - shiftBy)\n}\n\nfunction tickIndexToSqrtPricePositive(tick: number) {\n  let ratio: BN\n\n  if ((tick & 1) !== 0) {\n    ratio = new BN('79232123823359799118286999567')\n  } else {\n    ratio = new BN('79228162514264337593543950336')\n  }\n\n  if ((tick & 2) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79236085330515764027303304731')), 96, 256)\n  }\n  if ((tick & 4) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79244008939048815603706035061')), 96, 256)\n  }\n  if ((tick & 8) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79259858533276714757314932305')), 96, 256)\n  }\n  if ((tick & 16) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79291567232598584799939703904')), 96, 256)\n  }\n  if ((tick & 32) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79355022692464371645785046466')), 96, 256)\n  }\n  if ((tick & 64) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79482085999252804386437311141')), 96, 256)\n  }\n  if ((tick & 128) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('79736823300114093921829183326')), 96, 256)\n  }\n  if ((tick & 256) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('80248749790819932309965073892')), 96, 256)\n  }\n  if ((tick & 512) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('81282483887344747381513967011')), 96, 256)\n  }\n  if ((tick & 1024) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('83390072131320151908154831281')), 96, 256)\n  }\n  if ((tick & 2048) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('87770609709833776024991924138')), 96, 256)\n  }\n  if ((tick & 4096) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('97234110755111693312479820773')), 96, 256)\n  }\n  if ((tick & 8192) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('119332217159966728226237229890')), 96, 256)\n  }\n  if ((tick & 16384) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('179736315981702064433883588727')), 96, 256)\n  }\n  if ((tick & 32768) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('407748233172238350107850275304')), 96, 256)\n  }\n  if ((tick & 65536) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('2098478828474011932436660412517')), 96, 256)\n  }\n  if ((tick & 131072) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('55581415166113811149459800483533')), 96, 256)\n  }\n  if ((tick & 262144) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('38992368544603139932233054999993551')), 96, 256)\n  }\n\n  return signedShiftRight(ratio, 32, 256)\n}\n\nfunction tickIndexToSqrtPriceNegative(tickIndex: number) {\n  const tick = Math.abs(tickIndex)\n  let ratio: BN\n\n  if ((tick & 1) !== 0) {\n    ratio = new BN('18445821805675392311')\n  } else {\n    ratio = new BN('18446744073709551616')\n  }\n\n  if ((tick & 2) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18444899583751176498')), 64, 256)\n  }\n  if ((tick & 4) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18443055278223354162')), 64, 256)\n  }\n  if ((tick & 8) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18439367220385604838')), 64, 256)\n  }\n  if ((tick & 16) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18431993317065449817')), 64, 256)\n  }\n  if ((tick & 32) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18417254355718160513')), 64, 256)\n  }\n  if ((tick & 64) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18387811781193591352')), 64, 256)\n  }\n  if ((tick & 128) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18329067761203520168')), 64, 256)\n  }\n  if ((tick & 256) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('18212142134806087854')), 64, 256)\n  }\n  if ((tick & 512) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('17980523815641551639')), 64, 256)\n  }\n  if ((tick & 1024) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('17526086738831147013')), 64, 256)\n  }\n  if ((tick & 2048) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('16651378430235024244')), 64, 256)\n  }\n  if ((tick & 4096) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('15030750278693429944')), 64, 256)\n  }\n  if ((tick & 8192) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('12247334978882834399')), 64, 256)\n  }\n  if ((tick & 16384) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('8131365268884726200')), 64, 256)\n  }\n  if ((tick & 32768) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('3584323654723342297')), 64, 256)\n  }\n  if ((tick & 65536) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('696457651847595233')), 64, 256)\n  }\n  if ((tick & 131072) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('26294789957452057')), 64, 256)\n  }\n  if ((tick & 262144) !== 0) {\n    ratio = signedShiftRight(ratio.mul(new BN('37481735321082')), 64, 256)\n  }\n\n  return ratio\n}\n\nexport class TickMath {\n  static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN {\n    return MathUtil.toX64(price.mul(Decimal.pow(10, decimalsB - decimalsA)).sqrt())\n  }\n\n  static sqrtPriceX64ToPrice(sqrtPriceX64: BN, decimalsA: number, decimalsB: number): Decimal {\n    return MathUtil.fromX64(sqrtPriceX64)\n      .pow(2)\n      .mul(Decimal.pow(10, decimalsA - decimalsB))\n  }\n\n  static tickIndexToSqrtPriceX64(tickIndex: number): BN {\n    if (tickIndex > 0) {\n      return new BN(tickIndexToSqrtPricePositive(tickIndex))\n    }\n    return new BN(tickIndexToSqrtPriceNegative(tickIndex))\n  }\n\n  static sqrtPriceX64ToTickIndex(sqrtPriceX64: BN): number {\n    if (sqrtPriceX64.gt(new BN(MAX_SQRT_PRICE)) || sqrtPriceX64.lt(new BN(MIN_SQRT_PRICE))) {\n      throw new ClmmpoolsError('Provided sqrtPrice is not within the supported sqrtPrice range.', MathErrorCode.InvalidSqrtPrice)\n    }\n\n    const msb = sqrtPriceX64.bitLength() - 1\n    const adjustedMsb = new BN(msb - 64)\n    const log2pIntegerX32 = signedShiftLeft(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 = signedShiftRight(logbpX64.sub(new BN(LOG_B_P_ERR_MARGIN_LOWER_X64)), 64, 128).toNumber()\n    const tickHigh = signedShiftRight(logbpX64.add(new BN(LOG_B_P_ERR_MARGIN_UPPER_X64)), 64, 128).toNumber()\n\n    if (tickLow === tickHigh) {\n      return tickLow\n    }\n    const derivedTickHighSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(tickHigh)\n    if (derivedTickHighSqrtPriceX64.lte(sqrtPriceX64)) {\n      return tickHigh\n    }\n    return tickLow\n  }\n\n  static tickIndexToPrice(tickIndex: number, decimalsA: number, decimalsB: number): Decimal {\n    return TickMath.sqrtPriceX64ToPrice(TickMath.tickIndexToSqrtPriceX64(tickIndex), decimalsA, decimalsB)\n  }\n\n  static priceToTickIndex(price: Decimal, decimalsA: number, decimalsB: number): number {\n    return TickMath.sqrtPriceX64ToTickIndex(TickMath.priceToSqrtPriceX64(price, decimalsA, decimalsB))\n  }\n\n  static priceToInitializableTickIndex(price: Decimal, decimalsA: number, decimalsB: number, tickSpacing: number): number {\n    return TickMath.getInitializableTickIndex(TickMath.priceToTickIndex(price, decimalsA, decimalsB), tickSpacing)\n  }\n\n  static getInitializableTickIndex(tickIndex: number, tickSpacing: number): number {\n    return tickIndex - (tickIndex % tickSpacing)\n  }\n\n  /**\n   *\n   * @param tickIndex\n   * @param tickSpacing\n   * @returns\n   */\n  static getNextInitializableTickIndex(tickIndex: number, tickSpacing: number) {\n    return TickMath.getInitializableTickIndex(tickIndex, tickSpacing) + tickSpacing\n  }\n\n  static getPrevInitializableTickIndex(tickIndex: number, tickSpacing: number) {\n    return TickMath.getInitializableTickIndex(tickIndex, tickSpacing) - tickSpacing\n  }\n}\n\nexport function getTickDataFromUrlData(ticks: any) {\n  const tickdatas: any[] = []\n  for (const tick of ticks) {\n    const td: any = {\n      objectId: tick.objectId,\n      index: Number(asIntN(BigInt(tick.index)).toString()),\n      sqrtPrice: tick.sqrtPrice,\n      liquidityNet: new BN(BigInt.asIntN(128, BigInt(BigInt(tick.liquidityNet.toString()))).toString()),\n      liquidityGross: tick.liquidityGross,\n      feeGrowthOutsideA: tick.feeGrowthOutsideA,\n      feeGrowthOutsideB: tick.feeGrowthOutsideB,\n      rewardersGrowthOutside: [\n        new BN(tick.rewardersGrowthOutside[0]),\n        new BN(tick.rewardersGrowthOutside[1]),\n        new BN(tick.rewardersGrowthOutside[2]),\n      ],\n    }\n    tickdatas.push(td)\n  }\n  return tickdatas\n}\n\nexport function tickScore(tickIndex: number) {\n  return d(tickIndex).add(d(TICK_BOUND))\n}\n","import BN from 'bn.js'\nimport { asUintN, d } from '../utils'\nimport { LiquidityInput } from '../types/liquidity'\nimport { ClmmpoolsError, MathErrorCode, CoinErrorCode } from '../errors/errors'\nimport type { ClmmpoolData, TickData } from '../types/clmmpool'\nimport { FEE_RATE_DENOMINATOR, MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport Decimal from '../utils/decimal'\nimport { SwapUtils } from './swap'\nimport { TickMath } from './tick'\nimport { MathUtil, ONE, U64_MAX, ZERO } from './utils'\n\nexport type SwapStepResult = {\n  amountIn: BN\n  amountOut: BN\n  nextSqrtPrice: BN\n  feeAmount: BN\n}\n\nexport type SwapResult = {\n  amountIn: BN\n  amountOut: BN\n  feeAmount: BN\n  refAmount: BN\n  nextSqrtPrice: BN\n  crossTickNum: number\n}\n\nexport type CoinAmounts = {\n  coinA: BN\n  coinB: BN\n}\n\nexport function toCoinAmount(a: number, b: number): CoinAmounts {\n  return {\n    coinA: new BN(a.toString()),\n    coinB: new BN(b.toString()),\n  }\n}\n\n/**\n * Get the amount A delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaA(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n  const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n  const numberator = liquidity.mul(sqrtPriceDiff).shln(64)\n  const denomminator = sqrtPrice0.mul(sqrtPrice1)\n  const quotient = numberator.div(denomminator)\n  const remainder = numberator.mod(denomminator)\n  const result = roundUp && !remainder.eq(ZERO) ? quotient.add(new BN(1)) : quotient\n  // if (MathUtil.isOverflow(result, 64)) {\n  //   throw new ClmmpoolsError('Result large than u64 max', MathErrorCode.IntegerDowncastOverflow)\n  // }\n  return result\n}\n\n/**\n * Get the amount B delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaB(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n  const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n  if (liquidity.eq(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n    return ZERO\n  }\n  const p = liquidity.mul(sqrtPriceDiff)\n  const shoudRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n  const result = shoudRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n  if (MathUtil.isOverflow(result, 64)) {\n    throw new ClmmpoolsError('Result large than u64 max', MathErrorCode.IntegerDowncastOverflow)\n  }\n  return result\n}\n\n/**\n * Get the next sqrt price from give a delta of token_a.\n * `new_sqrt_price = (sqrt_price * liquidity) / (liquidity +/- amount * sqrt_price)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceAUp(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n  if (amount.eq(ZERO)) {\n    return sqrtPrice\n  }\n  const numberator = MathUtil.checkMulShiftLeft(sqrtPrice, liquidity, 64, 256)\n  const liquidityShl64 = liquidity.shln(64)\n  const product = MathUtil.checkMul(sqrtPrice, amount, 256)\n  if (!byAmountIn && liquidityShl64.lte(product)) {\n    throw new ClmmpoolsError('getNextSqrtPriceAUp - Unable to divide liquidityShl64 by product', MathErrorCode.DivideByZero)\n  }\n  const nextSqrtPrice = byAmountIn\n    ? MathUtil.checkDivRoundUpIf(numberator, liquidityShl64.add(product), true)\n    : MathUtil.checkDivRoundUpIf(numberator, liquidityShl64.sub(product), true)\n  if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE))) {\n    throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price less than min sqrt price', CoinErrorCode.CoinAmountMinSubceeded)\n  }\n  if (nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n    throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price greater than max sqrt price', CoinErrorCode.CoinAmountMaxExceeded)\n  }\n\n  return nextSqrtPrice\n}\n\n/**\n * Get the next sqrt price from give a delta of token_b.\n * `new_sqrt_price = (sqrt_price +(delta_b / liquidity)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceBDown(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n  const deltaSqrtPrice = MathUtil.checkDivRoundUpIf(amount.shln(64), liquidity, !byAmountIn)\n  const nextSqrtPrice = byAmountIn ? sqrtPrice.add(deltaSqrtPrice) : sqrtPrice.sub(deltaSqrtPrice)\n\n  if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE)) || nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n    throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price out of bounds', CoinErrorCode.SqrtPriceOutOfBounds)\n  }\n\n  return nextSqrtPrice\n}\n\n/**\n * Get next sqrt price from input parameter.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param aToB\n * @returns\n */\nexport function getNextSqrtPriceFromInput(sqrtPrice: BN, liquidity: BN, amount: BN, aToB: boolean): BN {\n  return aToB ? getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, true) : getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, true)\n}\n\n/**\n * Get the next sqrt price from output parameters.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param a2b\n * @returns\n */\nexport function getNextSqrtPriceFromOutput(sqrtPrice: BN, liquidity: BN, amount: BN, a2b: boolean): BN {\n  return a2b ? getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, false) : getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, false)\n}\n\n/**\n * Get the amount of delta_a or delta_b from input parameters, and round up result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaUpFromInput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n  const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n  if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n    return ZERO\n  }\n\n  let result\n  if (a2b) {\n    const numberator = new BN(liquidity).mul(new BN(sqrtPriceDiff)).shln(64)\n    const denomminator = targetSqrtPrice.mul(currentSqrtPrice)\n    const quotient = numberator.div(denomminator)\n    const remainder = numberator.mod(denomminator)\n    result = !remainder.eq(ZERO) ? quotient.add(ONE) : quotient\n  } else {\n    const product = new BN(liquidity).mul(new BN(sqrtPriceDiff))\n    const shoudRoundUp = product.and(U64_MAX).gt(ZERO)\n    result = shoudRoundUp ? product.shrn(64).add(ONE) : product.shrn(64)\n  }\n  return result\n}\n\n/**\n * Get the amount of delta_a or delta_b from output parameters, and round down result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaDownFromOutput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n  const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n  if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n    return ZERO\n  }\n\n  let result\n  if (a2b) {\n    const product = liquidity.mul(sqrtPriceDiff)\n    result = product.shrn(64)\n  } else {\n    const numberator = liquidity.mul(sqrtPriceDiff).shln(64)\n    const denomminator = targetSqrtPrice.mul(currentSqrtPrice)\n    result = numberator.div(denomminator)\n  }\n  return result\n}\n\n/**\n * Simulate per step of swap on every tick.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param amount\n * @param feeRate\n * @param byAmountIn\n * @returns\n */\nexport function computeSwapStep(\n  currentSqrtPrice: BN,\n  targetSqrtPrice: BN,\n  liquidity: BN,\n  amount: BN,\n  feeRate: BN,\n  byAmountIn: boolean\n): SwapStepResult {\n  if (liquidity === ZERO) {\n    return {\n      amountIn: ZERO,\n      amountOut: ZERO,\n      nextSqrtPrice: targetSqrtPrice,\n      feeAmount: ZERO,\n    }\n  }\n  const a2b = currentSqrtPrice.gte(targetSqrtPrice)\n  let amountIn: BN\n  let amountOut: BN\n  let nextSqrtPrice: BN\n  let feeAmount: BN\n  if (byAmountIn) {\n    const amountRemain = MathUtil.checkMulDivFloor(\n      amount,\n      MathUtil.checkUnsignedSub(FEE_RATE_DENOMINATOR, feeRate),\n      FEE_RATE_DENOMINATOR,\n      64\n    )\n    const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n    if (maxAmountIn.gt(amountRemain)) {\n      amountIn = amountRemain\n      feeAmount = MathUtil.checkUnsignedSub(amount, amountRemain)\n      nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amountRemain, a2b)\n    } else {\n      amountIn = maxAmountIn\n      feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n      nextSqrtPrice = targetSqrtPrice\n    }\n    amountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n  } else {\n    const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n    if (maxAmountOut.gt(amount)) {\n      amountOut = amount\n      nextSqrtPrice = getNextSqrtPriceFromOutput(currentSqrtPrice, liquidity, amount, a2b)\n    } else {\n      amountOut = maxAmountOut\n      nextSqrtPrice = targetSqrtPrice\n    }\n    amountIn = getDeltaUpFromInput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n    feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n  }\n  return {\n    amountIn,\n    amountOut,\n    nextSqrtPrice,\n    feeAmount,\n  }\n}\n\n/**\n * Simulate swap by imput lots of ticks.\n * @param aToB\n * @param byAmountIn\n * @param amount\n * @param poolData\n * @param swapTicks\n * @returns\n */\nexport function computeSwap(\n  aToB: boolean,\n  byAmountIn: boolean,\n  amount: BN,\n  poolData: ClmmpoolData,\n  swapTicks: Array<TickData>\n): SwapResult {\n  let remainerAmount = amount\n  let currentLiquidity = poolData.liquidity\n  let { currentSqrtPrice } = poolData\n  const swapResult: SwapResult = {\n    amountIn: ZERO,\n    amountOut: ZERO,\n    feeAmount: ZERO,\n    refAmount: ZERO,\n    nextSqrtPrice: ZERO,\n    crossTickNum: 0,\n  }\n  let targetSqrtPrice\n  let signedLiquidityChange\n  const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(aToB)\n  for (const tick of swapTicks) {\n    if (aToB && poolData.currentTickIndex < tick.index) {\n      continue\n    }\n    if (!aToB && poolData.currentTickIndex >= tick.index) {\n      continue\n    }\n    if (tick === null) {\n      continue\n    }\n    if ((aToB && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!aToB && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n      targetSqrtPrice = sqrtPriceLimit\n    } else {\n      targetSqrtPrice = tick.sqrtPrice\n    }\n\n    const stepResult = computeSwapStep(currentSqrtPrice, targetSqrtPrice, currentLiquidity, remainerAmount, poolData.feeRate, byAmountIn)\n\n    if (!stepResult.amountIn.eq(ZERO)) {\n      remainerAmount = byAmountIn\n        ? remainerAmount.sub(stepResult.amountIn.add(stepResult.feeAmount))\n        : remainerAmount.sub(stepResult.amountOut)\n    }\n\n    swapResult.amountIn = swapResult.amountIn.add(stepResult.amountIn)\n    swapResult.amountOut = swapResult.amountOut.add(stepResult.amountOut)\n    swapResult.feeAmount = swapResult.feeAmount.add(stepResult.feeAmount)\n    if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n      signedLiquidityChange = tick.liquidityNet.mul(new BN(-1))\n\n      if (aToB) {\n        if (MathUtil.is_neg(signedLiquidityChange)) {\n          currentLiquidity = currentLiquidity.add(new BN(asUintN(BigInt(signedLiquidityChange.toString()), 128)))\n        } else {\n          currentLiquidity = currentLiquidity.add(signedLiquidityChange)\n        }\n      } else if (MathUtil.is_neg(signedLiquidityChange)) {\n        currentLiquidity = currentLiquidity.sub(new BN(asUintN(BigInt(signedLiquidityChange.toString()), 128)))\n      } else {\n        currentLiquidity = currentLiquidity.sub(signedLiquidityChange)\n      }\n\n      currentSqrtPrice = tick.sqrtPrice\n    } else {\n      currentSqrtPrice = stepResult.nextSqrtPrice\n    }\n    swapResult.crossTickNum += 1\n    if (remainerAmount.eq(ZERO)) {\n      break\n    }\n  }\n  swapResult.amountIn = swapResult.amountIn.add(swapResult.feeAmount)\n  swapResult.nextSqrtPrice = currentSqrtPrice\n  return swapResult\n}\n\n/**\n * Estimate liquidity for coin A\n * @param sqrtPriceX - coin A sqrtprice\n * @param sqrtPriceY - coin B sqrtprice\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinA(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n  const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n  const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n  const num = MathUtil.fromX64_BN(coinAmount.mul(upperSqrtPriceX64).mul(lowerSqrtPriceX64))\n  const dem = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n  return !num.isZero() && !dem.isZero() ? num.div(dem) : new BN(0)\n}\n\n/**\n * Estimate liquidity for coin B\n * @param sqrtPriceX - coin A sqrtprice\n * @param sqrtPriceY - coin B sqrtprice\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinB(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n  const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n  const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n  const delta = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n  return !delta.isZero() ? coinAmount.shln(64).div(delta) : new BN(0)\n}\n\nexport class ClmmPoolUtil {\n  /**\n   * Update fee rate.\n   * @param clmm - clmmpool data\n   * @param feeAmount - fee Amount\n   * @param refRate - ref rate\n   * @param protocolFeeRate - protocol fee rate\n   * @param iscoinA - is token A\n   * @returns percentage\n   */\n  static updateFeeRate(clmm: ClmmpoolData, feeAmount: BN, refRate: number, protocolFeeRate: number, iscoinA: boolean) {\n    const protocolFee = MathUtil.checkMulDivCeil(feeAmount, new BN(protocolFeeRate), FEE_RATE_DENOMINATOR, 64)\n    const refFee = refRate === 0 ? ZERO : MathUtil.checkMulDivFloor(feeAmount, new BN(refRate), FEE_RATE_DENOMINATOR, 64)\n    const poolFee = feeAmount.mul(protocolFee).mul(refFee)\n    if (iscoinA) {\n      clmm.feeProtocolCoinA = clmm.feeProtocolCoinA.add(protocolFee)\n    } else {\n      clmm.feeProtocolCoinB = clmm.feeProtocolCoinB.add(protocolFee)\n    }\n    if (poolFee.eq(ZERO) || clmm.liquidity.eq(ZERO)) {\n      return { refFee, clmm }\n    }\n    const growthFee = poolFee.shln(64).div(clmm.liquidity)\n    if (iscoinA) {\n      clmm.feeGrowthGlobalA = clmm.feeGrowthGlobalA.add(growthFee)\n    } else {\n      clmm.feeGrowthGlobalB = clmm.feeGrowthGlobalB.add(growthFee)\n    }\n    return { refFee, clmm }\n  }\n\n  /**\n   * Get token amount fron liquidity.\n   * @param liquidity - liquidity\n   * @param curSqrtPrice - Pool current sqrt price\n   * @param lowerSqrtPrice - position lower sqrt price\n   * @param upperSqrtPrice - position upper sqrt price\n   * @param roundUp - is round up\n   * @returns\n   */\n  static getCoinAmountFromLiquidity(\n    liquidity: BN,\n    curSqrtPrice: BN,\n    lowerSqrtPrice: BN,\n    upperSqrtPrice: BN,\n    roundUp: boolean\n  ): CoinAmounts {\n    const liq = new Decimal(liquidity.toString())\n    const curSqrtPriceStr = new Decimal(curSqrtPrice.toString())\n    const lowerPriceStr = new Decimal(lowerSqrtPrice.toString())\n    const upperPriceStr = new Decimal(upperSqrtPrice.toString())\n    let coinA\n    let coinB\n    if (curSqrtPrice.lt(lowerSqrtPrice)) {\n      coinA = MathUtil.toX64_Decimal(liq).mul(upperPriceStr.sub(lowerPriceStr)).div(lowerPriceStr.mul(upperPriceStr))\n      coinB = new Decimal(0)\n    } else if (curSqrtPrice.lt(upperSqrtPrice)) {\n      coinA = MathUtil.toX64_Decimal(liq).mul(upperPriceStr.sub(curSqrtPriceStr)).div(curSqrtPriceStr.mul(upperPriceStr))\n\n      coinB = MathUtil.fromX64_Decimal(liq.mul(curSqrtPriceStr.sub(lowerPriceStr)))\n    } else {\n      coinA = new Decimal(0)\n      coinB = MathUtil.fromX64_Decimal(liq.mul(upperPriceStr.sub(lowerPriceStr)))\n    }\n    if (roundUp) {\n      return {\n        coinA: new BN(coinA.ceil().toString()),\n        coinB: new BN(coinB.ceil().toString()),\n      }\n    }\n    return {\n      coinA: new BN(coinA.floor().toString()),\n      coinB: new BN(coinB.floor().toString()),\n    }\n  }\n\n  /**\n   * Estimate liquidity and token amount from one amounts\n   * @param lowerTick - lower tick\n   * @param upperTick - upper tick\n   * @param coinAmount - token amount\n   * @param iscoinA - is token A\n   * @param roundUp - is round up\n   * @param isIncrease - is increase\n   * @param slippage - slippage percentage\n   * @param curSqrtPrice - current sqrt price.\n   * @return IncreaseLiquidityInput\n   */\n  static estLiquidityAndcoinAmountFromOneAmounts(\n    lowerTick: number,\n    upperTick: number,\n    coinAmount: BN,\n    iscoinA: boolean,\n    roundUp: boolean,\n    slippage: number,\n    curSqrtPrice: BN\n  ): LiquidityInput {\n    const currentTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n    const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n    const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n    let liquidity\n    if (currentTick < lowerTick) {\n      if (!iscoinA) {\n        throw new ClmmpoolsError('lower tick cannot calculate liquidity by coinB', MathErrorCode.NotSupportedThisCoin)\n      }\n      liquidity = estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, coinAmount)\n    } else if (currentTick > upperTick) {\n      if (iscoinA) {\n        throw new ClmmpoolsError('upper tick cannot calculate liquidity by coinA', MathErrorCode.NotSupportedThisCoin)\n      }\n      liquidity = estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, coinAmount)\n    } else if (iscoinA) {\n      liquidity = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, coinAmount)\n    } else {\n      liquidity = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, coinAmount)\n    }\n    const coinAmounts = ClmmPoolUtil.getCoinAmountFromLiquidity(liquidity, curSqrtPrice, lowerSqrtPrice, upperSqrtPrice, roundUp)\n    const tokenLimitA = roundUp\n      ? d(coinAmounts.coinA.toString())\n          .mul(1 + slippage)\n          .toString()\n      : d(coinAmounts.coinA.toString())\n          .mul(1 - slippage)\n          .toString()\n\n    const tokenLimitB = roundUp\n      ? d(coinAmounts.coinB.toString())\n          .mul(1 + slippage)\n          .toString()\n      : d(coinAmounts.coinB.toString())\n          .mul(1 - slippage)\n          .toString()\n\n    return {\n      coinAmountA: coinAmounts.coinA,\n      coinAmountB: coinAmounts.coinB,\n      tokenMaxA: roundUp ? new BN(Decimal.ceil(tokenLimitA).toString()) : new BN(Decimal.floor(tokenLimitA).toString()),\n      tokenMaxB: roundUp ? new BN(Decimal.ceil(tokenLimitB).toString()) : new BN(Decimal.floor(tokenLimitB).toString()),\n      liquidityAmount: liquidity,\n      fix_amount_a: iscoinA,\n    }\n  }\n\n  /**\n   * Estimate liquidity from token amounts\n   * @param curSqrtPrice - current sqrt price.\n   * @param lowerTick - lower tick\n   * @param upperTick - upper tick\n   * @param tokenAmount - token amount\n   * @return\n   */\n  static estimateLiquidityFromcoinAmounts(curSqrtPrice: BN, lowerTick: number, upperTick: number, tokenAmount: CoinAmounts): BN {\n    if (lowerTick > upperTick) {\n      throw new ClmmpoolsError('lower tick cannot be greater than lower tick', MathErrorCode.InvalidTwoTickIndex)\n    }\n    const currTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n    const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n    const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n    if (currTick < lowerTick) {\n      return estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, tokenAmount.coinA)\n    }\n    if (currTick >= upperTick) {\n      return estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, tokenAmount.coinB)\n    }\n    const estimateLiquidityAmountA = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, tokenAmount.coinA)\n    const estimateLiquidityAmountB = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, tokenAmount.coinB)\n    return BN.min(estimateLiquidityAmountA, estimateLiquidityAmountB)\n  }\n\n  /**\n   * Estimate coin amounts from total amount\n   * @param lowerTick\n   * @param upperTick\n   * @param decimalsA\n   * @param decimalsB\n   * @param curSqrtPrice\n   * @param totalAmount\n   * @param tokenPriceA\n   * @param tokenPriceB\n   * @returns\n   */\n  static estCoinAmountsFromTotalAmount(\n    lowerTick: number,\n    upperTick: number,\n    curSqrtPrice: BN,\n    totalAmount: string,\n    tokenPriceA: string,\n    tokenPriceB: string\n  ) {\n    const { ratioA, ratioB } = ClmmPoolUtil.calculateDepositRatioFixTokenA(lowerTick, upperTick, curSqrtPrice)\n\n    const amountA = d(totalAmount).mul(ratioA).div(tokenPriceA)\n    const amountB = d(totalAmount).mul(ratioB).div(tokenPriceB)\n\n    return { amountA, amountB }\n  }\n\n  static calculateDepositRatioFixTokenA(lowerTick: number, upperTick: number, curSqrtPrice: BN) {\n    const coinAmountA = new BN(100000000)\n    const { coinAmountB } = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(\n      lowerTick,\n      upperTick,\n      coinAmountA,\n      true,\n      true,\n      0,\n      curSqrtPrice\n    )\n    const currPrice = TickMath.sqrtPriceX64ToPrice(curSqrtPrice, 0, 0)\n    const transformAmountB = d(coinAmountA.toString()).mul(currPrice)\n    const totalAmount = transformAmountB.add(coinAmountB.toString())\n    const ratioA = transformAmountB.div(totalAmount)\n    const ratioB = d(coinAmountB.toString()).div(totalAmount)\n\n    return { ratioA, ratioB }\n  }\n}\n","import BN from 'bn.js'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport { MathUtil, U64_MAX, ZERO } from './utils'\n\nexport class SwapUtils {\n  /**\n   * Get the default sqrt price limit for a swap.\n   *\n   * @param a2b - true if the swap is A to B, false if the swap is B to A.\n   * @returns The default sqrt price limit for the swap.\n   */\n  static getDefaultSqrtPriceLimit(a2b: boolean): BN {\n    return new BN(a2b ? MIN_SQRT_PRICE : MAX_SQRT_PRICE)\n  }\n\n  /**\n   * Get the default values for the otherAmountThreshold in a swap.\n   *\n   * @param amountSpecifiedIsInput - The direction of a swap\n   * @returns The default values for the otherAmountThreshold parameter in a swap.\n   */\n  static getDefaultOtherAmountThreshold(amountSpecifiedIsInput: boolean): BN {\n    return amountSpecifiedIsInput ? ZERO : U64_MAX\n  }\n}\n\n/**\n * Get lower sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n  const numerator = liquidity.mul(sqrtPriceX64).shln(64)\n  const denominator = liquidity.shln(64).add(amount.mul(sqrtPriceX64))\n\n  // always round up\n  return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get upper sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n  const numerator = liquidity.mul(sqrtPriceX64).shln(64)\n  const denominator = liquidity.shln(64).sub(amount.mul(sqrtPriceX64))\n\n  // always round up\n  return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get lower sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n  // always round down(rounding up a negative number)\n  return sqrtPriceX64.sub(MathUtil.divRoundUp(amount.shln(64), liquidity))\n}\n\n/**\n * Get upper sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n  // always round down (rounding up a negative number)\n  return sqrtPriceX64.add(amount.shln(64).div(liquidity))\n}\n","import { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { SuiAddressType, SuiStructTag } from '../types/sui'\nimport { CoinAssist, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG } from '../math/CoinAssist'\nimport { removeHexPrefix } from './hex'\n\nconst EQUAL = 0\nconst LESS_THAN = 1\nconst GREATER_THAN = 2\n\nfunction cmp(a: number, b: number) {\n  if (a === b) {\n    return EQUAL\n  }\n  if (a < b) {\n    return LESS_THAN\n  }\n  return GREATER_THAN\n}\n\nfunction compare(symbolX: string, symbolY: string) {\n  let i = 0\n\n  const len = symbolX.length <= symbolY.length ? symbolX.length : symbolY.length\n\n  const lenCmp = cmp(symbolX.length, symbolY.length)\n  while (i < len) {\n    const elemCmp = cmp(symbolX.charCodeAt(i), symbolY.charCodeAt(i))\n    i += 1\n    if (elemCmp !== 0) {\n      return elemCmp\n    }\n  }\n\n  return lenCmp\n}\n\nexport function isSortedSymbols(symbolX: string, symbolY: string) {\n  return compare(symbolX, symbolY) === LESS_THAN\n}\n\nexport function composeType(address: string, generics: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, module: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, ...args: unknown[]): SuiAddressType {\n  const generics: string[] = Array.isArray(args[args.length - 1]) ? (args.pop() as string[]) : []\n  const chains = [address, ...args].filter(Boolean)\n\n  let result: string = chains.join('::')\n\n  if (generics && generics.length) {\n    result += `<${generics.join(', ')}>`\n  }\n\n  return result\n}\n\nexport function extractAddressFromType(type: string) {\n  return type.split('::')[0]\n}\n\nexport function extractStructTagFromType(type: string): SuiStructTag {\n  try {\n    let _type = type.replace(/\\s/g, '')\n\n    const genericsString = _type.match(/(<.+>)$/)\n    const generics = genericsString?.[0]?.match(/(\\w+::\\w+::\\w+)(?:<.*?>(?!>))?/g)\n    if (generics) {\n      _type = _type.slice(0, _type.indexOf('<'))\n      const tag = extractStructTagFromType(_type)\n      const structTag: SuiStructTag = {\n        ...tag,\n        type_arguments: generics.map((item) => extractStructTagFromType(item).source_address),\n      }\n      structTag.type_arguments = structTag.type_arguments.map((item) => {\n        return CoinAssist.isSuiCoin(item) ? item : extractStructTagFromType(item).source_address\n      })\n      structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n      return structTag\n    }\n    const parts = _type.split('::')\n\n    const isSuiCoin = _type === GAS_TYPE_ARG || _type === GAS_TYPE_ARG_LONG\n\n    const structTag: SuiStructTag = {\n      full_address: _type,\n      address: isSuiCoin ? '0x2' : normalizeSuiObjectId(parts[0]),\n      module: parts[1],\n      name: parts[2],\n      type_arguments: [],\n      source_address: '',\n    }\n    structTag.full_address = `${structTag.address}::${structTag.module}::${structTag.name}`\n    structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n    return structTag\n  } catch (error) {\n    return {\n      full_address: type,\n      address: '',\n      module: '',\n      name: '',\n      type_arguments: [],\n      source_address: type,\n    }\n  }\n}\n\nexport function normalizeCoinType(coinType: string): string {\n  return extractStructTagFromType(coinType).source_address\n}\n\nexport function fixSuiObjectId(value: string): string {\n  if (value.toLowerCase().startsWith('0x')) {\n    return normalizeSuiObjectId(value)\n  }\n  return value\n}\n\n/**\n * Fixes and normalizes a coin type by removing or keeping the prefix.\n *\n * @param {string} coinType - The coin type to be fixed.\n * @param {boolean} removePrefix - Whether to remove the prefix or not (default: true).\n * @returns {string} - The fixed and normalized coin type.\n */\nexport const fixCoinType = (coinType: string, removePrefix = true) => {\n  const arr = coinType.split('::')\n  const address = arr.shift() as string\n  let normalizeAddress = normalizeSuiObjectId(address)\n  if (removePrefix) {\n    normalizeAddress = removeHexPrefix(normalizeAddress)\n  }\n  return `${normalizeAddress}::${arr.join('::')}`\n}\n\n/**\n * Recursively traverses the given data object and patches any string values that represent Sui object IDs.\n *\n * @param {any} data - The data object to be patched.\n */\nexport function patchFixSuiObjectId(data: any) {\n  for (const key in data) {\n    const type = typeof data[key]\n    if (type === 'object') {\n      patchFixSuiObjectId(data[key])\n    } else if (type === 'string') {\n      const value = data[key]\n      if (value && !value.includes('::')) {\n        data[key] = fixSuiObjectId(value)\n      }\n    }\n  }\n}\n","// eslint-disable-next-line import/no-import-module-exports\nimport { ClmmpoolsError, TypesErrorCode } from '../errors/errors'\n\nconst HEX_REGEXP = /^[-+]?[0-9A-Fa-f]+\\.?[0-9A-Fa-f]*?$/\n\nexport function addHexPrefix(hex: string): string {\n  return !hex.startsWith('0x') ? `0x${hex}` : hex\n}\n\nexport function removeHexPrefix(hex: string): string {\n  return hex.startsWith('0x') ? `${hex.slice(2)}` : hex\n}\n\nexport function shortString(str: string, start = 4, end = 4) {\n  const slen = Math.max(start, 1)\n  const elen = Math.max(end, 1)\n\n  return `${str.slice(0, slen + 2)} ... ${str.slice(-elen)}`\n}\n\nexport function shortAddress(address: string, start = 4, end = 4) {\n  return shortString(addHexPrefix(address), start, end)\n}\n\nexport function checkAddress(address: any, options: { leadingZero: boolean } = { leadingZero: true }): boolean {\n  if (typeof address !== 'string') {\n    return false\n  }\n  let str = address\n\n  if (options.leadingZero) {\n    if (!address.startsWith('0x')) {\n      return false\n    }\n    str = str.substring(2)\n  }\n\n  return HEX_REGEXP.test(str)\n}\n\n/**\n * Attempts to turn a value into a `Buffer`. As input it supports `Buffer`, `String`, `Number`, null/undefined, `BN` and other objects with a `toArray()` method.\n * @param v the value\n */\nexport function toBuffer(v: any): Buffer {\n  if (!Buffer.isBuffer(v)) {\n    if (Array.isArray(v)) {\n      v = Buffer.from(v)\n    } else if (typeof v === 'string') {\n      if (exports.isHexString(v)) {\n        v = Buffer.from(exports.padToEven(exports.stripHexPrefix(v)), 'hex')\n      } else {\n        v = Buffer.from(v)\n      }\n    } else if (typeof v === 'number') {\n      v = exports.intToBuffer(v)\n    } else if (v === null || v === undefined) {\n      v = Buffer.allocUnsafe(0)\n    } else if (v.toArray) {\n      // converts a BN to a Buffer\n      v = Buffer.from(v.toArray())\n    } else {\n      throw new ClmmpoolsError(`Invalid type`, TypesErrorCode.InvalidType)\n    }\n  }\n  return v\n}\n\nexport function bufferToHex(buffer: Buffer): string {\n  return addHexPrefix(toBuffer(buffer).toString('hex'))\n}\n/**\n * '\\x02\\x00\\x00\\x00' to 2\n * @param binaryData\n */\nexport function hexToNumber(binaryData: string) {\n  const buffer = new ArrayBuffer(4)\n  const view = new DataView(buffer)\n\n  for (let i = 0; i < binaryData.length; i++) {\n    view.setUint8(i, binaryData.charCodeAt(i))\n  }\n\n  const number = view.getUint32(0, true) //\n\n  return number\n}\n\nexport function utf8to16(str: string) {\n  let out\n  let i\n  let c\n  let char2\n  let char3\n  out = ''\n  const len = str.length\n  i = 0\n  while (i < len) {\n    c = str.charCodeAt(i++)\n    switch (c >> 4) {\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n        out += str.charAt(i - 1)\n        break\n      case 12:\n      case 13:\n        char2 = str.charCodeAt(i++)\n        out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))\n        break\n      case 14:\n        char2 = str.charCodeAt(i++)\n        char3 = str.charCodeAt(i++)\n        out += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0))\n        break\n    }\n  }\n  return out\n}\n\nexport function hexToString(str: string) {\n  let val = ''\n  const newStr = removeHexPrefix(str)\n\n  const len = newStr.length / 2\n  for (let i = 0; i < len; i++) {\n    val += String.fromCharCode(parseInt(newStr.substr(i * 2, 2), 16))\n  }\n  return utf8to16(val)\n}\n","import { SuiMoveObject, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport { CoinAsset, FaucetCoin } from '../types'\nimport { extractStructTagFromType, normalizeCoinType } from '../utils/contracts'\nimport { SuiAddressType } from '../types/sui'\n\nconst COIN_TYPE = '0x2::coin::Coin'\nconst COIN_TYPE_ARG_REGEX = /^0x2::coin::Coin<(.+)>$/\nexport const DEFAULT_GAS_BUDGET_FOR_SPLIT = 1000\nexport const DEFAULT_GAS_BUDGET_FOR_MERGE = 500\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER = 100\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI = 100\nexport const DEFAULT_GAS_BUDGET_FOR_STAKE = 1000\nexport const GAS_TYPE_ARG = '0x2::sui::SUI'\nexport const GAS_TYPE_ARG_LONG = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI'\nexport const GAS_SYMBOL = 'SUI'\nexport const DEFAULT_NFT_TRANSFER_GAS_FEE = 450\nexport const SUI_SYSTEM_STATE_OBJECT_ID = '0x0000000000000000000000000000000000000005'\n/**\n * This class provides helper methods for working with coins.\n */\nexport class CoinAssist {\n  /**\n   * Get the coin type argument from a SuiMoveObject.\n   *\n   * @param obj The SuiMoveObject to get the coin type argument from.\n   * @returns The coin type argument, or null if it is not found.\n   */\n  public static getCoinTypeArg(obj: SuiMoveObject) {\n    const res = obj.type.match(COIN_TYPE_ARG_REGEX)\n    return res ? res[1] : null\n  }\n\n  /**\n   * Get whether a SuiMoveObject is a SUI coin.\n   *\n   * @param obj The SuiMoveObject to check.\n   * @returns Whether the SuiMoveObject is a SUI coin.\n   */\n  public static isSUI(obj: SuiMoveObject) {\n    const arg = CoinAssist.getCoinTypeArg(obj)\n    return arg ? CoinAssist.getCoinSymbol(arg) === 'SUI' : false\n  }\n\n  /**\n   * Get the coin symbol from a coin type argument.\n   *\n   * @param coinTypeArg The coin type argument to get the symbol from.\n   * @returns The coin symbol.\n   */\n  public static getCoinSymbol(coinTypeArg: string) {\n    return coinTypeArg.substring(coinTypeArg.lastIndexOf(':') + 1)\n  }\n\n  /**\n   * Get the balance of a SuiMoveObject.\n   *\n   * @param obj The SuiMoveObject to get the balance from.\n   * @returns The balance of the SuiMoveObject.\n   */\n  public static getBalance(obj: SuiMoveObject): bigint {\n    return BigInt((obj.fields as any).balance)\n  }\n\n  /**\n   * Get the total balance of a list of CoinAsset objects for a given coin address.\n   *\n   * @param objs The list of CoinAsset objects to get the total balance for.\n   * @param coinAddress The coin address to get the total balance for.\n   * @returns The total balance of the CoinAsset objects for the given coin address.\n   */\n  public static totalBalance(objs: CoinAsset[], coinAddress: SuiAddressType): bigint {\n    let balanceTotal = BigInt(0)\n    objs.forEach((obj) => {\n      if (coinAddress === obj.coinAddress) {\n        balanceTotal += BigInt(obj.balance)\n      }\n    })\n    return balanceTotal\n  }\n\n  /**\n   * Get the ID of a SuiMoveObject.\n   *\n   * @param obj The SuiMoveObject to get the ID from.\n   * @returns The ID of the SuiMoveObject.\n   */\n  public static getID(obj: SuiMoveObject): string {\n    return (obj.fields as any).id.id\n  }\n\n  /**\n   * Get the coin type from a coin type argument.\n   *\n   * @param coinTypeArg The coin type argument to get the coin type from.\n   * @returns The coin type.\n   */\n  public static getCoinTypeFromArg(coinTypeArg: string) {\n    return `${COIN_TYPE}<${coinTypeArg}>`\n  }\n\n  /**\n   * Get the FaucetCoin objects from a SuiTransactionBlockResponse.\n   *\n   * @param suiTransactionResponse The SuiTransactionBlockResponse to get the FaucetCoin objects from.\n   * @returns The FaucetCoin objects.\n   */\n  public static getFaucetCoins(suiTransactionResponse: SuiTransactionBlockResponse): FaucetCoin[] {\n    const { events } = suiTransactionResponse\n    const faucetCoin: FaucetCoin[] = []\n\n    events?.forEach((item: any) => {\n      const { type } = item\n      if (extractStructTagFromType(type).name === 'InitEvent') {\n        const fields = item.parsedJson as any\n        faucetCoin.push({\n          transactionModule: item.transactionModule,\n          suplyID: fields.suplyID,\n          decimals: fields.decimals,\n        })\n      }\n    })\n    return faucetCoin\n  }\n\n  /**\n   * Get the CoinAsset objects for a given coin type.\n   *\n   * @param coinType The coin type to get the CoinAsset objects for.\n   * @param allSuiObjects The list of all SuiMoveObjects.\n   * @returns The CoinAsset objects for the given coin type.\n   */\n  public static getCoinAssets(coinType: string, allSuiObjects: CoinAsset[]): CoinAsset[] {\n    const coins: CoinAsset[] = []\n    allSuiObjects.forEach((anObj) => {\n      if (normalizeCoinType(anObj.coinAddress) === normalizeCoinType(coinType)) {\n        coins.push(anObj)\n      }\n    })\n    return coins\n  }\n\n  /**\n   * Get whether a coin address is a SUI coin.\n   *\n   * @param coinAddress The coin address to check.\n   * @returns Whether the coin address is a SUI coin.\n   */\n  public static isSuiCoin(coinAddress: SuiAddressType) {\n    return extractStructTagFromType(coinAddress).full_address === GAS_TYPE_ARG\n  }\n\n  /**\n   * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n   *\n   * @param coins The list of CoinAsset objects to select from.\n   * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n   * @param exclude A list of CoinAsset objects to exclude from the selection.\n   * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n   */\n  static selectCoinObjectIdGreaterThanOrEqual(\n    coins: CoinAsset[],\n    amount: bigint,\n    exclude: string[] = []\n  ): { objectArray: string[]; remainCoins: CoinAsset[]; amountArray: string[] } {\n    const selectedResult = CoinAssist.selectCoinAssetGreaterThanOrEqual(coins, amount, exclude)\n    const objectArray = selectedResult.selectedCoins.map((item) => item.coinObjectId)\n    const remainCoins = selectedResult.remainingCoins\n    const amountArray = selectedResult.selectedCoins.map((item) => item.balance.toString())\n    return { objectArray, remainCoins, amountArray }\n  }\n\n  /**\n   * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n   *\n   * @param coins The list of CoinAsset objects to select from.\n   * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n   * @param exclude A list of CoinAsset objects to exclude from the selection.\n   * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n   */\n  static selectCoinAssetGreaterThanOrEqual(\n    coins: CoinAsset[],\n    amount: bigint,\n    exclude: string[] = []\n  ): { selectedCoins: CoinAsset[]; remainingCoins: CoinAsset[] } {\n    const sortedCoins = CoinAssist.sortByBalance(coins.filter((c) => !exclude.includes(c.coinObjectId)))\n\n    const total = CoinAssist.calculateTotalBalance(sortedCoins)\n\n    if (total < amount) {\n      return { selectedCoins: [], remainingCoins: sortedCoins }\n    }\n    if (total === amount) {\n      return { selectedCoins: sortedCoins, remainingCoins: [] }\n    }\n\n    let sum = BigInt(0)\n    const selectedCoins = []\n    const remainingCoins = [...sortedCoins]\n    while (sum < total) {\n      const target = amount - sum\n      const coinWithSmallestSufficientBalanceIndex = remainingCoins.findIndex((c) => c.balance >= target)\n      if (coinWithSmallestSufficientBalanceIndex !== -1) {\n        selectedCoins.push(remainingCoins[coinWithSmallestSufficientBalanceIndex])\n        remainingCoins.splice(coinWithSmallestSufficientBalanceIndex, 1)\n        break\n      }\n\n      const coinWithLargestBalance = remainingCoins.pop()!\n      if (coinWithLargestBalance.balance > 0) {\n        selectedCoins.push(coinWithLargestBalance)\n        sum += coinWithLargestBalance.balance\n      }\n    }\n    return { selectedCoins: CoinAssist.sortByBalance(selectedCoins), remainingCoins: CoinAssist.sortByBalance(remainingCoins) }\n  }\n\n  /**\n   * Sort the CoinAsset objects by their balance.\n   *\n   * @param coins The CoinAsset objects to sort.\n   * @returns The sorted CoinAsset objects.\n   */\n  static sortByBalance(coins: CoinAsset[]): CoinAsset[] {\n    return coins.sort((a, b) => (a.balance < b.balance ? -1 : a.balance > b.balance ? 1 : 0))\n  }\n\n  static sortByBalanceDes(coins: CoinAsset[]): CoinAsset[] {\n    return coins.sort((a, b) => (a.balance > b.balance ? -1 : a.balance < b.balance ? 0 : 1))\n  }\n\n  /**\n   * Calculate the total balance of a list of CoinAsset objects.\n   *\n   * @param coins The list of CoinAsset objects to calculate the total balance for.\n   * @returns The total balance of the CoinAsset objects.\n   */\n  static calculateTotalBalance(coins: CoinAsset[]): bigint {\n    return coins.reduce((partialSum, c) => partialSum + c.balance, BigInt(0))\n  }\n}\n","import BN from 'bn.js'\nimport { Pool, Position } from '../types'\nimport { TickData } from '../types/clmmpool'\nimport { MathUtil } from './utils'\n\n/**\n * @category CollectFeesQuoteParam\n */\nexport type CollectFeesQuoteParam = {\n  clmmpool: Pool\n  position: Position\n  tickLower: TickData\n  tickUpper: TickData\n}\n\n/**\n * @category CollectFeesQuote\n */\nexport type CollectFeesQuote = {\n  position_id: string\n  feeOwedA: BN\n  feeOwedB: BN\n}\n/**\n * Get the fee growth in the given tick range.\n *\n * @param clmmpool The CLMM pool.\n * @param tickLower The lower tick.\n * @param tickUpper The upper tick.\n * @returns The fee growth in the given tick range.\n */\nfunction getFeeInTickRange(clmmpool: Pool, tickLower: TickData, tickUpper: TickData): { fee_growth_inside_a: BN; fee_growth_inside_b: BN } {\n  let fee_growth_below_a = new BN(0)\n  let fee_growth_below_b = new BN(0)\n\n  if (clmmpool.current_tick_index < tickLower.index) {\n    fee_growth_below_a = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), new BN(tickLower.feeGrowthOutsideA))\n    fee_growth_below_b = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), new BN(tickLower.feeGrowthOutsideB))\n  } else {\n    fee_growth_below_a = new BN(tickLower.feeGrowthOutsideA)\n    fee_growth_below_b = new BN(tickLower.feeGrowthOutsideB)\n  }\n\n  let fee_growth_above_a = new BN(0)\n  let fee_growth_above_b = new BN(0)\n\n  if (clmmpool.current_tick_index < tickUpper.index) {\n    fee_growth_above_a = new BN(tickUpper.feeGrowthOutsideA)\n    fee_growth_above_b = new BN(tickUpper.feeGrowthOutsideB)\n  } else {\n    fee_growth_above_a = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), new BN(tickUpper.feeGrowthOutsideA))\n    fee_growth_above_b = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), new BN(tickUpper.feeGrowthOutsideB))\n  }\n  const fee_growth_inside_a = MathUtil.subUnderflowU128(\n    MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), fee_growth_below_a),\n    fee_growth_above_a\n  )\n  const fee_growth_inside_b = MathUtil.subUnderflowU128(\n    MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), fee_growth_below_b),\n    fee_growth_above_b\n  )\n\n  return { fee_growth_inside_a, fee_growth_inside_b }\n}\n\nfunction updateFees(position: Position, fee_growth_inside_a: BN, fee_growth_inside_b: BN): CollectFeesQuote {\n  const growth_delta_a = MathUtil.subUnderflowU128(fee_growth_inside_a, new BN(position.fee_growth_inside_a))\n  const fee_delta_a = new BN(position.liquidity).mul(growth_delta_a).shrn(64)\n  const growth_delta_b = MathUtil.subUnderflowU128(fee_growth_inside_b, new BN(position.fee_growth_inside_b))\n  const fee_delta_b = new BN(position.liquidity).mul(growth_delta_b).shrn(64)\n\n  const fee_owed_a = new BN(position.fee_owed_a).add(fee_delta_a)\n  const fee_owed_b = new BN(position.fee_owed_b).add(fee_delta_b)\n\n  return {\n    position_id: position.pos_object_id,\n    feeOwedA: fee_owed_a,\n    feeOwedB: fee_owed_b,\n  }\n}\n/**\n * Get a fee quote on the outstanding fees owed to a position.\n *\n * @category CollectFeesQuoteParam\n * @param param A collection of fetched Clmmpool accounts to faciliate the quote.\n * @returns A quote object containing the fees owed for each token in the pool.\n */\nexport function collectFeesQuote(param: CollectFeesQuoteParam): CollectFeesQuote {\n  // Calculate the fee growths inside the position\n  const { fee_growth_inside_a, fee_growth_inside_b } = getFeeInTickRange(param.clmmpool, param.tickLower, param.tickUpper)\n  // Calculate the updated fees owed\n  return updateFees(param.position, fee_growth_inside_a, fee_growth_inside_b)\n}\n","import BN from 'bn.js'\nimport type { Decimal } from 'decimal.js'\n\n/**\n * Percentage - the util set for percentage struct.\n */\nexport class Percentage {\n  readonly numerator: BN\n\n  readonly denominator: BN\n\n  constructor(numerator: BN, denominator: BN) {\n    this.toString = () => {\n      return `${this.numerator.toString()}/${this.denominator.toString()}`\n    }\n    this.numerator = numerator\n    this.denominator = denominator\n  }\n\n  /**\n   * Get the percentage of a number.\n   *\n   * @param number\n   * @returns\n   */\n  static fromDecimal(number: Decimal): Percentage {\n    return Percentage.fromFraction(number.toDecimalPlaces(1).mul(10).toNumber(), 1000)\n  }\n\n  /**\n   * Get the percentage of a fraction.\n   *\n   * @param numerator\n   * @param denominator\n   * @returns\n   */\n  static fromFraction(numerator: BN | number, denominator: BN | number): Percentage {\n    const num = typeof numerator === 'number' ? new BN(numerator.toString()) : numerator\n    const denom = typeof denominator === 'number' ? new BN(denominator.toString()) : denominator\n    return new Percentage(num, denom)\n  }\n}\n","import BN from 'bn.js'\nimport { SwapDirection } from '../types/liquidity'\nimport { CoinAmounts } from './clmm'\nimport { Percentage } from './percentage'\nimport { MathUtil } from './utils'\n\nexport enum AmountSpecified {\n  Input = 'Specified input amount',\n  Output = 'Specified output amount',\n}\n\nexport enum PositionStatus {\n  BelowRange,\n  InRange,\n  AboveRange,\n}\n/**\n * This class provides utility methods for working with positions.\n */\nexport class PositionUtil {\n  /**\n   * Get the position status for the given tick indices.\n   *\n   * @param currentTickIndex The current tick index.\n   * @param lowerTickIndex The lower tick index.\n   * @param upperTickIndex The upper tick index.\n   * @returns The position status.\n   */\n  static getPositionStatus(currentTickIndex: number, lowerTickIndex: number, upperTickIndex: number): PositionStatus {\n    if (currentTickIndex < lowerTickIndex) {\n      return PositionStatus.BelowRange\n    }\n    if (currentTickIndex < upperTickIndex) {\n      return PositionStatus.InRange\n    }\n    return PositionStatus.AboveRange\n  }\n}\n\n/**\n * Order sqrt price.\n * @param liquidity - liqudity.\n * @param sqrtPrice0X64 - Current sqrt price of coin 0.\n * @param sqrtPrice1X64 - Current sqrt price of coin 1.\n *\n * @returns\n */\nfunction orderSqrtPrice(sqrtPrice0X64: BN, sqrtPrice1X64: BN): [BN, BN] {\n  if (sqrtPrice0X64.lt(sqrtPrice1X64)) {\n    return [sqrtPrice0X64, sqrtPrice1X64]\n  }\n  return [sqrtPrice1X64, sqrtPrice0X64]\n}\n\n/**\n * Get token A from liquidity.\n * @param liquidity - liquidity.\n * @param sqrtPrice0X64 - Current sqrt price of coin 0.\n * @param sqrtPrice1X64 - Current sqrt price of coin 1.\n * @param roundUp - If round up.\n *\n * @returns\n */\nexport function getCoinAFromLiquidity(liquidity: BN, sqrtPrice0X64: BN, sqrtPrice1X64: BN, roundUp: boolean) {\n  const [sqrtPriceLowerX64, sqrtPriceUpperX64] = orderSqrtPrice(sqrtPrice0X64, sqrtPrice1X64)\n\n  const numerator = liquidity.mul(sqrtPriceUpperX64.sub(sqrtPriceLowerX64)).shln(64)\n  const denominator = sqrtPriceUpperX64.mul(sqrtPriceLowerX64)\n  if (roundUp) {\n    return MathUtil.divRoundUp(numerator, denominator)\n  }\n  return numerator.div(denominator)\n}\n\n/**\n * Get token B from liquidity.\n * @param liquidity - liqudity.\n * @param sqrtPrice0X64 - Current sqrt price of token 0.\n * @param sqrtPrice1X64 - Current sqrt price of token 1.\n * @param roundUp - If round up.\n *\n * @returns\n */\nexport function getCoinBFromLiquidity(liquidity: BN, sqrtPrice0X64: BN, sqrtPrice1X64: BN, roundUp: boolean) {\n  const [sqrtPriceLowerX64, sqrtPriceUpperX64] = orderSqrtPrice(sqrtPrice0X64, sqrtPrice1X64)\n\n  const result = liquidity.mul(sqrtPriceUpperX64.sub(sqrtPriceLowerX64))\n  if (roundUp) {\n    return MathUtil.shiftRightRoundUp(result)\n  }\n  return result.shrn(64)\n}\n\n/**\n * Get liquidity from token A.\n *\n * @param amount - The amount of token A.\n * @param sqrtPriceLowerX64 - The lower sqrt price.\n * @param sqrtPriceUpperX64 - The upper sqrt price.\n * @param roundUp - If round up.\n * @returns liquidity.\n */\nexport function getLiquidityFromCoinA(amount: BN, sqrtPriceLowerX64: BN, sqrtPriceUpperX64: BN, roundUp: boolean) {\n  const result = amount.mul(sqrtPriceLowerX64).mul(sqrtPriceUpperX64).div(sqrtPriceUpperX64.sub(sqrtPriceLowerX64))\n  if (roundUp) {\n    return MathUtil.shiftRightRoundUp(result)\n  }\n  return result.shrn(64)\n}\n\n/**\n * Get liquidity from token B.\n * @param amount - The amount of token B.\n * @param sqrtPriceLowerX64 - The lower sqrt price.\n * @param sqrtPriceUpperX64 - The upper sqrt price.\n * @param roundUp - If round up.\n *\n * @returns liquidity.\n */\nexport function getLiquidityFromCoinB(amount: BN, sqrtPriceLowerX64: BN, sqrtPriceUpperX64: BN, roundUp: boolean) {\n  const numerator = amount.shln(64)\n  const denominator = sqrtPriceUpperX64.sub(sqrtPriceLowerX64)\n  if (roundUp) {\n    return MathUtil.divRoundUp(numerator, denominator)\n  }\n  return numerator.div(denominator)\n}\n\n/**\n * Get amount of fixed delta.\n * @param currentSqrtPriceX64 - Current sqrt price.\n * @param targetSqrtPriceX64 - Target sqrt price.\n * @param liquidity - liqudity.\n * @param amountSpecified - The amount specified in the swap.\n * @param swapDirection - The swap direction.\n *\n * @returns\n */\nexport function getAmountFixedDelta(\n  currentSqrtPriceX64: BN,\n  targetSqrtPriceX64: BN,\n  liquidity: BN,\n  amountSpecified: AmountSpecified,\n  swapDirection: SwapDirection\n) {\n  if ((amountSpecified === AmountSpecified.Input) === (swapDirection === SwapDirection.A2B)) {\n    return getCoinAFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Input)\n  }\n  return getCoinBFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Input)\n}\n\n/**\n * Get amount of unfixed delta.\n * @param currentSqrtPriceX64 - Current sqrt price.\n * @param targetSqrtPriceX64 - Target sqrt price.\n * @param liquidity - liqudity.\n * @param amountSpecified - The amount specified in the swap.\n * @param swapDirection - The swap direction.\n *\n * @returns\n */\nexport function getAmountUnfixedDelta(\n  currentSqrtPriceX64: BN,\n  targetSqrtPriceX64: BN,\n  liquidity: BN,\n  amountSpecified: AmountSpecified,\n  swapDirection: SwapDirection\n) {\n  if ((amountSpecified === AmountSpecified.Input) === (swapDirection === SwapDirection.A2B)) {\n    return getCoinBFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Output)\n  }\n  return getCoinAFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Output)\n}\n\nexport function adjustForSlippage(n: BN, { numerator, denominator }: Percentage, adjustUp: boolean): BN {\n  if (adjustUp) {\n    return n.mul(denominator.add(numerator)).div(denominator)\n  }\n  return n.mul(denominator).div(denominator.add(numerator))\n}\n\nexport function adjustForCoinSlippage(tokenAmount: CoinAmounts, slippage: Percentage, adjustUp: boolean) {\n  return {\n    tokenMaxA: adjustForSlippage(tokenAmount.coinA, slippage, adjustUp),\n    tokenMaxB: adjustForSlippage(tokenAmount.coinB, slippage, adjustUp),\n  }\n}\n","import BN from 'bn.js'\nimport { Pool } from '../types/clmm_type'\nimport { ClmmpoolData, TickData, transClmmpoolDataWithoutTicks } from '../types/clmmpool'\nimport { computeSwapStep, SwapStepResult } from './clmm'\nimport { SwapUtils } from './swap'\nimport { ZERO } from './utils'\n\nexport enum SplitUnit {\n  FIVE = 5,\n  TEN = 10,\n  TWENTY = 20,\n  TWENTY_FIVE = 25,\n  FIVETY = 50,\n  HUNDRED = 100,\n}\n\nexport function createSplitArray(minSplitUnit: SplitUnit): number[] {\n  let unit\n  switch (minSplitUnit) {\n    case SplitUnit.FIVE:\n      unit = 5\n      break\n    case SplitUnit.TEN:\n      unit = 10\n      break\n    case SplitUnit.TWENTY:\n      unit = 20\n      break\n    case SplitUnit.TWENTY_FIVE:\n      unit = 25\n      break\n    case SplitUnit.FIVETY:\n      unit = 50\n      break\n    case SplitUnit.HUNDRED:\n      unit = 100\n      break\n    default:\n      unit = 1\n  }\n  const length = 100 / unit + 1\n  const splitArray = new Array<number>(length)\n  for (let i = 0; i < length; i += 1) {\n    splitArray[i] = i * unit\n  }\n  return splitArray\n}\n\nexport function createSplitAmountArray(amount: BN, minSplitUnit: SplitUnit): BN[] {\n  const splitArray = createSplitArray(minSplitUnit)\n  const splitAmountArray = new Array<BN>(splitArray.length)\n\n  for (let i = 0; i < splitArray.length; i += 1) {\n    splitAmountArray[i] = amount.muln(splitArray[i]).divn(100)\n  }\n\n  return splitAmountArray\n}\n\nexport type SplitSwapResult = {\n  amountInArray: BN[]\n  amountOutArray: BN[]\n  feeAmountArray: BN[]\n  nextSqrtPriceArray: BN[]\n  isExceed: boolean[]\n}\n\nfunction updateSplitSwapResult(\n  maxIndex: number,\n  currentIndex: number,\n  splitSwapResult: SplitSwapResult,\n  stepResult: SwapStepResult\n): SplitSwapResult {\n  for (let index = currentIndex; index < maxIndex; index += 1) {\n    splitSwapResult.amountInArray[index] = splitSwapResult.amountInArray[index].add(stepResult.amountIn)\n    splitSwapResult.amountOutArray[index] = splitSwapResult.amountOutArray[index].add(stepResult.amountOut)\n    splitSwapResult.feeAmountArray[index] = splitSwapResult.feeAmountArray[index].add(stepResult.feeAmount)\n  }\n  return splitSwapResult\n}\n\nfunction computeSplitSwap(\n  a2b: boolean,\n  byAmountIn: boolean,\n  amounts: BN[],\n  poolData: ClmmpoolData,\n  swapTicks: TickData[]\n): SplitSwapResult {\n  let currentLiquidity = new BN(poolData.liquidity)\n  let { currentSqrtPrice } = poolData\n\n  let splitSwapResult: SplitSwapResult = {\n    amountInArray: [],\n    amountOutArray: [],\n    feeAmountArray: [],\n    nextSqrtPriceArray: [],\n    isExceed: [],\n  }\n\n  amounts.forEach(() => {\n    splitSwapResult.amountInArray.push(ZERO)\n    splitSwapResult.amountOutArray.push(ZERO)\n    splitSwapResult.feeAmountArray.push(ZERO)\n    splitSwapResult.nextSqrtPriceArray.push(ZERO)\n  })\n\n  let targetSqrtPrice\n  let signedLiquidityChange\n  const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b)\n\n  const maxIndex = amounts.length\n  let remainerAmount = amounts[1]\n  let currentIndex = 1\n\n  let ticks\n  if (a2b) {\n    ticks = swapTicks.sort((a, b) => {\n      return b.index - a.index\n    })\n  } else {\n    ticks = swapTicks.sort((a, b) => {\n      return a.index - b.index\n    })\n  }\n\n  for (const tick of ticks) {\n    if (a2b) {\n      if (poolData.currentTickIndex < tick.index) {\n        continue\n      }\n    } else if (poolData.currentTickIndex > tick.index) {\n      continue\n    }\n    if (tick === null) {\n      continue\n    }\n    if ((a2b && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!a2b && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n      targetSqrtPrice = sqrtPriceLimit\n    } else {\n      targetSqrtPrice = tick.sqrtPrice\n    }\n\n    let tempStepResult: SwapStepResult = {\n      amountIn: ZERO,\n      amountOut: ZERO,\n      nextSqrtPrice: ZERO,\n      feeAmount: ZERO,\n    }\n\n    const tempSqrtPrice = currentSqrtPrice\n    const tempLiquidity = currentLiquidity\n    let tempRemainerAmount = remainerAmount\n    let currentTempIndex = currentIndex\n\n    for (let i = currentIndex; i < maxIndex; i += 1) {\n      const stepResult = computeSwapStep(\n        currentSqrtPrice,\n        targetSqrtPrice,\n        currentLiquidity,\n        remainerAmount,\n        new BN(poolData.feeRate),\n        byAmountIn\n      )\n      tempStepResult = stepResult\n\n      if (!stepResult.amountIn.eq(ZERO)) {\n        remainerAmount = byAmountIn\n          ? remainerAmount.sub(stepResult.amountIn.add(stepResult.feeAmount))\n          : remainerAmount.sub(stepResult.amountOut)\n      }\n\n      // splitSwapResult = updateSplitSwapResult(maxIndex, currentIndex, splitSwapResult, stepResult)\n      if (remainerAmount.eq(ZERO)) {\n        splitSwapResult.amountInArray[i] = splitSwapResult.amountInArray[i].add(stepResult.amountIn)\n        splitSwapResult.amountOutArray[i] = splitSwapResult.amountOutArray[i].add(stepResult.amountOut)\n        splitSwapResult.feeAmountArray[i] = splitSwapResult.feeAmountArray[i].add(stepResult.feeAmount)\n\n        // When current index remainerAmount run out, we need to update the swapResult of current index amountIn\n        if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n          signedLiquidityChange = a2b ? tick.liquidityNet.mul(new BN(-1)) : tick.liquidityNet\n          currentLiquidity = signedLiquidityChange.gt(ZERO)\n            ? currentLiquidity.add(signedLiquidityChange)\n            : currentLiquidity.sub(signedLiquidityChange.abs())\n          currentSqrtPrice = tick.sqrtPrice\n        } else {\n          currentSqrtPrice = stepResult.nextSqrtPrice\n        }\n        splitSwapResult.amountInArray[i] = splitSwapResult.amountInArray[i].add(splitSwapResult.feeAmountArray[i])\n        splitSwapResult.nextSqrtPriceArray[i] = currentSqrtPrice\n        currentLiquidity = tempLiquidity\n        currentSqrtPrice = tempSqrtPrice\n        // remainerAmount = tempRemainerAmount.add(amounts[1].muln(i - currentTempIndex + 1))\n        if (i !== maxIndex - 1) {\n          remainerAmount = tempRemainerAmount.add(amounts[i + 1].sub(amounts[currentTempIndex]))\n        }\n        currentIndex += 1\n      } else {\n        splitSwapResult = updateSplitSwapResult(maxIndex, i, splitSwapResult, stepResult)\n        tempRemainerAmount = remainerAmount\n        currentTempIndex = currentIndex\n        break\n      }\n    }\n\n    if (currentIndex === maxIndex) {\n      break\n    }\n\n    if (tempStepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n      signedLiquidityChange = a2b ? tick.liquidityNet.mul(new BN(-1)) : tick.liquidityNet\n      currentLiquidity = signedLiquidityChange.gt(ZERO)\n        ? currentLiquidity.add(signedLiquidityChange)\n        : currentLiquidity.sub(signedLiquidityChange.abs())\n      currentSqrtPrice = tick.sqrtPrice\n    } else {\n      currentSqrtPrice = tempStepResult.nextSqrtPrice\n    }\n  }\n\n  if (byAmountIn) {\n    amounts.forEach((a, i) => {\n      splitSwapResult.isExceed.push(splitSwapResult.amountInArray[i].lt(a))\n    })\n  } else {\n    amounts.forEach((a, i) => {\n      splitSwapResult.isExceed.push(splitSwapResult.amountOutArray[i].lt(a))\n    })\n  }\n\n  return splitSwapResult\n}\n\nexport class SplitSwap {\n  readonly minSplitUnit: number\n\n  amountArray: BN[]\n\n  private byAmountIn: boolean\n\n  private a2b: boolean\n\n  private clmmpool: Pool\n\n  private ticks: TickData[]\n\n  private splitSwapResult: SplitSwapResult\n\n  constructor(amount: BN, unit: SplitUnit, clmmpool: Pool, a2b: boolean, byAmountIn: boolean, tickData: TickData[]) {\n    this.minSplitUnit = unit\n    this.a2b = a2b\n    this.byAmountIn = byAmountIn\n    this.clmmpool = clmmpool\n    this.ticks = tickData\n    this.amountArray = []\n    this.createSplitSwapParams = this.createSplitSwapParams.bind(this)\n    this.createSplitSwapParams(amount, unit)\n    this.splitSwapResult = {\n      amountInArray: [],\n      amountOutArray: [],\n      feeAmountArray: [],\n      nextSqrtPriceArray: [],\n      isExceed: [],\n    }\n    this.computeSwap = this.computeSwap.bind(this)\n  }\n\n  createSplitSwapParams(amount: BN, unit: SplitUnit) {\n    const amountArray = createSplitAmountArray(amount, unit)\n    this.amountArray = amountArray\n  }\n\n  computeSwap(): SplitSwapResult {\n    const pool = transClmmpoolDataWithoutTicks(this.clmmpool)\n    this.splitSwapResult = computeSplitSwap(this.a2b, this.byAmountIn, this.amountArray, pool, this.ticks)\n    return this.splitSwapResult\n  }\n}\n","import Decimal from 'decimal.js'\n\nexport function d(value?: Decimal.Value): Decimal.Instance {\n  if (Decimal.isDecimal(value)) {\n    return value as Decimal\n  }\n\n  return new Decimal(value === undefined ? 0 : value)\n}\n\nexport function decimalsMultiplier(decimals?: Decimal.Value): Decimal.Instance {\n  return d(10).pow(d(decimals).abs())\n}\n","/* -------------------------------------------------------------------------- */\n/*                              Helper functions                              */\n/* -------------------------------------------------------------------------- */\n\nimport {\n  SuiObjectData,\n  SuiObjectRef,\n  SuiObjectResponse,\n  OwnedObjectRef,\n  ObjectOwner,\n  DisplayFieldsResponse,\n  SuiMoveObject,\n  SuiParsedData,\n} from '@mysten/sui/client'\n\n/* -------------------------- SuiObjectResponse ------------------------- */\n\nexport function getSuiObjectData(resp: SuiObjectResponse): SuiObjectData | null | undefined {\n  return resp.data\n}\n\nexport function getObjectDeletedResponse(resp: SuiObjectResponse): SuiObjectRef | undefined {\n  if (resp.error && 'object_id' in resp.error && 'version' in resp.error && 'digest' in resp.error) {\n    const { error } = resp\n    return {\n      objectId: error.object_id,\n      version: error.version,\n      digest: error.digest,\n    } as SuiObjectRef\n  }\n\n  return undefined\n}\n\nexport function getObjectNotExistsResponse(resp: SuiObjectResponse): string | undefined {\n  if (resp.error && 'object_id' in resp.error && !('version' in resp.error) && !('digest' in resp.error)) {\n    return resp.error.object_id as string\n  }\n\n  return undefined\n}\n\nexport function getObjectReference(resp: SuiObjectResponse | OwnedObjectRef): SuiObjectRef | undefined {\n  if ('reference' in resp) {\n    return resp.reference\n  }\n  const exists = getSuiObjectData(resp)\n  if (exists) {\n    return {\n      objectId: exists.objectId,\n      version: exists.version,\n      digest: exists.digest,\n    }\n  }\n  return getObjectDeletedResponse(resp)\n}\n\n/* ------------------------------ SuiObjectRef ------------------------------ */\n\nexport function getObjectId(data: SuiObjectResponse | SuiObjectRef | OwnedObjectRef): string {\n  if ('objectId' in data) {\n    return data.objectId\n  }\n  return getObjectReference(data)?.objectId ?? getObjectNotExistsResponse(data as SuiObjectResponse)!\n}\n\nexport function getObjectVersion(data: SuiObjectResponse | SuiObjectRef | SuiObjectData): string | number | undefined {\n  if ('version' in data) {\n    return data.version\n  }\n  return getObjectReference(data)?.version\n}\n\n/* -------------------------------- SuiObject ------------------------------- */\n\nexport function isSuiObjectResponse(resp: SuiObjectResponse | SuiObjectData): resp is SuiObjectResponse {\n  return (resp as SuiObjectResponse).data !== undefined\n}\n\nfunction isSuiObjectDataWithContent(data: SuiObjectData): data is SuiObjectDataWithContent {\n  return data.content !== undefined\n}\n\nexport function getMovePackageContent(data: SuiObjectResponse): any | undefined {\n  const suiObject = getSuiObjectData(data)\n  if (suiObject?.content?.dataType !== 'package') {\n    return undefined\n  }\n  return suiObject.content.disassembled\n}\nexport function getMoveObject(data: SuiObjectResponse | SuiObjectData): SuiMoveObject | undefined {\n  const suiObject = 'data' in data ? getSuiObjectData(data) : (data as SuiObjectData)\n\n  if (!suiObject || !isSuiObjectDataWithContent(suiObject) || suiObject.content.dataType !== 'moveObject') {\n    return undefined\n  }\n\n  return suiObject.content as SuiMoveObject\n}\n\nexport function getMoveObjectType(resp: SuiObjectResponse): string | undefined {\n  return getMoveObject(resp)?.type\n}\n\n/**\n * Deriving the object type from the object response\n * @returns 'package' if the object is a package, move object type(e.g., 0x2::coin::Coin<0x2::sui::SUI>)\n * if the object is a move object\n */\nexport function getObjectType(resp: SuiObjectResponse | SuiObjectData): string | null | undefined {\n  const data = isSuiObjectResponse(resp) ? resp.data : resp\n\n  if (!data?.type && 'data' in resp) {\n    if (data?.content?.dataType === 'package') {\n      return 'package'\n    }\n    return getMoveObjectType(resp)\n  }\n  return data?.type\n}\n\nexport function getObjectPreviousTransactionDigest(resp: SuiObjectResponse): string | null | undefined {\n  return getSuiObjectData(resp)?.previousTransaction\n}\n\nexport function getObjectOwner(resp: SuiObjectResponse): ObjectOwner | null | undefined {\n  return getSuiObjectData(resp)?.owner\n}\n\nexport function getObjectDisplay(resp: SuiObjectResponse): DisplayFieldsResponse {\n  const display = getSuiObjectData(resp)?.display\n  if (!display) {\n    return { data: null, error: null }\n  }\n  return display\n}\n\n/**\n * Get the fields of a sui object response or data. The dataType of the object must be moveObject.\n * @param {SuiObjectResponse | SuiObjectData}object The object to get the fields from.\n * @returns {any} The fields of the object.\n */\nexport function getObjectFields(object: SuiObjectResponse | SuiObjectData): any {\n  const fields = getMoveObject(object)?.fields\n  if (fields) {\n    if ('fields' in fields) {\n      return fields.fields\n    }\n    return fields\n  }\n  return undefined\n}\n\nexport interface SuiObjectDataWithContent extends SuiObjectData {\n  content: SuiParsedData\n}\n\n/**\n * Return hasPublicTransfer of a move object.\n * @param {SuiObjectResponse | SuiObjectData}data\n * @returns\n */\nexport function hasPublicTransfer(data: SuiObjectResponse | SuiObjectData): boolean {\n  return getMoveObject(data)?.hasPublicTransfer ?? false\n}\n","import BN from 'bn.js'\nimport { Pool } from '../types'\nimport { MathUtil } from '../math/utils'\nimport { TickData } from '../types/clmmpool'\nimport { MIN_TICK_INDEX, MAX_TICK_INDEX } from '../types/constants'\n\nexport class TickUtil {\n  /**\n   * Get min tick index.\n   * @param tick_spacing tick spacing\n   * @retruns min tick index\n   */\n  static getMinIndex(tickSpacing: number): number {\n    return MIN_TICK_INDEX + (Math.abs(MIN_TICK_INDEX) % tickSpacing)\n  }\n\n  /**\n   * Get max tick index.\n   * @param tick_spacing - tick spacing\n   * @retruns max tick index\n   */\n  // eslint-disable-next-line camelcase\n  static getMaxIndex(tickSpacing: number): number {\n    return MAX_TICK_INDEX - (MAX_TICK_INDEX % tickSpacing)\n  }\n}\n\n/**\n * Get nearest tick by current tick.\n *\n * @param tickIndex\n * @param tickSpacing\n * @returns\n */\nexport function getNearestTickByTick(tickIndex: number, tickSpacing: number): number {\n  const mod = Math.abs(tickIndex) % tickSpacing\n  if (tickIndex > 0) {\n    if (mod > tickSpacing / 2) {\n      return tickIndex + tickSpacing - mod\n    }\n    return tickIndex - mod\n  }\n  if (mod > tickSpacing / 2) {\n    return tickIndex - tickSpacing + mod\n  }\n  return tickIndex + mod\n}\n\n/**\n * Calculate reward amount in tick range.\n * @param {Pool}pool Pool object.\n * @param {TickData}tickLower Tick lower data.\n * @param {TickData}tickUpper Tick upper data.\n * @param {number}tickLowerIndex Tick lower index.\n * @param {number}tickUpperIndex Tick upper index.\n * @param {BN[]}growthGlobal\n * @returns\n */\nexport function getRewardInTickRange(\n  pool: Pool,\n  tickLower: TickData,\n  tickUpper: TickData,\n  tickLowerIndex: number,\n  tickUpperIndex: number,\n  growthGlobal: BN[]\n) {\n  const rewarderInfos: any = pool.rewarder_infos\n  const rewarderGrowthInside: BN[] = []\n\n  for (let i = 0; i < rewarderInfos.length; i += 1) {\n    let rewarder_growth_below = growthGlobal[i]\n    if (tickLower !== null) {\n      if (pool.current_tick_index < tickLowerIndex) {\n        rewarder_growth_below = growthGlobal[i].sub(new BN(tickLower.rewardersGrowthOutside[i]))\n      } else {\n        rewarder_growth_below = tickLower.rewardersGrowthOutside[i]\n      }\n    }\n    let rewarder_growth_above = new BN(0)\n    if (tickUpper !== null) {\n      if (pool.current_tick_index >= tickUpperIndex) {\n        rewarder_growth_above = growthGlobal[i].sub(new BN(tickUpper.rewardersGrowthOutside[i]))\n      } else {\n        rewarder_growth_above = tickUpper.rewardersGrowthOutside[i]\n      }\n    }\n    const rewGrowthInside = MathUtil.subUnderflowU128(\n      MathUtil.subUnderflowU128(new BN(growthGlobal[i]), new BN(rewarder_growth_below)),\n      new BN(rewarder_growth_above)\n    )\n\n    rewarderGrowthInside.push(rewGrowthInside)\n  }\n  return rewarderGrowthInside\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { coinWithBalance, Transaction, TransactionObjectArgument, TransactionResult } from '@mysten/sui/transactions'\nimport { CoinAssist } from '../math/CoinAssist'\nimport { OnePath, SwapWithRouterParams } from '../modules/routerModule'\nimport { TickData } from '../types/clmmpool'\nimport {\n  ClmmIntegrateRouterWithPartnerModule,\n  ClmmIntegratePoolV2Module,\n  ClmmIntegrateRouterModule,\n  ClmmIntegrateUtilsModule,\n  CLOCK_ADDRESS,\n} from '../types/sui'\nimport SDK, {\n  AddLiquidityFixTokenParams,\n  adjustForSlippage,\n  asUintN,\n  ClmmPoolUtil,\n  CoinAsset,\n  CoinPairType,\n  CollectRewarderParams,\n  d,\n  DeepbookUtils,\n  getPackagerConfigs,\n  normalizeCoinType,\n  Percentage,\n  Pool,\n  SdkOptions,\n  SwapParams,\n  SwapUtils,\n  ZERO,\n} from '../index'\nimport { AggregatorResult, BasePath } from '../modules/routerModuleV2'\nimport { ClmmpoolsError, UtilsErrorCode } from '../errors/errors'\n\nexport type AdjustResult = {\n  isAdjustCoinA: boolean\n  isAdjustCoinB: boolean\n}\n\n/**\n * Adjust coinpair is sui\n * @param {CoinPairType} coinPair\n * @returns\n */\nexport function findAdjustCoin(coinPair: CoinPairType): AdjustResult {\n  const isAdjustCoinA = CoinAssist.isSuiCoin(coinPair.coinTypeA)\n  const isAdjustCoinB = CoinAssist.isSuiCoin(coinPair.coinTypeB)\n  return { isAdjustCoinA, isAdjustCoinB }\n}\n\nexport type BuildCoinResult = {\n  targetCoin: TransactionObjectArgument\n  remainCoins: CoinAsset[]\n  isMintZeroCoin: boolean\n  tragetCoinAmount: string\n  originalSplitedCoin?: TransactionObjectArgument\n}\n\ntype CoinInputInterval = {\n  amountSecond: bigint\n  amountFirst: bigint\n}\n\n/**\n *\n * @param {number} slippageAmount\n * @param slippage\n * @returns\n */\nfunction reverSlippageAmount(slippageAmount: number | string, slippage: number): string {\n  return Decimal.ceil(d(slippageAmount).div(1 + slippage)).toString()\n}\n\nexport async function printTransaction(tx: Transaction, isPrint = true) {\n  console.log(`inputs`, tx.getData().inputs)\n  tx.getData().commands.forEach((item, index) => {\n    if (isPrint) {\n      console.log(`transaction ${index}: `, item)\n    }\n  })\n}\n\ninterface TransferedCoin {\n  coinType: string\n  coin: TransactionObjectArgument\n}\n\nexport class TransactionUtil {\n  static createCollectRewarderAndFeeParams(\n    sdk: SDK,\n    tx: Transaction,\n    params: CollectRewarderParams,\n    allCoinAsset: CoinAsset[],\n    allCoinAssetA?: CoinAsset[],\n    allCoinAssetB?: CoinAsset[]\n  ) {\n    if (allCoinAssetA === undefined) {\n      allCoinAssetA = [...allCoinAsset]\n    }\n    if (allCoinAssetB === undefined) {\n      allCoinAssetB = [...allCoinAsset]\n    }\n    const coinTypeA = normalizeCoinType(params.coinTypeA)\n    const coinTypeB = normalizeCoinType(params.coinTypeB)\n    if (params.collect_fee) {\n      const primaryCoinAInput = TransactionUtil.buildCoinForAmount(tx, allCoinAssetA, BigInt(0), coinTypeA, false)\n      allCoinAssetA = primaryCoinAInput.remainCoins\n\n      const primaryCoinBInput = TransactionUtil.buildCoinForAmount(tx, allCoinAssetB, BigInt(0), coinTypeB, false)\n      allCoinAssetB = primaryCoinBInput.remainCoins\n\n      tx = sdk.Position.createCollectFeePaylod(\n        {\n          pool_id: params.pool_id,\n          pos_id: params.pos_id,\n          coinTypeA: params.coinTypeA,\n          coinTypeB: params.coinTypeB,\n        },\n        tx,\n        primaryCoinAInput.targetCoin,\n        primaryCoinBInput.targetCoin\n      )\n    }\n    const primaryCoinInputs: TransactionObjectArgument[] = []\n    params.rewarder_coin_types.forEach((type) => {\n      switch (normalizeCoinType(type)) {\n        case coinTypeA:\n          primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAssetA!, BigInt(0), type, false).targetCoin)\n          break\n        case coinTypeB:\n          primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAssetB!, BigInt(0), type, false).targetCoin)\n          break\n        default:\n          primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(0), type, false).targetCoin)\n          break\n      }\n    })\n    tx = sdk.Rewarder.createCollectRewarderPaylod(params, tx, primaryCoinInputs)\n    return tx\n  }\n\n  /**\n   * adjust transaction for gas\n   * @param sdk\n   * @param amount\n   * @param tx\n   * @returns\n   */\n  static async adjustTransactionForGas(\n    sdk: SDK,\n    allCoins: CoinAsset[],\n    amount: bigint,\n    tx: Transaction\n  ): Promise<{ fixAmount: bigint; newTx?: Transaction }> {\n    tx.setSender(sdk.senderAddress)\n    // amount coins\n    const amountCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(allCoins, amount).selectedCoins\n    if (amountCoins.length === 0) {\n      throw new ClmmpoolsError(`Insufficient balance`, UtilsErrorCode.InsufficientBalance)\n    }\n    const totalAmount = CoinAssist.calculateTotalBalance(allCoins)\n    // If the remaining coin balance is greater than 1000000000, no gas fee correction will be done\n    if (totalAmount - amount > 1000000000) {\n      return { fixAmount: amount }\n    }\n\n    // payload Estimated gas consumption\n    const estimateGas = await sdk.fullClient.calculationTxGas(tx)\n\n    // Find estimateGas objectIds\n    const gasCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(\n      allCoins,\n      BigInt(estimateGas),\n      amountCoins.map((item) => item.coinObjectId)\n    ).selectedCoins\n\n    // There is not enough gas and the amount needs to be adjusted\n    if (gasCoins.length === 0) {\n      // Readjust the amount , Reserve 500 gas for the spit\n      const newGas = BigInt(estimateGas) + BigInt(500)\n      if (totalAmount - amount < newGas) {\n        amount -= newGas\n        if (amount < 0) {\n          throw new ClmmpoolsError(`gas Insufficient balance`, UtilsErrorCode.InsufficientBalance)\n        }\n\n        const newTx = new Transaction()\n        return { fixAmount: amount, newTx }\n      }\n    }\n    return { fixAmount: amount }\n  }\n\n  // -----------------------------------------liquidity-----------------------------------------------//\n  /**\n   * build add liquidity transaction\n   * @param params\n   * @param slippage\n   * @param curSqrtPrice\n   * @returns\n   */\n  static async buildAddLiquidityFixTokenForGas(\n    sdk: SDK,\n    allCoins: CoinAsset[],\n    params: AddLiquidityFixTokenParams,\n    gasEstimateArg: {\n      slippage: number\n      curSqrtPrice: BN\n    },\n    tx?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ): Promise<Transaction> {\n    tx = await TransactionUtil.buildAddLiquidityFixToken(sdk, allCoins, params, tx, inputCoinA, inputCoinB)\n\n    const { isAdjustCoinA } = findAdjustCoin(params)\n\n    const suiAmount = isAdjustCoinA ? params.amount_a : params.amount_b\n\n    const newResult = await TransactionUtil.adjustTransactionForGas(\n      sdk,\n      CoinAssist.getCoinAssets(isAdjustCoinA ? params.coinTypeA : params.coinTypeB, allCoins),\n      BigInt(suiAmount),\n      tx\n    )\n\n    const { fixAmount } = newResult\n    const { newTx } = newResult\n\n    if (newTx != null) {\n      let primaryCoinAInputs: BuildCoinResult\n      let primaryCoinBInputs: BuildCoinResult\n\n      if (isAdjustCoinA) {\n        params.amount_a = Number(fixAmount)\n        primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          !params.fix_amount_a,\n          fixAmount.toString(),\n          params.slippage,\n          params.coinTypeA,\n          allCoins,\n          false,\n          true\n        )\n        primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          params.fix_amount_a,\n          params.amount_b,\n          params.slippage,\n          params.coinTypeB,\n          allCoins,\n          false,\n          true\n        )\n      } else {\n        params.amount_b = Number(fixAmount)\n        primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          !params.fix_amount_a,\n          params.amount_a,\n          params.slippage,\n          params.coinTypeA,\n          allCoins,\n          false,\n          true\n        )\n        primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          params.fix_amount_a,\n          fixAmount.toString(),\n          params.slippage,\n          params.coinTypeB,\n          allCoins,\n          false,\n          true\n        )\n        params = TransactionUtil.fixAddLiquidityFixTokenParams(params, gasEstimateArg.slippage, gasEstimateArg.curSqrtPrice)\n\n        tx = await TransactionUtil.buildAddLiquidityFixTokenArgs(newTx, sdk, allCoins, params, primaryCoinAInputs, primaryCoinBInputs)\n        return tx\n      }\n    }\n    return tx\n  }\n\n  /**\n   * build add liquidity transaction\n   * @param params\n   * @param packageId\n   * @returns\n   */\n  static async buildAddLiquidityFixToken(\n    sdk: SDK,\n    allCoinAsset: CoinAsset[],\n    params: AddLiquidityFixTokenParams,\n    tx?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ): Promise<Transaction> {\n    if (sdk.senderAddress.length === 0) {\n      throw Error('this config sdk senderAddress is empty')\n    }\n\n    tx = tx || new Transaction()\n\n    let primaryCoinAInputs: BuildCoinResult\n    let primaryCoinBInputs: BuildCoinResult\n    if (inputCoinA == null || inputCoinB == null) {\n      primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n        tx,\n        !params.fix_amount_a,\n        params.amount_a,\n        params.slippage,\n        params.coinTypeA,\n        allCoinAsset,\n        false,\n        true\n      )\n      primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n        tx,\n        params.fix_amount_a,\n        params.amount_b,\n        params.slippage,\n        params.coinTypeB,\n        allCoinAsset,\n        false,\n        true\n      )\n    } else {\n      primaryCoinAInputs = {\n        targetCoin: inputCoinA,\n        remainCoins: [],\n        isMintZeroCoin: false,\n        tragetCoinAmount: '0',\n      }\n      primaryCoinBInputs = {\n        targetCoin: inputCoinB,\n        remainCoins: [],\n        isMintZeroCoin: false,\n        tragetCoinAmount: '0',\n      }\n    }\n\n    tx = TransactionUtil.buildAddLiquidityFixTokenArgs(\n      tx,\n      sdk,\n      allCoinAsset,\n      params as AddLiquidityFixTokenParams,\n      primaryCoinAInputs,\n      primaryCoinBInputs\n    )\n    return tx\n  }\n\n  public static buildAddLiquidityFixTokenCoinInput(\n    tx: Transaction,\n    need_interval_amount: boolean,\n    amount: number | string,\n    slippage: number,\n    coinType: string,\n    allCoinAsset: CoinAsset[],\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    return need_interval_amount\n      ? TransactionUtil.buildCoinForAmountInterval(\n          tx,\n          allCoinAsset,\n          { amountSecond: BigInt(reverSlippageAmount(amount, slippage)), amountFirst: BigInt(amount) },\n          coinType,\n          buildVector,\n          fixAmount\n        )\n      : TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(amount), coinType, buildVector, fixAmount)\n  }\n\n  /**\n   * fix add liquidity fix token for coin amount\n   * @param params\n   * @param slippage\n   * @param curSqrtPrice\n   * @returns\n   */\n  static fixAddLiquidityFixTokenParams(params: AddLiquidityFixTokenParams, slippage: number, curSqrtPrice: BN): AddLiquidityFixTokenParams {\n    const coinAmount = params.fix_amount_a ? params.amount_a : params.amount_b\n    const liquidityInput = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(\n      Number(params.tick_lower),\n      Number(params.tick_upper),\n      new BN(coinAmount),\n      params.fix_amount_a,\n      true,\n      slippage,\n      curSqrtPrice\n    )\n\n    params.amount_a = params.fix_amount_a ? params.amount_a : liquidityInput.tokenMaxA.toNumber()\n    params.amount_b = params.fix_amount_a ? liquidityInput.tokenMaxB.toNumber() : params.amount_b\n\n    return params\n  }\n\n  private static buildAddLiquidityFixTokenArgs(\n    tx: Transaction,\n    sdk: SDK,\n    allCoinAsset: CoinAsset[],\n    params: AddLiquidityFixTokenParams,\n    primaryCoinAInputs: BuildCoinResult,\n    primaryCoinBInputs: BuildCoinResult\n  ) {\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    const functionName = params.is_open ? 'open_position_with_liquidity_by_fix_coin' : 'add_liquidity_by_fix_coin'\n    const { clmm_pool, integrate } = sdk.sdkOptions\n\n    if (!params.is_open) {\n      tx = TransactionUtil.createCollectRewarderAndFeeParams(\n        sdk,\n        tx,\n        params,\n        allCoinAsset,\n        primaryCoinAInputs.remainCoins,\n        primaryCoinBInputs.remainCoins\n      )\n    }\n\n    const clmmConfig = getPackagerConfigs(clmm_pool)\n    const args = params.is_open\n      ? [\n          tx.object(clmmConfig.global_config_id),\n          tx.object(params.pool_id),\n          tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n          tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n          primaryCoinAInputs.targetCoin,\n          primaryCoinBInputs.targetCoin,\n          tx.pure.u64(params.amount_a),\n          tx.pure.u64(params.amount_b),\n          tx.pure.bool(params.fix_amount_a),\n          tx.object(CLOCK_ADDRESS),\n        ]\n      : [\n          tx.object(clmmConfig.global_config_id),\n          tx.object(params.pool_id),\n          tx.object(params.pos_id),\n          primaryCoinAInputs.targetCoin,\n          primaryCoinBInputs.targetCoin,\n          tx.pure.u64(params.amount_a),\n          tx.pure.u64(params.amount_b),\n          tx.pure.bool(params.fix_amount_a),\n          tx.object(CLOCK_ADDRESS),\n        ]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n      typeArguments,\n      arguments: args,\n    })\n    return tx\n  }\n\n  // -------------------------------------------swap--------------------------------------------------//\n  /**\n   * build add liquidity transaction\n   * @param params\n   * @param slippage\n   * @param curSqrtPrice\n   * @returns\n   */\n  static async buildSwapTransactionForGas(\n    sdk: SDK,\n    params: SwapParams,\n    allCoinAsset: CoinAsset[],\n    gasEstimateArg: {\n      byAmountIn: boolean\n      slippage: Percentage\n      decimalsA: number\n      decimalsB: number\n      swapTicks: Array<TickData>\n      currentPool: Pool\n    }\n  ): Promise<Transaction> {\n    let tx = TransactionUtil.buildSwapTransaction(sdk, params, allCoinAsset)\n    tx.setSender(sdk.senderAddress)\n    const newResult = await TransactionUtil.adjustTransactionForGas(\n      sdk,\n      CoinAssist.getCoinAssets(params.a2b ? params.coinTypeA : params.coinTypeB, allCoinAsset),\n      BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n      tx\n    )\n\n    const { fixAmount, newTx } = newResult\n\n    if (newTx !== undefined) {\n      newTx.setSender(sdk.senderAddress)\n      if (params.by_amount_in) {\n        params.amount = fixAmount.toString()\n      } else {\n        params.amount_limit = fixAmount.toString()\n      }\n      params = await TransactionUtil.fixSwapParams(sdk, params, gasEstimateArg)\n\n      const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n        tx,\n        allCoinAsset,\n        params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n        params.coinTypeA\n      )\n\n      const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n        tx,\n        allCoinAsset,\n        params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n        params.coinTypeB\n      )\n\n      tx = TransactionUtil.buildSwapTransactionArgs(newTx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n    }\n\n    return tx\n  }\n\n  /**\n   * build swap transaction\n   * @param params\n   * @param packageId\n   * @returns\n   */\n  static buildSwapTransaction(sdk: SDK, params: SwapParams, allCoinAsset: CoinAsset[]): Transaction {\n    let tx = new Transaction()\n    tx.setSender(sdk.senderAddress)\n\n    const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n      tx,\n      allCoinAsset,\n      params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n      params.coinTypeA,\n      false\n    )\n\n    const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n      tx,\n      allCoinAsset,\n      params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n      params.coinTypeB,\n      false\n    )\n\n    tx = TransactionUtil.buildSwapTransactionArgs(tx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n    return tx\n  }\n\n  /**\n   * build swap transaction\n   * @param params\n   * @param packageId\n   * @returns\n   */\n  static buildSwapTransactionArgs(\n    tx: Transaction,\n    params: SwapParams,\n    sdkOptions: SdkOptions,\n    primaryCoinInputA: BuildCoinResult,\n    primaryCoinInputB: BuildCoinResult\n  ): Transaction {\n    const { clmm_pool, integrate } = sdkOptions\n\n    const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n    if (global_config_id === undefined) {\n      throw Error('clmm.config.global_config_id is undefined')\n    }\n\n    const hasSwapPartner = params.swap_partner !== undefined\n\n    const functionName = hasSwapPartner\n      ? params.a2b\n        ? 'swap_a2b_with_partner'\n        : 'swap_b2a_with_partner'\n      : params.a2b\n      ? 'swap_a2b'\n      : 'swap_b2a'\n\n    const args = hasSwapPartner\n      ? [\n          tx.object(global_config_id),\n          tx.object(params.pool_id),\n          tx.object(params.swap_partner!),\n          primaryCoinInputA.targetCoin,\n          primaryCoinInputB.targetCoin,\n          tx.pure.bool(params.by_amount_in),\n          tx.pure.u64(params.amount),\n          tx.pure.u64(params.amount_limit),\n          tx.pure.u128(sqrtPriceLimit.toString()),\n          tx.object(CLOCK_ADDRESS),\n        ]\n      : [\n          tx.object(global_config_id),\n          tx.object(params.pool_id),\n          primaryCoinInputA.targetCoin,\n          primaryCoinInputB.targetCoin,\n          tx.pure.bool(params.by_amount_in),\n          tx.pure.u64(params.amount),\n          tx.pure.u64(params.amount_limit),\n          tx.pure.u128(sqrtPriceLimit.toString()),\n          tx.object(CLOCK_ADDRESS),\n        ]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n      typeArguments,\n      arguments: args,\n    })\n    return tx\n  }\n\n  // -------------------------------------swap-with-out-transfer-coin-----------------------------------------//\n  /**\n   * build add liquidity transaction with out transfer coins\n   * @param params\n   * @param slippage\n   * @param curSqrtPrice\n   * @returns\n   */\n  static async buildSwapTransactionWithoutTransferCoinsForGas(\n    sdk: SDK,\n    params: SwapParams,\n    allCoinAsset: CoinAsset[],\n    gasEstimateArg: {\n      byAmountIn: boolean\n      slippage: Percentage\n      decimalsA: number\n      decimalsB: number\n      swapTicks: Array<TickData>\n      currentPool: Pool\n    }\n  ): Promise<{ tx: Transaction; coinABs: TransactionObjectArgument[] }> {\n    let { tx, coinABs } = TransactionUtil.buildSwapTransactionWithoutTransferCoins(sdk, params, allCoinAsset)\n    tx.setSender(sdk.senderAddress)\n    const newResult = await TransactionUtil.adjustTransactionForGas(\n      sdk,\n      CoinAssist.getCoinAssets(params.a2b ? params.coinTypeA : params.coinTypeB, allCoinAsset),\n      BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n      tx\n    )\n\n    const { fixAmount, newTx } = newResult\n\n    if (newTx !== undefined) {\n      newTx.setSender(sdk.senderAddress)\n      if (params.by_amount_in) {\n        params.amount = fixAmount.toString()\n      } else {\n        params.amount_limit = fixAmount.toString()\n      }\n      params = await TransactionUtil.fixSwapParams(sdk, params, gasEstimateArg)\n\n      const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n        tx,\n        allCoinAsset,\n        params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n        params.coinTypeA,\n        false,\n        true\n      )\n\n      const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n        tx,\n        allCoinAsset,\n        params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n        params.coinTypeB,\n        false,\n        true\n      )\n\n      const res = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n        sdk,\n        newTx,\n        params,\n        sdk.sdkOptions,\n        primaryCoinInputA,\n        primaryCoinInputB\n      )\n      tx = res.tx\n      coinABs = res.txRes\n    }\n\n    return { tx, coinABs }\n  }\n\n  /**\n   * build swap transaction and return swaped coin\n   * @param params\n   * @param packageId\n   * @returns\n   */\n  static buildSwapTransactionWithoutTransferCoins(\n    sdk: SDK,\n    params: SwapParams,\n    allCoinAsset: CoinAsset[]\n  ): { tx: Transaction; coinABs: TransactionObjectArgument[] } {\n    const tx = new Transaction()\n    tx.setSender(sdk.senderAddress)\n\n    // Fix amount must set true, to support amount limit.\n    const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n      tx,\n      allCoinAsset,\n      params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n      params.coinTypeA,\n      false,\n      true\n    )\n\n    const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n      tx,\n      allCoinAsset,\n      params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n      params.coinTypeB,\n      false,\n      true\n    )\n\n    const res = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n      sdk,\n      tx,\n      params,\n      sdk.sdkOptions,\n      primaryCoinInputA,\n      primaryCoinInputB\n    )\n    return { tx: res.tx, coinABs: res.txRes }\n  }\n\n  /**\n   * build swap transaction\n   * @param params\n   * @param packageId\n   * @returns\n   */\n  static buildSwapTransactionWithoutTransferCoinArgs(\n    sdk: SDK,\n    tx: Transaction,\n    params: SwapParams,\n    sdkOptions: SdkOptions,\n    primaryCoinInputA: BuildCoinResult,\n    primaryCoinInputB: BuildCoinResult\n  ): { tx: Transaction; txRes: TransactionObjectArgument[] } {\n    const { clmm_pool, integrate } = sdkOptions\n\n    const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n\n    const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n    if (global_config_id === undefined) {\n      throw Error('clmm.config.global_config_id is undefined')\n    }\n\n    const hasSwapPartner = params.swap_partner !== undefined\n\n    const functionName = hasSwapPartner ? 'swap_with_partner' : 'swap'\n\n    const moduleName = hasSwapPartner ? ClmmIntegrateRouterWithPartnerModule : ClmmIntegrateRouterModule\n\n    const args = hasSwapPartner\n      ? [\n          tx.object(global_config_id),\n          tx.object(params.pool_id),\n          tx.object(params.swap_partner!),\n          primaryCoinInputA.targetCoin,\n          primaryCoinInputB.targetCoin,\n          tx.pure.bool(params.a2b),\n          tx.pure.bool(params.by_amount_in),\n          tx.pure.u64(params.amount),\n          tx.pure.u128(sqrtPriceLimit.toString()),\n          tx.pure.bool(false), // use coin value always set false.\n          tx.object(CLOCK_ADDRESS),\n        ]\n      : [\n          tx.object(global_config_id),\n          tx.object(params.pool_id),\n          primaryCoinInputA.targetCoin,\n          primaryCoinInputB.targetCoin,\n          tx.pure.bool(params.a2b),\n          tx.pure.bool(params.by_amount_in),\n          tx.pure.u64(params.amount),\n          tx.pure.u128(sqrtPriceLimit.toString()),\n          tx.pure.bool(false), // use coin value always set false.\n          tx.object(CLOCK_ADDRESS),\n        ]\n\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    const coinABs: TransactionObjectArgument[] = tx.moveCall({\n      target: `${integrate.published_at}::${moduleName}::${functionName}`,\n      typeArguments,\n      arguments: args,\n    })\n\n    if (params.by_amount_in) {\n      const toCoinType = params.a2b ? params.coinTypeB : params.coinTypeA\n      const toCoin = params.a2b ? coinABs[1] : coinABs[0]\n      const totalAmount = Number(params.amount_limit)\n      this.checkCoinThreshold(sdk, params.by_amount_in, tx, toCoin, totalAmount, toCoinType)\n    }\n\n    return { tx, txRes: coinABs }\n  }\n\n  static async fixSwapParams(\n    sdk: SDK,\n    params: SwapParams,\n    gasEstimateArg: {\n      byAmountIn: boolean\n      slippage: Percentage\n      decimalsA: number\n      decimalsB: number\n      swapTicks: Array<TickData>\n      currentPool: Pool\n    }\n  ): Promise<SwapParams> {\n    const { currentPool } = gasEstimateArg\n    try {\n      const res: any = await sdk.Swap.preswap({\n        decimalsA: gasEstimateArg.decimalsA,\n        decimalsB: gasEstimateArg.decimalsB,\n        a2b: params.a2b,\n        byAmountIn: params.by_amount_in,\n        amount: params.amount,\n        pool: currentPool,\n        currentSqrtPrice: currentPool.current_sqrt_price,\n        coinTypeA: currentPool.coinTypeA,\n        coinTypeB: currentPool.coinTypeB,\n      })\n\n      const toAmount = gasEstimateArg.byAmountIn ? res.estimatedAmountOut : res.estimatedAmountIn\n\n      const amountLimit = adjustForSlippage(toAmount, gasEstimateArg.slippage, !gasEstimateArg.byAmountIn)\n      params.amount_limit = amountLimit.toString()\n    } catch (error) {\n      console.log('fixSwapParams', error)\n    }\n\n    return params\n  }\n\n  public static async syncBuildCoinInputForAmount(\n    sdk: SDK,\n    tx: Transaction,\n    amount: bigint,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): Promise<TransactionObjectArgument | undefined> {\n    if (sdk.senderAddress.length === 0) {\n      throw Error('this config sdk senderAddress is empty')\n    }\n\n    const allCoins = await sdk.getOwnerCoinAssets(sdk.senderAddress, coinType)\n    const primaryCoinInput: any = TransactionUtil.buildCoinForAmount(tx, allCoins, amount, coinType, buildVector, fixAmount)!.targetCoin\n\n    return primaryCoinInput\n  }\n\n  public static buildCoinForAmount(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n    // mint zero coin\n    if (amount === BigInt(0)) {\n      return TransactionUtil.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n    }\n    const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n    if (amountTotal < amount) {\n      throw new ClmmpoolsError(\n        `The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amount} `,\n        UtilsErrorCode.InsufficientBalance\n      )\n    }\n\n    return TransactionUtil.buildCoin(tx, allCoins, coinAssets, amount, coinType, buildVector, fixAmount)\n  }\n\n  public static buildCoinWithBalance(amount: bigint, coinType: string): TransactionObjectArgument {\n    if (amount === BigInt(0)) {\n      if (CoinAssist.isSuiCoin(coinType)) {\n        return coinWithBalance({ balance: amount, useGasCoin: false })\n      }\n    }\n\n    return coinWithBalance({ balance: amount, type: coinType })\n  }\n\n  private static buildVectorCoin(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    coinAssets: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    fixAmount = true\n  ) {\n    if (CoinAssist.isSuiCoin(coinType)) {\n      const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n      return {\n        targetCoin: tx.makeMoveVec({ elements: [amountCoin] }),\n        remainCoins: allCoins,\n        tragetCoinAmount: amount.toString(),\n        isMintZeroCoin: false,\n        originalSplitedCoin: tx.gas,\n      }\n    }\n\n    const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult, coinObjectIds } = this.buildSpitTargeCoin(\n      tx,\n      amount,\n      coinAssets,\n      fixAmount\n    )\n\n    if (fixAmount) {\n      return {\n        targetCoin: tx.makeMoveVec({ elements: [targetCoin] }),\n        remainCoins: selectedCoinsResult.remainCoins,\n        originalSplitedCoin,\n        tragetCoinAmount,\n        isMintZeroCoin: false,\n      }\n    }\n\n    return {\n      targetCoin: tx.makeMoveVec({ elements: coinObjectIds.map((id) => tx.object(id)) }),\n      remainCoins: selectedCoinsResult.remainCoins,\n      tragetCoinAmount: selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString(),\n      isMintZeroCoin: false,\n    }\n  }\n\n  private static buildOneCoin(tx: Transaction, coinAssets: CoinAsset[], amount: bigint, coinType: string, fixAmount = true) {\n    if (CoinAssist.isSuiCoin(coinType)) {\n      if (amount === 0n && coinAssets.length > 1) {\n        const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n        return {\n          targetCoin: tx.object(selectedCoinsResult.objectArray[0]),\n          remainCoins: selectedCoinsResult.remainCoins,\n          tragetCoinAmount: selectedCoinsResult.amountArray[0],\n          isMintZeroCoin: false,\n        }\n      }\n      const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n      const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n      return {\n        targetCoin: amountCoin,\n        remainCoins: selectedCoinsResult.remainCoins,\n        tragetCoinAmount: amount.toString(),\n        isMintZeroCoin: false,\n        originalSplitedCoin: tx.gas,\n      }\n    }\n\n    const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult } = this.buildSpitTargeCoin(\n      tx,\n      amount,\n      coinAssets,\n      fixAmount\n    )\n\n    return {\n      targetCoin,\n      remainCoins: selectedCoinsResult.remainCoins,\n      originalSplitedCoin,\n      tragetCoinAmount,\n      isMintZeroCoin: false,\n    }\n  }\n\n  private static buildSpitTargeCoin(tx: Transaction, amount: bigint, coinAssets: CoinAsset[], fixAmount: boolean) {\n    const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n    const totalSelectedCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n    const coinObjectIds = selectedCoinsResult.objectArray\n\n    const [primaryCoinA, ...mergeCoinAs] = coinObjectIds\n    const primaryCoinAObject = tx.object(primaryCoinA)\n\n    let targetCoin: any = primaryCoinAObject\n    const tragetCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n    let originalSplitedCoin\n    if (mergeCoinAs.length > 0) {\n      tx.mergeCoins(\n        primaryCoinAObject,\n        mergeCoinAs.map((coin) => tx.object(coin))\n      )\n    }\n\n    if (fixAmount && Number(totalSelectedCoinAmount) > Number(amount)) {\n      targetCoin = tx.splitCoins(primaryCoinAObject, [tx.pure.u64(amount)])\n      originalSplitedCoin = primaryCoinAObject\n    }\n\n    return {\n      originalSplitedCoin,\n      targetCoin,\n      tragetCoinAmount,\n      selectedCoinsResult,\n      coinObjectIds,\n    }\n  }\n\n  private static buildCoin(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    coinAssets: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    if (buildVector) {\n      return this.buildVectorCoin(tx, allCoins, coinAssets, amount, coinType, fixAmount)\n    }\n\n    return this.buildOneCoin(tx, coinAssets, amount, coinType, fixAmount)\n  }\n\n  private static buildZeroValueCoin(allCoins: CoinAsset[], tx: Transaction, coinType: string, buildVector = true): BuildCoinResult {\n    const zeroCoin = TransactionUtil.callMintZeroValueCoin(tx, coinType)\n    let targetCoin: any\n    if (buildVector) {\n      targetCoin = tx.makeMoveVec({ elements: [zeroCoin] })\n    } else {\n      targetCoin = zeroCoin\n    }\n\n    return {\n      targetCoin,\n      remainCoins: allCoins,\n      isMintZeroCoin: true,\n      tragetCoinAmount: '0',\n    }\n  }\n\n  public static buildCoinForAmountInterval(\n    tx: Transaction,\n    allCoins: CoinAsset[],\n    amounts: CoinInputInterval,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n    if (amounts.amountFirst === BigInt(0)) {\n      if (coinAssets.length > 0) {\n        return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n      }\n      return TransactionUtil.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n    }\n\n    const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n\n    if (amountTotal >= amounts.amountFirst) {\n      return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n    }\n\n    if (amountTotal < amounts.amountSecond) {\n      throw new ClmmpoolsError(\n        `The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amounts.amountSecond} `,\n        UtilsErrorCode.InsufficientBalance\n      )\n    }\n\n    return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountSecond, coinType, buildVector, fixAmount)\n  }\n\n  static callMintZeroValueCoin = (txb: Transaction, coinType: string) => {\n    return txb.moveCall({\n      target: '0x2::coin::zero',\n      typeArguments: [coinType],\n    })\n  }\n\n  // ------------------------------------------router-v1-------------------------------------------------//\n  public static async buildRouterSwapTransaction(\n    sdk: SDK,\n    params: SwapWithRouterParams,\n    byAmountIn: boolean,\n    allCoinAsset: CoinAsset[],\n    // If recipient not set, transfer objects move call will use ctx sender.\n    recipient?: string\n  ): Promise<Transaction> {\n    let tx = new Transaction()\n\n    // When the router's split path length exceeds 1, router cannot support partner.\n    // now router v1 just return one best path.\n    // when use router v2, must set allow split to false.\n    if (params.paths.length > 1) {\n      params.partner = ''\n    }\n\n    tx = await this.buildRouterBasePathTx(sdk, params, byAmountIn, allCoinAsset, tx, recipient)\n    return tx\n  }\n\n  static async buildRouterBasePathTx(\n    sdk: SDK,\n    params: SwapWithRouterParams,\n    byAmountIn: boolean,\n    allCoinAsset: CoinAsset[],\n    tx: Transaction,\n    // If recipient not set, transfer objects move call will use ctx sender.\n    recipient?: string\n  ) {\n    const validPaths = params.paths.filter((path) => path && path.poolAddress)\n    const inputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n    const outputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n    const totalAmountLimit = byAmountIn\n      ? Math.round(Number(outputAmount.toString()) * (1 - params.priceSlippagePoint))\n      : Math.round(Number(inputAmount.toString()) * (1 + params.priceSlippagePoint))\n\n    const fromCoinType = params.paths[0].coinType[0]\n    const toCoinType = params.paths[0].coinType[params.paths[0].coinType.length - 1]\n\n    // When fix amount out, the amount of fromCoin must set to amountLimit to support limit amount slippage point.\n    const fromCoinBuildResult = TransactionUtil.buildCoinForAmount(\n      tx,\n      allCoinAsset,\n      byAmountIn ? BigInt(inputAmount) : BigInt(totalAmountLimit),\n      fromCoinType,\n      false,\n      true\n    )\n    const isSplited = fromCoinBuildResult.originalSplitedCoin !== undefined\n    const toCoinBuildResult = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, 0n, toCoinType, false)\n\n    const buildRouterBasePathReturnCoin = await this.buildRouterBasePathReturnCoins(\n      sdk,\n      params,\n      byAmountIn,\n      fromCoinBuildResult,\n      toCoinBuildResult,\n      tx\n    )\n\n    const transferedCoins: TransferedCoin[] = []\n    const { toCoin, fromCoin } = buildRouterBasePathReturnCoin\n    tx = buildRouterBasePathReturnCoin.tx\n\n    if (toCoinBuildResult.isMintZeroCoin) {\n      transferedCoins.push({\n        coinType: toCoinType,\n        coin: toCoin,\n      })\n    } else if (toCoinBuildResult.originalSplitedCoin !== undefined) {\n      tx.mergeCoins(toCoinBuildResult.originalSplitedCoin!, [toCoin])\n    } else {\n      tx.mergeCoins(toCoinBuildResult.targetCoin, [toCoin])\n    }\n\n    if (isSplited) {\n      const originalSplitedFromCoin = fromCoinBuildResult?.originalSplitedCoin as TransactionObjectArgument\n      tx.mergeCoins(originalSplitedFromCoin, [fromCoin])\n    } else {\n      transferedCoins.push({\n        coinType: fromCoinType,\n        coin: fromCoin,\n      })\n    }\n\n    for (let i = 0; i < transferedCoins.length; i++) {\n      this.buildTransferCoin(sdk, tx, transferedCoins[i].coin, transferedCoins[i].coinType, recipient)\n    }\n\n    return tx\n  }\n\n  static async buildRouterBasePathReturnCoins(\n    sdk: SDK,\n    params: SwapWithRouterParams,\n    byAmountIn: boolean,\n    fromCoinBuildRes: BuildCoinResult,\n    toCoinBuildRes: BuildCoinResult,\n    tx: Transaction\n  ) {\n    const { clmm_pool, integrate } = sdk.sdkOptions\n    const globalConfigID = getPackagerConfigs(clmm_pool).global_config_id\n\n    const validPaths = params.paths.filter((path) => path && path.poolAddress)\n\n    const inputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n    const outputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n    const totalAmountLimit = byAmountIn\n      ? Math.round(Number(outputAmount.toString()) * (1 - params.priceSlippagePoint))\n      : Math.round(Number(inputAmount.toString()) * (1 + params.priceSlippagePoint))\n\n    const fromCoinType = params.paths[0].coinType[0]\n    const toCoinType = params.paths[0].coinType[params.paths[0].coinType.length - 1]\n\n    let fromCoin = fromCoinBuildRes.targetCoin as TransactionObjectArgument\n    let toCoin\n    if (toCoinBuildRes.isMintZeroCoin || toCoinBuildRes.originalSplitedCoin !== undefined) {\n      toCoin = toCoinBuildRes.targetCoin as TransactionObjectArgument\n    } else {\n      toCoin = TransactionUtil.callMintZeroValueCoin(tx, toCoinType)\n    }\n\n    const noPartner = params.partner === ''\n\n    const moduleName = noPartner ? ClmmIntegrateRouterModule : ClmmIntegrateRouterWithPartnerModule\n\n    for (const path of validPaths) {\n      if (path.poolAddress.length === 1) {\n        const a2b = path.a2b[0]\n        const swapParams = {\n          amount: Number(path.amountIn.toString()),\n          amountLimit: totalAmountLimit,\n          poolCoinA: path.a2b[0] ? fromCoinType : toCoinType,\n          poolCoinB: path.a2b[0] ? toCoinType : fromCoinType,\n        }\n\n        const functionName = noPartner ? 'swap' : 'swap_with_partner'\n\n        const poolCoinA = a2b ? fromCoin : toCoin\n        const poolCoinB = a2b ? toCoin : fromCoin\n        const amount = byAmountIn ? path.amountIn.toString() : path.amountOut.toString()\n\n        const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b).toString()\n        const args: any = noPartner\n          ? [\n              tx.object(globalConfigID),\n              tx.object(path.poolAddress[0]),\n              poolCoinA,\n              poolCoinB,\n              tx.pure.bool(a2b),\n              tx.pure.bool(byAmountIn),\n              tx.pure.u64(amount),\n              tx.pure.u128(sqrtPriceLimit),\n              tx.pure.bool(false),\n              tx.object(CLOCK_ADDRESS),\n            ]\n          : [\n              tx.object(globalConfigID),\n              tx.object(path.poolAddress[0]),\n              tx.object(params.partner),\n              poolCoinA,\n              poolCoinB,\n              tx.pure.bool(a2b),\n              tx.pure.bool(byAmountIn),\n              tx.pure.u64(amount),\n              tx.pure.u128(sqrtPriceLimit),\n              tx.pure.bool(false),\n              tx.object(CLOCK_ADDRESS),\n            ]\n\n        const typeArguments = [swapParams.poolCoinA, swapParams.poolCoinB]\n\n        const coinABs: TransactionObjectArgument[] = tx.moveCall({\n          target: `${sdk.sdkOptions.integrate.published_at}::${moduleName}::${functionName}`,\n          typeArguments,\n          arguments: args,\n        })\n        fromCoin = a2b ? coinABs[0] : coinABs[1]\n        toCoin = a2b ? coinABs[1] : coinABs[0]\n      } else {\n        const amount0 = byAmountIn ? path.amountIn : path.rawAmountLimit[0]\n        const amount1 = byAmountIn ? 0 : path.amountOut\n\n        let functionName = ''\n        if (path.a2b[0]) {\n          if (path.a2b[1]) {\n            functionName = 'swap_ab_bc'\n          } else {\n            functionName = 'swap_ab_cb'\n          }\n        } else if (path.a2b[1]) {\n          functionName = 'swap_ba_bc'\n        } else {\n          functionName = 'swap_ba_cb'\n        }\n\n        if (!noPartner) {\n          functionName = `${functionName}_with_partner`\n        }\n\n        const sqrtPriceLimit0 = SwapUtils.getDefaultSqrtPriceLimit(path.a2b[0])\n        const sqrtPriceLimit1 = SwapUtils.getDefaultSqrtPriceLimit(path.a2b[1])\n        const args: any = noPartner\n          ? [\n              tx.object(globalConfigID),\n              tx.object(path.poolAddress[0]),\n              tx.object(path.poolAddress[1]),\n              fromCoin,\n              toCoin,\n              tx.pure.bool(byAmountIn),\n              tx.pure.u64(amount0.toString()),\n              tx.pure.u64(amount1.toString()),\n              tx.pure.u128(sqrtPriceLimit0.toString()),\n              tx.pure.u128(sqrtPriceLimit1.toString()),\n              tx.object(CLOCK_ADDRESS),\n            ]\n          : [\n              tx.object(globalConfigID),\n              tx.object(path.poolAddress[0]),\n              tx.object(path.poolAddress[1]),\n              tx.object(params.partner),\n              fromCoin,\n              toCoin,\n              tx.pure.bool(byAmountIn),\n              tx.pure.u64(amount0.toString()),\n              tx.pure.u64(amount1.toString()),\n              tx.pure.u128(sqrtPriceLimit0.toString()),\n              tx.pure.u128(sqrtPriceLimit1.toString()),\n              tx.object(CLOCK_ADDRESS),\n            ]\n        const typeArguments = [path.coinType[0], path.coinType[1], path.coinType[2]]\n        const fromToCoins = tx.moveCall({\n          target: `${integrate.published_at}::${moduleName}::${functionName}`,\n          typeArguments,\n          arguments: args,\n        })\n        fromCoin = fromToCoins[0] as TransactionObjectArgument\n        toCoin = fromToCoins[1] as TransactionObjectArgument\n      }\n    }\n\n    this.checkCoinThreshold(sdk, byAmountIn, tx, toCoin, totalAmountLimit, toCoinType)\n    return { fromCoin, toCoin, tx }\n  }\n\n  // ------------------------------------------router-v2-------------------------------------------------//\n  public static async buildAggregatorSwapReturnCoins(\n    sdk: SDK,\n    param: AggregatorResult,\n    fromCoinBuildRes: BuildCoinResult,\n    toCoinBuildRes: BuildCoinResult,\n    partner: string,\n    priceSplitPoint: number,\n    tx: Transaction,\n    // If recipient not set, transfer objects move call will use sdk.senderAddress\n    recipient?: string\n  ) {\n    if (recipient == null) {\n      if (sdk.senderAddress.length === 0) {\n        throw Error('recipient and this config sdk senderAddress all not set')\n      }\n      recipient = sdk.senderAddress\n    }\n\n    // When the router's split path length exceeds 1, router cannot support partner.\n    // now router v1 just return one best path.\n    // when use router v2, must set allow split to false.\n    if (param.splitPaths.length > 1) {\n      partner = ''\n    }\n\n    let fromCoin\n    let toCoin\n\n    const hasExternalPool = param.splitPaths.some((splitPath) => splitPath.basePaths.some((basePath) => basePath.label === 'Deepbook'))\n\n    if ((!param.byAmountIn || param.splitPaths.length === 1) && !hasExternalPool) {\n      const onePaths: OnePath[] = []\n      for (const splitPath of param.splitPaths) {\n        const a2b = []\n        const poolAddress = []\n        const rawAmountLimit: BN[] = []\n        const coinType = []\n\n        for (let i = 0; i < splitPath.basePaths.length; i += 1) {\n          const basePath = splitPath.basePaths[i]\n          a2b.push(basePath.direction)\n          poolAddress.push(basePath.poolAddress)\n          rawAmountLimit.push(new BN(basePath.inputAmount.toString()))\n          if (i === 0) {\n            coinType.push(basePath.fromCoin, basePath.toCoin)\n          } else {\n            coinType.push(basePath.toCoin)\n          }\n        }\n\n        const onePath: OnePath = {\n          amountIn: new BN(splitPath.inputAmount.toString()),\n          amountOut: new BN(splitPath.outputAmount.toString()),\n          poolAddress,\n          a2b,\n          rawAmountLimit,\n          isExceed: false,\n          coinType,\n        }\n        onePaths.push(onePath)\n      }\n      const params: SwapWithRouterParams = {\n        paths: onePaths,\n        partner,\n        priceSlippagePoint: priceSplitPoint,\n      }\n\n      const buildRouterBasePathReturnCoinRes = await this.buildRouterBasePathReturnCoins(\n        sdk,\n        params,\n        param.byAmountIn,\n        fromCoinBuildRes,\n        toCoinBuildRes,\n        tx\n      )\n      fromCoin = buildRouterBasePathReturnCoinRes.fromCoin\n      toCoin = buildRouterBasePathReturnCoinRes.toCoin\n      tx = buildRouterBasePathReturnCoinRes.tx\n    } else {\n      const amountLimit = Math.round(param.outputAmount * (1 - priceSplitPoint))\n\n      fromCoin = fromCoinBuildRes.targetCoin as TransactionObjectArgument\n      if (toCoinBuildRes.isMintZeroCoin || toCoinBuildRes.originalSplitedCoin !== undefined) {\n        toCoin = toCoinBuildRes.targetCoin as TransactionObjectArgument\n      } else {\n        toCoin = TransactionUtil.callMintZeroValueCoin(tx, param.toCoin)\n      }\n\n      let isCreateAccountCap = false\n\n      let accountCap\n      if (hasExternalPool) {\n        const [cap, createAccountCapTX] = DeepbookUtils.createAccountCap(recipient, sdk.sdkOptions, tx)\n        tx = createAccountCapTX as Transaction\n        accountCap = cap as TransactionObjectArgument\n        isCreateAccountCap = true\n      }\n\n      for (let i = 0; i < param.splitPaths.length; i += 1) {\n        const splitPath = param.splitPaths[i]\n\n        let middleCoin: any\n        for (let i = 0; i < splitPath.basePaths.length; i += 1) {\n          const basePath = splitPath.basePaths[i]\n          if (basePath.label === 'Deepbook') {\n            if (i === 0) {\n              if (splitPath.basePaths.length === 1) {\n                const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, fromCoin, toCoin, false)\n\n                fromCoin = deepbookTxBuild.from as TransactionObjectArgument\n                toCoin = deepbookTxBuild.to as TransactionObjectArgument\n              } else {\n                middleCoin = TransactionUtil.callMintZeroValueCoin(tx, basePath.toCoin)\n                const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, fromCoin, middleCoin, false)\n                fromCoin = deepbookTxBuild.from as TransactionObjectArgument\n                middleCoin = deepbookTxBuild.to as TransactionObjectArgument\n              }\n            } else {\n              const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, middleCoin, toCoin, true)\n\n              middleCoin = deepbookTxBuild.from as TransactionObjectArgument\n              toCoin = deepbookTxBuild.to as TransactionObjectArgument\n            }\n          }\n          if (basePath.label === 'Cetus') {\n            if (i === 0) {\n              if (splitPath.basePaths.length === 1) {\n                const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, fromCoin, toCoin, false, partner)\n                fromCoin = clmmTxBuild.from as TransactionObjectArgument\n                toCoin = clmmTxBuild.to as TransactionObjectArgument\n              } else {\n                middleCoin = TransactionUtil.callMintZeroValueCoin(tx, basePath.toCoin)\n                const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, fromCoin, middleCoin, false, partner)\n                fromCoin = clmmTxBuild.from as TransactionObjectArgument\n                middleCoin = clmmTxBuild.to as TransactionObjectArgument\n              }\n            } else {\n              const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, middleCoin, toCoin, true, partner)\n              middleCoin = clmmTxBuild.from as TransactionObjectArgument\n              toCoin = clmmTxBuild.to as TransactionObjectArgument\n              tx.moveCall({\n                target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::send_coin`,\n                typeArguments: [basePath.fromCoin],\n                arguments: [middleCoin, tx.pure.address(recipient)],\n              })\n            }\n          }\n        }\n      }\n\n      this.checkCoinThreshold(sdk, param.byAmountIn, tx, toCoin, amountLimit, param.toCoin)\n\n      if (isCreateAccountCap) {\n        tx = DeepbookUtils.deleteAccountCapByObject(accountCap as TransactionObjectArgument, sdk.sdkOptions, tx)\n      }\n    }\n    return { fromCoin, toCoin, tx }\n  }\n\n  public static async buildAggregatorSwapTransaction(\n    sdk: SDK,\n    param: AggregatorResult,\n    allCoinAsset: CoinAsset[],\n    partner: string,\n    priceSlippagePoint: number,\n    recipient?: string\n  ) {\n    let tx = new Transaction()\n\n    const amountLimit = param.byAmountIn\n      ? Math.round(param.outputAmount * (1 - priceSlippagePoint))\n      : Math.round(param.inputAmount * (1 + priceSlippagePoint))\n    const fromCoinBuildResult = TransactionUtil.buildCoinForAmount(\n      tx,\n      allCoinAsset,\n      param.byAmountIn ? BigInt(param.inputAmount) : BigInt(amountLimit),\n      param.fromCoin,\n      false,\n      true\n    )\n    const isSplited = fromCoinBuildResult.originalSplitedCoin != null\n    const toCoinBuildResult = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, 0n, param.toCoin, false)\n\n    const buildAggregatorSwapReturnCoinsRes = await this.buildAggregatorSwapReturnCoins(\n      sdk,\n      param,\n      fromCoinBuildResult,\n      toCoinBuildResult,\n      partner,\n      priceSlippagePoint,\n      tx,\n      recipient\n    )\n    const { fromCoin, toCoin } = buildAggregatorSwapReturnCoinsRes\n    tx = buildAggregatorSwapReturnCoinsRes.tx\n\n    const transferedCoins: TransferedCoin[] = []\n    if (toCoinBuildResult.isMintZeroCoin) {\n      transferedCoins.push({\n        coinType: param.toCoin,\n        coin: toCoin,\n      })\n    } else if (toCoinBuildResult.originalSplitedCoin != null) {\n      tx.mergeCoins(toCoinBuildResult.originalSplitedCoin!, [toCoin])\n    } else {\n      tx.mergeCoins(toCoinBuildResult.targetCoin, [toCoin])\n    }\n\n    if (isSplited) {\n      const originalSplitedFromCoin = fromCoinBuildResult.originalSplitedCoin as TransactionObjectArgument\n      tx.mergeCoins(originalSplitedFromCoin, [fromCoin])\n    } else {\n      transferedCoins.push({\n        coinType: param.fromCoin,\n        coin: fromCoin,\n      })\n    }\n\n    for (let i = 0; i < transferedCoins.length; i++) {\n      this.buildTransferCoin(sdk, tx, transferedCoins[i].coin, transferedCoins[i].coinType, recipient)\n    }\n    return tx\n  }\n\n  static checkCoinThreshold(\n    sdk: SDK,\n    byAmountIn: boolean,\n    tx: Transaction,\n    coin: TransactionObjectArgument,\n    amountLimit: number,\n    coinType: string\n  ) {\n    if (byAmountIn) {\n      tx.moveCall({\n        target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateRouterModule}::check_coin_threshold`,\n        typeArguments: [coinType],\n        arguments: [coin, tx.pure.u64(amountLimit)],\n      })\n    }\n  }\n\n  static buildDeepbookBasePathTx(\n    sdk: SDK,\n    basePath: BasePath,\n    tx: Transaction,\n    accountCap: any,\n    from: TransactionObjectArgument,\n    to: TransactionObjectArgument,\n    middleStep: boolean\n  ) {\n    const base = basePath.direction ? from : to\n    const quote = basePath.direction ? to : from\n\n    const args: any = [\n      tx.object(basePath.poolAddress),\n      accountCap,\n      tx.pure.u64(basePath.inputAmount),\n      tx.pure.u64(0),\n      tx.pure.bool(basePath.direction),\n      base,\n      quote,\n      tx.pure.bool(middleStep),\n      tx.object(CLOCK_ADDRESS),\n    ]\n\n    const typeArguments = basePath.direction ? [basePath.fromCoin, basePath.toCoin] : [basePath.toCoin, basePath.fromCoin]\n\n    const coinAB: TransactionObjectArgument[] = tx.moveCall({\n      target: `${sdk.sdkOptions.deepbook_endpoint_v2.published_at}::endpoints_v2::swap`,\n      typeArguments,\n      arguments: args,\n    })\n\n    from = basePath.direction ? coinAB[0] : coinAB[1]\n    to = basePath.direction ? coinAB[1] : coinAB[0]\n\n    return {\n      from,\n      to,\n      tx,\n    }\n  }\n\n  private static buildClmmBasePathTx(\n    sdk: SDK,\n    basePath: BasePath,\n    tx: Transaction,\n    byAmountIn: boolean,\n    from: TransactionObjectArgument,\n    to: TransactionObjectArgument,\n    middleStep: boolean,\n    partner: string\n  ) {\n    const { clmm_pool, integrate } = sdk.sdkOptions\n    const globalConfigID = getPackagerConfigs(clmm_pool).global_config_id\n    let coinA = basePath.direction ? from : to\n    let coinB = basePath.direction ? to : from\n    const noPartner = partner === ''\n    const moduleName = noPartner ? ClmmIntegrateRouterModule : ClmmIntegrateRouterWithPartnerModule\n    const functionName = noPartner ? 'swap' : 'swap_with_partner'\n    const amount = byAmountIn ? basePath.inputAmount.toString() : basePath.outputAmount.toString()\n    const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(basePath.direction)\n    const args: any = noPartner\n      ? [\n          tx.object(globalConfigID),\n          tx.object(basePath.poolAddress),\n          coinA,\n          coinB,\n          tx.pure.bool(basePath.direction),\n          tx.pure.bool(byAmountIn),\n          tx.pure.u64(amount),\n          tx.pure.u128(sqrtPriceLimit.toString()),\n          tx.pure.bool(middleStep),\n          tx.object(CLOCK_ADDRESS),\n        ]\n      : [\n          tx.object(globalConfigID),\n          tx.object(basePath.poolAddress),\n          tx.object(partner),\n          coinA,\n          coinB,\n          tx.pure.bool(basePath.direction),\n          tx.pure.bool(byAmountIn),\n          tx.pure.u64(amount),\n          tx.pure.u128(sqrtPriceLimit.toString()),\n          tx.pure.bool(middleStep),\n          tx.object(CLOCK_ADDRESS),\n        ]\n\n    const typeArguments = basePath.direction ? [basePath.fromCoin, basePath.toCoin] : [basePath.toCoin, basePath.fromCoin]\n\n    const coinAB: TransactionObjectArgument[] = tx.moveCall({\n      target: `${integrate.published_at}::${moduleName}::${functionName}`,\n      typeArguments,\n      arguments: args,\n    })\n\n    coinA = coinAB[0] as any\n    coinB = coinAB[1] as any\n\n    from = basePath.direction ? coinA : coinB\n    to = basePath.direction ? coinB : coinA\n\n    return {\n      from,\n      to,\n      tx,\n    }\n  }\n\n  static buildCoinTypePair(coinTypes: string[], partitionQuantities: number[]): string[][] {\n    const coinTypePair: string[][] = []\n    if (coinTypes.length === 2) {\n      const pair: string[] = []\n      pair.push(coinTypes[0], coinTypes[1])\n      coinTypePair.push(pair)\n    } else {\n      const directPair: string[] = []\n      directPair.push(coinTypes[0], coinTypes[coinTypes.length - 1])\n      coinTypePair.push(directPair)\n      for (let i = 1; i < coinTypes.length - 1; i += 1) {\n        if (partitionQuantities[i - 1] === 0) {\n          continue\n        }\n        const pair: string[] = []\n        pair.push(coinTypes[0], coinTypes[i], coinTypes[coinTypes.length - 1])\n        coinTypePair.push(pair)\n      }\n    }\n    return coinTypePair\n  }\n\n  // ------------------------------------------utils-------------------------------------------------//\n  static buildTransferCoinToSender(sdk: SDK, tx: Transaction, coin: TransactionObjectArgument, coinType: string) {\n    tx.moveCall({\n      target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::transfer_coin_to_sender`,\n      typeArguments: [coinType],\n      arguments: [coin],\n    })\n  }\n\n  // If recipient not set, transfer objects move call will use ctx sender\n  static buildTransferCoin(sdk: SDK, tx: Transaction, coin: TransactionObjectArgument, coinType: string, recipient?: string) {\n    if (recipient != null) {\n      tx.transferObjects([coin], tx.pure.address(recipient))\n    } else {\n      TransactionUtil.buildTransferCoinToSender(sdk, tx, coin, coinType)\n    }\n  }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { ClmmpoolsError, UtilsErrorCode } from '../errors/errors'\n\n/**\n * Check if the address is a valid sui address.\n * @param {string}address\n * @returns\n */\nexport function checkInvalidSuiAddress(address: string): boolean {\n  if (!address.startsWith('0x') || address.length !== 66) {\n    return false\n  }\n  return true\n}\nexport class TxBlock {\n  public txBlock: Transaction\n\n  constructor() {\n    this.txBlock = new Transaction()\n  }\n\n  /**\n   * Transfer sui to many recipoents.\n   * @param {string[]}recipients The recipient addresses.\n   * @param {number[]}amounts The amounts of sui coins to be transferred.\n   * @returns this\n   */\n  transferSuiToMany(recipients: string[], amounts: number[]) {\n    if (recipients.length !== amounts.length) {\n      throw new ClmmpoolsError('The length of recipients and amounts must be the same', UtilsErrorCode.InvalidRecipientAndAmountLength)\n    }\n\n    for (const recipient of recipients) {\n      if (!checkInvalidSuiAddress(recipient) === false) {\n        throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n      }\n    }\n\n    const tx = this.txBlock\n    const coins = tx.splitCoins(\n      tx.gas,\n      amounts.map((amount) => tx.pure.u64(amount))\n    )\n    recipients.forEach((recipient, index) => {\n      tx.transferObjects([coins[index]], tx.pure.address(recipient))\n    })\n    return this\n  }\n\n  /**\n   * Transfer sui to one recipient.\n   * @param {string}recipient recipient cannot be empty or invalid sui address.\n   * @param {number}amount\n   * @returns this\n   */\n  transferSui(recipient: string, amount: number) {\n    if (!checkInvalidSuiAddress(recipient) === false) {\n      throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n    }\n\n    return this.transferSuiToMany([recipient], [amount])\n  }\n\n  /**\n   * Transfer coin to many recipients.\n   * @param {string}recipient recipient cannot be empty or invalid sui address.\n   * @param {number}amount amount cannot be empty or invalid sui address.\n   * @param {string[]}coinObjectIds object ids of coins to be transferred.\n   * @returns this\n   * @deprecated use transferAndDestoryZeroCoin instead\n   */\n  transferCoin(recipient: string, amount: number, coinObjectIds: string[]) {\n    if (!checkInvalidSuiAddress(recipient) === false) {\n      throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n    }\n\n    const tx = this.txBlock\n    const [primaryCoinA, ...mergeCoinAs] = coinObjectIds\n    const primaryCoinAInput = tx.object(primaryCoinA)\n\n    if (mergeCoinAs.length > 0) {\n      tx.mergeCoins(\n        primaryCoinAInput,\n        mergeCoinAs.map((coin) => tx.object(coin))\n      )\n    }\n\n    const spitAmount = tx.splitCoins(primaryCoinAInput, [tx.pure.u64(amount)])\n    tx.transferObjects([spitAmount], tx.pure.address(recipient))\n    return this\n  }\n}\n","import BN from 'bn.js'\nimport { TransactionArgument, Transaction } from '@mysten/sui/transactions'\nimport { SdkOptions } from '../sdk'\nimport { CLOCK_ADDRESS, DeepbookClobV2Moudle, DeepbookCustodianV2Moudle, DeepbookEndpointsV2Moudle } from '../types'\nimport SDK from '../main'\nimport { extractStructTagFromType } from './contracts'\nimport { TransactionUtil } from './transaction-util'\nimport { ZERO } from '../math'\n\nconst FLOAT_SCALING = new BN(1000000000)\n\nexport type Order = {\n  quantity: number\n  price: number\n}\n\nexport type DeepbookPool = {\n  poolID: string\n  tickSize: number\n  lotSize: number\n  baseAsset: string\n  quoteAsset: string\n  takerFeeRate: number\n  makerRebateRate: number\n}\n\nexport class DeepbookUtils {\n  static createAccountCap(senderAddress: string, sdkOptions: SdkOptions, tx: Transaction, isTransfer = false) {\n    if (senderAddress.length === 0) {\n      throw Error('this config sdk senderAddress is empty')\n    }\n\n    const { deepbook } = sdkOptions\n\n    const [cap] = tx.moveCall({\n      target: `${deepbook.published_at}::${DeepbookClobV2Moudle}::create_account`,\n      typeArguments: [],\n      arguments: [],\n    })\n\n    if (isTransfer) {\n      tx.transferObjects([cap], tx.pure.address(senderAddress))\n    }\n\n    return [cap, tx]\n  }\n\n  static deleteAccountCap(accountCap: string, sdkOptions: SdkOptions, tx: Transaction): Transaction {\n    const { deepbook } = sdkOptions\n\n    const args = [tx.object(accountCap)]\n\n    tx.moveCall({\n      target: `${deepbook.published_at}::${DeepbookCustodianV2Moudle}::delete_account_cap`,\n      typeArguments: [],\n      arguments: args,\n    })\n    return tx\n  }\n\n  static deleteAccountCapByObject(accountCap: TransactionArgument, sdkOptions: SdkOptions, tx: Transaction): Transaction {\n    const { deepbook } = sdkOptions\n\n    const args = [accountCap]\n\n    tx.moveCall({\n      target: `${deepbook.published_at}::${DeepbookCustodianV2Moudle}::delete_account_cap`,\n      typeArguments: [],\n      arguments: args,\n    })\n    return tx\n  }\n\n  static async getAccountCap(sdk: SDK, showDisplay = true): Promise<string> {\n    const ownerRes: any = await sdk.fullClient.getOwnedObjectsByPage(sdk.senderAddress, {\n      options: { showType: true, showContent: true, showDisplay, showOwner: true },\n      filter: {\n        MoveModule: {\n          package: sdk.sdkOptions.deepbook.package_id,\n          module: DeepbookCustodianV2Moudle,\n        },\n      },\n    })\n\n    if (ownerRes.data.length === 0) {\n      return ''\n    }\n\n    const accountCap = ownerRes.data[0].data.objectId\n\n    return accountCap\n  }\n\n  static async getPools(sdk: SDK): Promise<DeepbookPool[]> {\n    const deepbook = sdk.sdkOptions.deepbook.package_id\n\n    const allPools: DeepbookPool[] = []\n\n    try {\n      const objects = await sdk.fullClient.queryEventsByPage({ MoveEventType: `${deepbook}::clob_v2::PoolCreated` })\n\n      objects.data.forEach((object: any) => {\n        const fields = object.parsedJson\n        if (fields) {\n          allPools.push({\n            poolID: fields.pool_id,\n            tickSize: Number(fields.tick_size),\n            lotSize: Number(fields.lot_size),\n            takerFeeRate: Number(fields.taker_fee_rate),\n            makerRebateRate: Number(fields.maker_rebate_rate),\n            baseAsset: fields.base_asset.name,\n            quoteAsset: fields.quote_asset.name,\n          })\n        }\n      })\n    } catch (error) {\n      console.log('getPoolImmutables', error)\n    }\n\n    // console.log('allPools', allPools)\n    return allPools\n  }\n\n  static async getPoolAsks(sdk: SDK, poolAddress: string, baseCoin: string, quoteCoin: string): Promise<Order[]> {\n    const { simulationAccount } = sdk.sdkOptions\n    const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n    const tx = new Transaction()\n\n    const asks: Order[] = []\n\n    const typeArguments = [baseCoin, quoteCoin]\n    const args = [tx.object(poolAddress), tx.pure.u64('0'), tx.pure.u64('999999999999'), tx.object(CLOCK_ADDRESS)]\n    tx.moveCall({\n      target: `${deepbook_endpoint_v2.published_at}::endpoints_v2::get_level2_book_status_ask_side`,\n      arguments: args,\n      typeArguments,\n    })\n\n    const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `BookStatus`\n    })\n    if (valueData.length === 0) {\n      return asks\n    }\n\n    for (let i = 0; i < valueData[0].parsedJson.depths.length; i++) {\n      const price = valueData[0].parsedJson.price[i]\n      const depth = valueData[0].parsedJson.depths[i]\n      const ask: Order = {\n        price: parseInt(price, 10),\n        quantity: parseInt(depth, 10),\n      }\n      asks.push(ask)\n    }\n\n    return asks\n  }\n\n  static async getPoolBids(sdk: SDK, poolAddress: string, baseCoin: string, quoteCoin: string): Promise<Order[]> {\n    const { simulationAccount } = sdk.sdkOptions\n    const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n    const tx = new Transaction()\n\n    const bids: Order[] = []\n\n    const typeArguments = [baseCoin, quoteCoin]\n    const args = [tx.object(poolAddress), tx.pure.u64('0'), tx.pure.u64('999999999999'), tx.object(CLOCK_ADDRESS)]\n    tx.moveCall({\n      target: `${deepbook_endpoint_v2.published_at}::endpoints_v2::get_level2_book_status_bid_side`,\n      arguments: args,\n      typeArguments,\n    })\n\n    const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `BookStatus`\n    })\n    if (valueData.length === 0) {\n      return bids\n    }\n\n    for (let i = 0; i < valueData[0].parsedJson.depths.length; i++) {\n      const price = valueData[0].parsedJson.price[i]\n      const depth = valueData[0].parsedJson.depths[i]\n      const bid: Order = {\n        price: parseInt(price, 10),\n        quantity: parseInt(depth, 10),\n      }\n      bids.push(bid)\n    }\n\n    return bids\n  }\n\n  static async preSwap(sdk: SDK, pool: DeepbookPool, a2b: boolean, amountIn: number) {\n    let isExceed = false\n    let amountOut = ZERO\n    let remainAmount = new BN(amountIn)\n    let feeAmount = ZERO\n    const initAmountIn = new BN(amountIn)\n\n    if (a2b) {\n      let bids = await this.getPoolBids(sdk, pool.poolID, pool.baseAsset, pool.quoteAsset)\n      if (bids === null) {\n        isExceed = true\n      }\n      bids = bids.sort((a, b) => {\n        return b.price - a.price\n      })\n\n      for (let i = 0; i < bids.length; i += 1) {\n        const curBidAmount = new BN(bids[i].quantity)\n        const curBidPrice = new BN(bids[i].price)\n        const fee = curBidAmount.mul(new BN(curBidPrice)).mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING).div(FLOAT_SCALING)\n        if (remainAmount.gt(curBidAmount)) {\n          remainAmount = remainAmount.sub(curBidAmount)\n          amountOut = amountOut.add(curBidAmount.mul(curBidPrice).div(FLOAT_SCALING).sub(fee))\n          feeAmount = feeAmount.add(fee)\n        } else {\n          const curOut = remainAmount.mul(new BN(bids[i].price)).div(FLOAT_SCALING)\n          const curFee = curOut.mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING)\n          amountOut = amountOut.add(curOut.sub(curFee))\n          remainAmount = remainAmount.sub(remainAmount)\n          feeAmount = feeAmount.add(curFee)\n        }\n        if (remainAmount.eq(ZERO)) {\n          break\n        }\n      }\n    } else {\n      const asks = await this.getPoolAsks(sdk, pool.poolID, pool.baseAsset, pool.quoteAsset)\n      if (asks === null) {\n        isExceed = true\n      }\n\n      for (let i = 0; i < asks.length; i += 1) {\n        const curAskAmount = new BN(asks[i].price).mul(new BN(asks[i].quantity)).div(new BN(1000000000))\n        const fee = curAskAmount.mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING)\n        const curAskAmountWithFee = curAskAmount.add(fee)\n        if (remainAmount.gt(curAskAmount)) {\n          amountOut = amountOut.add(new BN(asks[i].quantity))\n          remainAmount = remainAmount.sub(curAskAmountWithFee)\n          feeAmount = feeAmount.add(fee)\n        } else {\n          const splitNums = new BN(asks[i].quantity).div(new BN(pool.lotSize))\n          const splitAmount = curAskAmountWithFee.div(splitNums)\n          const swapSplitNum = remainAmount.div(splitAmount)\n          amountOut = amountOut.add(swapSplitNum.muln(pool.lotSize))\n          remainAmount = remainAmount.sub(swapSplitNum.mul(splitAmount))\n          feeAmount = feeAmount.add(swapSplitNum.div(splitNums).mul(fee))\n        }\n        if (remainAmount.eq(ZERO)) {\n          break\n        }\n      }\n    }\n\n    return {\n      poolAddress: pool.poolID,\n      // currentSqrtPrice: current_sqrt_price,\n      estimatedAmountIn: initAmountIn.sub(remainAmount).toNumber(),\n      estimatedAmountOut: amountOut.toNumber(),\n      // estimatedEndSqrtPrice: target_sqrt_price,\n      estimatedFeeAmount: feeAmount,\n      isExceed,\n      amount: Number(amountIn),\n      aToB: a2b,\n      byAmountIn: true,\n    }\n  }\n\n  static async simulateSwap(sdk: SDK, poolID: string, baseCoin: string, quoteCoin: string, a2b: boolean, amount: number) {\n    const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n    let tx = new Transaction()\n\n    const accountCapStr = await this.getAccountCap(sdk)\n\n    let accountCap\n    if (accountCapStr === '') {\n      const getAccoutCapResult = this.createAccountCap(sdk.senderAddress, sdk.sdkOptions, tx)\n      const cap = getAccoutCapResult[0] as TransactionArgument\n      tx = getAccoutCapResult[1] as Transaction\n      accountCap = cap\n    } else {\n      accountCap = tx.object(accountCapStr)\n    }\n\n    const allCoins = await sdk.getOwnerCoinAssets(sdk.senderAddress)\n    const primaryBaseInput = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount), baseCoin, false)\n    const baseAsset = primaryBaseInput?.targetCoin\n\n    const primaryQuoteInput = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount), quoteCoin, false)\n    const quoteAsset = primaryQuoteInput?.targetCoin\n\n    const typeArguments = [baseCoin, quoteCoin]\n    const args: any = [\n      tx.object(poolID),\n      accountCap,\n      tx.pure.u64(amount),\n      tx.pure.u64(0),\n      tx.pure.bool(a2b),\n      baseAsset,\n      quoteAsset,\n      tx.object(CLOCK_ADDRESS),\n    ]\n\n    tx.moveCall({\n      target: `${deepbook_endpoint_v2.published_at}::${DeepbookEndpointsV2Moudle}::swap`,\n      arguments: args,\n      typeArguments,\n    })\n\n    const { simulationAccount } = sdk.sdkOptions\n    const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `DeepbookSwapEvent`\n    })\n    if (valueData.length === 0) {\n      return null\n    }\n    const params: any = valueData[0].parsedJson\n    return {\n      poolAddress: params.pool,\n      estimatedAmountIn: params.amount_in,\n      estimatedAmountOut: params.amount_out,\n      aToB: params.atob,\n    }\n  }\n}\n","import { Inputs, Transaction } from '@mysten/sui/transactions'\nimport {\n  DevInspectResults,\n  DynamicFieldPage,\n  PaginatedEvents,\n  PaginatedObjectsResponse,\n  PaginatedTransactionResponse,\n  QueryTransactionBlocksParams,\n  SuiClient,\n  SuiEventFilter,\n  SuiObjectDataOptions,\n  SuiObjectResponse,\n  SuiObjectResponseQuery,\n  SuiTransactionBlockResponse,\n  TransactionFilter,\n} from '@mysten/sui/client'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\n\nimport { bcs } from '@mysten/sui/bcs'\nimport { toB64 } from '@mysten/bcs'\nimport { DataPage, PaginationArgs, SuiObjectIdType } from '../types'\n\n/**\n * Represents a module for making RPC (Remote Procedure Call) requests.\n */\nexport class RpcModule extends SuiClient {\n  /**\n   * Get events for a given query criteria\n   * @param query\n   * @param paginationArgs\n   * @returns\n   */\n  async queryEventsByPage(query: SuiEventFilter, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n\n    do {\n      const res: PaginatedEvents = await this.queryEvents({\n        query,\n        cursor: nextCursor,\n        limit: queryAll ? null : paginationArgs.limit,\n      })\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, nextCursor, hasNextPage }\n  }\n\n  async queryTransactionBlocksByPage(\n    filter?: TransactionFilter,\n    paginationArgs: PaginationArgs = 'all',\n    order: 'ascending' | 'descending' | null | undefined = 'ascending'\n  ): Promise<DataPage<SuiTransactionBlockResponse>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n\n    do {\n      const res: PaginatedTransactionResponse = await this.queryTransactionBlocks({\n        filter,\n        cursor: nextCursor,\n        order,\n        limit: queryAll ? null : paginationArgs.limit,\n        options: { showEvents: true },\n      })\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, nextCursor, hasNextPage }\n  }\n\n  /**\n   * Get all objects owned by an address\n   * @param owner\n   * @param query\n   * @param paginationArgs\n   * @returns\n   */\n  async getOwnedObjectsByPage(\n    owner: string,\n    query: SuiObjectResponseQuery,\n    paginationArgs: PaginationArgs = 'all'\n  ): Promise<DataPage<any>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n    do {\n      const res: PaginatedObjectsResponse = await this.getOwnedObjects({\n        owner,\n        ...query,\n        cursor: nextCursor,\n        limit: queryAll ? null : paginationArgs.limit,\n      })\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, nextCursor, hasNextPage }\n  }\n\n  /**\n   * Return the list of dynamic field objects owned by an object\n   * @param parentId\n   * @param paginationArgs\n   * @returns\n   */\n  async getDynamicFieldsByPage(parentId: SuiObjectIdType, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n    let result: any = []\n    let hasNextPage = true\n    const queryAll = paginationArgs === 'all'\n    let nextCursor = queryAll ? null : paginationArgs.cursor\n    do {\n      const res: DynamicFieldPage = await this.getDynamicFields({\n        parentId,\n        cursor: nextCursor,\n        limit: queryAll ? null : paginationArgs.limit,\n      })\n\n      if (res.data) {\n        result = [...result, ...res.data]\n        hasNextPage = res.hasNextPage\n        nextCursor = res.nextCursor\n      } else {\n        hasNextPage = false\n      }\n    } while (queryAll && hasNextPage)\n\n    return { data: result, nextCursor, hasNextPage }\n  }\n\n  /**\n   * Batch get details about a list of objects. If any of the object ids are duplicates the call will fail\n   * @param ids\n   * @param options\n   * @param limit\n   * @returns\n   */\n  async batchGetObjects(ids: SuiObjectIdType[], options?: SuiObjectDataOptions, limit = 50): Promise<SuiObjectResponse[]> {\n    let objectDataResponses: SuiObjectResponse[] = []\n\n    try {\n      for (let i = 0; i < Math.ceil(ids.length / limit); i++) {\n        const res = await this.multiGetObjects({\n          ids: ids.slice(i * limit, limit * (i + 1)),\n          options,\n        })\n        objectDataResponses = [...objectDataResponses, ...res]\n      }\n    } catch (error) {\n      console.log(error)\n    }\n\n    return objectDataResponses\n  }\n\n  /**\n   * Calculates the gas cost of a transaction block.\n   * @param {Transaction} tx - The transaction block to calculate gas for.\n   * @returns {Promise<number>} - The estimated gas cost of the transaction block.\n   * @throws {Error} - Throws an error if the sender is empty.\n   */\n  async calculationTxGas(tx: Transaction): Promise<number> {\n    const { sender } = tx.blockData\n\n    if (sender === undefined) {\n      throw Error('sdk sender is empty')\n    }\n\n    const devResult = await this.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender,\n    })\n    const { gasUsed } = devResult.effects\n\n    const estimateGas = Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate)\n    return estimateGas\n  }\n\n  /**\n   * Sends a transaction block after signing it with the provided keypair.\n   *\n   * @param {Ed25519Keypair | Secp256k1Keypair} keypair - The keypair used for signing the transaction.\n   * @param {Transaction} tx - The transaction block to send.\n   * @returns {Promise<SuiTransactionBlockResponse | undefined>} - The response of the sent transaction block.\n   */\n  async sendTransaction(keypair: Ed25519Keypair | Secp256k1Keypair, tx: Transaction): Promise<SuiTransactionBlockResponse | undefined> {\n    try {\n      const resultTxn: any = await this.signAndExecuteTransaction({\n        transaction: tx,\n        signer: keypair,\n        options: {\n          showEffects: true,\n          showEvents: true,\n        },\n      })\n      return resultTxn\n    } catch (error) {\n      console.log('error: ', error)\n    }\n    return undefined\n  }\n\n  /**\n   * Send a simulation transaction.\n   * @param tx - The transaction block.\n   * @param simulationAccount - The simulation account.\n   * @param useDevInspect - A flag indicating whether to use DevInspect. Defaults to true.\n   * @returns A promise that resolves to DevInspectResults or undefined.\n   */\n  async sendSimulationTransaction(\n    tx: Transaction,\n    simulationAccount: string,\n    useDevInspect = true\n  ): Promise<DevInspectResults | undefined> {\n    try {\n      if (useDevInspect) {\n        const simulateRes = await this.devInspectTransactionBlock({\n          transactionBlock: tx,\n          sender: simulationAccount,\n        })\n        return simulateRes\n      }\n\n      // If useDevInspect is false, manually construct the transaction for simulation.\n      // const inputs = tx.inputs.map((input) => {\n      //   const { type, value } = input\n      //   if (type === 'object') {\n      //     return Inputs.SharedObjectRef({\n      //       objectId: value,\n      //       initialSharedVersion: 0,\n      //       mutable: true,\n      //     })\n      //   }\n      //   return value\n      // })\n\n      // const kind = {\n      //   ProgrammableTransaction: {\n      //     inputs,\n      //     transactions: tx,\n      //   },\n      // }\n      // // Serialize the transaction using BCS.\n      // const serialize = bcs.TransactionKind.serialize(kind, {\n      //   maxSize: 131072,\n      // }).toBytes()\n\n      // const devInspectTxBytes = toB64(serialize)\n      // // Send the request to DevInspect.\n      // const res = await this.transport.request<DevInspectResults>({\n      //   method: 'sui_devInspectTransactionBlock',\n      //   params: [simulationAccount, devInspectTxBytes, null, null],\n      // })\n      // return res\n    } catch (error) {\n      console.log('devInspectTransactionBlock error', error)\n    }\n\n    return undefined\n  }\n}\n","import BN from 'bn.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { isValidSuiObjectId } from '@mysten/sui/utils'\nimport {\n  AddLiquidityFixTokenParams,\n  AddLiquidityParams,\n  ClosePositionParams,\n  CollectFeeParams,\n  OpenPositionParams,\n  Position,\n  PositionReward,\n  PositionTransactionInfo,\n  RemoveLiquidityParams,\n  getPackagerConfigs,\n} from '../types'\nimport {\n  CachedContent,\n  asUintN,\n  buildPosition,\n  buildPositionReward,\n  buildPositionTransactionInfo,\n  cacheTime24h,\n  cacheTime5min,\n  checkInvalidSuiAddress,\n  extractStructTagFromType,\n  getFutureTime,\n} from '../utils'\nimport { BuildCoinResult, findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport {\n  ClmmFetcherModule,\n  ClmmIntegratePoolModule,\n  ClmmIntegratePoolV2Module,\n  ClmmIntegratePoolV3Module,\n  CLOCK_ADDRESS,\n  DataPage,\n  PaginationArgs,\n  SuiObjectIdType,\n  SuiResource,\n} from '../types/sui'\nimport { CetusClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectFields } from '../utils/objects'\nimport { CollectFeesQuote } from '../math'\nimport { FetchPosFeeParams } from './rewarderModule'\nimport { ClmmpoolsError, ConfigErrorCode, PoolErrorCode, UtilsErrorCode } from '../errors/errors'\nimport { RpcModule } from './rpcModule'\n\n/**\n * Helper class to help interact with clmm position with a position router interface.\n */\nexport class PositionModule implements IModule {\n  protected _sdk: CetusClmmSDK\n\n  private readonly _cache: Record<string, CachedContent> = {}\n\n  constructor(sdk: CetusClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Builds the full address of the Position type.\n   * @returns The full address of the Position type.\n   */\n  buildPositionType() {\n    const cetusClmm = this._sdk.sdkOptions.clmm_pool.package_id\n    return `${cetusClmm}::position::Position`\n  }\n\n  async getPositionTransactionList({\n    posId,\n    paginationArgs = 'all',\n    order = 'ascending',\n    fullRpcUrl,\n    originPosId,\n  }: {\n    posId: string\n    originPosId?: string\n    fullRpcUrl?: string\n    paginationArgs?: PaginationArgs\n    order?: 'ascending' | 'descending' | null | undefined\n  }): Promise<DataPage<PositionTransactionInfo>> {\n    const { fullClient } = this._sdk\n    const filterIds: string[] = [posId]\n    if (originPosId) {\n      filterIds.push(originPosId)\n    }\n    let client\n    if (fullRpcUrl) {\n      client = new RpcModule({\n        url: fullRpcUrl,\n      })\n    } else {\n      client = fullClient\n    }\n    const data: DataPage<PositionTransactionInfo> = {\n      data: [],\n      hasNextPage: false,\n    }\n    try {\n      const res = await client.queryTransactionBlocksByPage({ ChangedObject: posId }, paginationArgs, order)\n\n      res.data.forEach((item, index) => {\n        const dataList = buildPositionTransactionInfo(item, index, filterIds)\n        data.data = [...data.data, ...dataList]\n      })\n      data.hasNextPage = res.hasNextPage\n      data.nextCursor = res.nextCursor\n      return data\n    } catch (error) {\n      console.log('Error in getPositionTransactionList:', error)\n    }\n\n    return data\n  }\n\n  /**\n   * Gets a list of positions for the given account address.\n   * @param accountAddress The account address to get positions for.\n   * @param assignPoolIds An array of pool IDs to filter the positions by.\n   * @returns array of Position objects.\n   */\n  async getPositionList(accountAddress: string, assignPoolIds: string[] = [], showDisplay = true): Promise<Position[]> {\n    const allPosition: Position[] = []\n\n    const ownerRes: any = await this._sdk.fullClient.getOwnedObjectsByPage(accountAddress, {\n      options: { showType: true, showContent: true, showDisplay, showOwner: true },\n      filter: { Package: this._sdk.sdkOptions.clmm_pool.package_id },\n    })\n\n    const hasAssignPoolIds = assignPoolIds.length > 0\n    for (const item of ownerRes.data as any[]) {\n      const type = extractStructTagFromType(item.data.type)\n\n      if (type.full_address === this.buildPositionType()) {\n        const position = buildPosition(item)\n        const cacheKey = `${position.pos_object_id}_getPositionList`\n        this.updateCache(cacheKey, position, cacheTime24h)\n        if (hasAssignPoolIds) {\n          if (assignPoolIds.includes(position.pool)) {\n            allPosition.push(position)\n          }\n        } else {\n          allPosition.push(position)\n        }\n      }\n    }\n\n    return allPosition\n  }\n\n  /**\n   * Gets a position by its handle and ID. But it needs pool info, so it is not recommended to use this method.\n   * if you want to get a position, you can use getPositionById method directly.\n   * @param {string} positionHandle The handle of the position to get.\n   * @param {string} positionID The ID of the position to get.\n   * @param {boolean} calculateRewarder Whether to calculate the rewarder of the position.\n   * @returns {Promise<Position>} Position object.\n   */\n  async getPosition(positionHandle: string, positionID: string, calculateRewarder = true, showDisplay = true): Promise<Position> {\n    let position = await this.getSimplePosition(positionID, showDisplay)\n    if (calculateRewarder) {\n      position = await this.updatePositionRewarders(positionHandle, position)\n    }\n    return position\n  }\n\n  /**\n   * Gets a position by its ID.\n   * @param {string} positionID The ID of the position to get.\n   * @param {boolean} calculateRewarder Whether to calculate the rewarder of the position.\n   * @returns {Promise<Position>} Position object.\n   */\n  async getPositionById(positionID: string, calculateRewarder = true, showDisplay = true): Promise<Position> {\n    const position = await this.getSimplePosition(positionID, showDisplay)\n    if (calculateRewarder) {\n      const pool = await this._sdk.Pool.getPool(position.pool, false)\n      const result = await this.updatePositionRewarders(pool.position_manager.positions_handle, position)\n      return result\n    }\n    return position\n  }\n\n  /**\n   * Gets a simple position for the given position ID.\n   * @param {string} positionID The ID of the position to get.\n   * @returns {Promise<Position>} Position object.\n   */\n  async getSimplePosition(positionID: string, showDisplay = true): Promise<Position> {\n    const cacheKey = `${positionID}_getPositionList`\n\n    let position = this.getSimplePositionByCache(positionID)\n\n    if (position === undefined) {\n      const objectDataResponses = await this.sdk.fullClient.getObject({\n        id: positionID,\n        options: { showContent: true, showType: true, showDisplay, showOwner: true },\n      })\n      position = buildPosition(objectDataResponses)\n\n      this.updateCache(cacheKey, position, cacheTime24h)\n    }\n    return position\n  }\n\n  /**\n   * Gets a simple position for the given position ID.\n   * @param {string} positionID Position object id\n   * @returns {Position | undefined} Position object\n   */\n  private getSimplePositionByCache(positionID: string): Position | undefined {\n    const cacheKey = `${positionID}_getPositionList`\n    return this.getCache<Position>(cacheKey)\n  }\n\n  /**\n   * Gets a list of simple positions for the given position IDs.\n   * @param {SuiObjectIdType[]} positionIDs The IDs of the positions to get.\n   * @returns {Promise<Position[]>} A promise that resolves to an array of Position objects.\n   */\n  async getSipmlePositionList(positionIDs: SuiObjectIdType[], showDisplay = true): Promise<Position[]> {\n    const positionList: Position[] = []\n    const notFoundIds: SuiObjectIdType[] = []\n\n    positionIDs.forEach((id) => {\n      const position = this.getSimplePositionByCache(id)\n      if (position) {\n        positionList.push(position)\n      } else {\n        notFoundIds.push(id)\n      }\n    })\n\n    if (notFoundIds.length > 0) {\n      const objectDataResponses = await this._sdk.fullClient.batchGetObjects(notFoundIds, {\n        showOwner: true,\n        showContent: true,\n        showDisplay,\n        showType: true,\n      })\n\n      objectDataResponses.forEach((info) => {\n        if (info.error == null) {\n          const position = buildPosition(info)\n          positionList.push(position)\n          const cacheKey = `${position.pos_object_id}_getPositionList`\n          this.updateCache(cacheKey, position, cacheTime24h)\n        }\n      })\n    }\n\n    return positionList\n  }\n\n  /**\n   * Updates the rewarders of position\n   * @param {string} positionHandle Position handle\n   * @param {Position} position Position object\n   * @returns {Promise<Position>} A promise that resolves to an array of Position objects.\n   */\n  private async updatePositionRewarders(positionHandle: string, position: Position): Promise<Position> {\n    const positionReward = await this.getPositionRewarders(positionHandle, position.pos_object_id)\n    return {\n      ...position,\n      ...positionReward,\n    }\n  }\n\n  /**\n   * Gets the position rewarders for the given position handle and position object ID.\n   * @param {string} positionHandle The handle of the position.\n   * @param {string} positionID The ID of the position object.\n   * @returns {Promise<PositionReward | undefined>} PositionReward object.\n   */\n  async getPositionRewarders(positionHandle: string, positionID: string): Promise<PositionReward | undefined> {\n    try {\n      const dynamicFieldObject = await this._sdk.fullClient.getDynamicFieldObject({\n        parentId: positionHandle,\n        name: {\n          type: '0x2::object::ID',\n          value: positionID,\n        },\n      })\n\n      const objectFields = getObjectFields(dynamicFieldObject.data as any) as any\n      const fields = objectFields.value.fields.value\n      const positionReward = buildPositionReward(fields)\n      return positionReward\n    } catch (error) {\n      console.log(error)\n      return undefined\n    }\n  }\n\n  /**\n   * Fetches the Position fee amount for a given list of addresses.\n   * @param {FetchPosFeeParams[]} params  An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n   * @returns {Promise<CollectFeesQuote[]>} A Promise that resolves with the fetched position fee amount for the specified addresses.\n   */\n  public async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n    const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n    const tx = new Transaction()\n\n    for (const paramItem of params) {\n      const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n      const args = [\n        tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n        tx.object(paramItem.poolAddress),\n        tx.pure.address(paramItem.positionId),\n      ]\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_fees`,\n        arguments: args,\n        typeArguments,\n      })\n    }\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n    }\n\n    const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    if (simulateRes.error != null) {\n      throw new ClmmpoolsError(\n        `fetch position fee error code: ${simulateRes.error ?? 'unknown error'}, please check config and postion and pool object ids`,\n        PoolErrorCode.InvalidPoolObject\n      )\n    }\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `FetchPositionFeesEvent`\n    })\n    if (valueData.length === 0) {\n      return []\n    }\n\n    const result: CollectFeesQuote[] = []\n\n    for (let i = 0; i < valueData.length; i += 1) {\n      const { parsedJson } = valueData[i]\n      const posRrewarderResult: CollectFeesQuote = {\n        feeOwedA: new BN(parsedJson.fee_owned_a),\n        feeOwedB: new BN(parsedJson.fee_owned_b),\n        position_id: parsedJson.position_id,\n      }\n      result.push(posRrewarderResult)\n    }\n\n    return result\n  }\n\n  /**\n   * Fetches the Position fee amount for a given list of addresses.\n   * @param positionIDs An array of position object ids.\n   * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n   */\n  async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n    const posFeeParamsList: FetchPosFeeParams[] = []\n    for (const id of positionIDs) {\n      const position = await this._sdk.Position.getPositionById(id, false)\n      const pool = await this._sdk.Pool.getPool(position.pool, false)\n      posFeeParamsList.push({\n        poolAddress: pool.poolAddress,\n        positionId: position.pos_object_id,\n        coinTypeA: pool.coinTypeA,\n        coinTypeB: pool.coinTypeB,\n      })\n    }\n\n    const positionMap: Record<string, CollectFeesQuote> = {}\n\n    if (posFeeParamsList.length > 0) {\n      const result: CollectFeesQuote[] = await this.fetchPosFeeAmount(posFeeParamsList)\n      for (const posRewarderInfo of result) {\n        positionMap[posRewarderInfo.position_id] = posRewarderInfo\n      }\n      return positionMap\n    }\n    return positionMap\n  }\n\n  /**\n   * create add liquidity transaction payload with fix token\n   * @param {AddLiquidityFixTokenParams} params\n   * @param gasEstimateArg : When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n   * If this parameter is not passed, gas estimation is not performed\n   * @returns {Promise<TransactionBlock>}\n   */\n  async createAddLiquidityFixTokenPayload(\n    params: AddLiquidityFixTokenParams,\n    gasEstimateArg?: {\n      slippage: number\n      curSqrtPrice: BN\n    },\n    tx?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const allCoinAsset = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n\n    if (gasEstimateArg) {\n      const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n      params = params as AddLiquidityFixTokenParams\n      if ((params.fix_amount_a && isAdjustCoinA) || (!params.fix_amount_a && isAdjustCoinB)) {\n        tx = await TransactionUtil.buildAddLiquidityFixTokenForGas(\n          this._sdk,\n          allCoinAsset,\n          params,\n          gasEstimateArg,\n          tx,\n          inputCoinA,\n          inputCoinB\n        )\n        return tx\n      }\n    }\n\n    return TransactionUtil.buildAddLiquidityFixToken(this._sdk, allCoinAsset, params, tx, inputCoinA, inputCoinB)\n  }\n\n  /**\n   * create add liquidity transaction payload\n   * @param {AddLiquidityParams} params\n   * @returns {Promise<TransactionBlock>}\n   */\n  async createAddLiquidityPayload(\n    params: AddLiquidityParams,\n    tx?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ): Promise<Transaction> {\n    const { integrate, clmm_pool } = this._sdk.sdkOptions\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n\n    const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n    const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n    tx = tx || new Transaction()\n\n    const needOpenPosition = !isValidSuiObjectId(params.pos_id)\n    const max_amount_a = BigInt(params.max_amount_a)\n    const max_amount_b = BigInt(params.max_amount_b)\n\n    let primaryCoinAInputs: BuildCoinResult\n    let primaryCoinBInputs: BuildCoinResult\n    if (inputCoinA == null || inputCoinB == null) {\n      const allCoinAsset = await this.sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n      primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, max_amount_a, params.coinTypeA, false, true)\n      primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, max_amount_b, params.coinTypeB, false, true)\n    } else {\n      primaryCoinAInputs = {\n        targetCoin: inputCoinA,\n        remainCoins: [],\n        isMintZeroCoin: false,\n        tragetCoinAmount: '0',\n      }\n      primaryCoinBInputs = {\n        targetCoin: inputCoinB,\n        remainCoins: [],\n        isMintZeroCoin: false,\n        tragetCoinAmount: '0',\n      }\n    }\n\n    if (needOpenPosition) {\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::open_position_with_liquidity`,\n        typeArguments,\n        arguments: [\n          tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n          tx.object(params.pool_id),\n          tx.pure.u32(Number(tick_lower)),\n          tx.pure.u32(Number(tick_upper)),\n          primaryCoinAInputs.targetCoin,\n          primaryCoinBInputs.targetCoin,\n          tx.pure.u64(params.max_amount_a),\n          tx.pure.u64(params.max_amount_b),\n          tx.pure.u128(params.delta_liquidity),\n          tx.object(CLOCK_ADDRESS),\n        ],\n      })\n    } else {\n      const allCoinAsset = await this.sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n      tx = TransactionUtil.createCollectRewarderAndFeeParams(\n        this.sdk,\n        tx,\n        params,\n        allCoinAsset,\n        primaryCoinAInputs.remainCoins,\n        primaryCoinBInputs.remainCoins\n      )\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::add_liquidity`,\n        typeArguments,\n        arguments: [\n          tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n          tx.object(params.pool_id),\n          tx.object(params.pos_id),\n          primaryCoinAInputs.targetCoin,\n          primaryCoinBInputs.targetCoin,\n          tx.pure.u64(params.max_amount_a),\n          tx.pure.u64(params.max_amount_b),\n          tx.pure.u128(params.delta_liquidity),\n          tx.object(CLOCK_ADDRESS),\n        ],\n      })\n    }\n    return tx\n  }\n\n  /**\n   * Remove liquidity from a position.\n   * @param {RemoveLiquidityParams} params\n   * @returns {TransactionBlock}\n   */\n  async removeLiquidityTransactionPayload(params: RemoveLiquidityParams, tx?: Transaction): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n    const functionName = 'remove_liquidity'\n\n    tx = tx || new Transaction()\n\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n    const allCoinAsset = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n\n    tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n    const args = [\n      tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n      tx.object(params.pool_id),\n      tx.object(params.pos_id),\n      tx.pure.u128(params.delta_liquidity),\n      tx.pure.u64(params.min_amount_a),\n      tx.pure.u64(params.min_amount_b),\n      tx.object(CLOCK_ADDRESS),\n    ]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolModule}::${functionName}`,\n      typeArguments,\n      arguments: args,\n    })\n\n    return tx\n  }\n\n  /**\n   * Close position and remove all liquidity and collect_reward\n   * @param {ClosePositionParams} params\n   * @returns {TransactionBlock}\n   */\n  async closePositionTransactionPayload(params: ClosePositionParams, tx?: Transaction): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n    tx = tx || new Transaction()\n\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n    const allCoinAsset = await this.sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n\n    tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolModule}::close_position`,\n      typeArguments,\n      arguments: [\n        tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n        tx.object(params.pool_id),\n        tx.object(params.pos_id),\n        tx.pure.u64(params.min_amount_a),\n        tx.pure.u64(params.min_amount_b),\n        tx.object(CLOCK_ADDRESS),\n      ],\n    })\n\n    return tx\n  }\n\n  /**\n   * Open position in clmmpool.\n   * @param {OpenPositionParams} params\n   * @returns {TransactionBlock}\n   */\n  openPositionTransactionPayload(params: OpenPositionParams, tx?: Transaction): Transaction {\n    const { clmm_pool, integrate } = this.sdk.sdkOptions\n    tx = tx || new Transaction()\n\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n    const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n    const args = [\n      tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n      tx.object(params.pool_id),\n      tx.pure.u32(Number(tick_lower)),\n      tx.pure.u32(Number(tick_upper)),\n    ]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolModule}::open_position`,\n      typeArguments,\n      arguments: args,\n    })\n\n    return tx\n  }\n\n  /**\n   * Collect LP fee from Position.\n   * @param {CollectFeeParams} params\n   * @param {TransactionBlock} tx\n   * @returns {TransactionBlock}\n   */\n  async collectFeeTransactionPayload(\n    params: CollectFeeParams,\n    tx?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n\n    tx = tx || new Transaction()\n\n    const coinA = inputCoinA || TransactionUtil.buildCoinWithBalance(BigInt(0), params.coinTypeA)\n    const coinB = inputCoinB || TransactionUtil.buildCoinWithBalance(BigInt(0), params.coinTypeB)\n\n    this.createCollectFeePaylod(params, tx, coinA, coinB)\n    return tx\n  }\n\n  createCollectFeePaylod(\n    params: CollectFeeParams,\n    tx: Transaction,\n    primaryCoinAInput: TransactionObjectArgument,\n    primaryCoinBInput: TransactionObjectArgument\n  ) {\n    const { clmm_pool, integrate } = this.sdk.sdkOptions\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    const args = [\n      tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n      tx.object(params.pool_id),\n      tx.object(params.pos_id),\n      primaryCoinAInput,\n      primaryCoinBInput,\n    ]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_fee`,\n      typeArguments,\n      arguments: args,\n    })\n    return tx\n  }\n\n  createCollectFeeNoSendPaylod(\n    params: CollectFeeParams,\n    tx: Transaction,\n    primaryCoinAInput: TransactionObjectArgument,\n    primaryCoinBInput: TransactionObjectArgument\n  ) {\n    const { clmm_pool, integrate } = this.sdk.sdkOptions\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    const args = [\n      tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n      tx.object(params.pool_id),\n      tx.object(params.pos_id),\n      primaryCoinAInput,\n      primaryCoinBInput,\n    ]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_fee`,\n      typeArguments,\n      arguments: args,\n    })\n    return tx\n  }\n\n  /**\n   * calculate fee\n   * @param {CollectFeeParams} params\n   * @returns\n   */\n  async calculateFee(params: CollectFeeParams) {\n    const paylod = await this.collectFeeTransactionPayload(params)\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const res = await this._sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: paylod,\n      sender: this.sdk.senderAddress,\n    })\n\n    for (const event of res.events) {\n      if (extractStructTagFromType(event.type).name === 'CollectFeeEvent') {\n        const json = event.parsedJson as any\n        return {\n          feeOwedA: json.amount_a,\n          feeOwedB: json.amount_b,\n        }\n      }\n    }\n\n    return {\n      feeOwedA: '0',\n      feeOwedB: '0',\n    }\n  }\n\n  /**\n   * Updates the cache for the given key.\n   * @param {string} key The key of the cache entry to update.\n   * @param {SuiResource} data The data to store in the cache.\n   * @param {cacheTime5min} time The time in minutes after which the cache entry should expire.\n   */\n  private updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n    let cacheData = this._cache[key]\n    if (cacheData) {\n      cacheData.overdueTime = getFutureTime(time)\n      cacheData.value = data\n    } else {\n      cacheData = new CachedContent(data, getFutureTime(time))\n    }\n    this._cache[key] = cacheData\n  }\n\n  /**\n   * Gets the cache entry for the given key.\n   * @param {string} key The key of the cache entry to get.\n   * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n   * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n   */\n  private getCache<T>(key: string, forceRefresh = false): T | undefined {\n    const cacheData = this._cache[key]\n    const isValid = cacheData?.isValid()\n    if (!forceRefresh && isValid) {\n      return cacheData.value as T\n    }\n    if (!isValid) {\n      delete this._cache[key]\n    }\n    return undefined\n  }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport BN from 'bn.js'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { BuildCoinResult, checkInvalidSuiAddress, extractStructTagFromType, normalizeCoinType, TransactionUtil } from '../utils'\nimport { ClmmFetcherModule, ClmmIntegratePoolV2Module, ClmmIntegratePoolV3Module, CLOCK_ADDRESS } from '../types/sui'\nimport { getRewardInTickRange } from '../utils/tick'\nimport { MathUtil, ONE, ZERO } from '../math/utils'\nimport { TickData } from '../types/clmmpool'\nimport { CetusClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { CollectRewarderParams, getPackagerConfigs, Pool, Position, PositionReward, Rewarder, RewarderAmountOwed } from '../types'\nimport { CollectFeesQuote } from '../math'\nimport { ClmmpoolsError, ConfigErrorCode, UtilsErrorCode } from '../errors/errors'\n\nexport type FetchPosRewardParams = {\n  poolAddress: string\n  positionId: string\n  coinTypeA: string\n  coinTypeB: string\n  rewarderInfo: Rewarder[]\n}\n\nexport type FetchPosFeeParams = {\n  poolAddress: string\n  positionId: string\n  coinTypeA: string\n  coinTypeB: string\n}\n\nexport type PosRewarderResult = {\n  poolAddress: string\n  positionId: string\n  rewarderAmountOwed: RewarderAmountOwed[]\n}\n\n/**\n * Helper class to help interact with clmm position rewaeder with a rewaeder router interface.\n */\nexport class RewarderModule implements IModule {\n  protected _sdk: CetusClmmSDK\n\n  private growthGlobal: BN[]\n\n  constructor(sdk: CetusClmmSDK) {\n    this._sdk = sdk\n    this.growthGlobal = [ZERO, ZERO, ZERO]\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Gets the emissions for the given pool every day.\n   *\n   * @param {string} poolID The object ID of the pool.\n   * @returns {Promise<Array<{emissions: number, coinAddress: string}>>} A promise that resolves to an array of objects with the emissions and coin address for each rewarder.\n   */\n  async emissionsEveryDay(poolID: string) {\n    const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n    const rewarderInfos = currentPool.rewarder_infos\n    if (!rewarderInfos) {\n      return null\n    }\n\n    const emissionsEveryDay = []\n    for (const rewarderInfo of rewarderInfos) {\n      const emissionSeconds = MathUtil.fromX64(new BN(rewarderInfo.emissions_per_second))\n      emissionsEveryDay.push({\n        emissions: Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24),\n        coin_address: rewarderInfo.coinAddress,\n      })\n    }\n\n    return emissionsEveryDay\n  }\n\n  /**\n   * Updates the rewarder for the given pool.\n   *\n   * @param {string} poolID The object ID of the pool.\n   * @param {BN} currentTime The current time in seconds since the Unix epoch.\n   * @returns {Promise<Pool>} A promise that resolves to the updated pool.\n   */\n  private async updatePoolRewarder(poolID: string, currentTime: BN): Promise<Pool> {\n    // refresh pool rewarder\n    const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n    const lastTime = currentPool.rewarder_last_updated_time\n    currentPool.rewarder_last_updated_time = currentTime.toString()\n\n    if (Number(currentPool.liquidity) === 0 || currentTime.eq(new BN(lastTime))) {\n      return currentPool\n    }\n    const timeDelta = currentTime.div(new BN(1000)).sub(new BN(lastTime)).add(new BN(15))\n    const rewarderInfos: any = currentPool.rewarder_infos\n\n    for (let i = 0; i < rewarderInfos.length; i += 1) {\n      const rewarderInfo = rewarderInfos[i]\n      const rewarderGrowthDelta = MathUtil.checkMulDivFloor(\n        timeDelta,\n        new BN(rewarderInfo.emissions_per_second),\n        new BN(currentPool.liquidity),\n        128\n      )\n      this.growthGlobal[i] = new BN(rewarderInfo.growth_global).add(new BN(rewarderGrowthDelta))\n    }\n\n    return currentPool\n  }\n\n  /**\n   * Gets the amount owed to the rewarders for the given position.\n   *\n   * @param {string} poolID The object ID of the pool.\n   * @param {string} positionHandle The handle of the position.\n   * @param {string} positionID The ID of the position.\n   * @returns {Promise<Array<{amountOwed: number}>>} A promise that resolves to an array of objects with the amount owed to each rewarder.\n   * @deprecated This method is deprecated and may be removed in future versions. Use `sdk.Rewarder.fetchPosRewardersAmount()` instead.\n   */\n  async posRewardersAmount(poolID: string, positionHandle: string, positionID: string) {\n    const currentTime = Date.parse(new Date().toString())\n    const pool: Pool = await this.updatePoolRewarder(poolID, new BN(currentTime))\n    const position = await this.sdk.Position.getPositionRewarders(positionHandle, positionID)\n\n    if (position === undefined) {\n      return []\n    }\n\n    const ticksHandle = pool.ticks_handle\n    const tickLower = await this.sdk.Pool.getTickDataByIndex(ticksHandle, position.tick_lower_index)\n    const tickUpper = await this.sdk.Pool.getTickDataByIndex(ticksHandle, position.tick_upper_index)\n\n    const amountOwed = this.posRewardersAmountInternal(pool, position, tickLower!, tickUpper!)\n    return amountOwed\n  }\n\n  /**\n   * Gets the amount owed to the rewarders for the given account and pool.\n   *\n   * @param {string} accountAddress The account address.\n   * @param {string} poolID The object ID of the pool.\n   * @returns {Promise<Array<{amountOwed: number}>>} A promise that resolves to an array of objects with the amount owed to each rewarder.\n   * @deprecated This method is deprecated and may be removed in future versions. Use `sdk.Rewarder.fetchPosRewardersAmount()` instead.\n   */\n  async poolRewardersAmount(accountAddress: string, poolID: string) {\n    const currentTime = Date.parse(new Date().toString())\n    const pool: Pool = await this.updatePoolRewarder(poolID, new BN(currentTime))\n\n    const positions = await this.sdk.Position.getPositionList(accountAddress, [poolID])\n    const tickDatas = await this.getPoolLowerAndUpperTicks(pool.ticks_handle, positions)\n\n    const rewarderAmount = [ZERO, ZERO, ZERO]\n\n    for (let i = 0; i < positions.length; i += 1) {\n      // eslint-disable-next-line no-await-in-loop\n      const posRewarderInfo: any = await this.posRewardersAmountInternal(pool, positions[i], tickDatas[0][i], tickDatas[1][i])\n      for (let j = 0; j < 3; j += 1) {\n        rewarderAmount[j] = rewarderAmount[j].add(posRewarderInfo[j].amount_owed)\n      }\n    }\n\n    return rewarderAmount\n  }\n\n  /**\n   * Gets the amount owed to the rewarders for the given account and pool.\n   * @param {Pool} pool Pool object\n   * @param {PositionReward} position Position object\n   * @param {TickData} tickLower Lower tick data\n   * @param {TickData} tickUpper Upper tick data\n   * @returns {RewarderAmountOwed[]}\n   */\n  private posRewardersAmountInternal(pool: Pool, position: PositionReward, tickLower: TickData, tickUpper: TickData): RewarderAmountOwed[] {\n    const tickLowerIndex = position.tick_lower_index\n    const tickUpperIndex = position.tick_upper_index\n    const rewardersInside = getRewardInTickRange(pool, tickLower, tickUpper, tickLowerIndex, tickUpperIndex, this.growthGlobal)\n\n    const growthInside = []\n    const AmountOwed = []\n\n    if (rewardersInside.length > 0) {\n      let growthDelta0 = MathUtil.subUnderflowU128(rewardersInside[0], new BN(position.reward_growth_inside_0))\n\n      if (growthDelta0.gt(new BN('3402823669209384634633745948738404'))) {\n        growthDelta0 = ONE\n      }\n\n      const amountOwed_0 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta0, 64, 128)\n      growthInside.push(rewardersInside[0])\n      AmountOwed.push({\n        amount_owed: new BN(position.reward_amount_owed_0).add(amountOwed_0),\n\n        coin_address: pool.rewarder_infos[0].coinAddress,\n      })\n    }\n\n    if (rewardersInside.length > 1) {\n      let growthDelta_1 = MathUtil.subUnderflowU128(rewardersInside[1], new BN(position.reward_growth_inside_1))\n      if (growthDelta_1.gt(new BN('3402823669209384634633745948738404'))) {\n        growthDelta_1 = ONE\n      }\n\n      const amountOwed_1 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta_1, 64, 128)\n      growthInside.push(rewardersInside[1])\n\n      AmountOwed.push({\n        amount_owed: new BN(position.reward_amount_owed_1).add(amountOwed_1),\n        coin_address: pool.rewarder_infos[1].coinAddress,\n      })\n    }\n\n    if (rewardersInside.length > 2) {\n      let growthDelta_2 = MathUtil.subUnderflowU128(rewardersInside[2], new BN(position.reward_growth_inside_2))\n      if (growthDelta_2.gt(new BN('3402823669209384634633745948738404'))) {\n        growthDelta_2 = ONE\n      }\n\n      const amountOwed_2 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta_2, 64, 128)\n      growthInside.push(rewardersInside[2])\n\n      AmountOwed.push({\n        amount_owed: new BN(position.reward_amount_owed_2).add(amountOwed_2),\n        coin_address: pool.rewarder_infos[2].coinAddress,\n      })\n    }\n    return AmountOwed\n  }\n\n  /**\n   * Fetches the Position reward amount for a given list of addresses.\n   * @param {string[]}positionIDs An array of position object ids.\n   * @returns {Promise<Record<string, RewarderAmountOwed[]>>} A Promise that resolves with the fetched position reward amount for the specified position object ids.\n   */\n  async batchFetchPositionRewarders(positionIDs: string[]): Promise<Record<string, RewarderAmountOwed[]>> {\n    const posRewardParamsList: FetchPosRewardParams[] = []\n    for (const id of positionIDs) {\n      const position = await this._sdk.Position.getPositionById(id, false)\n      const pool = await this._sdk.Pool.getPool(position.pool, false)\n      posRewardParamsList.push({\n        poolAddress: pool.poolAddress,\n        positionId: position.pos_object_id,\n        coinTypeA: pool.coinTypeA,\n        coinTypeB: pool.coinTypeB,\n        rewarderInfo: pool.rewarder_infos,\n      })\n    }\n\n    const positionMap: Record<string, RewarderAmountOwed[]> = {}\n\n    if (posRewardParamsList.length > 0) {\n      const result: PosRewarderResult[] = await this.fetchPosRewardersAmount(posRewardParamsList)\n      for (const posRewarderInfo of result) {\n        positionMap[posRewarderInfo.positionId] = posRewarderInfo.rewarderAmountOwed\n      }\n      return positionMap\n    }\n    return positionMap\n  }\n\n  /**\n   * Fetch the position rewards for a given pool.\n   * @param {Pool}pool Pool object\n   * @param {string}positionId Position object id\n   * @returns {Promise<RewarderAmountOwed[]>} A Promise that resolves with the fetched position reward amount for the specified position object id.\n   */\n  async fetchPositionRewarders(pool: Pool, positionId: string): Promise<RewarderAmountOwed[]> {\n    const param = {\n      poolAddress: pool.poolAddress,\n      positionId,\n      coinTypeA: pool.coinTypeA,\n      coinTypeB: pool.coinTypeB,\n      rewarderInfo: pool.rewarder_infos,\n    }\n\n    const result = await this.fetchPosRewardersAmount([param])\n\n    return result[0].rewarderAmountOwed\n  }\n\n  /**\n   * Fetches the Position fee amount for a given list of addresses.\n   * @param positionIDs An array of position object ids.\n   * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n   * @deprecated This method is deprecated and may be removed in future versions. Use alternative methods if available.\n   */\n  async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n    const posFeeParamsList: FetchPosFeeParams[] = []\n    for (const id of positionIDs) {\n      const position = await this._sdk.Position.getPositionById(id, false)\n      const pool = await this._sdk.Pool.getPool(position.pool, false)\n      posFeeParamsList.push({\n        poolAddress: pool.poolAddress,\n        positionId: position.pos_object_id,\n        coinTypeA: pool.coinTypeA,\n        coinTypeB: pool.coinTypeB,\n      })\n    }\n\n    const positionMap: Record<string, CollectFeesQuote> = {}\n\n    if (posFeeParamsList.length > 0) {\n      const result: CollectFeesQuote[] = await this.fetchPosFeeAmount(posFeeParamsList)\n      for (const posRewarderInfo of result) {\n        positionMap[posRewarderInfo.position_id] = posRewarderInfo\n      }\n      return positionMap\n    }\n    return positionMap\n  }\n\n  /**\n   * Fetches the Position fee amount for a given list of addresses.\n   * @param params  An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n   * @returns\n   */\n  async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n    const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n    const tx = new Transaction()\n\n    for (const paramItem of params) {\n      const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n      const args = [\n        tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n        tx.object(paramItem.poolAddress),\n        tx.pure.address(paramItem.positionId),\n      ]\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_fees`,\n        arguments: args,\n        typeArguments,\n      })\n    }\n\n    const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `FetchPositionFeesEvent`\n    })\n    if (valueData.length === 0) {\n      return []\n    }\n\n    const result: CollectFeesQuote[] = []\n\n    for (let i = 0; i < valueData.length; i += 1) {\n      const { parsedJson } = valueData[i]\n      const posRrewarderResult: CollectFeesQuote = {\n        feeOwedA: new BN(parsedJson.fee_owned_a),\n        feeOwedB: new BN(parsedJson.fee_owned_b),\n        position_id: parsedJson.position_id,\n      }\n      result.push(posRrewarderResult)\n    }\n\n    return result\n  }\n\n  /**\n   * Fetches the Position reward amount for a given list of addresses.\n   * @param params  An array of FetchPosRewardParams objects containing the target addresses and their corresponding amounts.\n   * @returns\n   */\n  async fetchPosRewardersAmount(params: FetchPosRewardParams[]) {\n    const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n    const tx = new Transaction()\n\n    for (const paramItem of params) {\n      const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n      const args = [\n        tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n        tx.object(paramItem.poolAddress),\n        tx.pure.address(paramItem.positionId),\n        tx.object(CLOCK_ADDRESS),\n      ]\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_rewards`,\n        arguments: args,\n        typeArguments,\n      })\n    }\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError(\n        `this config simulationAccount: ${simulationAccount.address} is not set right`,\n        ConfigErrorCode.InvalidSimulateAccount\n      )\n    }\n\n    const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    if (simulateRes.error != null) {\n      throw new ClmmpoolsError(\n        `fetch position rewards error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n        ConfigErrorCode.InvalidConfig\n      )\n    }\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `FetchPositionRewardsEvent`\n    })\n    if (valueData.length === 0) {\n      return []\n    }\n\n    if (valueData.length !== params.length) {\n      throw new ClmmpoolsError('valueData.length !== params.pools.length')\n    }\n\n    const result: PosRewarderResult[] = []\n\n    for (let i = 0; i < valueData.length; i += 1) {\n      const posRrewarderResult: PosRewarderResult = {\n        poolAddress: params[i].poolAddress,\n        positionId: params[i].positionId,\n        rewarderAmountOwed: [],\n      }\n\n      for (let j = 0; j < params[i].rewarderInfo.length; j += 1) {\n        posRrewarderResult.rewarderAmountOwed.push({\n          amount_owed: new BN(valueData[i].parsedJson.data[j]),\n          coin_address: params[i].rewarderInfo[j].coinAddress,\n        })\n      }\n\n      result.push(posRrewarderResult)\n    }\n\n    return result\n  }\n\n  /**\n   * Fetches the pool reward amount for a given account and pool object id.\n   * @param {string} account - The target account.\n   * @param {string} poolObjectId - The target pool object id.\n   * @returns {Promise<number|null>} - A Promise that resolves with the fetched pool reward amount for the specified account and pool, or null if the fetch is unsuccessful.\n   */\n  async fetchPoolRewardersAmount(account: string, poolObjectId: string) {\n    const pool: Pool = await this.sdk.Pool.getPool(poolObjectId)\n    const positions = await this.sdk.Position.getPositionList(account, [poolObjectId])\n\n    const params: FetchPosRewardParams[] = []\n\n    for (const position of positions) {\n      params.push({\n        poolAddress: pool.poolAddress,\n        positionId: position.pos_object_id,\n        rewarderInfo: pool.rewarder_infos,\n        coinTypeA: pool.coinTypeA,\n        coinTypeB: pool.coinTypeB,\n      })\n    }\n\n    const result = await this.fetchPosRewardersAmount(params)\n\n    const rewarderAmount = [ZERO, ZERO, ZERO]\n\n    if (result != null) {\n      for (const posRewarderInfo of result) {\n        for (let j = 0; j < posRewarderInfo.rewarderAmountOwed.length; j += 1) {\n          rewarderAmount[j] = rewarderAmount[j].add(posRewarderInfo.rewarderAmountOwed[j].amount_owed)\n        }\n      }\n    }\n    return rewarderAmount\n  }\n\n  private async getPoolLowerAndUpperTicks(ticksHandle: string, positions: Position[]): Promise<TickData[][]> {\n    const lowerTicks: TickData[] = []\n    const upperTicks: TickData[] = []\n\n    for (const pos of positions) {\n      const tickLower = await this.sdk.Pool.getTickDataByIndex(ticksHandle, pos.tick_lower_index)\n      const tickUpper = await this.sdk.Pool.getTickDataByIndex(ticksHandle, pos.tick_upper_index)\n      lowerTicks.push(tickLower!)\n      upperTicks.push(tickUpper!)\n    }\n\n    return [lowerTicks, upperTicks]\n  }\n\n  /**\n   * Collect rewards from Position.\n   * @param params\n   * @param gasBudget\n   * @returns\n   */\n  async collectRewarderTransactionPayload(params: CollectRewarderParams): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const allCoinAsset = await this.sdk.getOwnerCoinAssets(this.sdk.senderAddress, null)\n    let tx = new Transaction()\n\n    tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n    return tx\n  }\n\n  /**\n   * batech Collect rewards from Position.\n   * @param params\n   * @param published_at\n   * @param tx\n   * @returns\n   */\n  async batchCollectRewardePayload(\n    params: CollectRewarderParams[],\n    tx?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ) {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const allCoinAsset = await this.sdk.getOwnerCoinAssets(this.sdk.senderAddress, null)\n    tx = tx || new Transaction()\n    const coinIdMaps: Record<string, BuildCoinResult> = {}\n    params.forEach((item) => {\n      const coinTypeA = normalizeCoinType(item.coinTypeA)\n      const coinTypeB = normalizeCoinType(item.coinTypeB)\n\n      if (item.collect_fee) {\n        let coinAInput = coinIdMaps[coinTypeA]\n        if (coinAInput == null) {\n          if (inputCoinA == null) {\n            coinAInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinTypeA, false)\n          } else {\n            coinAInput = {\n              targetCoin: inputCoinA,\n              remainCoins: [],\n              isMintZeroCoin: false,\n              tragetCoinAmount: '0',\n            }\n          }\n\n          coinIdMaps[coinTypeA] = coinAInput\n        }\n\n        let coinBInput = coinIdMaps[coinTypeB]\n        if (coinBInput == null) {\n          if (inputCoinB == null) {\n            coinBInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinTypeB, false)\n          } else {\n            coinBInput = {\n              targetCoin: inputCoinB,\n              remainCoins: [],\n              isMintZeroCoin: false,\n              tragetCoinAmount: '0',\n            }\n          }\n\n          coinIdMaps[coinTypeB] = coinBInput\n        }\n\n        tx = this._sdk.Position.createCollectFeeNoSendPaylod(\n          {\n            pool_id: item.pool_id,\n            pos_id: item.pos_id,\n            coinTypeA: item.coinTypeA,\n            coinTypeB: item.coinTypeB,\n          },\n          tx!,\n          coinAInput.targetCoin,\n          coinBInput.targetCoin\n        )\n      }\n      const primaryCoinInputs: TransactionObjectArgument[] = []\n      item.rewarder_coin_types.forEach((type) => {\n        const coinType = normalizeCoinType(type)\n        let coinInput = coinIdMaps[type]\n        if (coinInput === undefined) {\n          coinInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinType, false)\n          coinIdMaps[coinType] = coinInput\n        }\n        primaryCoinInputs.push(coinInput.targetCoin)\n      })\n\n      tx = this.createCollectRewarderNoSendPaylod(item, tx!, primaryCoinInputs)\n    })\n\n    Object.keys(coinIdMaps).forEach((key) => {\n      const value = coinIdMaps[key]\n      if (value.isMintZeroCoin) {\n        TransactionUtil.buildTransferCoin(this.sdk, tx!, value.targetCoin, key, this.sdk.senderAddress)\n      }\n    })\n\n    return tx\n  }\n\n  createCollectRewarderPaylod(params: CollectRewarderParams, tx: Transaction, primaryCoinInputs: TransactionArgument[]) {\n    const { clmm_pool, integrate } = this.sdk.sdkOptions\n    const clmmConfigs = getPackagerConfigs(clmm_pool)\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    params.rewarder_coin_types.forEach((type, index) => {\n      if (tx) {\n        tx.moveCall({\n          target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_reward`,\n          typeArguments: [...typeArguments, type],\n          arguments: [\n            tx.object(clmmConfigs.global_config_id),\n            tx.object(params.pool_id),\n            tx.object(params.pos_id),\n            tx.object(clmmConfigs.global_vault_id),\n            primaryCoinInputs[index],\n            tx.object(CLOCK_ADDRESS),\n          ],\n        })\n      }\n    })\n    return tx\n  }\n\n  createCollectRewarderNoSendPaylod(params: CollectRewarderParams, tx: Transaction, primaryCoinInputs: TransactionArgument[]) {\n    const { clmm_pool, integrate } = this.sdk.sdkOptions\n    const clmmConfigs = getPackagerConfigs(clmm_pool)\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    params.rewarder_coin_types.forEach((type, index) => {\n      if (tx) {\n        tx.moveCall({\n          target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_reward`,\n          typeArguments: [...typeArguments, type],\n          arguments: [\n            tx.object(clmmConfigs.global_config_id),\n            tx.object(params.pool_id),\n            tx.object(params.pos_id),\n            tx.object(clmmConfigs.global_vault_id),\n            primaryCoinInputs[index],\n            tx.object(CLOCK_ADDRESS),\n          ],\n        })\n      }\n    })\n    return tx\n  }\n}\n","import BN from 'bn.js'\nimport { Graph, GraphEdge, GraphVertex } from '@syntsugar/cc-graph'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { PreSwapWithMultiPoolParams } from '../types'\nimport { checkInvalidSuiAddress, extractStructTagFromType } from '../utils'\nimport { ClmmExpectSwapModule, ClmmIntegrateRouterModule, SuiAddressType } from '../types/sui'\nimport { CetusClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { U64_MAX, ZERO } from '../math'\nimport { ClmmpoolsError, ConfigErrorCode, RouterErrorCode } from '../errors/errors'\n\n// coin node in coin map\nexport interface CoinNode {\n  address: string\n  decimals: number\n}\n\n// pass coin node to coin map\nexport interface CoinProvider {\n  coins: CoinNode[]\n}\n\n// path link to coin map\nexport interface PathLink {\n  base: string\n  quote: string\n  addressMap: Map<number, string>\n}\n\n// pass path link to coin map\nexport interface PathProvider {\n  paths: PathLink[]\n}\n\n// simple path in router path\nexport type OnePath = {\n  amountIn: BN\n  amountOut: BN\n  poolAddress: string[]\n  a2b: boolean[]\n  rawAmountLimit: BN[]\n  isExceed: boolean\n  coinType: string[]\n}\n\n// label address map with direction\nexport type AddressAndDirection = {\n  addressMap: Map<number, string>\n  direction: boolean\n}\n\n// use to build router swap transaction\nexport type SwapWithRouterParams = {\n  paths: OnePath[]\n  partner: string\n  priceSlippagePoint: number\n}\n\n// use to do pre router swap param by sdk\nexport type PreRouterSwapParams = {\n  stepNums: number\n  poolAB: string\n  poolBC: string | undefined\n  a2b: boolean\n  b2c: boolean | undefined\n  byAmountIn: boolean\n  amount: BN\n  coinTypeA: SuiAddressType\n  coinTypeB: SuiAddressType\n  coinTypeC: SuiAddressType | undefined\n}\n\n// return the best path in pre swap result\nexport type PreSwapResult = {\n  index: number\n  amountIn: BN\n  amountMedium: BN\n  amountOut: BN\n  targetSqrtPrice: BN[]\n  currentSqrtPrice: BN[]\n  isExceed: boolean\n  stepNum: number\n}\n\n// return the\nexport type PriceResult = {\n  amountIn: BN\n  amountOut: BN\n  paths: OnePath[]\n  a2b: boolean\n  b2c: boolean | undefined\n  byAmountIn: boolean\n  isExceed: boolean\n  targetSqrtPrice: BN[]\n  currentSqrtPrice: BN[]\n  coinTypeA: SuiAddressType\n  coinTypeB: SuiAddressType\n  coinTypeC: SuiAddressType | undefined\n  createTxParams: SwapWithRouterParams | undefined\n}\n\n// return the pool with tvl info by statistics API\ntype PoolWithTvl = {\n  poolAddress: string\n  tvl: number\n}\n\n/**\n * build pair symbol\n * @param base base coin\n * @param quote quote coin\n * @returns pair symbol\n */\nfunction _pairSymbol(\n  base: string,\n  quote: string\n): {\n  pair: string\n  reversePair: string\n} {\n  return {\n    pair: `${base}-${quote}`,\n    reversePair: `${quote}-${base}`,\n  }\n}\n\n/**\n * @deprecated Replace this feature with the latest aggregator sdk: https://github.com/CetusProtocol/aggregator\n */\nexport class RouterModule implements IModule {\n  readonly graph: Graph\n\n  readonly pathProviders: PathProvider[]\n\n  private coinProviders: CoinProvider\n\n  private _coinAddressMap: Map<string, CoinNode>\n\n  private poolAddressMap: Map<string, Map<number, string>>\n\n  protected _sdk: CetusClmmSDK\n\n  constructor(sdk: CetusClmmSDK) {\n    this.pathProviders = []\n    this.coinProviders = {\n      coins: [],\n    }\n    this.graph = new Graph(false)\n    this._coinAddressMap = new Map()\n    this.poolAddressMap = new Map()\n    this._sdk = sdk\n\n    this.getPoolAddressMapAndDirection = this.getPoolAddressMapAndDirection.bind(this)\n    this.setCoinList = this.setCoinList.bind(this)\n    this.loadGraph = this.loadGraph.bind(this)\n    this.addCoinProvider = this.addCoinProvider.bind(this)\n    this.addPathProvider = this.addPathProvider.bind(this)\n    this.preRouterSwapA2B2C = this.preRouterSwapA2B2C.bind(this)\n    this.price = this.price.bind(this)\n    this.getPoolWithTVL = this.getPoolWithTVL.bind(this)\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Get pool address map with direction\n   * @param {string} base base coin\n   * @param {string} quote quote coin\n   * @returns {AddressAndDirection} address with direction\n   */\n  getPoolAddressMapAndDirection(base: string, quote: string): AddressAndDirection | undefined {\n    const { pair, reversePair } = _pairSymbol(base, quote)\n    let addressMap: any = this.poolAddressMap.get(pair)\n\n    if (addressMap != null) {\n      return {\n        addressMap,\n        direction: true,\n      }\n    }\n\n    addressMap = this.poolAddressMap.get(reversePair)\n    if (addressMap != null) {\n      return {\n        addressMap,\n        direction: false,\n      }\n    }\n    return undefined\n  }\n\n  /**\n   * set coin list in coin address map\n   */\n  private setCoinList() {\n    this.coinProviders.coins.forEach((coin) => {\n      this._coinAddressMap.set(coin.address, coin)\n    })\n  }\n\n  /**\n   * Find best router must load graph first\n   * @param {CoinProvider} coins all coins\n   * @param {PathProvider} paths all paths\n   */\n  loadGraph(coins: CoinProvider, paths: PathProvider) {\n    this.addCoinProvider(coins)\n    this.addPathProvider(paths)\n    this.setCoinList()\n\n    this.pathProviders.forEach((provider) => {\n      const { paths } = provider\n      paths.forEach((path) => {\n        const vertexA = this.graph.getVertexByKey(path.base) ?? new GraphVertex(path.base)\n        const vertexB = this.graph.getVertexByKey(path.quote) ?? new GraphVertex(path.quote)\n\n        this.graph.addEdge(new GraphEdge(vertexA, vertexB))\n\n        const coinA: any = this._coinAddressMap.get(path.base)\n        const coinB: any = this._coinAddressMap.get(path.quote)\n\n        if (coinA != null && coinB != null) {\n          const poolSymbol = _pairSymbol(path.base, path.quote).pair\n          this.poolAddressMap.set(poolSymbol, path.addressMap)\n        }\n      })\n    })\n  }\n\n  /**\n   * Add path provider to router graph\n   * @param {PathProvider} provider path provider\n   * @returns {RouterModule} module of router\n   */\n  private addPathProvider(provider: PathProvider): RouterModule {\n    // fix all order about base and quote in paths\n    for (let i = 0; i < provider.paths.length; i += 1) {\n      const { base, quote } = provider.paths[i]\n      const compareResult = base.localeCompare(quote)\n      if (compareResult < 0) {\n        provider.paths[i].base = quote\n        provider.paths[i].quote = base\n      }\n\n      if (base === '0x2::sui::SUI') {\n        provider.paths[i].base = quote\n        provider.paths[i].quote = base\n      }\n\n      if (quote === '0x2::sui::SUI') {\n        provider.paths[i].base = base\n        provider.paths[i].quote = quote\n      }\n    }\n\n    this.pathProviders.push(provider)\n    return this\n  }\n\n  /**\n   * Add coin provider to router graph\n   * @param {CoinProvider} provider  coin provider\n   * @returns {RouterModule} module of router\n   */\n  private addCoinProvider(provider: CoinProvider): RouterModule {\n    this.coinProviders = provider\n    return this\n  }\n\n  /**\n   * Get token info from coin address map\n   * @param {string} key coin type\n   * @returns {CoinNode | undefined}\n   */\n  tokenInfo(key: string): CoinNode | undefined {\n    return this._coinAddressMap.get(key)\n  }\n\n  /**\n   * Get fee rate info from pool address map\n   * @param from from coin type\n   * @param to to coin type\n   * @param address pool address\n   * @returns fee rate of pool\n   */\n  getFeeRate(from: string, to: string, address: string): number {\n    const poolSymbol = _pairSymbol(from, to).pair\n    const addressMap = this.poolAddressMap.get(poolSymbol)\n    if (addressMap != null) {\n      // get value by key from map\n      for (const [key, value] of addressMap.entries()) {\n        if (value === address) {\n          return key * 100\n        }\n      }\n    }\n    const poolSymbolRev = _pairSymbol(from, to).reversePair\n    const addressMapRev = this.poolAddressMap.get(poolSymbolRev)\n    if (addressMapRev != null) {\n      // get value by key from map\n      for (const [key, value] of addressMapRev.entries()) {\n        if (value === address) {\n          return key * 100\n        }\n      }\n    }\n    return 0\n  }\n\n  /**\n   * @deprecated Replace this feature with the latest aggregator sdk: https://github.com/CetusProtocol/aggregator\n   * \n   * Get the best price from router graph.\n   *\n   * @param {string} from from coin type\n   * @param {string} to to coin type\n   * @param {BN} amount coin amount\n   * @param {boolean} byAmountIn weather fixed inoput amount\n   * @param {number} priceSlippagePoint price splippage point\n   * @param {string} partner partner object id\n   * @param {PreSwapWithMultiPoolParams} swapWithMultiPoolParams use to downgrade\n   * @returns {Promise<PriceResult | undefined>} best swap router\n   */\n  async price(\n    from: string,\n    to: string,\n    amount: BN,\n    byAmountIn: boolean,\n    priceSlippagePoint: number,\n    partner: string,\n    swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n  ): Promise<PriceResult | undefined> {\n    const fromCoin = this.tokenInfo(from)\n    const toCoin = this.tokenInfo(to)\n\n    if (fromCoin === undefined || toCoin === undefined) {\n      throw new ClmmpoolsError('From/To coin is undefined', RouterErrorCode.InvalidCoin)\n    }\n\n    const fromVertex = this.graph.getVertexByKey(fromCoin.address)\n    const toVertex = this.graph.getVertexByKey(toCoin.address)\n\n    const pathIters = this.graph.findAllPath(fromVertex, toVertex)\n    const allPaths = Array.from(pathIters)\n\n    if (allPaths.length === 0) {\n      throw new ClmmpoolsError('No find valid path in coin graph', RouterErrorCode.NotFoundPath)\n    }\n\n    let preRouterSwapParams: PreRouterSwapParams[] = []\n\n    for (let i = 0; i < allPaths.length; i += 1) {\n      const path = allPaths[i]\n\n      // only consider one and two pair path\n      if (path.length > 3) {\n        continue\n      }\n      const fromAndTo = []\n      const swapDirection = []\n\n      const poolsAB: string[] = []\n      const poolsBC: string[] = []\n\n      for (let j = 0; j < path.length - 1; j += 1) {\n        const subFrom = path[j].value.toString()\n        const subTo = path[j + 1].value.toString()\n        const addressMapAndDirection = this.getPoolAddressMapAndDirection(subFrom, subTo)\n        const addressMap = addressMapAndDirection?.addressMap\n        const direction = addressMapAndDirection?.direction\n\n        if (addressMap != null && direction != null) {\n          swapDirection.push(direction)\n          fromAndTo.push(subFrom)\n          fromAndTo.push(subTo)\n          addressMap.forEach((address) => {\n            if (j === 0) {\n              poolsAB.push(address)\n            } else {\n              poolsBC.push(address)\n            }\n          })\n        }\n      }\n\n      for (const poolAB of poolsAB) {\n        if (poolsBC.length > 0) {\n          for (const poolBC of poolsBC) {\n            const param: PreRouterSwapParams = {\n              stepNums: 2,\n              poolAB,\n              poolBC,\n              a2b: swapDirection[0],\n              b2c: swapDirection[1],\n              amount,\n              byAmountIn,\n              coinTypeA: fromAndTo[0],\n              coinTypeB: fromAndTo[1],\n              coinTypeC: fromAndTo[3],\n            }\n            preRouterSwapParams.push(param)\n          }\n        } else {\n          const param: PreRouterSwapParams = {\n            stepNums: 1,\n            poolAB,\n            poolBC: undefined,\n            a2b: swapDirection[0],\n            b2c: undefined,\n            amount,\n            byAmountIn,\n            coinTypeA: fromAndTo[0],\n            coinTypeB: fromAndTo[1],\n            coinTypeC: undefined,\n          }\n          preRouterSwapParams.push(param)\n        }\n      }\n    }\n\n    // add one limit, must calculated two steps path.\n    const stepNumsOne = preRouterSwapParams.filter((item) => item.stepNums === 1)\n    const notStepNumsOne = preRouterSwapParams.filter((item) => item.stepNums !== 1)\n\n    let poolWithTvls: PoolWithTvl[] = []\n    try {\n      poolWithTvls = await this.getPoolWithTVL()\n    } catch (err) {\n      poolWithTvls = []\n    }\n\n    if (poolWithTvls.length > 0) {\n      const poolWithTvlsMap = new Map(poolWithTvls.map((item) => [item.poolAddress, item]))\n\n      // sort notStepNumbsOne by tvl\n      notStepNumsOne.sort((a, b) => {\n        let aTvlMinimum = 0\n        let bTvlMinimum = 0\n\n        if (poolWithTvlsMap.has(a.poolAB) && poolWithTvlsMap.has(a.poolBC!)) {\n          const aPoolAB = poolWithTvlsMap.get(a.poolAB)!\n          const aPoolBC = poolWithTvlsMap.get(a.poolBC!)!\n          aTvlMinimum = Math.min(aPoolAB.tvl, aPoolBC.tvl)\n        }\n\n        if (poolWithTvlsMap.has(b.poolAB) && poolWithTvlsMap.has(b.poolBC!)) {\n          const bPoolAB = poolWithTvlsMap.get(b.poolAB)!\n          const bPoolBC = poolWithTvlsMap.get(b.poolBC!)!\n          bTvlMinimum = Math.min(bPoolAB.tvl, bPoolBC.tvl)\n        }\n        return bTvlMinimum - aTvlMinimum\n      })\n    }\n\n    preRouterSwapParams = [...stepNumsOne, ...notStepNumsOne]\n\n    if (preRouterSwapParams.length === 0) {\n      if (swapWithMultiPoolParams != null) {\n        const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n        const onePath: OnePath = {\n          amountIn: new BN(preSwapResult!.estimatedAmountIn),\n          amountOut: new BN(preSwapResult!.estimatedAmountOut),\n          poolAddress: [preSwapResult!.poolAddress],\n          a2b: [preSwapResult!.aToB],\n          rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n          isExceed: preSwapResult!.isExceed,\n          coinType: [from, to],\n        }\n\n        const swapWithRouterParams = {\n          paths: [onePath],\n          partner,\n          priceSlippagePoint,\n        }\n\n        const result: PriceResult = {\n          amountIn: new BN(preSwapResult!.estimatedAmountIn),\n          amountOut: new BN(preSwapResult!.estimatedAmountOut),\n          paths: [onePath],\n          a2b: preSwapResult!.aToB,\n          b2c: undefined,\n          byAmountIn,\n          isExceed: preSwapResult!.isExceed,\n          targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n          currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n          coinTypeA: from,\n          coinTypeB: to,\n          coinTypeC: undefined,\n          createTxParams: swapWithRouterParams,\n        }\n        return result\n      }\n      throw new ClmmpoolsError('No parameters available for service downgrade', RouterErrorCode.NoDowngradeNeedParams)\n    }\n\n    const preSwapResult = await this.preRouterSwapA2B2C(preRouterSwapParams.slice(0, 16))\n    if (preSwapResult == null) {\n      if (swapWithMultiPoolParams != null) {\n        const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n        const onePath: OnePath = {\n          amountIn: new BN(preSwapResult!.estimatedAmountIn),\n          amountOut: new BN(preSwapResult!.estimatedAmountOut),\n          poolAddress: [preSwapResult!.poolAddress],\n          a2b: [preSwapResult!.aToB],\n          rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n          isExceed: preSwapResult!.isExceed,\n          coinType: [from, to],\n        }\n\n        const swapWithRouterParams = {\n          paths: [onePath],\n          partner,\n          priceSlippagePoint,\n        }\n\n        const result: PriceResult = {\n          amountIn: new BN(preSwapResult!.estimatedAmountIn),\n          amountOut: new BN(preSwapResult!.estimatedAmountOut),\n          paths: [onePath],\n          a2b: preSwapResult!.aToB,\n          b2c: undefined,\n          byAmountIn,\n          isExceed: preSwapResult!.isExceed,\n          targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n          currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n          coinTypeA: from,\n          coinTypeB: to,\n          coinTypeC: undefined,\n          createTxParams: swapWithRouterParams,\n        }\n        return result\n      }\n      const result: PriceResult = {\n        amountIn: ZERO,\n        amountOut: ZERO,\n        paths: [],\n        a2b: false,\n        b2c: false,\n        byAmountIn,\n        isExceed: true,\n        targetSqrtPrice: [],\n        currentSqrtPrice: [],\n        coinTypeA: '',\n        coinTypeB: '',\n        coinTypeC: undefined,\n        createTxParams: undefined,\n      }\n\n      return result\n    }\n\n    const bestIndex = preSwapResult!.index\n\n    const poolAddress =\n      preRouterSwapParams[bestIndex].poolBC != null\n        ? [preRouterSwapParams[bestIndex].poolAB, preRouterSwapParams[bestIndex].poolBC!]\n        : [preRouterSwapParams[bestIndex].poolAB]\n\n    const rawAmountLimit = byAmountIn\n      ? [preSwapResult!.amountMedium, preSwapResult!.amountOut]\n      : [preSwapResult!.amountIn, preSwapResult!.amountMedium]\n\n    const a2bs = []\n    a2bs.push(preRouterSwapParams[bestIndex].a2b)\n    if (preSwapResult!.stepNum! > 1) {\n      a2bs.push(preRouterSwapParams[bestIndex].b2c!)\n    }\n\n    const coinTypes = []\n    coinTypes.push(preRouterSwapParams[bestIndex].coinTypeA)\n    coinTypes.push(preRouterSwapParams[bestIndex].coinTypeB)\n    if (preSwapResult!.stepNum! > 1) {\n      coinTypes.push(preRouterSwapParams[bestIndex].coinTypeC!)\n    }\n\n    const onePath: OnePath = {\n      amountIn: preSwapResult!.amountIn,\n      amountOut: preSwapResult!.amountOut,\n      poolAddress,\n      a2b: a2bs,\n      rawAmountLimit,\n      isExceed: preSwapResult!.isExceed,\n      coinType: coinTypes,\n    }\n\n    const swapWithRouterParams = {\n      paths: [onePath],\n      partner,\n      priceSlippagePoint,\n    }\n\n    const result: PriceResult = {\n      amountIn: preSwapResult!.amountIn,\n      amountOut: preSwapResult!.amountOut,\n      paths: [onePath],\n      a2b: preRouterSwapParams[bestIndex].a2b,\n      b2c: preSwapResult!.stepNum! > 1 ? preRouterSwapParams[bestIndex].b2c! : undefined,\n      byAmountIn,\n      isExceed: preSwapResult!.isExceed,\n      targetSqrtPrice: preSwapResult!.targetSqrtPrice,\n      currentSqrtPrice: preSwapResult!.currentSqrtPrice,\n      coinTypeA: preRouterSwapParams[bestIndex].coinTypeA,\n      coinTypeB: preRouterSwapParams[bestIndex].coinTypeB,\n      coinTypeC: preSwapResult!.stepNum! > 1 ? preRouterSwapParams[bestIndex].coinTypeC! : undefined,\n      createTxParams: swapWithRouterParams,\n    }\n    return result\n  }\n\n  async priceUseV1(\n    from: string,\n    to: string,\n    _amount: BN,\n    byAmountIn: boolean,\n    priceSlippagePoint: number,\n    partner: string,\n    swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n  ) {\n    if (swapWithMultiPoolParams != null) {\n      const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n      const onePath: OnePath = {\n        amountIn: new BN(preSwapResult!.estimatedAmountIn),\n        amountOut: new BN(preSwapResult!.estimatedAmountOut),\n        poolAddress: [preSwapResult!.poolAddress],\n        a2b: [preSwapResult!.aToB],\n        rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n        isExceed: preSwapResult!.isExceed,\n        coinType: [from, to],\n      }\n\n      const swapWithRouterParams = {\n        paths: [onePath],\n        partner,\n        priceSlippagePoint,\n      }\n\n      const result: PriceResult = {\n        amountIn: new BN(preSwapResult!.estimatedAmountIn),\n        amountOut: new BN(preSwapResult!.estimatedAmountOut),\n        paths: [onePath],\n        a2b: preSwapResult!.aToB,\n        b2c: undefined,\n        byAmountIn,\n        isExceed: preSwapResult!.isExceed,\n        targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n        currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n        coinTypeA: from,\n        coinTypeB: to,\n        coinTypeC: undefined,\n        createTxParams: swapWithRouterParams,\n      }\n      return result\n    }\n    throw new ClmmpoolsError('No parameters available for service downgrade', RouterErrorCode.NoDowngradeNeedParams)\n  }\n\n  async preRouterSwapA2B2C(params: PreRouterSwapParams[]) {\n    if (params.length === 0) {\n      return null\n    }\n\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n    const tx = new Transaction()\n    for (const param of params) {\n      if (param.stepNums > 1) {\n        const args = [\n          tx.object(param.poolAB),\n          tx.object(param.poolBC!),\n          tx.pure.bool(param.a2b),\n          tx.pure.bool(param.b2c!),\n          tx.pure.bool(param.byAmountIn),\n          tx.pure.u64(param.amount.toString()),\n        ]\n        const typeArguments = []\n        if (param.a2b) {\n          typeArguments.push(param.coinTypeA, param.coinTypeB)\n        } else {\n          typeArguments.push(param.coinTypeB, param.coinTypeA)\n        }\n\n        if (param.b2c) {\n          typeArguments.push(param.coinTypeB, param.coinTypeC!)\n        } else {\n          typeArguments.push(param.coinTypeC!, param.coinTypeB)\n        }\n\n        tx.moveCall({\n          target: `${integrate.published_at}::${ClmmIntegrateRouterModule}::calculate_router_swap_result`,\n          typeArguments,\n          arguments: args,\n        })\n      } else {\n        const args = [\n          tx.object(param.poolAB),\n          tx.pure.bool(param.a2b),\n          tx.pure.bool(param.byAmountIn),\n          tx.pure.u64(param.amount.toString()),\n        ]\n        const typeArguments = param.a2b ? [param.coinTypeA, param.coinTypeB] : [param.coinTypeB, param.coinTypeA]\n        tx.moveCall({\n          target: `${integrate.published_at}::${ClmmExpectSwapModule}::get_expect_swap_result`,\n          arguments: args,\n          typeArguments,\n        })\n      }\n    }\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n    }\n    const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return (\n        extractStructTagFromType(item.type).name === `CalculatedRouterSwapResultEvent` ||\n        extractStructTagFromType(item.type).name === `ExpectSwapResultEvent`\n      )\n    })\n    if (valueData.length === 0) {\n      return null\n    }\n\n    let tempMaxAmount = params[0].byAmountIn ? ZERO : U64_MAX\n    let tempIndex = 0\n\n    for (let i = 0; i < valueData.length; i += 1) {\n      if (valueData[i].parsedJson.data.is_exceed) {\n        continue\n      }\n\n      if (params[0].byAmountIn) {\n        const amount = new BN(valueData[i].parsedJson.data.amount_out)\n        if (amount.gt(tempMaxAmount)) {\n          tempIndex = i\n          tempMaxAmount = amount\n        }\n      } else {\n        const amount =\n          params[i].stepNums > 1\n            ? new BN(valueData[i].parsedJson.data.amount_in)\n            : new BN(valueData[i].parsedJson.data.amount_in).add(new BN(valueData[i].parsedJson.data.fee_amount))\n        if (amount.lt(tempMaxAmount)) {\n          tempIndex = i\n          tempMaxAmount = amount\n        }\n      }\n    }\n\n    const currentSqrtPrice = []\n    const targetSqrtPrice = []\n    if (params[tempIndex].stepNums > 1) {\n      targetSqrtPrice.push(\n        valueData[tempIndex].parsedJson.data.target_sqrt_price_ab,\n        valueData[tempIndex].parsedJson.data.target_sqrt_price_cd\n      )\n      currentSqrtPrice.push(\n        valueData[tempIndex].parsedJson.data.current_sqrt_price_ab,\n        valueData[tempIndex].parsedJson.data.current_sqrt_price_cd\n      )\n    } else {\n      targetSqrtPrice.push(valueData[tempIndex].parsedJson.data.after_sqrt_price)\n      currentSqrtPrice.push(valueData[tempIndex].parsedJson.current_sqrt_price)\n    }\n\n    const result: PreSwapResult = {\n      index: tempIndex,\n      amountIn: params[0].byAmountIn ? params[tempIndex].amount : tempMaxAmount,\n      amountMedium: valueData[tempIndex].parsedJson.data.amount_medium,\n      amountOut: params[0].byAmountIn ? tempMaxAmount : params[tempIndex].amount,\n      targetSqrtPrice,\n      currentSqrtPrice,\n      isExceed: valueData[tempIndex].parsedJson.data.is_exceed,\n      stepNum: params[tempIndex].stepNums,\n    }\n    return result\n  }\n\n  async getPoolWithTVL(): Promise<PoolWithTvl[]> {\n    const result: PoolWithTvl[] = []\n\n    const { swapCountUrl } = this._sdk.sdkOptions\n    if (!swapCountUrl) {\n      return result\n    }\n\n    let response\n    try {\n      response = await fetch(swapCountUrl)\n    } catch (e) {\n      throw new ClmmpoolsError(`Failed to get pool list with liquidity from ${swapCountUrl}.`, RouterErrorCode.InvalidSwapCountUrl)\n    }\n\n    let json\n    try {\n      json = await response.json()\n    } catch (e) {\n      throw new ClmmpoolsError(`Failed tp [arse response from ${swapCountUrl}].`, RouterErrorCode.InvalidSwapCountUrl)\n    }\n\n    if (json.code !== 200) {\n      throw new ClmmpoolsError(\n        `Failed to get pool list from ${swapCountUrl}. Statu code is ${json.code}.`,\n        RouterErrorCode.InvalidSwapCountUrl\n      )\n    }\n\n    const { pools } = json.data\n\n    for (const pool of pools) {\n      result.push({\n        poolAddress: pool.swap_account,\n        tvl: Number(pool.tvl_in_usd),\n      })\n    }\n\n    return result\n  }\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport {\n  CalculateRatesParams,\n  CalculateRatesResult,\n  Pool,\n  PreSwapParams,\n  PreSwapWithMultiPoolParams,\n  SwapParams,\n  TransPreSwapWithMultiPoolParams,\n} from '../types'\nimport { Percentage, U64_MAX, ZERO } from '../math'\nimport { findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport { extractStructTagFromType } from '../utils/contracts'\nimport { ClmmFetcherModule } from '../types/sui'\nimport { TickData, transClmmpoolDataWithoutTicks } from '../types/clmmpool'\nimport { CetusClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { SwapUtils } from '../math/swap'\nimport { computeSwap } from '../math/clmm'\nimport { TickMath } from '../math/tick'\nimport { checkInvalidSuiAddress, d } from '../utils'\nimport { SplitPath } from './routerModuleV2'\nimport { ClmmpoolsError, ConfigErrorCode, SwapErrorCode, UtilsErrorCode } from '../errors/errors'\n\nexport const AMM_SWAP_MODULE = 'amm_swap'\nexport const POOL_STRUCT = 'Pool'\n\n/**\n * Helper class to help interact with clmm pool swap with a swap router interface.\n */\nexport class SwapModule implements IModule {\n  protected _sdk: CetusClmmSDK\n\n  constructor(sdk: CetusClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  calculateSwapFee(paths: SplitPath[]) {\n    let fee = d(0)\n    paths.forEach((item) => {\n      const pathCount = item.basePaths.length\n      if (pathCount > 0) {\n        const path = item.basePaths[0]\n        const feeRate = path.label === 'Cetus' ? new Decimal(path.feeRate).div(10 ** 6) : new Decimal(path.feeRate).div(10 ** 9)\n        const feeAmount = d(path.inputAmount)\n          .div(10 ** path.fromDecimal)\n          .mul(feeRate)\n        fee = fee.add(feeAmount)\n        if (pathCount > 1) {\n          const path2 = item.basePaths[1]\n          const price1 = path.direction ? path.currentPrice : new Decimal(1).div(path.currentPrice)\n          const price2 = path2.direction ? path2.currentPrice : new Decimal(1).div(path2.currentPrice)\n          const feeRate2 = path2.label === 'Cetus' ? new Decimal(path2.feeRate).div(10 ** 6) : new Decimal(path2.feeRate).div(10 ** 9)\n\n          const feeAmount2 = d(path2.outputAmount)\n            .div(10 ** path2.toDecimal)\n            .mul(feeRate2)\n          const fee2 = feeAmount2.div(price1.mul(price2))\n          fee = fee.add(fee2)\n        }\n      }\n    })\n\n    return fee.toString()\n  }\n\n  calculateSwapPriceImpact(paths: SplitPath[]) {\n    let impactValue = d(0)\n    paths.forEach((item) => {\n      const pathCount = item.basePaths.length\n      if (pathCount === 1) {\n        const path = item.basePaths[0]\n        const outputAmount = d(path.outputAmount).div(10 ** path.toDecimal)\n        const inputAmount = d(path.inputAmount).div(10 ** path.fromDecimal)\n        const rate = outputAmount.div(inputAmount)\n        const cprice = path.direction ? new Decimal(path.currentPrice) : new Decimal(1).div(path.currentPrice)\n        impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n      }\n      if (pathCount === 2) {\n        const path = item.basePaths[0]\n        const path2 = item.basePaths[1]\n        const cprice1 = path.direction ? new Decimal(path.currentPrice) : new Decimal(1).div(path.currentPrice)\n        const cprice2 = path2.direction ? new Decimal(path2.currentPrice) : new Decimal(1).div(path2.currentPrice)\n        const cprice = cprice1.mul(cprice2)\n        const outputAmount = new Decimal(path2.outputAmount).div(10 ** path2.toDecimal)\n        const inputAmount = new Decimal(path.inputAmount).div(10 ** path.fromDecimal)\n        const rate = outputAmount.div(inputAmount)\n        impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n      }\n    })\n\n    return impactValue.toString()\n  }\n\n  private calculateSingleImpact = (rate: Decimal, cprice: Decimal) => {\n    // ((cprice - rate)/cprice)*100\n    return cprice.minus(rate).div(cprice).mul(100)\n  }\n\n  /**\n   * Performs a pre-swap with multiple pools.\n   *\n   * @param {PreSwapWithMultiPoolParams} params The parameters for the pre-swap.\n   * @returns {Promise<SwapWithMultiPoolData>} A promise that resolves to the swap data.\n   */\n  async preSwapWithMultiPool(params: PreSwapWithMultiPoolParams) {\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n    const tx = new Transaction()\n\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    for (let i = 0; i < params.poolAddresses.length; i += 1) {\n      const args = [\n        tx.object(params.poolAddresses[i]),\n        tx.pure.bool(params.a2b),\n        tx.pure.bool(params.byAmountIn),\n        tx.pure.u64(params.amount),\n      ]\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n        arguments: args,\n        typeArguments,\n      })\n    }\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n    }\n    const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n    if (simulateRes.error != null) {\n      throw new ClmmpoolsError(\n        `pre swap with multi pools error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n        ConfigErrorCode.InvalidConfig\n      )\n    }\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n    })\n    if (valueData.length === 0) {\n      return null\n    }\n\n    if (valueData.length !== params.poolAddresses.length) {\n      throw new ClmmpoolsError('valueData.length !== params.pools.length', SwapErrorCode.ParamsLengthNotEqual)\n    }\n\n    let tempMaxAmount = params.byAmountIn ? ZERO : U64_MAX\n    let tempIndex = 0\n    for (let i = 0; i < valueData.length; i += 1) {\n      if (valueData[i].parsedJson.data.is_exceed) {\n        continue\n      }\n\n      if (params.byAmountIn) {\n        const amount = new BN(valueData[i].parsedJson.data.amount_out)\n        if (amount.gt(tempMaxAmount)) {\n          tempIndex = i\n          tempMaxAmount = amount\n        }\n      } else {\n        const amount = new BN(valueData[i].parsedJson.data.amount_out)\n        if (amount.lt(tempMaxAmount)) {\n          tempIndex = i\n          tempMaxAmount = amount\n        }\n      }\n    }\n\n    return this.transformSwapWithMultiPoolData(\n      {\n        poolAddress: params.poolAddresses[tempIndex],\n        a2b: params.a2b,\n        byAmountIn: params.byAmountIn,\n        amount: params.amount,\n        coinTypeA: params.coinTypeA,\n        coinTypeB: params.coinTypeB,\n      },\n      valueData[tempIndex].parsedJson\n    )\n  }\n\n  /**\n   * Performs a pre-swap.\n   *\n   * @param {PreSwapParams} params The parameters for the pre-swap.\n   * @returns {Promise<PreSwapParams>} A promise that resolves to the swap data.\n   */\n  async preswap(params: PreSwapParams) {\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n    const tx = new Transaction()\n\n    const typeArguments = [params.coinTypeA, params.coinTypeB]\n    const args = [tx.object(params.pool.poolAddress), tx.pure.bool(params.a2b), tx.pure.bool(params.byAmountIn), tx.pure.u64(params.amount)]\n\n    tx.moveCall({\n      target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n      arguments: args,\n      typeArguments,\n    })\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n    }\n    const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: tx,\n      sender: simulationAccount.address,\n    })\n    if (simulateRes.error != null) {\n      throw new ClmmpoolsError(\n        `preswap error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n        ConfigErrorCode.InvalidConfig\n      )\n    }\n\n    const valueData: any = simulateRes.events?.filter((item: any) => {\n      return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n    })\n    if (valueData.length === 0) {\n      return null\n    }\n    return this.transformSwapData(params, valueData[0].parsedJson.data)\n  }\n\n  private transformSwapData(params: PreSwapParams, data: any) {\n    const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n    return {\n      poolAddress: params.pool.poolAddress,\n      currentSqrtPrice: params.currentSqrtPrice,\n      estimatedAmountIn,\n      estimatedAmountOut: data.amount_out,\n      estimatedEndSqrtPrice: data.after_sqrt_price,\n      estimatedFeeAmount: data.fee_amount,\n      isExceed: data.is_exceed,\n      amount: params.amount,\n      aToB: params.a2b,\n      byAmountIn: params.byAmountIn,\n    }\n  }\n\n  private transformSwapWithMultiPoolData(params: TransPreSwapWithMultiPoolParams, jsonData: any) {\n    const { data } = jsonData\n\n    console.log('json data. ', data)\n\n    const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n    return {\n      poolAddress: params.poolAddress,\n      estimatedAmountIn,\n      estimatedAmountOut: data.amount_out,\n      estimatedEndSqrtPrice: data.after_sqrt_price,\n      estimatedStartSqrtPrice: data.step_results[0].current_sqrt_price,\n      estimatedFeeAmount: data.fee_amount,\n      isExceed: data.is_exceed,\n      amount: params.amount,\n      aToB: params.a2b,\n      byAmountIn: params.byAmountIn,\n    }\n  }\n\n  /**\n   * Calculates the rates for a swap.\n   * @param {CalculateRatesParams} params The parameters for the calculation.\n   * @returns {CalculateRatesResult} The results of the calculation.\n   */\n  calculateRates(params: CalculateRatesParams): CalculateRatesResult {\n    const { currentPool } = params\n    const poolData = transClmmpoolDataWithoutTicks(currentPool)\n\n    let ticks\n    if (params.a2b) {\n      ticks = params.swapTicks.sort((a, b) => {\n        return b.index - a.index\n      })\n    } else {\n      ticks = params.swapTicks.sort((a, b) => {\n        return a.index - b.index\n      })\n    }\n\n    const swapResult = computeSwap(params.a2b, params.byAmountIn, params.amount, poolData, ticks)\n\n    let isExceed = false\n    if (params.byAmountIn) {\n      isExceed = swapResult.amountIn.lt(params.amount)\n    } else {\n      isExceed = swapResult.amountOut.lt(params.amount)\n    }\n    const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n    if (params.a2b && swapResult.nextSqrtPrice.lt(sqrtPriceLimit)) {\n      isExceed = true\n    }\n\n    if (!params.a2b && swapResult.nextSqrtPrice.gt(sqrtPriceLimit)) {\n      isExceed = true\n    }\n\n    let extraComputeLimit = 0\n    if (swapResult.crossTickNum > 6 && swapResult.crossTickNum < 40) {\n      extraComputeLimit = 22000 * (swapResult.crossTickNum - 6)\n    }\n\n    if (swapResult.crossTickNum > 40) {\n      isExceed = true\n    }\n\n    const prePrice = TickMath.sqrtPriceX64ToPrice(poolData.currentSqrtPrice, params.decimalsA, params.decimalsB).toNumber()\n    const afterPrice = TickMath.sqrtPriceX64ToPrice(swapResult.nextSqrtPrice, params.decimalsA, params.decimalsB).toNumber()\n\n    const priceImpactPct = (Math.abs(prePrice - afterPrice) / prePrice) * 100\n\n    return {\n      estimatedAmountIn: swapResult.amountIn,\n      estimatedAmountOut: swapResult.amountOut,\n      estimatedEndSqrtPrice: swapResult.nextSqrtPrice,\n      estimatedFeeAmount: swapResult.feeAmount,\n      isExceed,\n      extraComputeLimit,\n      amount: params.amount,\n      aToB: params.a2b,\n      byAmountIn: params.byAmountIn,\n      priceImpactPct,\n    }\n  }\n\n  /**\n   * create swap transaction payload\n   * @param params\n   * @param gasEstimateArg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n   * If this parameter is not passed, gas estimation is not performed\n   * @returns\n   */\n  async createSwapTransactionPayload(\n    params: SwapParams,\n    gasEstimateArg?: {\n      byAmountIn: boolean\n      slippage: Percentage\n      decimalsA: number\n      decimalsB: number\n      swapTicks: Array<TickData>\n      currentPool: Pool\n    }\n  ): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const allCoinAsset = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n\n    if (gasEstimateArg) {\n      const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n\n      if ((params.a2b && isAdjustCoinA) || (!params.a2b && isAdjustCoinB)) {\n        const tx = await TransactionUtil.buildSwapTransactionForGas(this._sdk, params, allCoinAsset, gasEstimateArg)\n        return tx\n      }\n    }\n\n    return TransactionUtil.buildSwapTransaction(this.sdk, params, allCoinAsset)\n  }\n\n  /**\n   * create swap transaction without transfer coins payload\n   * @param params\n   * @param gasEstimateArg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n   * If this parameter is not passed, gas estimation is not performed\n   * @returns tx and coin ABs\n   */\n  async createSwapTransactionWithoutTransferCoinsPayload(\n    params: SwapParams,\n    gasEstimateArg?: {\n      byAmountIn: boolean\n      slippage: Percentage\n      decimalsA: number\n      decimalsB: number\n      swapTicks: Array<TickData>\n      currentPool: Pool\n    }\n  ): Promise<{ tx: Transaction; coinABs: TransactionObjectArgument[] }> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: cetus clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n    const allCoinAsset = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n\n    if (gasEstimateArg) {\n      const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n\n      if ((params.a2b && isAdjustCoinA) || (!params.a2b && isAdjustCoinB)) {\n        const res = await TransactionUtil.buildSwapTransactionWithoutTransferCoinsForGas(this._sdk, params, allCoinAsset, gasEstimateArg)\n        return res\n      }\n    }\n\n    return TransactionUtil.buildSwapTransactionWithoutTransferCoins(this.sdk, params, allCoinAsset)\n  }\n}\n","import { Base64 } from 'js-base64'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { getPackagerConfigs, PoolInfo, TokenConfigEvent, TokenInfo } from '../types'\nimport { SuiResource, SuiAddressType } from '../types/sui'\nimport { CachedContent, cacheTime24h, cacheTime5min, getFutureTime } from '../utils/cachedContent'\nimport { extractStructTagFromType, normalizeCoinType } from '../utils/contracts'\nimport { CetusClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport { checkInvalidSuiAddress } from '../utils'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\n\n/**\n * Helper class to help interact with pool and token config\n * @deprecated TokenModule is no longer maintained. Please use ConfigModule instead\n */\nexport class TokenModule implements IModule {\n  protected _sdk: CetusClmmSDK\n\n  private readonly _cache: Record<string, CachedContent> = {}\n\n  constructor(sdk: CetusClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Get all registered token list.\n   * @param forceRefresh\n   * @returns\n   */\n  async getAllRegisteredTokenList(forceRefresh = false): Promise<TokenInfo[]> {\n    const list = await this.factchTokenList('', forceRefresh)\n    return list\n  }\n\n  /**\n   * Get token list by owner address.\n   * @param listOwnerAddr\n   * @param forceRefresh\n   * @returns\n   */\n  async getOwnerTokenList(listOwnerAddr = '', forceRefresh = false): Promise<TokenInfo[]> {\n    const list = await this.factchTokenList(listOwnerAddr, forceRefresh)\n    return list\n  }\n\n  /**\n   * Get all registered pool list\n   * @param forceRefresh\n   * @returns\n   */\n  async getAllRegisteredPoolList(forceRefresh = false): Promise<PoolInfo[]> {\n    const list = await this.factchPoolList('', forceRefresh)\n    return list\n  }\n\n  /**\n   * Get pool list by owner address.\n   * @param listOwnerAddr\n   * @param forceRefresh\n   * @returns\n   */\n  async getOwnerPoolList(listOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n    const list = await this.factchPoolList(listOwnerAddr, forceRefresh)\n    return list\n  }\n\n  /**\n   * Get warp pool list.\n   * @param forceRefresh\n   * @returns\n   */\n  async getWarpPoolList(forceRefresh = false): Promise<PoolInfo[]> {\n    const list = await this.factchWarpPoolList('', '', forceRefresh)\n    return list\n  }\n\n  /**\n   * Get warp pool list by pool owner address and coin owner address.\n   * @param poolOwnerAddr\n   * @param coinOwnerAddr\n   * @param forceRefresh\n   * @returns\n   */\n  async getOwnerWarpPoolList(poolOwnerAddr = '', coinOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n    const list = await this.factchWarpPoolList(poolOwnerAddr, coinOwnerAddr, forceRefresh)\n    return list\n  }\n\n  /**\n   * Get token list by coin types.\n   * @param coinTypes\n   * @returns\n   */\n  async getTokenListByCoinTypes(coinTypes: SuiAddressType[]): Promise<Record<string, TokenInfo>> {\n    const tokenMap: Record<string, TokenInfo> = {}\n    const cacheKey = `getAllRegisteredTokenList`\n    const cacheData = this.getCache<TokenInfo[]>(cacheKey)\n\n    if (cacheData !== undefined) {\n      const tokenList = cacheData\n      for (const coinType of coinTypes) {\n        for (const token of tokenList) {\n          if (normalizeCoinType(coinType) === normalizeCoinType(token.address)) {\n            tokenMap[coinType] = token\n            continue\n          }\n        }\n      }\n    }\n\n    const unFindArray = coinTypes.filter((coinType: string) => {\n      return tokenMap[coinType] === undefined\n    })\n\n    for (const coinType of unFindArray) {\n      const metadataKey = `${coinType}_metadata`\n      const metadata = this.getCache<TokenInfo>(metadataKey)\n      if (metadata !== undefined) {\n        tokenMap[coinType] = metadata as TokenInfo\n      } else {\n        const data = await this._sdk.fullClient.getCoinMetadata({\n          coinType,\n        })\n        if (data) {\n          const token = {\n            id: data.id,\n            name: data.name,\n            symbol: data.symbol,\n            official_symbol: data.symbol,\n            coingecko_id: '',\n            decimals: data.decimals,\n            project_url: '',\n            logo_url: data.iconUrl as string,\n            address: coinType,\n          }\n          tokenMap[coinType] = token\n\n          this.updateCache(metadataKey, token, cacheTime24h)\n        }\n      }\n    }\n\n    return tokenMap\n  }\n\n  private async factchTokenList(listOwnerAddr = '', forceRefresh = false): Promise<TokenInfo[]> {\n    const { simulationAccount, token } = this.sdk.sdkOptions\n\n    const cacheKey = `getAllRegisteredTokenList`\n    const cacheData = this.getCache<TokenInfo[]>(cacheKey, forceRefresh)\n\n    if (cacheData !== undefined) {\n      return cacheData\n    }\n\n    const isOwnerRequest = listOwnerAddr.length > 0\n    const limit = 512\n    let index = 0\n    let allTokenList: TokenInfo[] = []\n\n    if (token === undefined) {\n      throw Error('please config token ofsdkOptions')\n    }\n    const tokenConfig = getPackagerConfigs(token)\n    while (true) {\n      const tx = new Transaction()\n      tx.moveCall({\n        target: `${token.published_at}::coin_list::${\n          isOwnerRequest ? 'fetch_full_list_with_limit' : 'fetch_all_registered_coin_info_with_limit'\n        }`,\n        arguments: isOwnerRequest\n          ? [tx.pure.address(tokenConfig.coin_registry_id), tx.pure.address(listOwnerAddr), tx.pure.u64(index), tx.pure.u64(limit)]\n          : [tx.pure.address(tokenConfig.coin_registry_id), tx.pure.u64(index), tx.pure.u64(limit)],\n      })\n\n      const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n        transactionBlock: tx,\n        sender: simulationAccount.address,\n      })\n\n      const tokenList: TokenInfo[] = []\n\n      simulateRes.events?.forEach((item: any) => {\n        const formatType = extractStructTagFromType(item.type)\n        if (formatType.full_address === `${token.published_at}::coin_list::FetchCoinListEvent`) {\n          item.parsedJson.full_list.value_list.forEach((item: any) => {\n            tokenList.push(this.transformData(item, false))\n          })\n        }\n      })\n      allTokenList = [...allTokenList, ...tokenList]\n      if (tokenList.length < limit) {\n        break\n      } else {\n        index = allTokenList.length\n      }\n    }\n\n    return allTokenList\n  }\n\n  private async factchPoolList(listOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n    const { simulationAccount, token } = this.sdk.sdkOptions\n    const cacheKey = `getAllRegisteredPoolList`\n    const cacheData = this.getCache<PoolInfo[]>(cacheKey, forceRefresh)\n\n    if (cacheData !== undefined) {\n      return cacheData\n    }\n    let allPoolList: PoolInfo[] = []\n    const limit = 512\n    let index = 0\n    const isOwnerRequest = listOwnerAddr.length > 0\n\n    if (token === undefined) {\n      throw Error('please config token ofsdkOptions')\n    }\n    const tokenConfig = getPackagerConfigs(token)\n    while (true) {\n      const tx = new Transaction()\n      tx.moveCall({\n        target: `${token.published_at}::lp_list::${\n          isOwnerRequest ? 'fetch_full_list_with_limit' : 'fetch_all_registered_coin_info_with_limit'\n        }`,\n        arguments: isOwnerRequest\n          ? [tx.pure.address(tokenConfig.pool_registry_id), tx.pure.address(listOwnerAddr), tx.pure.u64(index), tx.pure.u64(limit)]\n          : [tx.pure.address(tokenConfig.pool_registry_id), tx.pure.u64(index), tx.pure.u64(limit)],\n      })\n\n      if (!checkInvalidSuiAddress(simulationAccount.address)) {\n        throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n      }\n      const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n        transactionBlock: tx,\n        sender: simulationAccount.address,\n      })\n\n      const poolList: PoolInfo[] = []\n      simulateRes.events?.forEach((item: any) => {\n        const formatType = extractStructTagFromType(item.type)\n        if (formatType.full_address === `${token.published_at}::lp_list::FetchPoolListEvent`) {\n          item.parsedJson.full_list.value_list.forEach((item: any) => {\n            poolList.push(this.transformData(item, true))\n          })\n        }\n      })\n\n      allPoolList = [...allPoolList, ...poolList]\n      if (poolList.length < limit) {\n        break\n      } else {\n        index = allPoolList.length\n      }\n    }\n\n    return allPoolList\n  }\n\n  private async factchWarpPoolList(poolOwnerAddr = '', coinOwnerAddr = '', forceRefresh = false): Promise<any[]> {\n    const poolList = await this.factchPoolList(poolOwnerAddr, forceRefresh)\n    if (poolList.length === 0) {\n      return []\n    }\n    const tokenList = await this.factchTokenList(coinOwnerAddr, forceRefresh)\n\n    const lpPoolArray: any[] = []\n    for (const pool of poolList) {\n      for (const token of tokenList) {\n        if (token.address === pool.coin_a_address) {\n          pool.coinA = token\n        }\n        if (token.address === pool.coin_b_address) {\n          pool.coinB = token\n        }\n        continue\n      }\n      lpPoolArray.push(pool)\n    }\n    return lpPoolArray\n  }\n\n  /**\n   * Get the token config event.\n   *\n   * @param forceRefresh Whether to force a refresh of the event.\n   * @returns The token config event.\n   */\n  async getTokenConfigEvent(forceRefresh = false): Promise<TokenConfigEvent> {\n    const packageObjectId = this._sdk.sdkOptions.token!.package_id\n    const cacheKey = `${packageObjectId}_getTokenConfigEvent`\n\n    const cacheData = this.getCache<TokenConfigEvent>(cacheKey, forceRefresh)\n\n    if (cacheData !== undefined) {\n      return cacheData\n    }\n\n    const packageObject = await this._sdk.fullClient.getObject({\n      id: packageObjectId,\n      options: {\n        showPreviousTransaction: true,\n      },\n    })\n\n    const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n    const objects = await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })\n    const tokenConfigEvent: TokenConfigEvent = {\n      coin_registry_id: '',\n      pool_registry_id: '',\n      coin_list_owner: '',\n      pool_list_owner: '',\n    }\n\n    if (objects.data.length > 0) {\n      objects.data.forEach((item: any) => {\n        const formatType = extractStructTagFromType(item.type)\n        if (item.transactionModule === 'coin_list') {\n          switch (formatType.name) {\n            case `InitListEvent`:\n              tokenConfigEvent.coin_list_owner = item.parsedJson.list_id\n              break\n            case `InitRegistryEvent`:\n              tokenConfigEvent.coin_registry_id = item.parsedJson.registry_id\n              break\n            default:\n              break\n          }\n        } else if (item.transactionModule === 'lp_list') {\n          switch (formatType.name) {\n            case `InitListEvent<address>`:\n              tokenConfigEvent.pool_list_owner = item.parsedJson.list_id\n              break\n            case `InitRegistryEvent<address>`:\n              tokenConfigEvent.pool_registry_id = item.parsedJson.registry_id\n              break\n            default:\n              break\n          }\n        }\n      })\n    }\n    if (tokenConfigEvent.coin_registry_id.length > 0) {\n      this.updateCache(cacheKey, tokenConfigEvent, cacheTime24h)\n    }\n    return tokenConfigEvent\n  }\n\n  private transformData(item: any, isPoolData: boolean): any {\n    const token = { ...item }\n    if (isPoolData) {\n      try {\n        token.coin_a_address = extractStructTagFromType(token.coin_a_address).full_address\n        token.coin_b_address = extractStructTagFromType(token.coin_b_address).full_address\n      } catch (error) {\n        //\n      }\n    } else {\n      token.address = extractStructTagFromType(token.address).full_address\n    }\n    if (item.extensions) {\n      const extensionsDataArray = item.extensions.contents\n\n      for (const item of extensionsDataArray) {\n        const { key } = item\n        let { value } = item\n        if (key === 'labels') {\n          try {\n            value = JSON.parse(decodeURIComponent(Base64.decode(value)))\n          } catch (error) {}\n        }\n        if (key === 'pyth_id') {\n          value = normalizeSuiObjectId(value)\n        }\n        token[key] = value\n      }\n      delete token.extensions\n    }\n    return token\n  }\n\n  /**\n   * Updates the cache for the given key.\n   *\n   * @param key The key of the cache entry to update.\n   * @param data The data to store in the cache.\n   * @param time The time in minutes after which the cache entry should expire.\n   */\n  updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n    let cacheData = this._cache[key]\n    if (cacheData) {\n      cacheData.overdueTime = getFutureTime(time)\n      cacheData.value = data\n    } else {\n      cacheData = new CachedContent(data, getFutureTime(time))\n    }\n    this._cache[key] = cacheData\n  }\n\n  /**\n   * Gets the cache entry for the given key.\n   *\n   * @param key The key of the cache entry to get.\n   * @param forceRefresh Whether to force a refresh of the cache entry.\n   * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n   */\n  getCache<T>(key: string, forceRefresh = false): T | undefined {\n    const cacheData = this._cache[key]\n    const isValid = cacheData?.isValid()\n    if (!forceRefresh && isValid) {\n      return cacheData.value as T\n    }\n    if (!isValid) {\n      delete this._cache[key]\n    }\n    return undefined\n  }\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { v4 as uuidv4 } from 'uuid'\nimport { CetusClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { PreSwapLpChangeParams, PreSwapWithMultiPoolParams } from '../types'\nimport { TickMath, ZERO } from '../math'\nimport axios, { AxiosRequestConfig } from 'axios'\nimport { ClmmpoolsError, MathErrorCode, RouterErrorCode } from '../errors/errors'\n\nexport type BasePath = {\n  direction: boolean\n  label: string\n  poolAddress: string\n  fromCoin: string\n  toCoin: string\n  feeRate: number\n  outputAmount: number\n  inputAmount: number\n  currentSqrtPrice: BN\n  fromDecimal: number\n  toDecimal: number\n  currentPrice: Decimal\n}\n\nexport type SplitPath = {\n  percent: number\n  inputAmount: number\n  outputAmount: number\n  pathIndex: number\n  lastQuoteOutput: number\n  basePaths: BasePath[]\n}\n\nexport type AggregatorResult = {\n  isExceed: boolean\n  isTimeout: boolean\n  inputAmount: number\n  outputAmount: number\n  fromCoin: string\n  toCoin: string\n  byAmountIn: boolean\n  splitPaths: SplitPath[]\n}\n\nexport class RouterModuleV2 implements IModule {\n  protected _sdk: CetusClmmSDK\n\n  constructor(sdk: CetusClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  private calculatePrice(currentSqrtPrice: BN, fromDecimals: number, toDecimals: number, a2b: boolean, label: string): Decimal {\n    const decimalA = a2b ? fromDecimals : toDecimals\n    const decimalB = a2b ? toDecimals : fromDecimals\n    if (label === 'Cetus') {\n      return TickMath.sqrtPriceX64ToPrice(currentSqrtPrice, decimalA, decimalB)\n    }\n\n    return new Decimal(currentSqrtPrice.toString()).div(new Decimal(10).pow(new Decimal(decimalB + 9 - decimalA)))\n  }\n\n  private parseJsonResult(data: any): AggregatorResult {\n    const result: AggregatorResult = {\n      isExceed: data.is_exceed,\n      isTimeout: data.is_timeout,\n      inputAmount: data.input_amount,\n      outputAmount: data.output_amount,\n      fromCoin: data.from_coin,\n      toCoin: data.to_coin,\n      byAmountIn: data.by_amount_in,\n      splitPaths: data.split_paths.map((path: any) => {\n        const splitPath: SplitPath = {\n          pathIndex: path.path_index,\n          lastQuoteOutput: path.last_quote_output,\n          percent: path.percent,\n          basePaths: path.best_path.map((basePath: any) => {\n            return {\n              direction: basePath.direction,\n              label: basePath.label,\n              poolAddress: basePath.provider,\n              fromCoin: basePath.from_coin,\n              toCoin: basePath.to_coin,\n              outputAmount: basePath.output_amount,\n              inputAmount: basePath.input_amount,\n              feeRate: basePath.fee_rate,\n              currentSqrtPrice: new BN(basePath.current_sqrt_price.toString()),\n              afterSqrtPrice: basePath.label === 'Cetus' ? new BN(basePath.after_sqrt_price.toString()) : ZERO,\n              fromDecimal: basePath.from_decimal,\n              toDecimal: basePath.to_decimal,\n              currentPrice: this.calculatePrice(\n                new BN(basePath.current_sqrt_price.toString()),\n                basePath.from_decimal,\n                basePath.to_decimal,\n                basePath.direction,\n                basePath.label\n              ),\n            }\n          }),\n          inputAmount: path.input_amount,\n          outputAmount: path.output_amount,\n        }\n        return splitPath\n      }),\n    }\n    return result\n  }\n\n  async fetchDataWithAxios(apiUrl: string, _options: AxiosRequestConfig, timeoutDuration: number) {\n    try {\n      const config: AxiosRequestConfig = {\n        ..._options,\n        timeout: timeoutDuration,\n      };\n\n      const response = await axios(apiUrl, config);\n\n      if (response.status === 200) {\n        return this.parseJsonResult(response.data);\n      }\n\n      return null;\n    } catch (error) {\n      console.error(error);\n      return null;\n    }\n  }\n\n  /**\n   * Optimal routing method with fallback functionality.\n   * This method first attempts to find the optimal route using the routing backend. If the optimal route is available, it will return this route.\n   * If the optimal route is not available (for example, due to network issues or API errors), this method will activate a fallback mechanism,\n   * and try to find a suboptimal route using the routing algorithm built into the SDK, which only includes clmm pool. This way, even if the optimal route is not available, this method can still provide a usable route.\n   * This method uses a fallback strategy to ensure that it can provide the best available route when facing problems, rather than failing completely.\n   *\n   * @param {string} from Sold `from` coin\n   * @param {string} from: get `to` coin\n   * @param {number} from: the amount of sold coin\n   * @param {boolena} byAmountIn:\n   */\n  async getBestRouter(\n    from: string,\n    to: string,\n    amount: number,\n    byAmountIn: boolean,\n    priceSplitPoint: number,\n    partner: string,\n    /**\n     * @deprecated don't need to pass, just use empty string.\n     */\n    _senderAddress?: string,\n    swapWithMultiPoolParams?: PreSwapWithMultiPoolParams,\n    orderSplit = false,\n    externalRouter = false,\n    lpChanges: PreSwapLpChangeParams[] = []\n  ) {\n    let result = null\n    let version = 'v2'\n    let options: AxiosRequestConfig = {}\n    let apiUrl = this.sdk.sdkOptions.aggregatorUrl\n    if (lpChanges.length > 0) {\n      const url = new URL(apiUrl)\n      apiUrl = `${url.protocol}//${url.hostname}/router_with_lp_changes`\n      options = {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        data: JSON.stringify({\n          from,\n          to,\n          amount,\n          by_amount_in: byAmountIn,\n          order_split: orderSplit,\n          external_router: externalRouter,\n          sender_address: 'None',\n          request_id: encodeURIComponent(uuidv4()),\n          lp_changes: lpChanges,\n        }),\n      }\n    } else {\n      apiUrl = `\n      ${apiUrl}?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}&amount=${encodeURIComponent(\n        amount\n      )}&by_amount_in=${encodeURIComponent(byAmountIn)}&order_split=${encodeURIComponent(orderSplit)}&external_router=${encodeURIComponent(\n        externalRouter\n      )}&sender_address=''&request_id=${encodeURIComponent(uuidv4())}\n      `\n    }\n\n    result = await this.fetchDataWithAxios(apiUrl, options, 6000)\n\n    if (result == null) {\n      const priceResult: any = await this.sdk.Router.priceUseV1(\n        from,\n        to,\n        new BN(amount),\n        byAmountIn,\n        priceSplitPoint,\n        partner,\n        swapWithMultiPoolParams\n      )\n\n      const splitPaths: SplitPath[] = []\n\n      for (const path of priceResult.paths) {\n        const basePaths: BasePath[] = []\n        if (path.poolAddress.length > 1) {\n          const fromDecimal0 = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n          const toDecimal0 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n          const currentPrice = path.a2b[0]\n            ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal0, toDecimal0)\n            : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal0, fromDecimal0)\n\n          const path0: BasePath = {\n            direction: path.a2b[0],\n            label: 'Cetus',\n            poolAddress: path.poolAddress[0],\n            fromCoin: path.coinType[0],\n            toCoin: path.coinType[1],\n            feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n            outputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n            inputAmount: path.amountIn.toString(),\n            currentSqrtPrice: priceResult.currentSqrtPrice[0],\n            currentPrice,\n            fromDecimal: fromDecimal0,\n            toDecimal: toDecimal0,\n          }\n\n          const fromDecimal1 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n          const toDecimal1 = this.sdk.Router.tokenInfo(path.coinType[2])!.decimals\n          const currentPrice1 = path.a2b[1]\n            ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), fromDecimal1, toDecimal1)\n            : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), toDecimal1, fromDecimal1)\n\n          const path1: BasePath = {\n            direction: path.a2b[1],\n            label: 'Cetus',\n            poolAddress: path.poolAddress[1],\n            fromCoin: path.coinType[1],\n            toCoin: path.coinType[2],\n            feeRate: this.sdk.Router.getFeeRate(path.coinType[1], path.coinType[2], path.poolAddress[1]),\n            outputAmount: path.amountOut.toString(),\n            inputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n            currentSqrtPrice: priceResult.currentSqrtPrice[1],\n            currentPrice: currentPrice1,\n            fromDecimal: fromDecimal1,\n            toDecimal: toDecimal1,\n          }\n\n          basePaths.push(path0, path1)\n        } else {\n          const fromDecimal = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n          const toDecimal = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n          const currentPrice = path.a2b[0]\n            ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal, toDecimal)\n            : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal, fromDecimal)\n\n          const path0: BasePath = {\n            direction: path.a2b[0],\n            label: 'Cetus',\n            poolAddress: path.poolAddress[0],\n            fromCoin: path.coinType[0],\n            toCoin: path.coinType[1],\n            feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n            outputAmount: path.amountOut.toString(),\n            inputAmount: path.amountIn.toString(),\n            currentSqrtPrice: priceResult.currentSqrtPrice[0],\n            currentPrice,\n            fromDecimal,\n            toDecimal,\n          }\n          basePaths.push(path0)\n        }\n        const splitPath: SplitPath = {\n          percent: (Number(path.amountIn) / Number(priceResult.amountIn)) * 100,\n          inputAmount: Number(path.amountIn.toString()),\n          outputAmount: Number(path.amountOut.toString()),\n          pathIndex: 0,\n          lastQuoteOutput: 0,\n          basePaths,\n        }\n        splitPaths.push(splitPath)\n      }\n\n      const aggregatorResult: AggregatorResult = {\n        isExceed: priceResult.isExceed,\n        isTimeout: true,\n        inputAmount: Number(priceResult.amountIn.toString()),\n        outputAmount: Number(priceResult.amountOut.toString()),\n        fromCoin: priceResult.coinTypeA,\n        toCoin: priceResult.coinTypeC != null ? priceResult.coinTypeC : priceResult.coinTypeB,\n        byAmountIn: priceResult.byAmountIn,\n        splitPaths,\n      }\n      version = 'v1'\n      result = aggregatorResult\n    }\n\n    return { result, version }\n  }\n\n  async getBestRouterByServer(\n    from: string,\n    to: string,\n    amount: number,\n    byAmountIn: boolean,\n    /**\n     * @deprecated don't need to pass, just use empty string.\n     */\n    _senderAddress?: string,\n    orderSplit = false,\n    externalRouter = false,\n    lpChanges: PreSwapLpChangeParams[] = []\n  ): Promise<AggregatorResult> {\n    let result = null\n    let options: AxiosRequestConfig = {}\n    let apiUrl = this.sdk.sdkOptions.aggregatorUrl\n    if (lpChanges.length > 0) {\n      const url = new URL(apiUrl)\n      apiUrl = `${url.protocol}//${url.hostname}/router_with_lp_changes`\n      options = {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        data: JSON.stringify({\n          from,\n          to,\n          amount,\n          by_amount_in: byAmountIn,\n          order_split: orderSplit,\n          external_router: externalRouter,\n          sender_address: 'None',\n          request_id: encodeURIComponent(uuidv4()),\n          lp_changes: lpChanges,\n        }),\n      }\n    } else {\n      apiUrl = `\n      ${apiUrl}?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}&amount=${encodeURIComponent(\n        amount\n      )}&by_amount_in=${encodeURIComponent(byAmountIn)}&order_split=${encodeURIComponent(orderSplit)}&external_router=${encodeURIComponent(\n        externalRouter\n      )}&sender_address=''&request_id=${encodeURIComponent(uuidv4())}\n      `\n    }\n\n    result = await this.fetchDataWithAxios(apiUrl, options, 6000)\n\n    if (result == null) {\n      throw new ClmmpoolsError('Invalid server response', RouterErrorCode.InvalidServerResponse)\n    }\n\n    return result\n  }\n\n  async getBestRouterByRpc(\n    from: string,\n    to: string,\n    amount: number,\n    byAmountIn: boolean,\n    priceSplitPoint: number,\n    partner: string,\n    swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n  ): Promise<AggregatorResult> {\n    const priceResult: any = await this.sdk.Router.priceUseV1(\n      from,\n      to,\n      new BN(amount),\n      byAmountIn,\n      priceSplitPoint,\n      partner,\n      swapWithMultiPoolParams\n    )\n\n    const splitPaths: SplitPath[] = []\n\n    for (const path of priceResult.paths) {\n      const basePaths: BasePath[] = []\n      if (path.poolAddress.length > 1) {\n        const fromDecimal0 = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n        const toDecimal0 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n        const currentPrice = path.a2b[0]\n          ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal0, toDecimal0)\n          : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal0, fromDecimal0)\n\n        const path0: BasePath = {\n          direction: path.a2b[0],\n          label: 'Cetus',\n          poolAddress: path.poolAddress[0],\n          fromCoin: path.coinType[0],\n          toCoin: path.coinType[1],\n          feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n          outputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n          inputAmount: path.amountIn.toString(),\n          currentSqrtPrice: priceResult.currentSqrtPrice[0],\n          currentPrice,\n          fromDecimal: fromDecimal0,\n          toDecimal: toDecimal0,\n        }\n\n        const fromDecimal1 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n        const toDecimal1 = this.sdk.Router.tokenInfo(path.coinType[2])!.decimals\n        const currentPrice1 = path.a2b[1]\n          ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), fromDecimal1, toDecimal1)\n          : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), toDecimal1, fromDecimal1)\n\n        const path1: BasePath = {\n          direction: path.a2b[1],\n          label: 'Cetus',\n          poolAddress: path.poolAddress[1],\n          fromCoin: path.coinType[1],\n          toCoin: path.coinType[2],\n          feeRate: this.sdk.Router.getFeeRate(path.coinType[1], path.coinType[2], path.poolAddress[1]),\n          outputAmount: path.amountOut.toString(),\n          inputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n          currentSqrtPrice: priceResult.currentSqrtPrice[1],\n          currentPrice: currentPrice1,\n          fromDecimal: fromDecimal1,\n          toDecimal: toDecimal1,\n        }\n\n        basePaths.push(path0, path1)\n      } else {\n        const fromDecimal = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n        const toDecimal = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n        const currentPrice = path.a2b[0]\n          ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal, toDecimal)\n          : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal, fromDecimal)\n\n        const path0: BasePath = {\n          direction: path.a2b[0],\n          label: 'Cetus',\n          poolAddress: path.poolAddress[0],\n          fromCoin: path.coinType[0],\n          toCoin: path.coinType[1],\n          feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n          outputAmount: path.amountOut.toString(),\n          inputAmount: path.amountIn.toString(),\n          currentSqrtPrice: priceResult.currentSqrtPrice[0],\n          currentPrice,\n          fromDecimal,\n          toDecimal,\n        }\n        basePaths.push(path0)\n      }\n      const splitPath: SplitPath = {\n        percent: (Number(path.amountIn) / Number(priceResult.amountIn)) * 100,\n        inputAmount: Number(path.amountIn.toString()),\n        outputAmount: Number(path.amountOut.toString()),\n        pathIndex: 0,\n        lastQuoteOutput: 0,\n        basePaths,\n      }\n      splitPaths.push(splitPath)\n    }\n\n    const aggregatorResult: AggregatorResult = {\n      isExceed: priceResult.isExceed,\n      isTimeout: true,\n      inputAmount: Number(priceResult.amountIn.toString()),\n      outputAmount: Number(priceResult.amountOut.toString()),\n      fromCoin: priceResult.coinTypeA,\n      toCoin: priceResult.coinTypeC != null ? priceResult.coinTypeC : priceResult.coinTypeB,\n      byAmountIn: priceResult.byAmountIn,\n      splitPaths,\n    }\n\n    return aggregatorResult\n  }\n}\n","import { SuiObjectResponse } from '@mysten/sui/client'\nimport { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { Base64 } from 'js-base64'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\nimport { IModule } from '../interfaces/IModule'\nimport { CetusClmmSDK } from '../sdk'\nimport { CetusConfigs, ClmmPoolConfig, CoinConfig, LaunchpadPoolConfig, getPackagerConfigs } from '../types'\nimport { SuiAddressType, SuiResource } from '../types/sui'\nimport { CachedContent, cacheTime24h, cacheTime5min, getFutureTime } from '../utils/cachedContent'\nimport { extractStructTagFromType, fixCoinType, normalizeCoinType } from '../utils/contracts'\nimport { getObjectFields, getObjectId, getObjectPreviousTransactionDigest, getObjectType } from '../utils/objects'\n\n/**\n * Helper class to help interact with clmm pool and coin and launchpad pool config.\n */\nexport class ConfigModule implements IModule {\n  protected _sdk: CetusClmmSDK\n\n  private readonly _cache: Record<string, CachedContent> = {}\n\n  constructor(sdk: CetusClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Set default token list cache.\n   * @param {CoinConfig[]}coinList\n   */\n  setTokenListCache(coinList: CoinConfig[]) {\n    const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${coin_list_handle}_getCoinConfigs`\n    const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n    const updatedCacheData = cacheData ? [...cacheData, ...coinList] : coinList\n    this.updateCache(cacheKey, updatedCacheData, cacheTime24h)\n  }\n\n  /**\n   * Get token config list by coin type list.\n   * @param {SuiAddressType[]} coinTypes Coin type list.\n   * @returns {Promise<Record<string, CoinConfig>>} Token config map.\n   */\n  async getTokenListByCoinTypes(coinTypes: SuiAddressType[]): Promise<Record<string, CoinConfig>> {\n    const tokenMap: Record<string, CoinConfig> = {}\n    const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${coin_list_handle}_getCoinConfigs`\n    const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n\n    if (cacheData !== undefined) {\n      const tokenList = cacheData\n      for (const coinType of coinTypes) {\n        for (const token of tokenList) {\n          if (normalizeCoinType(coinType) === normalizeCoinType(token.address)) {\n            tokenMap[coinType] = token\n            continue\n          }\n        }\n      }\n    }\n\n    const unFoundArray = coinTypes.filter((coinType: string) => {\n      return tokenMap[coinType] === undefined\n    })\n\n    for (const coinType of unFoundArray) {\n      const metadataKey = `${coinType}_metadata`\n      const metadata = this.getCache<CoinConfig>(metadataKey)\n      if (metadata !== undefined) {\n        tokenMap[coinType] = metadata as CoinConfig\n      } else {\n        const data = await this._sdk.fullClient.getCoinMetadata({\n          coinType,\n        })\n        if (data) {\n          const token: CoinConfig = {\n            id: data.id as string,\n            pyth_id: '',\n            name: data.name,\n            symbol: data.symbol,\n            official_symbol: data.symbol,\n            coingecko_id: '',\n            decimals: data.decimals,\n            project_url: '',\n            logo_url: data.iconUrl as string,\n            address: coinType,\n          }\n          tokenMap[coinType] = token\n\n          this.updateCache(metadataKey, token, cacheTime24h)\n        } else {\n          console.log(`not found ${coinType}`)\n        }\n      }\n    }\n\n    return tokenMap\n  }\n\n  /**\n   * Get coin config list.\n   * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n   * @param {boolean} transformExtensions Whether to transform extensions.\n   * @returns {Promise<CoinConfig[]>} Coin config list.\n   */\n  async getCoinConfigs(forceRefresh = false, transformExtensions = true): Promise<CoinConfig[]> {\n    const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${coin_list_handle}_getCoinConfigs`\n    const cacheData = this.getCache<CoinConfig[]>(cacheKey, forceRefresh)\n    if (cacheData) {\n      return cacheData\n    }\n    const res = await this._sdk.fullClient.getDynamicFieldsByPage(coin_list_handle)\n    const warpIds = res.data.map((item: any) => {\n      return item.objectId\n    })\n    const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n    const coinList: CoinConfig[] = []\n    objects.forEach((object) => {\n      if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n          ConfigErrorCode.InvalidConfig\n        )\n      }\n\n      const coin = this.buildCoinConfig(object, transformExtensions)\n      this.updateCache(`${coin_list_handle}_${coin.address}_getCoinConfig`, coin, cacheTime24h)\n      coinList.push({ ...coin })\n    })\n    this.updateCache(cacheKey, coinList, cacheTime24h)\n    return coinList\n  }\n\n  /**\n   * Get coin config by coin type.\n   * @param {string} coinType Coin type.\n   * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n   * @param {boolean} transformExtensions Whether to transform extensions.\n   * @returns {Promise<CoinConfig>} Coin config.\n   */\n  async getCoinConfig(coinType: string, forceRefresh = false, transformExtensions = true): Promise<CoinConfig> {\n    const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${coin_list_handle}_${coinType}_getCoinConfig`\n    const cacheData = this.getCache<CoinConfig>(cacheKey, forceRefresh)\n    if (cacheData) {\n      return cacheData\n    }\n    const object = await this._sdk.fullClient.getDynamicFieldObject({\n      parentId: coin_list_handle,\n      name: {\n        type: '0x1::type_name::TypeName',\n        value: {\n          name: fixCoinType(coinType),\n        },\n      },\n    })\n\n    if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n      throw new ClmmpoolsError(\n        `when getCoinConfig get object error: ${object.error}, please check the rpc and contracts address config.`,\n        ConfigErrorCode.InvalidConfig\n      )\n    }\n\n    const coin = this.buildCoinConfig(object, transformExtensions)\n    this.updateCache(cacheKey, coin, cacheTime24h)\n    return coin\n  }\n\n  /**\n   * Build coin config.\n   * @param {SuiObjectResponse} object Coin object.\n   * @param {boolean} transformExtensions Whether to transform extensions.\n   * @returns {CoinConfig} Coin config.\n   */\n  private buildCoinConfig(object: SuiObjectResponse, transformExtensions = true) {\n    let fields = getObjectFields(object)\n\n    fields = fields.value.fields\n    const coin: any = { ...fields }\n\n    coin.id = getObjectId(object)\n    coin.address = extractStructTagFromType(fields.coin_type.fields.name).full_address\n    if (fields.pyth_id) {\n      coin.pyth_id = normalizeSuiObjectId(fields.pyth_id)\n    }\n\n    this.transformExtensions(coin, fields.extension_fields.fields.contents, transformExtensions)\n\n    delete coin.coin_type\n    return coin\n  }\n\n  /**\n   * Get clmm pool config list.\n   * @param forceRefresh\n   * @returns\n   */\n  async getClmmPoolConfigs(forceRefresh = false, transformExtensions = true): Promise<ClmmPoolConfig[]> {\n    const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${clmm_pools_handle}_getClmmPoolConfigs`\n    const cacheData = this.getCache<ClmmPoolConfig[]>(cacheKey, forceRefresh)\n    if (cacheData) {\n      return cacheData\n    }\n    const res = await this._sdk.fullClient.getDynamicFieldsByPage(clmm_pools_handle)\n    const warpIds = res.data.map((item: any) => {\n      return item.objectId\n    })\n    const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n    const poolList: ClmmPoolConfig[] = []\n    objects.forEach((object) => {\n      if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `when getClmmPoolsConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n          ConfigErrorCode.InvalidConfig\n        )\n      }\n\n      const pool = this.buildClmmPoolConfig(object, transformExtensions)\n      this.updateCache(`${pool.pool_address}_getClmmPoolConfig`, pool, cacheTime24h)\n      poolList.push({ ...pool })\n    })\n    this.updateCache(cacheKey, poolList, cacheTime24h)\n    return poolList\n  }\n\n  async getClmmPoolConfig(poolAddress: string, forceRefresh = false, transformExtensions = true): Promise<ClmmPoolConfig> {\n    const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${poolAddress}_getClmmPoolConfig`\n    const cacheData = this.getCache<ClmmPoolConfig>(cacheKey, forceRefresh)\n    if (cacheData) {\n      return cacheData\n    }\n    const object = await this._sdk.fullClient.getDynamicFieldObject({\n      parentId: clmm_pools_handle,\n      name: {\n        type: 'address',\n        value: poolAddress,\n      },\n    })\n    const pool = this.buildClmmPoolConfig(object, transformExtensions)\n    this.updateCache(cacheKey, pool, cacheTime24h)\n    return pool\n  }\n\n  private buildClmmPoolConfig(object: SuiObjectResponse, transformExtensions = true) {\n    let fields = getObjectFields(object)\n    fields = fields.value.fields\n    const pool: any = { ...fields }\n\n    pool.id = getObjectId(object)\n    pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n    this.transformExtensions(pool, fields.extension_fields.fields.contents, transformExtensions)\n    return pool\n  }\n\n  /**\n   * Get launchpad pool config list.\n   * @param forceRefresh\n   * @returns\n   */\n  async getLaunchpadPoolConfigs(forceRefresh = false, transformExtensions = true): Promise<LaunchpadPoolConfig[]> {\n    const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${launchpad_pools_handle}_getLaunchpadPoolConfigs`\n    const cacheData = this.getCache<LaunchpadPoolConfig[]>(cacheKey, forceRefresh)\n    if (cacheData) {\n      return cacheData\n    }\n    const res = await this._sdk.fullClient.getDynamicFieldsByPage(launchpad_pools_handle)\n    const warpIds = res.data.map((item: any) => {\n      return item.objectId\n    })\n    const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n    const poolList: LaunchpadPoolConfig[] = []\n    objects.forEach((object) => {\n      if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n          ConfigErrorCode.InvalidConfig\n        )\n      }\n\n      const pool = this.buildLaunchpadPoolConfig(object, transformExtensions)\n      this.updateCache(`${pool.pool_address}_getLaunchpadPoolConfig`, pool, cacheTime24h)\n      poolList.push({ ...pool })\n    })\n    this.updateCache(cacheKey, poolList, cacheTime24h)\n    return poolList\n  }\n\n  async getLaunchpadPoolConfig(poolAddress: string, forceRefresh = false, transformExtensions = true): Promise<LaunchpadPoolConfig> {\n    const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.cetus_config)\n    const cacheKey = `${poolAddress}_getLaunchpadPoolConfig`\n    const cacheData = this.getCache<LaunchpadPoolConfig>(cacheKey, forceRefresh)\n    if (cacheData) {\n      return cacheData\n    }\n    const object = await this._sdk.fullClient.getDynamicFieldObject({\n      parentId: launchpad_pools_handle,\n      name: {\n        type: 'address',\n        value: poolAddress,\n      },\n    })\n    const pool = this.buildLaunchpadPoolConfig(object, transformExtensions)\n    this.updateCache(cacheKey, pool, cacheTime24h)\n    return pool\n  }\n\n  private buildLaunchpadPoolConfig(object: SuiObjectResponse, transformExtensions = true) {\n    let fields = getObjectFields(object)\n    fields = fields.value.fields\n    const pool: any = { ...fields }\n\n    pool.id = getObjectId(object)\n    pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n    this.transformExtensions(pool, fields.extension_fields.fields.contents, transformExtensions)\n    const social_medias: {\n      name: string\n      link: string\n    }[] = []\n    fields.social_media.fields.contents.forEach((item: any) => {\n      social_medias.push({\n        name: item.fields.value.fields.name,\n        link: item.fields.value.fields.link,\n      })\n    })\n    pool.social_media = social_medias\n    try {\n      pool.regulation = decodeURIComponent(Base64.decode(pool.regulation).replace(/%/g, '%25'))\n    } catch (error) {\n      pool.regulation = Base64.decode(pool.regulation)\n    }\n\n    return pool\n  }\n\n  private transformExtensions(coin: any, dataArray: any[], transformExtensions = true) {\n    const extensions: any[] = []\n    for (const item of dataArray) {\n      const { key } = item.fields\n      let { value } = item.fields\n      if (key === 'labels') {\n        try {\n          const decodedValue = decodeURIComponent(Base64.decode(value))\n          try {\n            value = JSON.parse(decodedValue)\n          } catch {\n            value = decodedValue\n          }\n        } catch (error) {}\n      }\n      if (transformExtensions) {\n        coin[key] = value\n      }\n      extensions.push({\n        key,\n        value,\n      })\n    }\n    delete coin.extension_fields\n\n    if (!transformExtensions) {\n      coin.extensions = extensions\n    }\n  }\n\n  /**\n   * Get the token config event.\n   *\n   * @param forceRefresh Whether to force a refresh of the event.\n   * @returns The token config event.\n   */\n  async getCetusConfig(forceRefresh = false): Promise<CetusConfigs> {\n    const packageObjectId = this._sdk.sdkOptions.cetus_config.package_id\n    const cacheKey = `${packageObjectId}_getCetusConfig`\n\n    const cacheData = this.getCache<CetusConfigs>(cacheKey, forceRefresh)\n\n    if (cacheData !== undefined) {\n      return cacheData\n    }\n\n    const packageObject = await this._sdk.fullClient.getObject({\n      id: packageObjectId,\n      options: {\n        showPreviousTransaction: true,\n      },\n    })\n\n    const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n    const objects = await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })\n    let tokenConfig: CetusConfigs = {\n      coin_list_id: '',\n      launchpad_pools_id: '',\n      clmm_pools_id: '',\n      admin_cap_id: '',\n      global_config_id: '',\n      coin_list_handle: '',\n      launchpad_pools_handle: '',\n      clmm_pools_handle: '',\n    }\n\n    if (objects.data.length > 0) {\n      for (const item of objects.data) {\n        const formatType = extractStructTagFromType(item.type)\n        switch (formatType.name) {\n          case `InitCoinListEvent`:\n            tokenConfig.coin_list_id = item.parsedJson.coin_list_id\n            break\n          case `InitLaunchpadPoolsEvent`:\n            tokenConfig.launchpad_pools_id = item.parsedJson.launchpad_pools_id\n            break\n          case `InitClmmPoolsEvent`:\n            tokenConfig.clmm_pools_id = item.parsedJson.pools_id\n            break\n          case `InitConfigEvent`:\n            tokenConfig.global_config_id = item.parsedJson.global_config_id\n            tokenConfig.admin_cap_id = item.parsedJson.admin_cap_id\n            break\n          default:\n            break\n        }\n      }\n    }\n    tokenConfig = await this.getCetusConfigHandle(tokenConfig)\n    if (tokenConfig.clmm_pools_id.length > 0) {\n      this.updateCache(cacheKey, tokenConfig, cacheTime24h)\n    }\n    return tokenConfig\n  }\n\n  private async getCetusConfigHandle(tokenConfig: CetusConfigs): Promise<CetusConfigs> {\n    const warpIds = [tokenConfig.clmm_pools_id, tokenConfig.coin_list_id, tokenConfig.launchpad_pools_id]\n\n    const res = await this._sdk.fullClient.multiGetObjects({ ids: warpIds, options: { showContent: true } })\n\n    res.forEach((item) => {\n      if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n        throw new ClmmpoolsError(\n          `when getCetusConfigHandle get objects error: ${item.error}, please check the rpc and contracts address config.`,\n          ConfigErrorCode.InvalidConfigHandle\n        )\n      }\n\n      const fields = getObjectFields(item)\n      const type = getObjectType(item) as string\n      switch (extractStructTagFromType(type).name) {\n        case 'ClmmPools':\n          tokenConfig.clmm_pools_handle = fields.pools.fields.id.id\n          break\n        case 'CoinList':\n          tokenConfig.coin_list_handle = fields.coins.fields.id.id\n          break\n        case 'LaunchpadPools':\n          tokenConfig.launchpad_pools_handle = fields.pools.fields.id.id\n          break\n        default:\n          break\n      }\n    })\n\n    return tokenConfig\n  }\n\n  /**\n   * Updates the cache for the given key.\n   * @param key The key of the cache entry to update.\n   * @param data The data to store in the cache.\n   * @param time The time in minutes after which the cache entry should expire.\n   */\n  updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n    let cacheData = this._cache[key]\n    if (cacheData) {\n      cacheData.overdueTime = getFutureTime(time)\n      cacheData.value = data\n    } else {\n      cacheData = new CachedContent(data, getFutureTime(time))\n    }\n    this._cache[key] = cacheData\n  }\n\n  /**\n   * Gets the cache entry for the given key.\n   * @param key The key of the cache entry to get.\n   * @param forceRefresh Whether to force a refresh of the cache entry.\n   * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n   */\n  getCache<T>(key: string, forceRefresh = false): T | undefined {\n    try {\n      const cacheData = this._cache[key]\n      if (!cacheData) {\n        return undefined // No cache data available\n      }\n\n      if (forceRefresh || !cacheData.isValid()) {\n        delete this._cache[key]\n        return undefined\n      }\n\n      return cacheData.value as T\n    } catch (error) {\n      console.error(`Error accessing cache for key ${key}:`, error)\n      return undefined\n    }\n  }\n}\n","import { CoinBalance } from '@mysten/sui/client'\nimport { PoolModule } from './modules/poolModule'\nimport { PositionModule } from './modules/positionModule'\nimport { RewarderModule } from './modules/rewarderModule'\nimport { RouterModule } from './modules/routerModule'\nimport { SwapModule } from './modules/swapModule'\nimport { TokenModule } from './modules/tokenModule'\nimport { RouterModuleV2 } from './modules/routerModuleV2'\nimport { CachedContent, cacheTime24h, extractStructTagFromType, getFutureTime, patchFixSuiObjectId } from './utils'\nimport { CetusConfigs, ClmmConfig, CoinAsset, Package, SuiResource, SuiAddressType, TokenConfig } from './types'\nimport { ConfigModule } from './modules'\nimport { RpcModule } from './modules/rpcModule'\n\n/**\n * Represents options and configurations for an SDK.\n */\nexport type SdkOptions = {\n  /**\n   * The full URL for interacting with the RPC (Remote Procedure Call) service.\n   */\n  fullRpcUrl: string\n\n  /**\n   * Optional URL for the faucet service.\n   */\n  faucetURL?: string\n\n  /**\n   * Configuration for the simulation account.\n   */\n  simulationAccount: {\n    /**\n     * The address of the simulation account.\n     */\n    address: string\n  }\n\n  /**\n   * Package containing faucet-related configurations.\n   */\n  faucet?: Package\n\n  /**\n   * Package containing token-related configurations.\n   */\n  token?: Package<TokenConfig>\n\n  /**\n   * Package containing Cetus protocol configurations.\n   */\n  cetus_config: Package<CetusConfigs>\n\n  /**\n   * Package containing Cryptocurrency Liquidity Mining Module (CLMM) pool configurations.\n   */\n  clmm_pool: Package<ClmmConfig>\n\n  /**\n   * Package containing integration-related configurations.\n   */\n  integrate: Package\n\n  /**\n   * Package containing DeepBook-related configurations.\n   */\n  deepbook: Package\n\n  /**\n   * Package containing DeepBook endpoint version 2 configurations.\n   */\n  deepbook_endpoint_v2: Package\n\n  /**\n   * The URL for the aggregator service.\n   */\n  aggregatorUrl: string\n\n  /**\n   * The URL for the swap count\n   */\n  swapCountUrl?: string\n\n  /**\n   * The URL for the swap count\n   */\n  statsPoolsUrl?: string\n}\n\n/**\n * The entry class of CetusClmmSDK, which is almost responsible for all interactions with CLMM.\n */\nexport class CetusClmmSDK {\n  private readonly _cache: Record<string, CachedContent> = {}\n\n  /**\n   * RPC provider on the SUI chain\n   */\n  protected _rpcModule: RpcModule\n\n  /**\n   * Provide interact with clmm pools with a pool router interface.\n   */\n  protected _pool: PoolModule\n\n  /**\n   * Provide interact with clmm position with a position router interface.\n   */\n  protected _position: PositionModule\n\n  /**\n   * Provide interact with a pool swap router interface.\n   */\n  protected _swap: SwapModule\n\n  /**\n   * Provide interact  with a position rewarder interface.\n   */\n  protected _rewarder: RewarderModule\n\n  /**\n   * Provide interact with a pool router interface.\n   */\n  protected _router: RouterModule\n\n  /**\n   * Provide interact with a pool routerV2 interface.\n   */\n  protected _router_v2: RouterModuleV2\n\n  /**\n   * Provide interact with pool and token config (contain token base info for metadat).\n   * @deprecated Please use CetusConfig instead\n   */\n  protected _token: TokenModule\n\n  /**\n   * Provide  interact with clmm pool and coin and launchpad pool config\n   */\n  protected _config: ConfigModule\n\n  /**\n   *  Provide sdk options\n   */\n  protected _sdkOptions: SdkOptions\n\n  /**\n   * After connecting the wallet, set the current wallet address to senderAddress.\n   */\n  protected _senderAddress = ''\n\n  constructor(options: SdkOptions) {\n    this._sdkOptions = options\n    this._rpcModule = new RpcModule({\n      url: options.fullRpcUrl,\n    })\n\n    this._swap = new SwapModule(this)\n    this._pool = new PoolModule(this)\n    this._position = new PositionModule(this)\n    this._rewarder = new RewarderModule(this)\n    this._router = new RouterModule(this)\n    this._router_v2 = new RouterModuleV2(this)\n    this._token = new TokenModule(this)\n    this._config = new ConfigModule(this)\n\n    patchFixSuiObjectId(this._sdkOptions)\n  }\n\n  /**\n   * Getter for the sender address property.\n   * @returns {SuiAddressType} The sender address.\n   */\n  get senderAddress(): SuiAddressType {\n    return this._senderAddress\n  }\n\n  /**\n   * Setter for the sender address property.\n   * @param {string} value - The new sender address value.\n   */\n  set senderAddress(value: string) {\n    this._senderAddress = value\n  }\n\n  /**\n   * Getter for the Swap property.\n   * @returns {SwapModule} The Swap property value.\n   */\n  get Swap(): SwapModule {\n    return this._swap\n  }\n\n  /**\n   * Getter for the fullClient property.\n   * @returns {RpcModule} The fullClient property value.\n   */\n  get fullClient(): RpcModule {\n    return this._rpcModule\n  }\n\n  /**\n   * Getter for the sdkOptions property.\n   * @returns {SdkOptions} The sdkOptions property value.\n   */\n  get sdkOptions(): SdkOptions {\n    return this._sdkOptions\n  }\n\n  /**\n   * Getter for the Pool property.\n   * @returns {PoolModule} The Pool property value.\n   */\n  get Pool(): PoolModule {\n    return this._pool\n  }\n\n  /**\n   * Getter for the Position property.\n   * @returns {PositionModule} The Position property value.\n   */\n  get Position(): PositionModule {\n    return this._position\n  }\n\n  /**\n   * Getter for the Rewarder property.\n   * @returns {RewarderModule} The Rewarder property value.\n   */\n  get Rewarder(): RewarderModule {\n    return this._rewarder\n  }\n\n  /**\n   * Getter for the Router property.\n   * @returns {RouterModule} The Router property value.\n   */\n  get Router(): RouterModule {\n    return this._router\n  }\n\n  /**\n   * Getter for the RouterV2 property.\n   * @returns {RouterModuleV2} The RouterV2 property value.\n   */\n  get RouterV2(): RouterModuleV2 {\n    return this._router_v2\n  }\n\n  /**\n   * Getter for the CetusConfig property.\n   * @returns {ConfigModule} The CetusConfig property value.\n   */\n  get CetusConfig(): ConfigModule {\n    return this._config\n  }\n\n  /**\n   * @deprecated Token is no longer maintained. Please use CetusConfig instead\n   */\n  get Token() {\n    return this._token\n  }\n\n  /**\n   * Gets all coin assets for the given owner and coin type.\n   *\n   * @param suiAddress The address of the owner.\n   * @param coinType The type of the coin.\n   * @returns an array of coin assets.\n   */\n  async getOwnerCoinAssets(suiAddress: string, coinType?: string | null, forceRefresh = true): Promise<CoinAsset[]> {\n    const allCoinAsset: CoinAsset[] = []\n    let nextCursor: string | null | undefined = null\n\n    const cacheKey = `${this.sdkOptions.fullRpcUrl}_${suiAddress}_${coinType}_getOwnerCoinAssets`\n    const cacheData = this.getCache<CoinAsset[]>(cacheKey, forceRefresh)\n    if (cacheData) {\n      return cacheData\n    }\n\n    while (true) {\n      const allCoinObject: any = await (coinType\n        ? this.fullClient.getCoins({\n            owner: suiAddress,\n            coinType,\n            cursor: nextCursor,\n          })\n        : this.fullClient.getAllCoins({\n            owner: suiAddress,\n            cursor: nextCursor,\n          }))\n\n      allCoinObject.data.forEach((coin: any) => {\n        if (BigInt(coin.balance) > 0) {\n          allCoinAsset.push({\n            coinAddress: extractStructTagFromType(coin.coinType).source_address,\n            coinObjectId: coin.coinObjectId,\n            balance: BigInt(coin.balance),\n          })\n        }\n      })\n      nextCursor = allCoinObject.nextCursor\n\n      if (!allCoinObject.hasNextPage) {\n        break\n      }\n    }\n    this.updateCache(cacheKey, allCoinAsset, 30 * 1000)\n    return allCoinAsset\n  }\n\n  /**\n   * Gets all coin balances for the given owner and coin type.\n   *\n   * @param suiAddress The address of the owner.\n   * @param coinType The type of the coin.\n   * @returns an array of coin balances.\n   */\n  async getOwnerCoinBalances(suiAddress: string, coinType?: string | null): Promise<CoinBalance[]> {\n    let allCoinBalance: CoinBalance[] = []\n\n    if (coinType) {\n      const res = await this.fullClient.getBalance({\n        owner: suiAddress,\n        coinType,\n      })\n      allCoinBalance = [res]\n    } else {\n      const res = await this.fullClient.getAllBalances({\n        owner: suiAddress,\n      })\n      allCoinBalance = [...res]\n    }\n    return allCoinBalance\n  }\n\n  /**\n   * Updates the cache for the given key.\n   *\n   * @param key The key of the cache entry to update.\n   * @param data The data to store in the cache.\n   * @param time The time in minutes after which the cache entry should expire.\n   */\n  updateCache(key: string, data: SuiResource, time = cacheTime24h) {\n    let cacheData = this._cache[key]\n    if (cacheData) {\n      cacheData.overdueTime = getFutureTime(time)\n      cacheData.value = data\n    } else {\n      cacheData = new CachedContent(data, getFutureTime(time))\n    }\n    this._cache[key] = cacheData\n  }\n\n  /**\n   * Gets the cache entry for the given key.\n   *\n   * @param key The key of the cache entry to get.\n   * @param forceRefresh Whether to force a refresh of the cache entry.\n   * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n   */\n  getCache<T>(key: string, forceRefresh = false): T | undefined {\n    const cacheData = this._cache[key]\n    const isValid = cacheData?.isValid()\n    if (!forceRefresh && isValid) {\n      return cacheData.value as T\n    }\n    if (!isValid) {\n      delete this._cache[key]\n    }\n    return undefined\n  }\n}\n","import { CetusClmmSDK, SdkOptions } from './sdk'\n\nexport { CetusClmmSDK, SdkOptions }\n\nexport default CetusClmmSDK\n","import { getFullnodeUrl } from '@mysten/sui/client'\nimport CetusClmmSDK, { SdkOptions } from '../main'\nimport { checkInvalidSuiAddress } from '../utils'\n\nconst SDKConfig = {\n  clmmConfig: {\n    pools_id: '0xf699e7f2276f5c9a75944b37a0c5b5d9ddfd2471bf6242483b03ab2887d198d0',\n    global_config_id: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',\n    global_vault_id: '0xce7bceef26d3ad1f6d9b6f13a953f053e6ed3ca77907516481ce99ae8e588f2b',\n    admin_cap_id: '0x89c1a321291d15ddae5a086c9abc533dff697fde3d89e0ca836c41af73e36a75',\n  },\n  cetusConfig: {\n    coin_list_id: '0x8cbc11d9e10140db3d230f50b4d30e9b721201c0083615441707ffec1ef77b23',\n    launchpad_pools_id: '0x1098fac992eab3a0ab7acf15bb654fc1cf29b5a6142c4ef1058e6c408dd15115',\n    clmm_pools_id: '0x15b6a27dd9ae03eb455aba03b39e29aad74abd3757b8e18c0755651b2ae5b71e',\n    admin_cap_id: '0x39d78781750e193ce35c45ff32c6c0c3f2941fa3ddaf8595c90c555589ddb113',\n    global_config_id: '0x0408fa4e4a4c03cc0de8f23d0c2bbfe8913d178713c9a271ed4080973fe42d8f',\n    coin_list_handle: '0x49136005e90e28c4695419ed4194cc240603f1ea8eb84e62275eaff088a71063',\n    launchpad_pools_handle: '0x5e194a8efcf653830daf85a85b52e3ae8f65dc39481d54b2382acda25068375c',\n    clmm_pools_handle: '0x37f60eb2d9d227949b95da8fea810db3c32d1e1fa8ed87434fc51664f87d83cb',\n  },\n}\n\n// mainnet\nexport const clmmMainnet: SdkOptions = {\n  fullRpcUrl: 'https://mainnet.suiet.app:443',\n  simulationAccount: {\n    address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n  },\n  cetus_config: {\n    package_id: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n    published_at: '0xba7e740c3c002673dbe69ad5fbdb0691ec260170e141297cefb982e7081fde52',\n    version: 2,\n    config: SDKConfig.cetusConfig,\n  },\n  clmm_pool: {\n    package_id: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb',\n    published_at: '0x75b2e9ecad34944b8d0c874e568c90db0cf9437f0d7392abfd4cb902972f3e40',\n    version: 12,\n    config: SDKConfig.clmmConfig,\n  },\n  integrate: {\n    package_id: '0x996c4d9480708fb8b92aa7acf819fb0497b5ec8e65ba06601cae2fb6db3312c3',\n    published_at: '0xb2db7142fa83210a7d78d9c12ac49c043b3cbbd482224fea6e3da00aa5a5ae2d',\n    version: 12,\n  },\n  deepbook: {\n    package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n    published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n  },\n  deepbook_endpoint_v2: {\n    package_id: '0xac95e8a5e873cfa2544916c16fe1461b6a45542d9e65504c1794ae390b3345a7',\n    published_at: '0xac95e8a5e873cfa2544916c16fe1461b6a45542d9e65504c1794ae390b3345a7',\n  },\n  aggregatorUrl: 'https://api-sui.cetus.zone/router',\n  swapCountUrl: 'https://api-sui.cetus.zone/v2/sui/swap/count',\n  statsPoolsUrl: 'https://api-sui.cetus.zone/v2/sui/stats_pools',\n}\n\n/**\n * Initialize the mainnet SDK\n * @param fullNodeUrl. If provided, it will be used as the full node URL.\n * @param simulationAccount. If provided, it will be used as the simulation account address.\n *                           when you use the `preswap` method or other methods that require payment assistance,\n *                           you must configure a simulation account with sufficient balance of input tokens.\n *                           If you connect the wallet, you can set the current wallet address to simulationAccount.\n * @returns\n */\nexport function initMainnetSDK(fullNodeUrl?: string, wallet?: string): CetusClmmSDK {\n  if (fullNodeUrl) {\n    clmmMainnet.fullRpcUrl = fullNodeUrl\n  }\n  const sdk = new CetusClmmSDK(clmmMainnet)\n  if (wallet && checkInvalidSuiAddress(wallet)) {\n    sdk.senderAddress = wallet\n  }\n  return sdk\n}\n","import { getFullnodeUrl } from '@mysten/sui/client'\nimport CetusClmmSDK, { SdkOptions } from '../main'\nimport { checkInvalidSuiAddress } from '../utils'\n\nconst SDKConfig = {\n  clmmConfig: {\n    pools_id: '0x50eb61dd5928cec5ea04711a2e9b72e5237e79e9fbcd2ce3d5469dc8708e0ee2',\n    global_config_id: '0x9774e359588ead122af1c7e7f64e14ade261cfeecdb5d0eb4a5b3b4c8ab8bd3e',\n    global_vault_id: '0xf78d2ee3c312f298882cb680695e5e8c81b1d441a646caccc058006c2851ddea',\n    admin_cap_id: '0xa456f86a53fc31e1243f065738ff1fc93f5a62cc080ff894a0fb3747556a799b',\n  },\n  cetusConfig: {\n    coin_list_id: '0x257eb2ba592a5480bba0a97d05338fab17cc3283f8df6998a0e12e4ab9b84478',\n    launchpad_pools_id: '0xdc3a7bd66a6dcff73c77c866e87d73826e446e9171f34e1c1b656377314f94da',\n    clmm_pools_id: '0x26c85500f5dd2983bf35123918a144de24e18936d0b234ef2b49fbb2d3d6307d',\n    admin_cap_id: '0x1a496f6c67668eb2c27c99e07e1d61754715c1acf86dac45020c886ac601edb8',\n    global_config_id: '0xe1f3db327e75f7ec30585fa52241edf66f7e359ef550b533f89aa1528dd1be52',\n    coin_list_handle: '0x3204350fc603609c91675e07b8f9ac0999b9607d83845086321fca7f469de235',\n    launchpad_pools_handle: '0xae67ff87c34aceea4d28107f9c6c62e297a111e9f8e70b9abbc2f4c9f5ec20fd',\n    clmm_pools_handle: '0xd28736923703342b4752f5ed8c2f2a5c0cb2336c30e1fed42b387234ce8408ec',\n  },\n}\n\nexport const clmmTestnet: SdkOptions = {\n  fullRpcUrl: getFullnodeUrl('testnet'),\n  simulationAccount: {\n    address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n  },\n  faucet: {\n    package_id: '0x26b3bc67befc214058ca78ea9a2690298d731a2d4309485ec3d40198063c4abc',\n    published_at: '0x26b3bc67befc214058ca78ea9a2690298d731a2d4309485ec3d40198063c4abc',\n  },\n  cetus_config: {\n    package_id: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n    published_at: '0xf5ff7d5ba73b581bca6b4b9fa0049cd320360abd154b809f8700a8fd3cfaf7ca',\n    config: SDKConfig.cetusConfig,\n  },\n  clmm_pool: {\n    package_id: '0x0c7ae833c220aa73a3643a0d508afa4ac5d50d97312ea4584e35f9eb21b9df12',\n    published_at: '0x85e61285a10efc6602ab00df70a0c06357c384ef4c5633ecf73016df1500c704',\n    config: SDKConfig.clmmConfig,\n  },\n  integrate: {\n    package_id: '0x2918cf39850de6d5d94d8196dc878c8c722cd79db659318e00bff57fbb4e2ede',\n    published_at: '0x19dd42e05fa6c9988a60d30686ee3feb776672b5547e328d6dab16563da65293',\n  },\n  deepbook: {\n    package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n    published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n  },\n  deepbook_endpoint_v2: {\n    package_id: '0x56d90d0c055edb534b11e7548270bb458fd47c69b77bf40c14d5eb00e6e6cf64',\n    published_at: '0x56d90d0c055edb534b11e7548270bb458fd47c69b77bf40c14d5eb00e6e6cf64',\n  },\n  aggregatorUrl: 'https://api-sui.devcetus.com/router',\n  swapCountUrl: 'https://api-sui.devcetus.com/v2/sui/swap/count',\n  statsPoolsUrl: 'https://api-sui.devcetus.com/v2/sui/stats_pools',\n}\n\n/**\n * Initialize the testnet SDK\n * @param fullNodeUrl. If provided, it will be used as the full node URL.\n * @param simulationAccount. If provided, it will be used as the simulation account address.\n * @returns\n */\nexport function initTestnetSDK(fullNodeUrl?: string, wallet?: string): CetusClmmSDK {\n  if (fullNodeUrl) {\n    clmmTestnet.fullRpcUrl = fullNodeUrl\n  }\n  const sdk = new CetusClmmSDK(clmmTestnet)\n  if (wallet && checkInvalidSuiAddress(wallet)) {\n    sdk.senderAddress = wallet\n  }\n  return sdk\n}\n","import CetusClmmSDK from '../main'\nimport { initMainnetSDK } from './mainnet'\nimport { initTestnetSDK } from './testnet'\n\ninterface InitCetusSDKOptions {\n  network: 'mainnet' | 'testnet'\n  fullNodeUrl?: string\n  wallet?: string\n}\n\n/**\n * Helper function to initialize the Cetus SDK\n * @param env - The environment to initialize the SDK in. One of 'mainnet' or 'testnet'.\n * @param fullNodeUrl - The full node URL to use.\n * @param wallet - The wallet address to use. If not provided,\n *                 If you use the `preswap` method or other methods that require payment assistance,\n *                  you must configure a wallet with sufficient balance of input tokens.\n *                  If you do not set a wallet, the SDK will throw an error.\n * @returns The initialized Cetus SDK.\n */\nexport function initCetusSDK(options: InitCetusSDKOptions): CetusClmmSDK {\n  const { network, fullNodeUrl, wallet } = options\n  return network === 'mainnet' ? initMainnetSDK(fullNodeUrl, wallet) : initTestnetSDK(fullNodeUrl, wallet)\n}\n"]}