{"version":3,"sources":["../src/modules/poolModule.ts","../src/utils/cachedContent.ts","../src/utils/common.ts","../src/types/clmmpool.ts","../src/math/utils.ts","../src/utils/decimal.ts","../src/errors/errors.ts","../src/types/constants.ts","../src/types/sui.ts","../src/types/clmm_type.ts","../src/types/liquidity.ts","../src/math/apr.ts","../src/math/tick.ts","../src/math/clmm.ts","../src/math/swap.ts","../src/utils/contracts.ts","../src/utils/hex.ts","../src/math/CoinAssist.ts","../src/math/collect-fees.ts","../src/math/percentage.ts","../src/math/position.ts","../src/math/SplitSwap.ts","../src/utils/numbers.ts","../src/utils/objects.ts","../src/utils/tick.ts","../src/utils/transaction-util.ts","../src/utils/tx-block.ts","../src/utils/deepbook-utils.ts","../src/modules/rpcModule.ts","../src/modules/positionModule.ts","../src/modules/rewarderModule.ts","../src/modules/routerModule.ts","../src/modules/swapModule.ts","../src/modules/tokenModule.ts","../src/modules/routerModuleV2.ts","../src/modules/configModule.ts","../src/sdk.ts","../src/main.ts","../src/config/mainnet.ts","../src/config/testnet.ts","../src/config/config.ts","../src/index.ts"],"sourcesContent":["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","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"],"mappings":"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","names":["Transaction","BN","BN","BN","BN","ClmmPositionStatus","SwapDirection","BN","Decimal","BN","BN","BN","Decimal","BN","BN","BN","BN","structTag","BN","BN","BN","AmountSpecified","PositionStatus","BN","SplitUnit","BN","Decimal","BN","BN","BN","BN","Decimal","Decimal","BN","selectedCoinsResult","i","Transaction","Transaction","BN","Transaction","BN","Transaction","Transaction","params","item","object","BN","Transaction","Transaction","BN","BN","Transaction","BN","Transaction","BN","Transaction","paths","preSwapResult","onePath","BN","swapWithRouterParams","result","Transaction","BN","Decimal","Transaction","Decimal","Transaction","BN","Transaction","normalizeSuiObjectId","Transaction","item","normalizeSuiObjectId","BN","Decimal","Decimal","BN","normalizeSuiObjectId","Base64","normalizeSuiObjectId","Base64","SDKConfig"]}