{"version":3,"sources":["../src/modules/pool.ts","../src/utils/cached-content.ts","../src/utils/common.ts","../src/types/clmm-pool.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/coin-assist.ts","../src/math/collect-fees.ts","../src/math/percentage.ts","../src/math/position.ts","../src/math/split-swap.ts","../src/utils/numbers.ts","../src/utils/objects.ts","../src/utils/tick.ts","../src/utils/transaction-util.ts","../src/utils/tx-block.ts","../src/modules/rpc.ts","../src/modules/position.ts","../src/modules/rewarder.ts","../src/modules/router.ts","../src/modules/swap.ts","../src/sdk.ts","../src/main.ts","../src/config/mainnet.ts","../src/config/testnet.ts","../src/config/beta.ts","../src/config/config.ts","../src/index.ts"],"names":["Transaction","BN","ClmmPositionStatus","SwapDirection","Decimal","structTag","AmountSpecified","PositionStatus","SplitUnit","coinSelection","item","object","SDKConfig"],"mappings":"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","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 { 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/clmm-pool'\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 { FerraClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport {\n  ClmmpoolsError,\n  ConfigErrorCode,\n  PartnerErrorCode,\n  PoolErrorCode,\n  PositionErrorCode,\n  UtilsErrorCode,\n} from '../errors/errors'\nimport { RpcModule } from './rpc'\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 * Pool module for interacting with CLMM pools\n * Provides functionality for pool creation, liquidity management, and data retrieval\n */\nexport class PoolModule implements IModule {\n  protected _sdk: FerraClmmSDK\n  private readonly _cache: Record<string, CachedContent> = {}\n\n  constructor(sdk: FerraClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Retrieves all positions associated with a position handle\n   * @param positionHandle - The position collection handle ID\n   * @param paginationArgs - Pagination parameters (default: 'all' to fetch all positions)\n   * @returns Paginated list of positions with navigation metadata\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   * Retrieves immutable pool data (address, tick spacing, coin types)\n   * Uses cached data to minimize RPC calls\n   * @param assignPoolIDs - Specific pool IDs to retrieve (empty array for all pools)\n   * @param offset - Starting index for pagination\n   * @param limit - Maximum number of pools to return\n   * @param forceRefresh - Force cache refresh if true\n   * @returns Array of pool immutable data\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   * Retrieves complete pool data including current state\n   * @param assignPools - Specific pool IDs to retrieve (empty array for all pools)\n   * @param offset - Starting index for pagination\n   * @param limit - Maximum number of pools to return\n   * @returns Array of complete pool objects with current state\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   * Retrieves pool immutable data with advanced pagination support\n   * @param paginationArgs - Pagination parameters ('all' or specific cursor/limit)\n   * @param forceRefresh - Force cache refresh if true\n   * @returns Paginated pool immutable data with navigation metadata\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   * Retrieves complete pool data with advanced pagination support\n   * @param assignPools - Specific pool IDs to retrieve (empty array for all pools)\n   * @param paginationArgs - Pagination parameters ('all' or specific cursor/limit)\n   * @param forceRefresh - Force cache refresh if true\n   * @returns Array of complete pool objects with current state\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   * Retrieves a single pool by its object ID\n   * @param poolID - The pool's object ID\n   * @param forceRefresh - Force cache refresh if true (default: true for real-time data)\n   * @returns Complete pool object with current state\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  /**\n   * @deprecated Use createPoolTransactionPayload instead\n   * Creates a single pool with initial liquidity position\n   * Automatically sorts coin types according to protocol requirements\n   * @param params - Pool creation and liquidity parameters\n   * @returns Transaction object for pool creation and liquidity addition\n   */\n  async creatPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n    // Ensure coin types follow protocol ordering rules\n    // Reference: https://ferra-1.gitbook.io/ferra-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   * Creates a pool with initial liquidity position\n   * Automatically sorts coin types according to protocol requirements\n   * @param params - Pool creation and liquidity parameters\n   * @returns Transaction object for pool creation and liquidity addition\n   */\n  async createPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n    // Ensure coin types follow protocol ordering rules\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   * Retrieves CLMM protocol configuration from genesis transaction\n   * Contains global config, pools collection, vault, and admin capability IDs\n   * @param forceRefresh - Force cache refresh if true\n   * @returns CLMM protocol configuration 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_rewarder_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_rewarder_vault_id = fields.global_rewarder_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   * Retrieves full transaction details including events and effects\n   * Used for analyzing pool-related transactions\n   * @param digest - Transaction digest to query\n   * @param forceRefresh - Force cache refresh if true\n   * @returns Complete transaction block response or null\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  /**\n   * Retrieves transaction history for a specific pool\n   * Supports custom RPC endpoints for different data sources\n   * @param poolId - Pool object ID\n   * @param paginationArgs - Pagination parameters\n   * @param order - Sort order (default: 'descending')\n   * @param fullRpcUrl - Optional custom RPC endpoint\n   * @returns Paginated list of pool transactions\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\n    // Fetch transactions in batches until we reach user limit\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    // Trim results to user limit\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\n  /**\n   * Internal method for creating pool with initial liquidity\n   * Uses integrate contract to handle pool creation and liquidity in single transaction\n   * @param params - Pool creation and liquidity parameters\n   * @returns Transaction object\n   */\n  private async createPoolAndAddLiquidity(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: ferra 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    // Build coin inputs from user's balance\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(clmm_pool.config.global_config_id),\n      tx.object(clmm_pool.config.pools_id),\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.pure.u64(params.lock_until ?? 0),\n      tx.pure.bool(params.fix_amount_a),\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    // Return remaining coins to sender\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  /**\n   * Fetches all tick data for a pool\n   * Retrieves tick liquidity data in batches for efficiency\n   * @param params - Pool and coin type parameters\n   * @returns Complete 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    // Fetch ticks in batches\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   * Internal method to fetch tick data using simulated transaction\n   * Uses devInspectTransactionBlock for gas-free tick data retrieval\n   * @param params - Tick fetch parameters including start indices and limit\n   * @returns 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 reward information for all positions in a pool\n   * Retrieves position rewards in batches for efficiency\n   * @param params - Pool and coin type parameters\n   * @returns Complete 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    // Fetch position rewards in batches\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: '0x2::object::ID',\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 all ticks directly from RPC (alternative to simulation method)\n   * Useful when simulation is not available or for debugging\n   * @param tickHandle - Pool's tick handle from pool object\n   * @returns Complete 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\n    // Paginate through all tick dynamic fields\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   * Internal method to fetch tick objects by their IDs\n   * @param tickObjectId - Array of tick object IDs\n   * @returns 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   * Retrieves tick data for a specific tick index\n   * Uses dynamic field lookup for efficient single tick retrieval\n   * @param tickHandle - Pool's tick handle\n   * @param tickIndex - The tick index to retrieve\n   * @returns Tick data for the specified index\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   * Retrieves tick data by its object ID\n   * Direct object fetch for known tick IDs\n   * @param tickId - Tick object ID\n   * @returns Tick data or null if not found\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   * Retrieves referral fee balances for a partner\n   * @param partner - Partner object ID\n   * @param showDisplay - Include display metadata\n   * @returns Array of coin assets with balances\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   * Creates transaction to claim partner referral fees\n   * @param partnerCap - Partner capability object ID\n   * @param partner - Partner object ID\n   * @param coinType - Coin type to claim\n   * @returns Transaction object for claiming fees\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 cached data with expiration time\n   * @param key - Cache key\n   * @param data - Data to cache\n   * @param time - Cache duration in minutes (default: 5)\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   * Retrieves cached data if valid\n   * @param key - Cache key\n   * @param forceRefresh - Bypass cache if true\n   * @returns Cached data or undefined if expired/not found\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}","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/clmm-pool'\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    lock_until: '0'\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      lock_until: fields.lock_until\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 `Ferra 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}\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 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/**\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 './clmm-pool'\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 Ferra 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  lock_until: string;\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_rewarder_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  lock_until?: 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\n  lock_until?: number\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\n  lock_until?: number\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  lock_until?: number\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/clmm-pool'\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/coin-assist'\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/clmm-pool'\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/clmm-pool'\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/clmm-pool'\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/coin-assist'\nimport { TickData } from '../types/clmm-pool'\nimport {\n  ClmmIntegrateRouterWithPartnerModule,\n  ClmmIntegratePoolModule,\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  getPackagerConfigs,\n  normalizeCoinType,\n  Percentage,\n  Pool,\n  SdkOptions,\n  SwapParams,\n  SwapUtils,\n  ZERO,\n} from '../index'\nimport { BasePath, OnePath, SwapWithRouterParams } from '../modules/router'\nimport { ClmmpoolsError, ConfigErrorCode, UtilsErrorCode } from '../errors/errors'\n\nexport type AdjustResult = {\n  isAdjustCoinA: boolean\n  isAdjustCoinB: boolean\n}\n\n/**\n * Determines which coins in a pair are SUI tokens that need adjustment\n * @param coinPair - Pair of coin types to check\n * @returns Object indicating which coins are SUI and need adjustment\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 * Calculates the reverse slippage amount for liquidity operations\n * @param slippageAmount - Amount affected by slippage\n * @param slippageRate - Slippage rate as decimal\n * @returns Adjusted amount string\n */\nfunction reverseSlippageAmount(slippageAmount: number | string, slippageRate: number): string {\n  return Decimal.ceil(d(slippageAmount).div(1 + slippageRate)).toString()\n}\n\n/**\n * Utility function for debugging transaction structure\n * @param transaction - Transaction to inspect\n * @param enablePrint - Whether to print command details\n */\nexport async function printTransaction(transaction: Transaction, enablePrint = true) {\n  console.log(`Transaction inputs:`, transaction.getData().inputs)\n  transaction.getData().commands.forEach((command, commandIndex) => {\n    if (enablePrint) {\n      console.log(`Command ${commandIndex}: `, command)\n    }\n  })\n}\n\ninterface TransferredCoin {\n  coinType: string\n  coin: TransactionObjectArgument\n}\n\n/**\n * Transaction utility class for building CLMM-related transactions\n * Provides methods for liquidity operations, swaps, and coin management\n */\nexport class TransactionUtil {\n  /**\n   * Creates transaction parameters for collecting rewards and fees\n   * @param sdk - SDK instance\n   * @param transaction - Transaction to modify\n   * @param rewarderParams - Parameters for reward collection\n   * @param allCoinAssets - All available coin assets\n   * @param coinAssetsA - Optional coin assets for token A\n   * @param coinAssetsB - Optional coin assets for token B\n   * @returns Modified transaction with reward collection logic\n   */\n  static createCollectRewarderAndFeeParams(\n    sdk: SDK,\n    transaction: Transaction,\n    rewarderParams: CollectRewarderParams,\n    allCoinAssets: CoinAsset[],\n    coinAssetsA?: CoinAsset[],\n    coinAssetsB?: CoinAsset[]\n  ) {\n    if (coinAssetsA === undefined) {\n      coinAssetsA = [...allCoinAssets]\n    }\n    if (coinAssetsB === undefined) {\n      coinAssetsB = [...allCoinAssets]\n    }\n\n    const normalizedCoinTypeA = normalizeCoinType(rewarderParams.coinTypeA)\n    const normalizedCoinTypeB = normalizeCoinType(rewarderParams.coinTypeB)\n\n    if (rewarderParams.collect_fee) {\n      const zeroCoinAInput = TransactionUtil.buildCoinForAmount(transaction, coinAssetsA, BigInt(0), normalizedCoinTypeA, false)\n      coinAssetsA = zeroCoinAInput.remainCoins\n\n      const zeroCoinBInput = TransactionUtil.buildCoinForAmount(transaction, coinAssetsB, BigInt(0), normalizedCoinTypeB, false)\n      coinAssetsB = zeroCoinBInput.remainCoins\n\n      transaction = sdk.Position.createCollectFeePaylod(\n        {\n          pool_id: rewarderParams.pool_id,\n          pos_id: rewarderParams.pos_id,\n          coinTypeA: rewarderParams.coinTypeA,\n          coinTypeB: rewarderParams.coinTypeB,\n        },\n        transaction,\n        zeroCoinAInput.targetCoin,\n        zeroCoinBInput.targetCoin\n      )\n    }\n\n    const rewarderCoinInputs: TransactionObjectArgument[] = []\n    rewarderParams.rewarder_coin_types.forEach((coinType) => {\n      switch (normalizeCoinType(coinType)) {\n        case normalizedCoinTypeA:\n          rewarderCoinInputs.push(TransactionUtil.buildCoinForAmount(transaction, coinAssetsA!, BigInt(0), coinType, false).targetCoin)\n          break\n        case normalizedCoinTypeB:\n          rewarderCoinInputs.push(TransactionUtil.buildCoinForAmount(transaction, coinAssetsB!, BigInt(0), coinType, false).targetCoin)\n          break\n        default:\n          rewarderCoinInputs.push(TransactionUtil.buildCoinForAmount(transaction, allCoinAssets, BigInt(0), coinType, false).targetCoin)\n          break\n      }\n    })\n\n    transaction = sdk.Rewarder.createCollectRewarderPaylod(rewarderParams, transaction, rewarderCoinInputs)\n    return transaction\n  }\n\n  /**\n   * Adjusts transaction parameters to account for gas costs\n   * @param sdk - SDK instance\n   * @param availableCoins - Available coin assets\n   * @param requiredAmount - Required amount for operation\n   * @param transaction - Transaction to analyze\n   * @returns Adjusted amount and optionally a new transaction\n   */\n  static async adjustTransactionForGas(\n    sdk: SDK,\n    availableCoins: CoinAsset[],\n    requiredAmount: bigint,\n    transaction: Transaction\n  ): Promise<{ fixAmount: bigint; newTx?: Transaction }> {\n    transaction.setSender(sdk.senderAddress)\n\n    // Select coins that can cover the required amount\n    const amountCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(availableCoins, requiredAmount).selectedCoins\n    if (amountCoins.length === 0) {\n      throw new ClmmpoolsError(`Insufficient balance`, UtilsErrorCode.InsufficientBalance)\n    }\n\n    const totalBalance = CoinAssist.calculateTotalBalance(availableCoins)\n    // If remaining balance is sufficient, no gas adjustment needed\n    if (totalBalance - requiredAmount > 1000000000) {\n      return { fixAmount: requiredAmount }\n    }\n\n    // Estimate gas consumption for the transaction\n    const estimatedGasCost = await sdk.fullClient.calculationTxGas(transaction)\n\n    // Find coins that can cover gas costs\n    const gasCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(\n      availableCoins,\n      BigInt(estimatedGasCost),\n      amountCoins.map((coin) => coin.coinObjectId)\n    ).selectedCoins\n\n    // Adjust amount if insufficient gas\n    if (gasCoins.length === 0) {\n      // Reserve additional gas for split operations\n      const totalGasNeeded = BigInt(estimatedGasCost) + BigInt(500)\n      if (totalBalance - requiredAmount < totalGasNeeded) {\n        requiredAmount -= totalGasNeeded\n        if (requiredAmount < 0) {\n          throw new ClmmpoolsError(`Insufficient balance for gas`, UtilsErrorCode.InsufficientBalance)\n        }\n\n        const newTransaction = new Transaction()\n        return { fixAmount: requiredAmount, newTx: newTransaction }\n      }\n    }\n    return { fixAmount: requiredAmount }\n  }\n\n  // -----------------------------------------liquidity-----------------------------------------------//\n  /**\n   * Builds add liquidity transaction with gas optimization for SUI tokens\n   * @param sdk - SDK instance\n   * @param allCoins - All available coin assets\n   * @param liquidityParams - Parameters for adding liquidity\n   * @param gasEstimationConfig - Gas estimation configuration\n   * @param transaction - Optional existing transaction\n   * @param inputCoinA - Optional pre-built coin A input\n   * @param inputCoinB - Optional pre-built coin B input\n   * @returns Transaction with gas-optimized liquidity addition\n   */\n  static async buildAddLiquidityFixTokenForGas(\n    sdk: SDK,\n    allCoins: CoinAsset[],\n    liquidityParams: AddLiquidityFixTokenParams,\n    gasEstimationConfig: {\n      slippage: number\n      curSqrtPrice: BN\n    },\n    transaction?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ): Promise<Transaction> {\n    transaction = await TransactionUtil.buildAddLiquidityFixToken(sdk, allCoins, liquidityParams, transaction, inputCoinA, inputCoinB)\n\n    const { isAdjustCoinA } = findAdjustCoin(liquidityParams)\n\n    const suiTokenAmount = isAdjustCoinA ? liquidityParams.amount_a : liquidityParams.amount_b\n\n    const gasAdjustmentResult = await TransactionUtil.adjustTransactionForGas(\n      sdk,\n      CoinAssist.getCoinAssets(isAdjustCoinA ? liquidityParams.coinTypeA : liquidityParams.coinTypeB, allCoins),\n      BigInt(suiTokenAmount),\n      transaction\n    )\n\n    const { fixAmount } = gasAdjustmentResult\n    const { newTx } = gasAdjustmentResult\n\n    if (newTx != null) {\n      let coinAInputs: BuildCoinResult\n      let coinBInputs: BuildCoinResult\n\n      if (isAdjustCoinA) {\n        liquidityParams.amount_a = Number(fixAmount)\n        coinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          !liquidityParams.fix_amount_a,\n          fixAmount.toString(),\n          liquidityParams.slippage,\n          liquidityParams.coinTypeA,\n          allCoins,\n          false,\n          true\n        )\n        coinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          liquidityParams.fix_amount_a,\n          liquidityParams.amount_b,\n          liquidityParams.slippage,\n          liquidityParams.coinTypeB,\n          allCoins,\n          false,\n          true\n        )\n      } else {\n        liquidityParams.amount_b = Number(fixAmount)\n        coinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          !liquidityParams.fix_amount_a,\n          liquidityParams.amount_a,\n          liquidityParams.slippage,\n          liquidityParams.coinTypeA,\n          allCoins,\n          false,\n          true\n        )\n        coinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n          newTx,\n          liquidityParams.fix_amount_a,\n          fixAmount.toString(),\n          liquidityParams.slippage,\n          liquidityParams.coinTypeB,\n          allCoins,\n          false,\n          true\n        )\n        liquidityParams = TransactionUtil.fixAddLiquidityFixTokenParams(liquidityParams, gasEstimationConfig.slippage, gasEstimationConfig.curSqrtPrice)\n\n        transaction = await TransactionUtil.buildAddLiquidityFixTokenArgs(newTx, sdk, allCoins, liquidityParams, coinAInputs, coinBInputs)\n        return transaction\n      }\n    }\n    return transaction\n  }\n\n  /**\n   * Builds basic add liquidity transaction\n   * @param sdk - SDK instance\n   * @param allCoinAssets - All available coin assets\n   * @param liquidityParams - Parameters for adding liquidity\n   * @param transaction - Optional existing transaction\n   * @param inputCoinA - Optional pre-built coin A input\n   * @param inputCoinB - Optional pre-built coin B input\n   * @returns Transaction for adding liquidity\n   */\n  static async buildAddLiquidityFixToken(\n    sdk: SDK,\n    allCoinAssets: CoinAsset[],\n    liquidityParams: AddLiquidityFixTokenParams,\n    transaction?: Transaction,\n    inputCoinA?: TransactionObjectArgument,\n    inputCoinB?: TransactionObjectArgument\n  ): Promise<Transaction> {\n    if (sdk.senderAddress.length === 0) {\n      throw Error('SDK sender address is required but not configured')\n    }\n\n    transaction = transaction || new Transaction()\n\n    let coinAInputs: BuildCoinResult\n    let coinBInputs: BuildCoinResult\n\n    if (inputCoinA == null || inputCoinB == null) {\n      coinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n        transaction,\n        !liquidityParams.fix_amount_a,\n        liquidityParams.amount_a,\n        liquidityParams.slippage,\n        liquidityParams.coinTypeA,\n        allCoinAssets,\n        false,\n        true\n      )\n      coinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n        transaction,\n        liquidityParams.fix_amount_a,\n        liquidityParams.amount_b,\n        liquidityParams.slippage,\n        liquidityParams.coinTypeB,\n        allCoinAssets,\n        false,\n        true\n      )\n    } else {\n      coinAInputs = {\n        targetCoin: inputCoinA,\n        remainCoins: [],\n        isMintZeroCoin: false,\n        tragetCoinAmount: '0',\n      }\n      coinBInputs = {\n        targetCoin: inputCoinB,\n        remainCoins: [],\n        isMintZeroCoin: false,\n        tragetCoinAmount: '0',\n      }\n    }\n\n    transaction = TransactionUtil.buildAddLiquidityFixTokenArgs(\n      transaction,\n      sdk,\n      allCoinAssets,\n      liquidityParams as AddLiquidityFixTokenParams,\n      coinAInputs,\n      coinBInputs\n    )\n    return transaction\n  }\n\n  /**\n   * Builds coin input for add liquidity operations with slippage handling\n   * @param transaction - Transaction to modify\n   * @param needIntervalAmount - Whether amount needs interval calculation\n   * @param amount - Amount to use\n   * @param slippageRate - Slippage rate\n   * @param coinType - Type of coin\n   * @param allCoinAssets - Available coin assets\n   * @param buildVector - Whether to build as vector\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Built coin result\n   */\n  public static buildAddLiquidityFixTokenCoinInput(\n    transaction: Transaction,\n    needIntervalAmount: boolean,\n    amount: number | string,\n    slippageRate: number,\n    coinType: string,\n    allCoinAssets: CoinAsset[],\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    return needIntervalAmount\n      ? TransactionUtil.buildCoinForAmountInterval(\n          transaction,\n          allCoinAssets,\n          { amountSecond: BigInt(reverseSlippageAmount(amount, slippageRate)), amountFirst: BigInt(amount) },\n          coinType,\n          buildVector,\n          fixAmount\n        )\n      : TransactionUtil.buildCoinForAmount(transaction, allCoinAssets, BigInt(amount), coinType, buildVector, fixAmount)\n  }\n\n  /**\n   * Adjusts liquidity parameters based on current pool state\n   * @param liquidityParams - Original liquidity parameters\n   * @param slippageRate - Slippage tolerance\n   * @param currentSqrtPrice - Current pool sqrt price\n   * @returns Adjusted liquidity parameters\n   */\n  static fixAddLiquidityFixTokenParams(liquidityParams: AddLiquidityFixTokenParams, slippageRate: number, currentSqrtPrice: BN): AddLiquidityFixTokenParams {\n    const fixedCoinAmount = liquidityParams.fix_amount_a ? liquidityParams.amount_a : liquidityParams.amount_b\n    const liquidityCalculation = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(\n      Number(liquidityParams.tick_lower),\n      Number(liquidityParams.tick_upper),\n      new BN(fixedCoinAmount),\n      liquidityParams.fix_amount_a,\n      true,\n      slippageRate,\n      currentSqrtPrice\n    )\n\n    liquidityParams.amount_a = liquidityParams.fix_amount_a ? liquidityParams.amount_a : liquidityCalculation.tokenMaxA.toNumber()\n    liquidityParams.amount_b = liquidityParams.fix_amount_a ? liquidityCalculation.tokenMaxB.toNumber() : liquidityParams.amount_b\n\n    return liquidityParams\n  }\n\n  /**\n   * Builds the core arguments for add liquidity transaction\n   * @param transaction - Transaction to modify\n   * @param sdk - SDK instance\n   * @param allCoinAssets - All available coin assets\n   * @param liquidityParams - Liquidity parameters\n   * @param coinAInputs - Coin A input result\n   * @param coinBInputs - Coin B input result\n   * @returns Transaction with liquidity arguments\n   */\n  private static buildAddLiquidityFixTokenArgs(\n    transaction: Transaction,\n    sdk: SDK,\n    allCoinAssets: CoinAsset[],\n    liquidityParams: AddLiquidityFixTokenParams,\n    coinAInputs: BuildCoinResult,\n    coinBInputs: BuildCoinResult\n  ) {\n    const typeArguments = [liquidityParams.coinTypeA, liquidityParams.coinTypeB]\n    const functionName = liquidityParams.is_open ? 'open_position_with_liquidity_by_fix_coin' : 'add_liquidity_by_fix_coin'\n    const { clmm_pool, integrate } = sdk.sdkOptions\n\n    if (!liquidityParams.is_open) {\n      transaction = TransactionUtil.createCollectRewarderAndFeeParams(\n        sdk,\n        transaction,\n        liquidityParams,\n        allCoinAssets,\n        coinAInputs.remainCoins,\n        coinBInputs.remainCoins\n      )\n    }\n\n    const clmmConfiguration = getPackagerConfigs(clmm_pool)\n    const transactionArgs = liquidityParams.is_open\n      ? [\n          transaction.object(clmmConfiguration.global_config_id),\n          transaction.object(liquidityParams.pool_id),\n          transaction.pure.u32(Number(asUintN(BigInt(liquidityParams.tick_lower)).toString())),\n          transaction.pure.u32(Number(asUintN(BigInt(liquidityParams.tick_upper)).toString())),\n          coinAInputs.targetCoin,\n          coinBInputs.targetCoin,\n          transaction.pure.u64(liquidityParams.amount_a),\n          transaction.pure.u64(liquidityParams.amount_b),\n          transaction.pure.u64(liquidityParams.lock_until ?? 0),\n          transaction.pure.bool(liquidityParams.fix_amount_a),\n          transaction.object(CLOCK_ADDRESS),\n        ]\n      : [\n          transaction.object(clmmConfiguration.global_config_id),\n          transaction.object(liquidityParams.pool_id),\n          transaction.object(liquidityParams.pos_id),\n          coinAInputs.targetCoin,\n          coinBInputs.targetCoin,\n          transaction.pure.u64(liquidityParams.amount_a),\n          transaction.pure.u64(liquidityParams.amount_b),\n          transaction.pure.bool(liquidityParams.fix_amount_a),\n          transaction.object(CLOCK_ADDRESS),\n        ]\n\n    transaction.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolModule}::${functionName}`,\n      typeArguments,\n      arguments: transactionArgs,\n    })\n    return transaction\n  }\n\n  // -------------------------------------------swap--------------------------------------------------//\n  /**\n   * Builds swap transaction with gas optimization for SUI tokens\n   * @param sdk - SDK instance\n   * @param swapParams - Parameters for swap\n   * @param allCoinAssets - All available coin assets\n   * @param gasEstimationConfig - Gas estimation configuration\n   * @returns Gas-optimized swap transaction\n   */\n  static async buildSwapTransactionForGas(\n    sdk: SDK,\n    swapParams: SwapParams,\n    allCoinAssets: CoinAsset[],\n    gasEstimationConfig: {\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 transaction = TransactionUtil.buildSwapTransaction(sdk, swapParams, allCoinAssets)\n    transaction.setSender(sdk.senderAddress)\n\n    const gasAdjustmentResult = await TransactionUtil.adjustTransactionForGas(\n      sdk,\n      CoinAssist.getCoinAssets(swapParams.a2b ? swapParams.coinTypeA : swapParams.coinTypeB, allCoinAssets),\n      BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit),\n      transaction\n    )\n\n    const { fixAmount, newTx } = gasAdjustmentResult\n\n    if (newTx !== undefined) {\n      newTx.setSender(sdk.senderAddress)\n      if (swapParams.by_amount_in) {\n        swapParams.amount = fixAmount.toString()\n      } else {\n        swapParams.amount_limit = fixAmount.toString()\n      }\n      swapParams = await TransactionUtil.fixSwapParams(sdk, swapParams, gasEstimationConfig)\n\n      const coinAInput = TransactionUtil.buildCoinForAmount(\n        transaction,\n        allCoinAssets,\n        swapParams.a2b ? BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit) : BigInt(0),\n        swapParams.coinTypeA\n      )\n\n      const coinBInput = TransactionUtil.buildCoinForAmount(\n        transaction,\n        allCoinAssets,\n        swapParams.a2b ? BigInt(0) : BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit),\n        swapParams.coinTypeB\n      )\n\n      transaction = TransactionUtil.buildSwapTransactionArgs(newTx, swapParams, sdk.sdkOptions, coinAInput, coinBInput)\n    }\n\n    return transaction\n  }\n\n  /**\n   * Builds basic swap transaction\n   * @param sdk - SDK instance\n   * @param swapParams - Parameters for swap\n   * @param allCoinAssets - All available coin assets\n   * @returns Swap transaction\n   */\n  static buildSwapTransaction(sdk: SDK, swapParams: SwapParams, allCoinAssets: CoinAsset[]): Transaction {\n    let transaction = new Transaction()\n    transaction.setSender(sdk.senderAddress)\n\n    const coinAInput = TransactionUtil.buildCoinForAmount(\n      transaction,\n      allCoinAssets,\n      swapParams.a2b ? BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit) : BigInt(0),\n      swapParams.coinTypeA,\n      false\n    )\n\n    const coinBInput = TransactionUtil.buildCoinForAmount(\n      transaction,\n      allCoinAssets,\n      swapParams.a2b ? BigInt(0) : BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit),\n      swapParams.coinTypeB,\n      false\n    )\n\n    transaction = TransactionUtil.buildSwapTransactionArgs(transaction, swapParams, sdk.sdkOptions, coinAInput, coinBInput)\n    return transaction\n  }\n\n  /**\n   * Builds the core arguments for swap transaction\n   * @param transaction - Transaction to modify\n   * @param swapParams - Swap parameters\n   * @param sdkOptions - SDK configuration options\n   * @param coinAInput - Coin A input result\n   * @param coinBInput - Coin B input result\n   * @returns Transaction with swap arguments\n   */\n  static buildSwapTransactionArgs(\n    transaction: Transaction,\n    swapParams: SwapParams,\n    sdkOptions: SdkOptions,\n    coinAInput: BuildCoinResult,\n    coinBInput: BuildCoinResult\n  ): Transaction {\n    const { clmm_pool, integrate } = sdkOptions\n\n    const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapParams.a2b)\n    const typeArguments = [swapParams.coinTypeA, swapParams.coinTypeB]\n    const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n    if (global_config_id === undefined) {\n      throw Error('CLMM global config ID is undefined')\n    }\n\n    const hasSwapPartner = swapParams.swap_partner !== undefined\n\n    const functionName = hasSwapPartner\n      ? swapParams.a2b\n        ? 'swap_a2b_with_partner'\n        : 'swap_b2a_with_partner'\n      : swapParams.a2b\n      ? 'swap_a2b'\n      : 'swap_b2a'\n\n    const transactionArgs = hasSwapPartner\n      ? [\n          transaction.object(global_config_id),\n          transaction.object(swapParams.pool_id),\n          transaction.object(swapParams.swap_partner!),\n          coinAInput.targetCoin,\n          coinBInput.targetCoin,\n          transaction.pure.bool(swapParams.by_amount_in),\n          transaction.pure.u64(swapParams.amount),\n          transaction.pure.u64(swapParams.amount_limit),\n          transaction.pure.u128(sqrtPriceLimit.toString()),\n          transaction.object(CLOCK_ADDRESS),\n        ]\n      : [\n          transaction.object(global_config_id),\n          transaction.object(swapParams.pool_id),\n          coinAInput.targetCoin,\n          coinBInput.targetCoin,\n          transaction.pure.bool(swapParams.by_amount_in),\n          transaction.pure.u64(swapParams.amount),\n          transaction.pure.u64(swapParams.amount_limit),\n          transaction.pure.u128(sqrtPriceLimit.toString()),\n          transaction.object(CLOCK_ADDRESS),\n        ]\n\n    transaction.moveCall({\n      target: `${integrate.published_at}::${ClmmIntegratePoolModule}::${functionName}`,\n      typeArguments,\n      arguments: transactionArgs,\n    })\n    return transaction\n  }\n\n  // -------------------------------------swap-without-transfer-coin-----------------------------------------//\n  /**\n   * Builds swap transaction without automatic coin transfers, with gas optimization\n   * @param sdk - SDK instance\n   * @param swapParams - Parameters for swap\n   * @param allCoinAssets - All available coin assets\n   * @param gasEstimationConfig - Gas estimation configuration\n   * @returns Object containing transaction and coin arguments for manual handling\n   */\n  static async buildSwapTransactionWithoutTransferCoinsForGas(\n    sdk: SDK,\n    swapParams: SwapParams,\n    allCoinAssets: CoinAsset[],\n    gasEstimationConfig: {\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, swapParams, allCoinAssets)\n    tx.setSender(sdk.senderAddress)\n\n    const gasAdjustmentResult = await TransactionUtil.adjustTransactionForGas(\n      sdk,\n      CoinAssist.getCoinAssets(swapParams.a2b ? swapParams.coinTypeA : swapParams.coinTypeB, allCoinAssets),\n      BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit),\n      tx\n    )\n\n    const { fixAmount, newTx } = gasAdjustmentResult\n\n    if (newTx !== undefined) {\n      newTx.setSender(sdk.senderAddress)\n      if (swapParams.by_amount_in) {\n        swapParams.amount = fixAmount.toString()\n      } else {\n        swapParams.amount_limit = fixAmount.toString()\n      }\n      swapParams = await TransactionUtil.fixSwapParams(sdk, swapParams, gasEstimationConfig)\n\n      const coinAInput = TransactionUtil.buildCoinForAmount(\n        tx,\n        allCoinAssets,\n        swapParams.a2b ? BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit) : BigInt(0),\n        swapParams.coinTypeA,\n        false,\n        true\n      )\n\n      const coinBInput = TransactionUtil.buildCoinForAmount(\n        tx,\n        allCoinAssets,\n        swapParams.a2b ? BigInt(0) : BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit),\n        swapParams.coinTypeB,\n        false,\n        true\n      )\n\n      const swapResult = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n        sdk,\n        newTx,\n        swapParams,\n        sdk.sdkOptions,\n        coinAInput,\n        coinBInput\n      )\n      tx = swapResult.tx\n      coinABs = swapResult.txRes\n    }\n\n    return { tx, coinABs }\n  }\n\n  /**\n   * Builds swap transaction without automatic coin transfers\n   * @param sdk - SDK instance\n   * @param swapParams - Parameters for swap\n   * @param allCoinAssets - All available coin assets\n   * @returns Object containing transaction and coin arguments for manual handling\n   */\n  static buildSwapTransactionWithoutTransferCoins(\n    sdk: SDK,\n    swapParams: SwapParams,\n    allCoinAssets: CoinAsset[]\n  ): { tx: Transaction; coinABs: TransactionObjectArgument[] } {\n    const transaction = new Transaction()\n    transaction.setSender(sdk.senderAddress)\n\n    // Fixed amount must be set to true to support amount limits\n    const coinAInput = TransactionUtil.buildCoinForAmount(\n      transaction,\n      allCoinAssets,\n      swapParams.a2b ? BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit) : BigInt(0),\n      swapParams.coinTypeA,\n      false,\n      true\n    )\n\n    const coinBInput = TransactionUtil.buildCoinForAmount(\n      transaction,\n      allCoinAssets,\n      swapParams.a2b ? BigInt(0) : BigInt(swapParams.by_amount_in ? swapParams.amount : swapParams.amount_limit),\n      swapParams.coinTypeB,\n      false,\n      true\n    )\n\n    const swapResult = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n      sdk,\n      transaction,\n      swapParams,\n      sdk.sdkOptions,\n      coinAInput,\n      coinBInput\n    )\n    return { tx: swapResult.tx, coinABs: swapResult.txRes }\n  }\n\n  /**\n   * Builds swap transaction arguments without automatic transfers\n   * @param sdk - SDK instance\n   * @param transaction - Transaction to modify\n   * @param swapParams - Swap parameters\n   * @param sdkOptions - SDK configuration options\n   * @param coinAInput - Coin A input result\n   * @param coinBInput - Coin B input result\n   * @returns Object containing transaction and resulting coin arguments\n   */\n  static buildSwapTransactionWithoutTransferCoinArgs(\n    sdk: SDK,\n    transaction: Transaction,\n    swapParams: SwapParams,\n    sdkOptions: SdkOptions,\n    coinAInput: BuildCoinResult,\n    coinBInput: BuildCoinResult\n  ): { tx: Transaction; txRes: TransactionObjectArgument[] } {\n    const { clmm_pool, integrate } = sdkOptions\n\n    const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapParams.a2b)\n\n    const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n    if (global_config_id === undefined) {\n      throw Error('CLMM global config ID is undefined')\n    }\n\n    const hasSwapPartner = swapParams.swap_partner !== undefined\n\n    const functionName = hasSwapPartner ? 'swap_with_partner' : 'swap'\n\n    const moduleName = hasSwapPartner ? ClmmIntegrateRouterWithPartnerModule : ClmmIntegrateRouterModule\n\n    const transactionArgs = hasSwapPartner\n      ? [\n          transaction.object(global_config_id),\n          transaction.object(swapParams.pool_id),\n          transaction.object(swapParams.swap_partner!),\n          coinAInput.targetCoin,\n          coinBInput.targetCoin,\n          transaction.pure.bool(swapParams.a2b),\n          transaction.pure.bool(swapParams.by_amount_in),\n          transaction.pure.u64(swapParams.amount),\n          transaction.pure.u128(sqrtPriceLimit.toString()),\n          transaction.pure.bool(false), // use coin value always set false\n          transaction.object(CLOCK_ADDRESS),\n        ]\n      : [\n          transaction.object(global_config_id),\n          transaction.object(swapParams.pool_id),\n          coinAInput.targetCoin,\n          coinBInput.targetCoin,\n          transaction.pure.bool(swapParams.a2b),\n          transaction.pure.bool(swapParams.by_amount_in),\n          transaction.pure.u64(swapParams.amount),\n          transaction.pure.u128(sqrtPriceLimit.toString()),\n          transaction.pure.bool(false), // use coin value always set false\n          transaction.object(CLOCK_ADDRESS),\n        ]\n\n    const typeArguments = [swapParams.coinTypeA, swapParams.coinTypeB]\n    const resultingCoins: TransactionObjectArgument[] = transaction.moveCall({\n      target: `${integrate.published_at}::${moduleName}::${functionName}`,\n      typeArguments,\n      arguments: transactionArgs,\n    })\n\n    if (swapParams.by_amount_in) {\n      const outputCoinType = swapParams.a2b ? swapParams.coinTypeB : swapParams.coinTypeA\n      const outputCoin = swapParams.a2b ? resultingCoins[1] : resultingCoins[0]\n      const minimumOutputAmount = Number(swapParams.amount_limit)\n      this.checkCoinThreshold(sdk, swapParams.by_amount_in, transaction, outputCoin, minimumOutputAmount, outputCoinType)\n    }\n\n    return { tx: transaction, txRes: resultingCoins }\n  }\n\n  /**\n   * Fixes swap parameters by recalculating limits based on current pool state\n   * @param sdk - SDK instance\n   * @param swapParams - Original swap parameters\n   * @param gasEstimationConfig - Gas estimation configuration\n   * @returns Updated swap parameters with correct limits\n   */\n  static async fixSwapParams(\n    sdk: SDK,\n    swapParams: SwapParams,\n    gasEstimationConfig: {\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 } = gasEstimationConfig\n    try {\n      const preSwapResult: any = await sdk.Swap.preswap({\n        decimalsA: gasEstimationConfig.decimalsA,\n        decimalsB: gasEstimationConfig.decimalsB,\n        a2b: swapParams.a2b,\n        byAmountIn: swapParams.by_amount_in,\n        amount: swapParams.amount,\n        pool: currentPool,\n        currentSqrtPrice: currentPool.current_sqrt_price,\n        coinTypeA: currentPool.coinTypeA,\n        coinTypeB: currentPool.coinTypeB,\n      })\n\n      const expectedAmount = gasEstimationConfig.byAmountIn ? preSwapResult.estimatedAmountOut : preSwapResult.estimatedAmountIn\n\n      const slippageAdjustedLimit = adjustForSlippage(expectedAmount, gasEstimationConfig.slippage, !gasEstimationConfig.byAmountIn)\n      swapParams.amount_limit = slippageAdjustedLimit.toString()\n    } catch (error) {\n      console.log('fixSwapParams error:', error)\n    }\n\n    return swapParams\n  }\n\n  /**\n   * Asynchronously builds coin input for a specific amount\n   * @param sdk - SDK instance\n   * @param transaction - Transaction to modify\n   * @param amount - Amount to build coin for\n   * @param coinType - Type of coin\n   * @param buildVector - Whether to build as vector\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Transaction object argument or undefined\n   */\n  public static async syncBuildCoinInputForAmount(\n    sdk: SDK,\n    transaction: 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('SDK sender address is required but not configured')\n    }\n\n    const userCoins = await sdk.getOwnerCoinAssets(sdk.senderAddress, coinType)\n    const coinInput: any = TransactionUtil.buildCoinForAmount(transaction, userCoins, amount, coinType, buildVector, fixAmount)!.targetCoin\n\n    return coinInput\n  }\n\n  /**\n   * Builds coin input for a specific amount from available assets\n   * @param transaction - Transaction to modify\n   * @param availableCoins - Available coin assets\n   * @param amount - Amount to build coin for\n   * @param coinType - Type of coin\n   * @param buildVector - Whether to build as vector\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Built coin result\n   */\n  public static buildCoinForAmount(\n    transaction: Transaction,\n    availableCoins: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    const filteredCoinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, availableCoins)\n\n    // Handle zero amount by minting zero coin\n    if (amount === BigInt(0)) {\n      return TransactionUtil.buildZeroValueCoin(availableCoins, transaction, coinType, buildVector)\n    }\n\n    const totalAvailableAmount = CoinAssist.calculateTotalBalance(filteredCoinAssets)\n    if (totalAvailableAmount < amount) {\n      throw new ClmmpoolsError(\n        `Insufficient balance: available ${totalAvailableAmount} for ${coinType}, required ${amount}`,\n        UtilsErrorCode.InsufficientBalance\n      )\n    }\n\n    return TransactionUtil.buildCoin(transaction, availableCoins, filteredCoinAssets, amount, coinType, buildVector, fixAmount)\n  }\n\n  /**\n   * Builds coin with specific balance using coinWithBalance utility\n   * @param amount - Amount for the coin\n   * @param coinType - Type of coin\n   * @returns Transaction object argument for the coin\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  /**\n   * Builds vector of coins for transaction use\n   * @param transaction - Transaction to modify\n   * @param availableCoins - All available coin assets\n   * @param targetCoinAssets - Target coin assets to use\n   * @param amount - Amount needed\n   * @param coinType - Type of coin\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Built coin result as vector\n   */\n  private static buildVectorCoin(\n    transaction: Transaction,\n    availableCoins: CoinAsset[],\n    targetCoinAssets: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    fixAmount = true\n  ) {\n    if (CoinAssist.isSuiCoin(coinType)) {\n      const splitCoin = transaction.splitCoins(transaction.gas, [transaction.pure.u64(amount)])\n      return {\n        targetCoin: transaction.makeMoveVec({ elements: [splitCoin] }),\n        remainCoins: availableCoins,\n        tragetCoinAmount: amount.toString(),\n        isMintZeroCoin: false,\n        originalSplitedCoin: transaction.gas,\n      }\n    }\n\n    const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult, coinObjectIds } = this.buildSplitTargetCoin(\n      transaction,\n      amount,\n      targetCoinAssets,\n      fixAmount\n    )\n\n    if (fixAmount) {\n      return {\n        targetCoin: transaction.makeMoveVec({ elements: [targetCoin] }),\n        remainCoins: selectedCoinsResult.remainCoins,\n        originalSplitedCoin,\n        tragetCoinAmount,\n        isMintZeroCoin: false,\n      }\n    }\n\n    return {\n      targetCoin: transaction.makeMoveVec({ elements: coinObjectIds.map((id) => transaction.object(id)) }),\n      remainCoins: selectedCoinsResult.remainCoins,\n      tragetCoinAmount: selectedCoinsResult.amountArray.reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0).toString(),\n      isMintZeroCoin: false,\n    }\n  }\n\n  /**\n   * Builds single coin for transaction use\n   * @param transaction - Transaction to modify\n   * @param targetCoinAssets - Target coin assets to use\n   * @param amount - Amount needed\n   * @param coinType - Type of coin\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Built coin result as single coin\n   */\n  private static buildOneCoin(transaction: Transaction, targetCoinAssets: CoinAsset[], amount: bigint, coinType: string, fixAmount = true) {\n    if (CoinAssist.isSuiCoin(coinType)) {\n      if (amount === 0n && targetCoinAssets.length > 1) {\n        const coinSelection = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(targetCoinAssets, amount)\n        return {\n          targetCoin: transaction.object(coinSelection.objectArray[0]),\n          remainCoins: coinSelection.remainCoins,\n          tragetCoinAmount: coinSelection.amountArray[0],\n          isMintZeroCoin: false,\n        }\n      }\n      const coinSelection = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(targetCoinAssets, amount)\n      const splitCoin = transaction.splitCoins(transaction.gas, [transaction.pure.u64(amount)])\n      return {\n        targetCoin: splitCoin,\n        remainCoins: coinSelection.remainCoins,\n        tragetCoinAmount: amount.toString(),\n        isMintZeroCoin: false,\n        originalSplitedCoin: transaction.gas,\n      }\n    }\n\n    const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult } = this.buildSplitTargetCoin(\n      transaction,\n      amount,\n      targetCoinAssets,\n      fixAmount\n    )\n\n    return {\n      targetCoin,\n      remainCoins: selectedCoinsResult.remainCoins,\n      originalSplitedCoin,\n      tragetCoinAmount,\n      isMintZeroCoin: false,\n    }\n  }\n\n  /**\n   * Builds split target coin by merging and splitting as needed\n   * @param transaction - Transaction to modify\n   * @param amount - Amount needed\n   * @param targetCoinAssets - Coin assets to use\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Split coin result with metadata\n   */\n  private static buildSplitTargetCoin(transaction: Transaction, amount: bigint, targetCoinAssets: CoinAsset[], fixAmount: boolean) {\n    const coinSelection = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(targetCoinAssets, amount)\n    const totalSelectedAmount = coinSelection.amountArray.reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0).toString()\n    const coinObjectIds = coinSelection.objectArray\n\n    const [primaryCoinId, ...mergeCoins] = coinObjectIds\n    const primaryCoinObject = transaction.object(primaryCoinId)\n\n    let targetCoin: any = primaryCoinObject\n    const targetCoinAmount = coinSelection.amountArray.reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0).toString()\n    let originalSplitedCoin\n\n    if (mergeCoins.length > 0) {\n      transaction.mergeCoins(\n        primaryCoinObject,\n        mergeCoins.map((coinId) => transaction.object(coinId))\n      )\n    }\n\n    if (fixAmount && Number(totalSelectedAmount) > Number(amount)) {\n      targetCoin = transaction.splitCoins(primaryCoinObject, [transaction.pure.u64(amount)])\n      originalSplitedCoin = primaryCoinObject\n    }\n\n    return {\n      originalSplitedCoin,\n      targetCoin,\n      tragetCoinAmount: targetCoinAmount,\n      selectedCoinsResult: coinSelection,\n      coinObjectIds,\n    }\n  }\n\n  /**\n   * Generic coin building method that delegates to vector or single coin building\n   * @param transaction - Transaction to modify\n   * @param availableCoins - All available coin assets\n   * @param targetCoinAssets - Target coin assets to use\n   * @param amount - Amount needed\n   * @param coinType - Type of coin\n   * @param buildVector - Whether to build as vector\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Built coin result\n   */\n  private static buildCoin(\n    transaction: Transaction,\n    availableCoins: CoinAsset[],\n    targetCoinAssets: CoinAsset[],\n    amount: bigint,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    if (buildVector) {\n      return this.buildVectorCoin(transaction, availableCoins, targetCoinAssets, amount, coinType, fixAmount)\n    }\n\n    return this.buildOneCoin(transaction, targetCoinAssets, amount, coinType, fixAmount)\n  }\n\n  /**\n   * Builds zero-value coin for cases where no amount is needed\n   * @param availableCoins - All available coin assets\n   * @param transaction - Transaction to modify\n   * @param coinType - Type of coin to mint\n   * @param buildVector - Whether to build as vector\n   * @returns Built zero coin result\n   */\n  private static buildZeroValueCoin(availableCoins: CoinAsset[], transaction: Transaction, coinType: string, buildVector = true): BuildCoinResult {\n    const zeroCoin = TransactionUtil.callMintZeroValueCoin(transaction, coinType)\n    let targetCoin: any\n\n    if (buildVector) {\n      targetCoin = transaction.makeMoveVec({ elements: [zeroCoin] })\n    } else {\n      targetCoin = zeroCoin\n    }\n\n    return {\n      targetCoin,\n      remainCoins: availableCoins,\n      isMintZeroCoin: true,\n      tragetCoinAmount: '0',\n    }\n  }\n\n  /**\n   * Builds coin for amount with interval support (for slippage handling)\n   * @param transaction - Transaction to modify\n   * @param availableCoins - All available coin assets\n   * @param amounts - Amount interval with first and second options\n   * @param coinType - Type of coin\n   * @param buildVector - Whether to build as vector\n   * @param fixAmount - Whether to fix amount exactly\n   * @returns Built coin result using interval logic\n   */\n  public static buildCoinForAmountInterval(\n    transaction: Transaction,\n    availableCoins: CoinAsset[],\n    amounts: CoinInputInterval,\n    coinType: string,\n    buildVector = true,\n    fixAmount = true\n  ): BuildCoinResult {\n    const targetCoinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, availableCoins)\n\n    if (amounts.amountFirst === BigInt(0)) {\n      if (targetCoinAssets.length > 0) {\n        return TransactionUtil.buildCoin(transaction, [...availableCoins], [...targetCoinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n      }\n      return TransactionUtil.buildZeroValueCoin(availableCoins, transaction, coinType, buildVector)\n    }\n\n    const totalAvailableAmount = CoinAssist.calculateTotalBalance(targetCoinAssets)\n\n    if (totalAvailableAmount >= amounts.amountFirst) {\n      return TransactionUtil.buildCoin(transaction, [...availableCoins], [...targetCoinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n    }\n\n    if (totalAvailableAmount < amounts.amountSecond) {\n      throw new ClmmpoolsError(\n        `Insufficient balance: available ${totalAvailableAmount} for ${coinType}, required ${amounts.amountSecond}`,\n        UtilsErrorCode.InsufficientBalance\n      )\n    }\n\n    return TransactionUtil.buildCoin(transaction, [...availableCoins], [...targetCoinAssets], amounts.amountSecond, coinType, buildVector, fixAmount)\n  }\n\n  /**\n   * Calls the Move function to mint a zero-value coin\n   * @param transaction - Transaction to modify\n   * @param coinType - Type of coin to mint\n   * @returns Transaction object argument for zero coin\n   */\n  static callMintZeroValueCoin = (transaction: Transaction, coinType: string) => {\n    return transaction.moveCall({\n      target: '0x2::coin::zero',\n      typeArguments: [coinType],\n    })\n  }\n\n  // ------------------------------------------router-v1-------------------------------------------------//\n  /**\n   * Builds router swap transaction for multi-path swapping\n   * @param sdk - SDK instance\n   * @param routerParams - Router swap parameters\n   * @param isAmountIn - Whether amount is input (true) or output (false)\n   * @param allCoinAssets - All available coin assets\n   * @param recipient - Optional recipient address for transfers\n   * @returns Router swap transaction\n   */\n  public static async buildRouterSwapTransaction(\n    sdk: SDK,\n    routerParams: SwapWithRouterParams,\n    isAmountIn: boolean,\n    allCoinAssets: CoinAsset[],\n    recipient?: string\n  ): Promise<Transaction> {\n    let transaction = new Transaction()\n\n    // Router cannot support partners when split path length exceeds 1\n    // Router v1 returns one best path; router v2 must set allow split to false\n    if (routerParams.paths.length > 1) {\n      routerParams.partner = ''\n    }\n\n    transaction = await this.buildRouterBasePathTx(sdk, routerParams, isAmountIn, allCoinAssets, transaction, recipient)\n    return transaction\n  }\n\n  /**\n   * Builds the base path transaction for router swaps\n   * @param sdk - SDK instance\n   * @param routerParams - Router swap parameters\n   * @param isAmountIn - Whether amount is input\n   * @param allCoinAssets - All available coin assets\n   * @param transaction - Transaction to modify\n   * @param recipient - Optional recipient address\n   * @returns Modified transaction with router swap logic\n   */\n  static async buildRouterBasePathTx(\n    sdk: SDK,\n    routerParams: SwapWithRouterParams,\n    isAmountIn: boolean,\n    allCoinAssets: CoinAsset[],\n    transaction: Transaction,\n    recipient?: string\n  ) {\n    const validSwapPaths = routerParams.paths.filter((path) => path && path.poolAddress)\n    const totalInputAmount = Number(validSwapPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n    const totalOutputAmount = Number(validSwapPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n    const slippageAdjustedLimit = isAmountIn\n      ? Math.round(Number(totalOutputAmount.toString()) * (1 - routerParams.priceSlippagePoint))\n      : Math.round(Number(totalInputAmount.toString()) * (1 + routerParams.priceSlippagePoint))\n\n    const sourceCoinType = routerParams.paths[0].coinType[0]\n    const targetCoinType = routerParams.paths[0].coinType[routerParams.paths[0].coinType.length - 1]\n\n    // When fixing amount out, fromCoin amount must be set to limit for slippage support\n    const sourceCoinBuildResult = TransactionUtil.buildCoinForAmount(\n      transaction,\n      allCoinAssets,\n      isAmountIn ? BigInt(totalInputAmount) : BigInt(slippageAdjustedLimit),\n      sourceCoinType,\n      false,\n      true\n    )\n    const hasSplitSourceCoin = sourceCoinBuildResult.originalSplitedCoin !== undefined\n    const targetCoinBuildResult = TransactionUtil.buildCoinForAmount(transaction, allCoinAssets, 0n, targetCoinType, false)\n\n    const routerSwapResult = await this.buildRouterBasePathReturnCoins(\n      sdk,\n      routerParams,\n      isAmountIn,\n      sourceCoinBuildResult,\n      targetCoinBuildResult,\n      transaction\n    )\n\n    const coinsToTransfer: TransferredCoin[] = []\n    const { toCoin, fromCoin } = routerSwapResult\n    transaction = routerSwapResult.tx\n\n    if (targetCoinBuildResult.isMintZeroCoin) {\n      coinsToTransfer.push({\n        coinType: targetCoinType,\n        coin: toCoin,\n      })\n    } else if (targetCoinBuildResult.originalSplitedCoin !== undefined) {\n      transaction.mergeCoins(targetCoinBuildResult.originalSplitedCoin!, [toCoin])\n    } else {\n      transaction.mergeCoins(targetCoinBuildResult.targetCoin, [toCoin])\n    }\n\n    if (hasSplitSourceCoin) {\n      const originalSourceCoin = sourceCoinBuildResult?.originalSplitedCoin as TransactionObjectArgument\n      transaction.mergeCoins(originalSourceCoin, [fromCoin])\n    } else {\n      coinsToTransfer.push({\n        coinType: sourceCoinType,\n        coin: fromCoin,\n      })\n    }\n\n    for (let transferIndex = 0; transferIndex < coinsToTransfer.length; transferIndex++) {\n      this.buildTransferCoin(sdk, transaction, coinsToTransfer[transferIndex].coin, coinsToTransfer[transferIndex].coinType, recipient)\n    }\n\n    return transaction\n  }\n\n  /**\n   * Builds router swap operations and returns resulting coins\n   * @param sdk - SDK instance\n   * @param routerParams - Router swap parameters\n   * @param isAmountIn - Whether amount is input\n   * @param sourceCoinResult - Source coin build result\n   * @param targetCoinResult - Target coin build result\n   * @param transaction - Transaction to modify\n   * @returns Object with resulting coins and modified transaction\n   */\n  static async buildRouterBasePathReturnCoins(\n    sdk: SDK,\n    routerParams: SwapWithRouterParams,\n    isAmountIn: boolean,\n    sourceCoinResult: BuildCoinResult,\n    targetCoinResult: BuildCoinResult,\n    transaction: Transaction\n  ) {\n    const { clmm_pool, integrate } = sdk.sdkOptions\n    const globalConfigId = getPackagerConfigs(clmm_pool).global_config_id\n\n    const validSwapPaths = routerParams.paths.filter((path) => path && path.poolAddress)\n\n    const totalInputAmount = Number(validSwapPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n    const totalOutputAmount = Number(validSwapPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n    const slippageAdjustedLimit = isAmountIn\n      ? Math.round(Number(totalOutputAmount.toString()) * (1 - routerParams.priceSlippagePoint))\n      : Math.round(Number(totalInputAmount.toString()) * (1 + routerParams.priceSlippagePoint))\n\n    const sourceCoinType = routerParams.paths[0].coinType[0]\n    const targetCoinType = routerParams.paths[0].coinType[routerParams.paths[0].coinType.length - 1]\n\n    let sourceCoin = sourceCoinResult.targetCoin as TransactionObjectArgument\n    let targetCoin\n    if (targetCoinResult.isMintZeroCoin || targetCoinResult.originalSplitedCoin !== undefined) {\n      targetCoin = targetCoinResult.targetCoin as TransactionObjectArgument\n    } else {\n      targetCoin = TransactionUtil.callMintZeroValueCoin(transaction, targetCoinType)\n    }\n\n    const hasPartner = routerParams.partner !== ''\n\n    const moduleToUse = hasPartner ? ClmmIntegrateRouterWithPartnerModule : ClmmIntegrateRouterModule\n\n    for (const swapPath of validSwapPaths) {\n      if (swapPath.poolAddress.length === 1) {\n        const isA2B = swapPath.a2b[0]\n        const swapParameters = {\n          amount: Number(swapPath.amountIn.toString()),\n          amountLimit: slippageAdjustedLimit,\n          poolCoinA: swapPath.a2b[0] ? sourceCoinType : targetCoinType,\n          poolCoinB: swapPath.a2b[0] ? targetCoinType : sourceCoinType,\n        }\n\n        const functionName = hasPartner ? 'swap_with_partner' : 'swap'\n\n        const coinA = isA2B ? sourceCoin : targetCoin\n        const coinB = isA2B ? targetCoin : sourceCoin\n        const swapAmount = isAmountIn ? swapPath.amountIn.toString() : swapPath.amountOut.toString()\n\n        const priceLimit = SwapUtils.getDefaultSqrtPriceLimit(isA2B).toString()\n        const transactionArgs: any = hasPartner\n          ? [\n              transaction.object(globalConfigId),\n              transaction.object(swapPath.poolAddress[0]),\n              transaction.object(routerParams.partner),\n              coinA,\n              coinB,\n              transaction.pure.bool(isA2B),\n              transaction.pure.bool(isAmountIn),\n              transaction.pure.u64(swapAmount),\n              transaction.pure.u128(priceLimit),\n              transaction.pure.bool(false),\n              transaction.object(CLOCK_ADDRESS),\n            ]\n          : [\n              transaction.object(globalConfigId),\n              transaction.object(swapPath.poolAddress[0]),\n              coinA,\n              coinB,\n              transaction.pure.bool(isA2B),\n              transaction.pure.bool(isAmountIn),\n              transaction.pure.u64(swapAmount),\n              transaction.pure.u128(priceLimit),\n              transaction.pure.bool(false),\n              transaction.object(CLOCK_ADDRESS),\n            ]\n\n        const typeArguments = [swapParameters.poolCoinA, swapParameters.poolCoinB]\n\n        const resultingCoins: TransactionObjectArgument[] = transaction.moveCall({\n          target: `${sdk.sdkOptions.integrate.published_at}::${moduleToUse}::${functionName}`,\n          typeArguments,\n          arguments: transactionArgs,\n        })\n        sourceCoin = isA2B ? resultingCoins[0] : resultingCoins[1]\n        targetCoin = isA2B ? resultingCoins[1] : resultingCoins[0]\n      } else {\n        const firstStepAmount = isAmountIn ? swapPath.amountIn : swapPath.rawAmountLimit[0]\n        const secondStepAmount = isAmountIn ? 0 : swapPath.amountOut\n\n        let functionName = ''\n        if (swapPath.a2b[0]) {\n          if (swapPath.a2b[1]) {\n            functionName = 'swap_ab_bc'\n          } else {\n            functionName = 'swap_ab_cb'\n          }\n        } else if (swapPath.a2b[1]) {\n          functionName = 'swap_ba_bc'\n        } else {\n          functionName = 'swap_ba_cb'\n        }\n\n        if (hasPartner) {\n          functionName = `${functionName}_with_partner`\n        }\n\n        const firstPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapPath.a2b[0])\n        const secondPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapPath.a2b[1])\n        const transactionArgs: any = hasPartner\n          ? [\n              transaction.object(globalConfigId),\n              transaction.object(swapPath.poolAddress[0]),\n              transaction.object(swapPath.poolAddress[1]),\n              transaction.object(routerParams.partner),\n              sourceCoin,\n              targetCoin,\n              transaction.pure.bool(isAmountIn),\n              transaction.pure.u64(firstStepAmount.toString()),\n              transaction.pure.u64(secondStepAmount.toString()),\n              transaction.pure.u128(firstPriceLimit.toString()),\n              transaction.pure.u128(secondPriceLimit.toString()),\n              transaction.object(CLOCK_ADDRESS),\n            ]\n          : [\n              transaction.object(globalConfigId),\n              transaction.object(swapPath.poolAddress[0]),\n              transaction.object(swapPath.poolAddress[1]),\n              sourceCoin,\n              targetCoin,\n              transaction.pure.bool(isAmountIn),\n              transaction.pure.u64(firstStepAmount.toString()),\n              transaction.pure.u64(secondStepAmount.toString()),\n              transaction.pure.u128(firstPriceLimit.toString()),\n              transaction.pure.u128(secondPriceLimit.toString()),\n              transaction.object(CLOCK_ADDRESS),\n            ]\n        const typeArguments = [swapPath.coinType[0], swapPath.coinType[1], swapPath.coinType[2]]\n        const swapResultCoins = transaction.moveCall({\n          target: `${integrate.published_at}::${moduleToUse}::${functionName}`,\n          typeArguments,\n          arguments: transactionArgs,\n        })\n        sourceCoin = swapResultCoins[0] as TransactionObjectArgument\n        targetCoin = swapResultCoins[1] as TransactionObjectArgument\n      }\n    }\n\n    this.checkCoinThreshold(sdk, isAmountIn, transaction, targetCoin, slippageAdjustedLimit, targetCoinType)\n    return { fromCoin: sourceCoin, toCoin: targetCoin, tx: transaction }\n  }\n\n  /**\n   * Validates that output coin meets minimum threshold requirements\n   * @param sdk - SDK instance\n   * @param isAmountIn - Whether amount is input\n   * @param transaction - Transaction to modify\n   * @param outputCoin - Coin to check\n   * @param minimumAmount - Minimum required amount\n   * @param coinType - Type of coin being checked\n   */\n  static checkCoinThreshold(\n    sdk: SDK,\n    isAmountIn: boolean,\n    transaction: Transaction,\n    outputCoin: TransactionObjectArgument,\n    minimumAmount: number,\n    coinType: string\n  ) {\n    if (isAmountIn) {\n      transaction.moveCall({\n        target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateRouterModule}::check_coin_threshold`,\n        typeArguments: [coinType],\n        arguments: [outputCoin, transaction.pure.u64(minimumAmount)],\n      })\n    }\n  }\n\n  /**\n   * Builds CLMM base path transaction for individual swap steps\n   * @param sdk - SDK instance\n   * @param basePath - Base path configuration\n   * @param transaction - Transaction to modify\n   * @param isAmountIn - Whether amount is input\n   * @param sourceCoin - Source coin argument\n   * @param targetCoin - Target coin argument\n   * @param isMiddleStep - Whether this is a middle step in multi-hop\n   * @param partnerAddress - Partner address for fees\n   * @returns Object with resulting coins and transaction\n   */\n  private static buildClmmBasePathTx(\n    sdk: SDK,\n    basePath: BasePath,\n    transaction: Transaction,\n    isAmountIn: boolean,\n    sourceCoin: TransactionObjectArgument,\n    targetCoin: TransactionObjectArgument,\n    isMiddleStep: boolean,\n    partnerAddress: string\n  ) {\n    const { clmm_pool, integrate } = sdk.sdkOptions\n    const globalConfigId = getPackagerConfigs(clmm_pool).global_config_id\n    let coinA = basePath.direction ? sourceCoin : targetCoin\n    let coinB = basePath.direction ? targetCoin : sourceCoin\n    const hasPartner = partnerAddress !== ''\n    const moduleToUse = hasPartner ? ClmmIntegrateRouterWithPartnerModule : ClmmIntegrateRouterModule\n    const functionName = hasPartner ? 'swap_with_partner' : 'swap'\n    const swapAmount = isAmountIn ? basePath.inputAmount.toString() : basePath.outputAmount.toString()\n    const priceLimit = SwapUtils.getDefaultSqrtPriceLimit(basePath.direction)\n\n    const transactionArgs: any = hasPartner\n      ? [\n          transaction.object(globalConfigId),\n          transaction.object(basePath.poolAddress),\n          transaction.object(partnerAddress),\n          coinA,\n          coinB,\n          transaction.pure.bool(basePath.direction),\n          transaction.pure.bool(isAmountIn),\n          transaction.pure.u64(swapAmount),\n          transaction.pure.u128(priceLimit.toString()),\n          transaction.pure.bool(isMiddleStep),\n          transaction.object(CLOCK_ADDRESS),\n        ]\n      : [\n          transaction.object(globalConfigId),\n          transaction.object(basePath.poolAddress),\n          coinA,\n          coinB,\n          transaction.pure.bool(basePath.direction),\n          transaction.pure.bool(isAmountIn),\n          transaction.pure.u64(swapAmount),\n          transaction.pure.u128(priceLimit.toString()),\n          transaction.pure.bool(isMiddleStep),\n          transaction.object(CLOCK_ADDRESS),\n        ]\n\n    const typeArguments = basePath.direction ? [basePath.fromCoin, basePath.toCoin] : [basePath.toCoin, basePath.fromCoin]\n\n    const resultingCoins: TransactionObjectArgument[] = transaction.moveCall({\n      target: `${integrate.published_at}::${moduleToUse}::${functionName}`,\n      typeArguments,\n      arguments: transactionArgs,\n    })\n\n    coinA = resultingCoins[0] as any\n    coinB = resultingCoins[1] as any\n\n    sourceCoin = basePath.direction ? coinA : coinB\n    targetCoin = basePath.direction ? coinB : coinA\n\n    return {\n      from: sourceCoin,\n      to: targetCoin,\n      tx: transaction,\n    }\n  }\n\n  /**\n   * Builds coin type pairs for multi-hop routing\n   * @param coinTypes - Array of coin types in the path\n   * @param partitionQuantities - Quantities for each partition\n   * @returns Array of coin type pairs for routing\n   */\n  static buildCoinTypePair(coinTypes: string[], partitionQuantities: number[]): string[][] {\n    const coinTypePairs: string[][] = []\n\n    if (coinTypes.length === 2) {\n      const directPair: string[] = []\n      directPair.push(coinTypes[0], coinTypes[1])\n      coinTypePairs.push(directPair)\n    } else {\n      const directRoutePair: string[] = []\n      directRoutePair.push(coinTypes[0], coinTypes[coinTypes.length - 1])\n      coinTypePairs.push(directRoutePair)\n\n      for (let pathIndex = 1; pathIndex < coinTypes.length - 1; pathIndex += 1) {\n        if (partitionQuantities[pathIndex - 1] === 0) {\n          continue\n        }\n        const intermediateRoutePair: string[] = []\n        intermediateRoutePair.push(coinTypes[0], coinTypes[pathIndex], coinTypes[coinTypes.length - 1])\n        coinTypePairs.push(intermediateRoutePair)\n      }\n    }\n    return coinTypePairs\n  }\n\n  // ------------------------------------------utils-------------------------------------------------//\n  /**\n   * Transfers coin to sender using Move call\n   * @param sdk - SDK instance\n   * @param transaction - Transaction to modify\n   * @param coinToTransfer - Coin to transfer\n   * @param coinType - Type of coin\n   */\n  static buildTransferCoinToSender(sdk: SDK, transaction: Transaction, coinToTransfer: TransactionObjectArgument, coinType: string) {\n    transaction.moveCall({\n      target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::transfer_coin_to_sender`,\n      typeArguments: [coinType],\n      arguments: [coinToTransfer],\n    })\n  }\n\n  /**\n   * Transfers coin to specified recipient or sender if no recipient provided\n   * @param sdk - SDK instance\n   * @param transaction - Transaction to modify\n   * @param coinToTransfer - Coin to transfer\n   * @param coinType - Type of coin\n   * @param recipient - Optional recipient address\n   */\n  static buildTransferCoin(sdk: SDK, transaction: Transaction, coinToTransfer: TransactionObjectArgument, coinType: string, recipient?: string) {\n    if (recipient != null) {\n      transaction.transferObjects([coinToTransfer], transaction.pure.address(recipient))\n    } else {\n      TransactionUtil.buildTransferCoinToSender(sdk, transaction, coinToTransfer, coinType)\n    }\n  }\n\n  static buildLockPosition(\n    args: {\n      positionId: string\n      untilTimestamp: number\n      poolId: string\n      typeA: string\n      typeB: string\n    },\n    sdkOptions: SdkOptions,\n    tx?: Transaction\n  ) {\n    const {\n      integrate: { package_id },\n      clmm_pool: { config }\n    } = sdkOptions\n\n    const { global_config_id } = config ?? {}\n\n    if (!global_config_id) {\n      throw new ClmmpoolsError('Global config is not set', ConfigErrorCode.InvalidConfig)\n    }\n\n    tx ??= new Transaction()\n    tx.moveCall({\n      target: `${package_id}::pool_script::lock_position`,\n      arguments: [\n        tx.object(global_config_id),\n        tx.object(args.poolId),\n        tx.object(args.positionId),\n        tx.pure.u64(args.untilTimestamp),\n        tx.object(CLOCK_ADDRESS),\n      ],\n      typeArguments: [args.typeA, args.typeB],\n    })\n\n    return [tx] as const\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 { Transaction } from '@mysten/sui/transactions'\nimport {\n  DevInspectResults,\n  DynamicFieldPage,\n  PaginatedEvents,\n  PaginatedObjectsResponse,\n  PaginatedTransactionResponse,\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 { DataPage, PaginationArgs, SuiObjectIdType } from '../types'\n\n/**\n * RPC module for making remote procedure calls to Sui blockchain\n * Extends SuiClient to provide enhanced pagination, batching, and transaction utilities\n * Handles event querying, object retrieval, and transaction simulation/execution\n */\nexport class RpcModule extends SuiClient {\n  /**\n   * Retrieves events matching the given query criteria with pagination support\n   * @param eventFilter - Filter criteria for event selection\n   * @param paginationConfig - Pagination configuration ('all' or specific limits)\n   * @returns Promise resolving to paginated event data\n   */\n  async queryEventsByPage(eventFilter: SuiEventFilter, paginationConfig: PaginationArgs = 'all'): Promise<DataPage<any>> {\n    let combinedResults: any = []\n    let hasMorePages = true\n    const shouldQueryAll = paginationConfig === 'all'\n    let currentCursor = shouldQueryAll ? null : paginationConfig.cursor\n\n    do {\n      const eventResponse: PaginatedEvents = await this.queryEvents({\n        query: eventFilter,\n        cursor: currentCursor,\n        limit: shouldQueryAll ? null : paginationConfig.limit,\n      })\n\n      if (eventResponse.data) {\n        combinedResults = [...combinedResults, ...eventResponse.data]\n        hasMorePages = eventResponse.hasNextPage\n        currentCursor = eventResponse.nextCursor\n      } else {\n        hasMorePages = false\n      }\n    } while (shouldQueryAll && hasMorePages)\n\n    return { data: combinedResults, nextCursor: currentCursor, hasNextPage: hasMorePages }\n  }\n\n  /**\n   * Queries transaction blocks with pagination support\n   * @param transactionFilter - Optional filter for transaction selection\n   * @param paginationConfig - Pagination configuration ('all' or specific limits)\n   * @param sortOrder - Sort order for results (ascending/descending)\n   * @returns Promise resolving to paginated transaction data\n   */\n  async queryTransactionBlocksByPage(\n    transactionFilter?: TransactionFilter,\n    paginationConfig: PaginationArgs = 'all',\n    sortOrder: 'ascending' | 'descending' | null | undefined = 'ascending'\n  ): Promise<DataPage<SuiTransactionBlockResponse>> {\n    let combinedResults: any = []\n    let hasMorePages = true\n    const shouldQueryAll = paginationConfig === 'all'\n    let currentCursor = shouldQueryAll ? null : paginationConfig.cursor\n\n    do {\n      const transactionResponse: PaginatedTransactionResponse = await this.queryTransactionBlocks({\n        filter: transactionFilter,\n        cursor: currentCursor,\n        order: sortOrder,\n        limit: shouldQueryAll ? null : paginationConfig.limit,\n        options: { showEvents: true },\n      })\n\n      if (transactionResponse.data) {\n        combinedResults = [...combinedResults, ...transactionResponse.data]\n        hasMorePages = transactionResponse.hasNextPage\n        currentCursor = transactionResponse.nextCursor\n      } else {\n        hasMorePages = false\n      }\n    } while (shouldQueryAll && hasMorePages)\n\n    return { data: combinedResults, nextCursor: currentCursor, hasNextPage: hasMorePages }\n  }\n\n  /**\n   * Retrieves all objects owned by a specific address with pagination\n   * @param ownerAddress - Address of the object owner\n   * @param queryOptions - Query options for object filtering\n   * @param paginationConfig - Pagination configuration ('all' or specific limits)\n   * @returns Promise resolving to paginated owned objects data\n   */\n  async getOwnedObjectsByPage(\n    ownerAddress: string,\n    queryOptions: SuiObjectResponseQuery,\n    paginationConfig: PaginationArgs = 'all'\n  ): Promise<DataPage<any>> {\n    let combinedResults: any = []\n    let hasMorePages = true\n    const shouldQueryAll = paginationConfig === 'all'\n    let currentCursor = shouldQueryAll ? null : paginationConfig.cursor\n\n    do {\n      const objectResponse: PaginatedObjectsResponse = await this.getOwnedObjects({\n        owner: ownerAddress,\n        ...queryOptions,\n        cursor: currentCursor,\n        limit: shouldQueryAll ? null : paginationConfig.limit,\n      })\n\n      if (objectResponse.data) {\n        combinedResults = [...combinedResults, ...objectResponse.data]\n        hasMorePages = objectResponse.hasNextPage\n        currentCursor = objectResponse.nextCursor\n      } else {\n        hasMorePages = false\n      }\n    } while (shouldQueryAll && hasMorePages)\n\n    return { data: combinedResults, nextCursor: currentCursor, hasNextPage: hasMorePages }\n  }\n\n  /**\n   * Retrieves dynamic fields for a parent object with pagination support\n   * @param parentObjectId - ID of the parent object containing dynamic fields\n   * @param paginationConfig - Pagination configuration ('all' or specific limits)\n   * @returns Promise resolving to paginated dynamic fields data\n   */\n  async getDynamicFieldsByPage(parentObjectId: SuiObjectIdType, paginationConfig: PaginationArgs = 'all'): Promise<DataPage<any>> {\n    let combinedResults: any = []\n    let hasMorePages = true\n    const shouldQueryAll = paginationConfig === 'all'\n    let currentCursor = shouldQueryAll ? null : paginationConfig.cursor\n\n    do {\n      const dynamicFieldResponse: DynamicFieldPage = await this.getDynamicFields({\n        parentId: parentObjectId,\n        cursor: currentCursor,\n        limit: shouldQueryAll ? null : paginationConfig.limit,\n      })\n\n      if (dynamicFieldResponse.data) {\n        combinedResults = [...combinedResults, ...dynamicFieldResponse.data]\n        hasMorePages = dynamicFieldResponse.hasNextPage\n        currentCursor = dynamicFieldResponse.nextCursor\n      } else {\n        hasMorePages = false\n      }\n    } while (shouldQueryAll && hasMorePages)\n\n    return { data: combinedResults, nextCursor: currentCursor, hasNextPage: hasMorePages }\n  }\n\n  /**\n   * Retrieves object details in batches to avoid API limits\n   * Note: Duplicate object IDs will cause the call to fail\n   * @param objectIds - Array of object IDs to retrieve\n   * @param dataOptions - Options for object data retrieval\n   * @param batchSize - Maximum number of objects per batch request\n   * @returns Promise resolving to array of object responses\n   */\n  async batchGetObjects(objectIds: SuiObjectIdType[], dataOptions?: SuiObjectDataOptions, batchSize = 50): Promise<SuiObjectResponse[]> {\n    let objectResponses: SuiObjectResponse[] = []\n\n    try {\n      for (let batchIndex = 0; batchIndex < Math.ceil(objectIds.length / batchSize); batchIndex++) {\n        const batchResponse = await this.multiGetObjects({\n          ids: objectIds.slice(batchIndex * batchSize, batchSize * (batchIndex + 1)),\n          options: dataOptions,\n        })\n        objectResponses = [...objectResponses, ...batchResponse]\n      }\n    } catch (batchError) {\n      console.log(batchError)\n    }\n\n    return objectResponses\n  }\n\n  /**\n   * Estimates the gas cost required for executing a transaction\n   * @param transaction - The transaction to estimate gas for\n   * @returns Promise resolving to the estimated gas cost\n   * @throws Error if transaction sender is not specified\n   */\n  async calculationTxGas(transaction: Transaction): Promise<number> {\n    const { sender } = transaction.blockData\n\n    if (sender === undefined) {\n      throw Error('Transaction sender is required for gas calculation')\n    }\n\n    const inspectionResult = await this.devInspectTransactionBlock({\n      transactionBlock: transaction,\n      sender,\n    })\n    const { gasUsed } = inspectionResult.effects\n\n    const totalGasCost = Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate)\n    return totalGasCost\n  }\n\n  /**\n   * Signs and executes a transaction using the provided keypair\n   * @param signingKeypair - Keypair for transaction signing (Ed25519 or Secp256k1)\n   * @param transaction - Transaction to sign and execute\n   * @returns Promise resolving to transaction response or undefined on failure\n   */\n  async sendTransaction(signingKeypair: Ed25519Keypair | Secp256k1Keypair, transaction: Transaction): Promise<SuiTransactionBlockResponse | undefined> {\n    try {\n      const executionResult: any = await this.signAndExecuteTransaction({\n        transaction: transaction,\n        signer: signingKeypair,\n        options: {\n          showEffects: true,\n          showEvents: true,\n        },\n      })\n      return executionResult\n    } catch (executionError) {\n      console.dir(executionError, { depth: null })\n    }\n    return undefined\n  }\n\n  /**\n   * Simulates transaction execution without committing to blockchain\n   * @param transaction - Transaction to simulate\n   * @param simulationAddress - Address to use for simulation\n   * @param enableDevInspect - Whether to use DevInspect mode (default: true)\n   * @returns Promise resolving to simulation results or undefined on failure\n   */\n  async sendSimulationTransaction(\n    transaction: Transaction,\n    simulationAddress: string,\n    enableDevInspect = true\n  ): Promise<DevInspectResults | undefined> {\n    try {\n      if (enableDevInspect) {\n        const simulationResult = await this.devInspectTransactionBlock({\n          transactionBlock: transaction,\n          sender: simulationAddress,\n        })\n        return simulationResult\n      }\n\n\n    } catch (simulationError) {\n      console.log('Transaction simulation failed:', simulationError)\n    }\n\n    return undefined\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  Pool,\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  CLOCK_ADDRESS,\n  DataPage,\n  PaginationArgs,\n  SuiObjectIdType,\n  SuiResource,\n} from '../types/sui'\nimport { FerraClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectFields } from '../utils/objects'\nimport { CollectFeesQuote } from '../math'\nimport { FetchPosFeeParams } from './rewarder'\nimport { ClmmpoolsError, ConfigErrorCode, PoolErrorCode, UtilsErrorCode } from '../errors/errors'\nimport { RpcModule } from './rpc'\nimport { bcs } from '@mysten/bcs'\n\n/**\n * Position module for managing liquidity positions in CLMM pools\n * Provides functionality for creating, updating, and managing positions\n */\nexport class PositionModule implements IModule {\n  protected _sdk: FerraClmmSDK\n  private readonly _cache: Record<string, CachedContent> = {}\n\n  constructor(sdk: FerraClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Constructs the full type address for Position objects\n   * @returns Full type string in format: packageId::module::type\n   */\n  buildPositionType() {\n    const ferraClmm = this._sdk.sdkOptions.clmm_pool.package_id\n    return `${ferraClmm}::position::Position`\n  }\n\n  /**\n   * Retrieves transaction history for a specific position\n   * Supports custom RPC endpoints and filtering by multiple position IDs\n   * @param posId - Primary position ID to query\n   * @param originPosId - Optional original position ID for filtering\n   * @param fullRpcUrl - Optional custom RPC endpoint\n   * @param paginationArgs - Pagination parameters (default: 'all')\n   * @param order - Sort order for transactions (default: 'ascending')\n   * @returns Paginated list of position transactions\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\n    // Use custom RPC client if provided\n    let client\n    if (fullRpcUrl) {\n      client = new RpcModule({\n        url: fullRpcUrl,\n      })\n    } else {\n      client = fullClient\n    }\n\n    const data: DataPage<PositionTransactionInfo> = {\n      data: [],\n      hasNextPage: false,\n    }\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   * Retrieves all positions owned by an account\n   * Optionally filters by pool IDs\n   * @param accountAddress - Owner's address\n   * @param assignPoolIds - Optional array of pool IDs to filter positions\n   * @param showDisplay - Include display metadata (default: true)\n   * @returns Array of Position objects owned by the account\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\n        // Filter by pool IDs if specified\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   * Retrieves position data using position handle (requires pool info)\n   * Note: getPositionById is recommended for direct position retrieval\n   * @param positionHandle - Position collection handle from pool\n   * @param positionID - Position object ID\n   * @param calculateRewarder - Calculate reward amounts (default: true)\n   * @param showDisplay - Include display metadata (default: true)\n   * @returns Complete position object with optional rewards\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   * Retrieves position data directly by ID (recommended method)\n   * Automatically fetches pool data to calculate rewards if needed\n   * @param positionID - Position object ID\n   * @param calculateRewarder - Calculate reward amounts (default: true)\n   * @param showDisplay - Include display metadata (default: true)\n   * @returns Complete position object with optional rewards\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   * Retrieves basic position data without reward calculations\n   * Uses cache to minimize RPC calls\n   * @param positionID - Position object ID\n   * @param showDisplay - Include display metadata (default: true)\n   * @returns Basic position object without rewards\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   * Internal method to retrieve cached position data\n   * @param positionID - Position object ID\n   * @returns Cached position or undefined if not found/expired\n   */\n  private getSimplePositionByCache(positionID: string): Position | undefined {\n    const cacheKey = `${positionID}_getPositionList`\n    return this.getCache<Position>(cacheKey)\n  }\n\n  /**\n   * Batch retrieves multiple positions efficiently\n   * Uses cache and batch RPC calls to optimize performance\n   * @param positionIDs - Array of position object IDs\n   * @param showDisplay - Include display metadata (default: true)\n   * @returns Array of position objects\n   */\n  async getSipmlePositionList(positionIDs: SuiObjectIdType[], showDisplay = true): Promise<Position[]> {\n    const positionList: Position[] = []\n    const notFoundIds: SuiObjectIdType[] = []\n\n    // Check cache first\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    // Batch fetch positions not in cache\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   * Internal method to update position with reward information\n   * @param positionHandle - Position collection handle\n   * @param position - Position object to update\n   * @returns Position object with reward data\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   * Retrieves reward information for a specific position\n   * @param positionHandle - Position collection handle\n   * @param positionID - Position object ID\n   * @returns Position reward data or undefined if not found\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   * Simulates fee collection for multiple positions\n   * Uses devInspectTransactionBlock for gas-free simulation\n   * @param params - Array of position parameters for fee calculation\n   * @returns Array of fee quotes for each position\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    // Build simulation transaction for all positions\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    // Extract fee data from simulation events\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   * Batch fetches fee amounts for multiple positions\n   * Automatically retrieves position and pool data\n   * @param positionIDs - Array of position object IDs\n   * @returns Map of position ID to fee quote\n   */\n  async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n    const posFeeParamsList: FetchPosFeeParams[] = []\n\n    // Prepare parameters for each position\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   * Creates transaction to add liquidity with fixed token amount\n   * Supports gas estimation for SUI token transactions\n   * @param params - Fixed token liquidity parameters\n   * @param gasEstimateArg - Optional gas estimation parameters for SUI\n   * @param tx - Optional existing transaction to append to\n   * @param inputCoinA - Optional pre-built coin A object\n   * @param inputCoinB - Optional pre-built coin B object\n   * @returns Transaction object for adding liquidity\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: ferra 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    // Handle gas estimation for SUI token\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   * Creates transaction to add liquidity to a position\n   * Automatically handles position creation if needed\n   * @param params - Liquidity addition parameters\n   * @param tx - Optional existing transaction to append to\n   * @param inputCoinA - Optional pre-built coin A object\n   * @param inputCoinB - Optional pre-built coin B object\n   * @returns Transaction object for adding liquidity\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: ferra clmm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n\n    // Convert tick indices to unsigned format\n    const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n    const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n    const lock_until = asUintN(BigInt(params.lock_until ?? 0)).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    // Build coin inputs if not provided\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      // Create new position with initial liquidity\n      tx.moveCall({\n        target: `${integrate.published_at}::${ClmmIntegratePoolModule}::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.pure.u64(lock_until),\n          tx.object(CLOCK_ADDRESS),\n        ],\n      })\n    } else {\n      // Add liquidity to existing position\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}::${ClmmIntegratePoolModule}::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   * Creates transaction to remove liquidity from a position\n   * Automatically collects fees and rewards before removal\n   * @param params - Liquidity removal parameters\n   * @param tx - Optional existing transaction to append to\n   * @returns Transaction object for removing liquidity\n   */\n  async removeLiquidityTransactionPayload(params: RemoveLiquidityParams, tx?: Transaction): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: ferra 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    // Collect fees and rewards before removing liquidity\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   * Creates transaction to close a position completely\n   * Removes all liquidity and collects all fees/rewards\n   * @param params - Position closure parameters\n   * @param tx - Optional existing transaction to append to\n   * @returns Transaction object for closing position\n   */\n  async closePositionTransactionPayload(params: ClosePositionParams, tx?: Transaction): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: ferra 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    // Collect all fees and rewards before closing\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   * Creates transaction to open a new empty position\n   * Position will have no liquidity until added separately\n   * @param params - Position opening parameters\n   * @param tx - Optional existing transaction to append to\n   * @returns Transaction object for opening position\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    // Convert tick indices to unsigned format\n    const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n    const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n    const lock_until = asUintN(BigInt(params?.lock_until ?? 0)).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      tx.pure.u64(Number(lock_until))\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  public async lockPosition(pool: Pool, positionId: string, untilTimestamp: number) {\n    const sender = this.sdk.senderAddress\n\n    const tx = new Transaction()\n    tx.setSender(sender)\n    TransactionUtil.buildLockPosition(\n      {\n        poolId: pool.poolAddress,\n        positionId,\n        typeA: pool.coinTypeA,\n        typeB: pool.coinTypeB,\n        untilTimestamp,\n      },\n      this.sdk.sdkOptions,\n      tx\n    )\n\n    return tx\n  }\n\n  public async getLockPositionStatusById(positionId: string): Promise<[current_lock: number, current_timestamp: number, is_locked: boolean]> {\n    const position = await this.getPositionById(positionId)\n    const currentLock = Number(position.lock_until);\n    const currentTimestamp = Date.now();\n\n    return [currentLock, currentTimestamp, currentLock > currentTimestamp]\n  }\n\n  public async getLockPositionStatus(position: Position): Promise<[current_lock: number, current_timestamp: number, is_locked: boolean]> {\n    const currentLock = Number(position.lock_until);\n    const currentTimestamp = Date.now();\n\n    return [currentLock, currentTimestamp, currentLock > currentTimestamp]\n  }\n\n  /**\n   * Creates transaction to collect LP fees from a position\n   * @param params - Fee collection parameters\n   * @param tx - Optional existing transaction to append to\n   * @param inputCoinA - Optional pre-built coin A object\n   * @param inputCoinB - Optional pre-built coin B object\n   * @returns Transaction object for fee collection\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: ferra 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    // Build zero-balance coins if not provided\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  /**\n   * Internal method to create collect fee move call\n   * @param params - Fee collection parameters\n   * @param tx - Transaction object\n   * @param primaryCoinAInput - Coin A object\n   * @param primaryCoinBInput - Coin B object\n   * @returns Transaction object with collect fee call\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}::${ClmmIntegratePoolModule}::collect_fee`,\n      typeArguments,\n      arguments: args,\n    })\n    return tx\n  }\n\n  /**\n   * Creates collect fee call without sending coins to sender\n   * Used when coins need to be used in subsequent operations\n   * @param params - Fee collection parameters\n   * @param tx - Transaction object\n   * @param primaryCoinAInput - Coin A object\n   * @param primaryCoinBInput - Coin B object\n   * @returns Transaction object with collect fee call\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}::${ClmmIntegratePoolModule}::collect_fee`,\n      typeArguments,\n      arguments: args,\n    })\n    return tx\n  }\n\n  /**\n   * Simulates fee collection to calculate claimable amounts\n   * Uses devInspectTransactionBlock for gas-free calculation\n   * @param params - Fee collection parameters\n   * @returns Object containing fee amounts for both tokens\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: ferra 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    // Extract fee amounts from simulation events\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 cached data with expiration time\n   * @param key - Cache key\n   * @param data - Data to cache\n   * @param time - Cache duration in minutes (default: 5)\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   * Retrieves cached data if valid\n   * @param key - Cache key\n   * @param forceRefresh - Bypass cache if true\n   * @returns Cached data or undefined if expired/not found\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}","/* 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, ClmmIntegratePoolModule, CLOCK_ADDRESS } from '../types/sui'\nimport { getRewardInTickRange } from '../utils/tick'\nimport { MathUtil, ONE, ZERO } from '../math/utils'\nimport { TickData } from '../types/clmm-pool'\nimport { FerraClmmSDK } 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 * Rewarder module for managing position rewards in CLMM pools\n * Handles reward calculations, collection, and distribution for liquidity providers\n */\nexport class RewarderModule implements IModule {\n  protected _sdk: FerraClmmSDK\n  private growthGlobal: BN[]\n\n  constructor(sdk: FerraClmmSDK) {\n    this._sdk = sdk\n    this.growthGlobal = [ZERO, ZERO, ZERO]\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Calculates daily emissions for all rewarders in a pool\n   * @param poolID - The pool object ID\n   * @returns Array of daily emissions for each rewarder with coin addresses\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      // Convert emissions from x64 fixed-point to regular number\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 pool rewarder growth globals based on time elapsed\n   * Internal method used for reward calculations\n   * @param poolID - The pool object ID\n   * @param currentTime - Current timestamp in milliseconds\n   * @returns Updated pool object with new rewarder state\n   */\n  private async updatePoolRewarder(poolID: string, currentTime: BN): Promise<Pool> {\n    // Refresh pool rewarder state\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    // Skip update if no liquidity or no time has passed\n    if (Number(currentPool.liquidity) === 0 || currentTime.eq(new BN(lastTime))) {\n      return currentPool\n    }\n\n    // Calculate time delta in seconds with 15 second buffer\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    // Update growth global for each rewarder\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   * Calculates reward amounts owed to a specific position\n   * @deprecated Use fetchPosRewardersAmount() for better performance and accuracy\n   * @param poolID - The pool object ID\n   * @param positionHandle - Position collection handle\n   * @param positionID - Position object ID\n   * @returns Array of reward amounts for each rewarder\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   * Calculates total reward amounts for all positions in a pool owned by an account\n   * @deprecated Use fetchPosRewardersAmount() for better performance and accuracy\n   * @param accountAddress - Owner's address\n   * @param poolID - The pool object ID\n   * @returns Array of total reward amounts for each rewarder\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   * Internal method to calculate reward amounts for a position\n   * Uses tick data and growth globals to compute accurate rewards\n   * @param pool - Pool object\n   * @param position - Position reward data\n   * @param tickLower - Lower tick data\n   * @param tickUpper - Upper tick data\n   * @returns Array of reward amounts owed for each rewarder\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    // Process first rewarder if exists\n    if (rewardersInside.length > 0) {\n      let growthDelta0 = MathUtil.subUnderflowU128(rewardersInside[0], new BN(position.reward_growth_inside_0))\n\n      // Cap growth delta to prevent overflow\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        coin_address: pool.rewarder_infos[0].coinAddress,\n      })\n    }\n\n    // Process second rewarder if exists\n    if (rewardersInside.length > 1) {\n      let growthDelta_1 = MathUtil.subUnderflowU128(rewardersInside[1], new BN(position.reward_growth_inside_1))\n      // Cap growth delta to prevent overflow\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    // Process third rewarder if exists\n    if (rewardersInside.length > 2) {\n      let growthDelta_2 = MathUtil.subUnderflowU128(rewardersInside[2], new BN(position.reward_growth_inside_2))\n      // Cap growth delta to prevent overflow\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   * Batch fetches reward amounts for multiple positions\n   * More efficient than calling fetchPositionRewarders individually\n   * @param positionIDs - Array of position object IDs\n   * @returns Map of position ID to reward amounts\n   */\n  async batchFetchPositionRewarders(positionIDs: string[]): Promise<Record<string, RewarderAmountOwed[]>> {\n    const posRewardParamsList: FetchPosRewardParams[] = []\n\n    // Prepare parameters for each position\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   * Fetches reward amounts for a single position\n   * @param pool - Pool object\n   * @param positionId - Position object ID\n   * @returns Array of reward amounts for each rewarder\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   * @deprecated Use Position.batchFetchPositionFees() instead\n   * Batch fetches fee amounts for multiple positions\n   * @param positionIDs - Array of position object IDs\n   * @returns Map of position ID to fee amounts\n   */\n  async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n    const posFeeParamsList: FetchPosFeeParams[] = []\n\n    // Prepare parameters for each position\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   * Simulates fee collection for multiple positions\n   * Uses devInspectTransactionBlock for gas-free calculation\n   * @param params - Array of position fee parameters\n   * @returns Array of fee quotes for each position\n   */\n  async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n    const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n    const tx = new Transaction()\n\n    // Build simulation transaction for all positions\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    // Extract fee data from simulation events\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 posRewarderResult: 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(posRewarderResult)\n    }\n\n    return result\n  }\n\n  /**\n   * Simulates reward collection for multiple positions\n   * Main method for fetching position rewards efficiently\n   * @param params - Array of position reward parameters\n   * @returns Array of reward results for each position\n   */\n  async fetchPosRewardersAmount(params: FetchPosRewardParams[]) {\n    const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n    const tx = new Transaction()\n\n    // Build simulation transaction for all positions\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    // Extract reward data from simulation events\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.length')\n    }\n\n    const result: PosRewarderResult[] = []\n\n    // Process results for each position\n    for (let i = 0; i < valueData.length; i += 1) {\n      const posRewarderResult: PosRewarderResult = {\n        poolAddress: params[i].poolAddress,\n        positionId: params[i].positionId,\n        rewarderAmountOwed: [],\n      }\n\n      // Extract reward amounts for each rewarder\n      for (let j = 0; j < params[i].rewarderInfo.length; j += 1) {\n        posRewarderResult.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(posRewarderResult)\n    }\n\n    return result\n  }\n\n  /**\n   * Calculates total rewards for all positions owned by an account in a pool\n   * @param account - Owner's address\n   * @param poolObjectId - Pool object ID\n   * @returns Array of total reward amounts for each rewarder or null\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    // Prepare parameters for all positions\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    // Sum up rewards across all positions\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  /**\n   * Fetches tick data for all positions' upper and lower bounds\n   * @param ticksHandle - Pool's tick collection handle\n   * @param positions - Array of positions\n   * @returns Array containing lower and upper tick data arrays\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   * Creates transaction to collect rewards from a position\n   * @param params - Collection parameters\n   * @returns Transaction object for reward collection\n   */\n  async collectRewarderTransactionPayload(params: CollectRewarderParams): Promise<Transaction> {\n    if (!checkInvalidSuiAddress(this.sdk.senderAddress)) {\n      throw new ClmmpoolsError(\n        'Invalid sender address: ferra 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   * Creates batch transaction to collect rewards from multiple positions\n   * Optimizes coin object usage across multiple collections\n   * @param params - Array of collection parameters\n   * @param tx - Optional existing transaction to append to\n   * @param inputCoinA - Optional pre-built coin A object\n   * @param inputCoinB - Optional pre-built coin B object\n   * @returns Transaction object for batch reward collection\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: ferra 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\n    // Process each collection request\n    params.forEach((item) => {\n      const coinTypeA = normalizeCoinType(item.coinTypeA)\n      const coinTypeB = normalizeCoinType(item.coinTypeB)\n\n      // Collect fees if requested\n      if (item.collect_fee) {\n        // Build or reuse coin A input\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        // Build or reuse coin B input\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        // Add fee collection to transaction\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\n      // Build coin inputs for each rewarder\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      // Add reward collection to transaction\n      tx = this.createCollectRewarderNoSendPaylod(item, tx!, primaryCoinInputs)\n    })\n\n    // Transfer any minted zero coins to sender\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  /**\n   * Creates collect reward move calls (internal method)\n   * @param params - Collection parameters\n   * @param tx - Transaction object\n   * @param primaryCoinInputs - Array of coin objects for each rewarder\n   * @returns Transaction object with collect reward calls\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\n    // Create collect call for each rewarder\n    params.rewarder_coin_types.forEach((type, index) => {\n      if (tx) {\n        tx.moveCall({\n          target: `${integrate.published_at}::${ClmmIntegratePoolModule}::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_rewarder_vault_id),\n            primaryCoinInputs[index],\n            tx.object(CLOCK_ADDRESS),\n          ],\n        })\n      }\n    })\n    return tx\n  }\n\n  /**\n   * Creates collect reward calls without sending coins to sender\n   * Used when coins need to be used in subsequent operations\n   * @param params - Collection parameters\n   * @param tx - Transaction object\n   * @param primaryCoinInputs - Array of coin objects for each rewarder\n   * @returns Transaction object with collect reward calls\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\n    // Create collect call for each rewarder\n    params.rewarder_coin_types.forEach((type, index) => {\n      if (tx) {\n        tx.moveCall({\n          target: `${integrate.published_at}::${ClmmIntegratePoolModule}::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_rewarder_vault_id),\n            primaryCoinInputs[index],\n            tx.object(CLOCK_ADDRESS),\n          ],\n        })\n      }\n    })\n    return tx\n  }\n}","import BN from 'bn.js'\nimport { Graph, GraphEdge, GraphVertex } from '@syntsugar/cc-graph'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { PreSwapLpChangeParams, PreSwapWithMultiPoolParams } from '../types'\nimport { checkInvalidSuiAddress, extractStructTagFromType } from '../utils'\nimport { ClmmExpectSwapModule, ClmmIntegrateRouterModule, SuiAddressType } from '../types/sui'\nimport { FerraClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { U64_MAX, ZERO } from '../math'\nimport { ClmmpoolsError, ConfigErrorCode, RouterErrorCode } from '../errors/errors'\nimport Decimal from '../utils/decimal'\nimport { normalizeStructTag } from '@mysten/sui/utils'\n\n// Represents a coin node in the coin mapping system\nexport interface CoinNode {\n  address: string\n  decimals: number\n}\n\n// Provider interface for coin data\nexport interface CoinProvider {\n  coins: CoinNode[]\n}\n\n// Represents a trading path link between two coins\nexport interface PathLink {\n  base: string\n  quote: string\n  addressMap: Map<number, string>\n}\n\n// Provider interface for path data\nexport interface PathProvider {\n  paths: PathLink[]\n}\n\n// Defines a single routing path with swap details\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// Base path information for routing calculations\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\n// Split path configuration for multi-path routing\nexport type SplitPath = {\n  percent: number\n  inputAmount: number\n  outputAmount: number\n  pathIndex: number\n  lastQuoteOutput: number\n  basePaths: BasePath[]\n}\n\n// Contains address mapping with directional information\nexport type AddressAndDirection = {\n  addressMap: Map<number, string>\n  direction: boolean\n}\n\n// Parameters for executing router-based swaps\nexport type SwapWithRouterParams = {\n  paths: OnePath[]\n  partner: string\n  priceSlippagePoint: number\n}\n\n// Parameters for pre-calculating router swap operations\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// Result of pre-swap calculations with optimal path information\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// Comprehensive result for the best internal routing option\nexport type BestInternalRouterResult = {\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// Pool information with total value locked (TVL) data\ntype PoolWithTvl = {\n  poolAddress: string\n  tvl: number\n}\n\n/**\n * Creates trading pair symbols for both directions\n * @param baseCoin - Base coin identifier\n * @param quoteCoin - Quote coin identifier\n * @returns Object containing pair and reverse pair symbols\n */\nfunction _pairSymbol(\n  baseCoin: string,\n  quoteCoin: string\n): {\n  pair: string\n  reversePair: string\n} {\n  return {\n    pair: `${baseCoin}-${quoteCoin}`,\n    reversePair: `${quoteCoin}-${baseCoin}`,\n  }\n}\n\n/**\n * Router module for finding optimal swap paths in CLMM pools\n * Handles pathfinding, route optimization, and swap execution across multiple pools\n * Supports both single-hop and multi-hop swaps with TVL-based routing prioritization\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  private _isGraphLoaded: boolean = false\n\n  protected _sdk: FerraClmmSDK\n\n  constructor(sdk: FerraClmmSDK) {\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    // Bind all methods to maintain proper context\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.getPoolWithTVL = this.getPoolWithTVL.bind(this)\n    this.getBestInternalRouter = this.getBestInternalRouter.bind(this)\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  get isGraphLoaded(): boolean {\n    return this._isGraphLoaded\n  }\n\n  /**\n   * Retrieves pool address mapping with trading direction\n   * @param baseCoin - Base coin identifier\n   * @param quoteCoin - Quote coin identifier\n   * @returns Address mapping with direction information, or undefined if not found\n   */\n  getPoolAddressMapAndDirection(baseCoin: string, quoteCoin: string): AddressAndDirection | undefined {\n    const { pair, reversePair } = _pairSymbol(baseCoin, quoteCoin)\n    let poolAddressMapping: any = this.poolAddressMap.get(pair)\n\n    if (poolAddressMapping != null) {\n      return {\n        addressMap: poolAddressMapping,\n        direction: true,\n      }\n    }\n\n    poolAddressMapping = this.poolAddressMap.get(reversePair)\n    if (poolAddressMapping != null) {\n      return {\n        addressMap: poolAddressMapping,\n        direction: false,\n      }\n    }\n    return undefined\n  }\n\n  /**\n   * Populates the coin address mapping with available coins\n   */\n  private setCoinList() {\n    this.coinProviders.coins.forEach((coinData) => {\n      this._coinAddressMap.set(coinData.address, coinData)\n    })\n  }\n\n  /**\n   * Initializes the routing graph with coin and path data\n   * Must be called before finding optimal routes\n   * @param coinData - All available coins\n   * @param pathData - All available trading paths\n   */\n  loadGraph(coinData: CoinProvider, pathData: PathProvider) {\n    this.addCoinProvider(coinData)\n    this.addPathProvider(pathData)\n    this.setCoinList()\n    this._isGraphLoaded = true\n\n    this.pathProviders.forEach((provider) => {\n      const { paths } = provider\n      paths.forEach((pathInfo) => {\n        const vertexA = this.graph.getVertexByKey(pathInfo.base) ?? new GraphVertex(pathInfo.base)\n        const vertexB = this.graph.getVertexByKey(pathInfo.quote) ?? new GraphVertex(pathInfo.quote)\n\n        this.graph.addEdge(new GraphEdge(vertexA, vertexB))\n\n        const baseCoinInfo: any = this._coinAddressMap.get(pathInfo.base)\n        const quoteCoinInfo: any = this._coinAddressMap.get(pathInfo.quote)\n\n        if (baseCoinInfo != null && quoteCoinInfo != null) {\n          const pairSymbol = _pairSymbol(pathInfo.base, pathInfo.quote).pair\n          this.poolAddressMap.set(pairSymbol, pathInfo.addressMap)\n        }\n      })\n    })\n  }\n\n  /**\n   * Adds a new path provider to the routing graph\n   * @param provider - Path provider containing trading paths\n   * @returns Current RouterModule instance for chaining\n   */\n  private addPathProvider(provider: PathProvider): RouterModule {\n    // Normalize coin order in paths for consistency\n    for (let pathIndex = 0; pathIndex < provider.paths.length; pathIndex += 1) {\n      const { base, quote } = provider.paths[pathIndex]\n      const lexicalComparison = base.localeCompare(quote)\n\n      if (lexicalComparison < 0) {\n        provider.paths[pathIndex].base = quote\n        provider.paths[pathIndex].quote = base\n      }\n\n      // Special handling for SUI coin ordering\n      if (base === '0x2::sui::SUI') {\n        provider.paths[pathIndex].base = quote\n        provider.paths[pathIndex].quote = base\n      }\n\n      if (quote === '0x2::sui::SUI') {\n        provider.paths[pathIndex].base = base\n        provider.paths[pathIndex].quote = quote\n      }\n    }\n\n    this.pathProviders.push(provider)\n    return this\n  }\n\n  /**\n   * Registers a coin provider with the router\n   * @param provider - Coin provider containing coin information\n   * @returns Current RouterModule instance for chaining\n   */\n  private addCoinProvider(provider: CoinProvider): RouterModule {\n    this.coinProviders = provider\n    return this\n  }\n\n  /**\n   * Retrieves token information from the coin address mapping\n   * @param coinType - Coin type identifier\n   * @returns Coin node information or undefined if not found\n   */\n  tokenInfo(coinType: string): CoinNode | undefined {\n    return this._coinAddressMap.get(coinType)\n  }\n\n  /**\n   * Calculates the fee rate for a specific pool\n   * @param fromCoin - Source coin type\n   * @param toCoin - Target coin type\n   * @param poolAddress - Pool address\n   * @returns Fee rate percentage for the pool\n   */\n  getFeeRate(fromCoin: string, toCoin: string, poolAddress: string): number {\n    const pairSymbol = _pairSymbol(fromCoin, toCoin).pair\n    const forwardAddressMap = this.poolAddressMap.get(pairSymbol)\n\n    if (forwardAddressMap != null) {\n      // Find fee rate by matching pool address\n      for (const [feeKey, addressValue] of forwardAddressMap.entries()) {\n        if (addressValue === poolAddress) {\n          return feeKey * 100\n        }\n      }\n    }\n\n    const reversePairSymbol = _pairSymbol(fromCoin, toCoin).reversePair\n    const reverseAddressMap = this.poolAddressMap.get(reversePairSymbol)\n\n    if (reverseAddressMap != null) {\n      // Find fee rate by matching pool address in reverse direction\n      for (const [feeKey, addressValue] of reverseAddressMap.entries()) {\n        if (addressValue === poolAddress) {\n          return feeKey * 100\n        }\n      }\n    }\n    return 0\n  }\n\n  /**\n   * Finds the optimal internal routing path between two coins\n   *\n   * @param fromCoin - Source coin type\n   * @param toCoin - Target coin type\n   * @param swapAmount - Amount to swap\n   * @param isFixedInput - Whether input amount is fixed\n   * @param slippagePoint - Price slippage tolerance\n   * @param partnerObjectId - Partner object identifier\n   * @param multiPoolParams - Parameters for fallback to multi-pool swap\n   * @returns Promise resolving to the best routing result or undefined\n   */\n  async getBestInternalRouter(\n    fromCoin: string,\n    toCoin: string,\n    swapAmount: BN,\n    isFixedInput: boolean,\n    slippagePoint: number,\n    partnerObjectId: string,\n    multiPoolParams?: PreSwapWithMultiPoolParams\n  ): Promise<BestInternalRouterResult | undefined> {\n\n    if (!this.isGraphLoaded) {\n      await this.loadGraphData()\n    }\n\n    const sourceCoinInfo = this.tokenInfo(normalizeStructTag(fromCoin))\n    const targetCoinInfo = this.tokenInfo(normalizeStructTag(toCoin))\n\n    if (sourceCoinInfo === undefined || targetCoinInfo === undefined) {\n      throw new ClmmpoolsError('From/To coin is undefined', RouterErrorCode.InvalidCoin)\n    }\n\n    const sourceVertex = this.graph.getVertexByKey(sourceCoinInfo.address)\n    const targetVertex = this.graph.getVertexByKey(targetCoinInfo.address)\n\n    const pathIterator = this.graph.findAllPath(sourceVertex, targetVertex)\n    const availablePaths = Array.from(pathIterator)\n\n    if (availablePaths.length === 0) {\n      throw new ClmmpoolsError('No valid path found in coin graph', RouterErrorCode.NotFoundPath)\n    }\n\n    let routerSwapParams: PreRouterSwapParams[] = []\n\n    for (let pathIndex = 0; pathIndex < availablePaths.length; pathIndex += 1) {\n      const currentPath = availablePaths[pathIndex]\n\n      // Only consider single and double hop paths\n      if (currentPath.length > 3) {\n        continue\n      }\n\n      const coinSequence = []\n      const swapDirections = []\n      const firstStepPools: string[] = []\n      const secondStepPools: string[] = []\n\n      for (let stepIndex = 0; stepIndex < currentPath.length - 1; stepIndex += 1) {\n        const stepFromCoin = currentPath[stepIndex].value.toString()\n        const stepToCoin = currentPath[stepIndex + 1].value.toString()\n        const addressAndDirection = this.getPoolAddressMapAndDirection(stepFromCoin, stepToCoin)\n        const stepAddressMap = addressAndDirection?.addressMap\n        const stepDirection = addressAndDirection?.direction\n\n        if (stepAddressMap != null && stepDirection != null) {\n          swapDirections.push(stepDirection)\n          coinSequence.push(stepFromCoin)\n          coinSequence.push(stepToCoin)\n\n          stepAddressMap.forEach((poolAddress) => {\n            if (stepIndex === 0) {\n              firstStepPools.push(poolAddress)\n            } else {\n              secondStepPools.push(poolAddress)\n            }\n          })\n        }\n      }\n\n      for (const firstPool of firstStepPools) {\n        if (secondStepPools.length > 0) {\n          for (const secondPool of secondStepPools) {\n            const routingParam: PreRouterSwapParams = {\n              stepNums: 2,\n              poolAB: firstPool,\n              poolBC: secondPool,\n              a2b: swapDirections[0],\n              b2c: swapDirections[1],\n              amount: swapAmount,\n              byAmountIn: isFixedInput,\n              coinTypeA: coinSequence[0],\n              coinTypeB: coinSequence[1],\n              coinTypeC: coinSequence[3],\n            }\n            routerSwapParams.push(routingParam)\n          }\n        } else {\n          const routingParam: PreRouterSwapParams = {\n            stepNums: 1,\n            poolAB: firstPool,\n            poolBC: undefined,\n            a2b: swapDirections[0],\n            b2c: undefined,\n            amount: swapAmount,\n            byAmountIn: isFixedInput,\n            coinTypeA: coinSequence[0],\n            coinTypeB: coinSequence[1],\n            coinTypeC: undefined,\n          }\n          routerSwapParams.push(routingParam)\n        }\n      }\n    }\n\n    // Separate single-step and multi-step paths\n    const singleStepPaths = routerSwapParams.filter((param) => param.stepNums === 1)\n    const multiStepPaths = routerSwapParams.filter((param) => param.stepNums !== 1)\n\n    let poolTvlData: PoolWithTvl[] = []\n    try {\n      poolTvlData = await this.getPoolWithTVL()\n    } catch (error) {\n      poolTvlData = []\n    }\n\n    if (poolTvlData.length > 0) {\n      const tvlLookupMap = new Map(poolTvlData.map((poolInfo) => [poolInfo.poolAddress, poolInfo]))\n\n      // Sort multi-step paths by minimum TVL across both pools\n      multiStepPaths.sort((pathA, pathB) => {\n        let minTvlA = 0\n        let minTvlB = 0\n\n        if (tvlLookupMap.has(pathA.poolAB) && tvlLookupMap.has(pathA.poolBC!)) {\n          const poolAB_A = tvlLookupMap.get(pathA.poolAB)!\n          const poolBC_A = tvlLookupMap.get(pathA.poolBC!)!\n          minTvlA = Math.min(poolAB_A.tvl, poolBC_A.tvl)\n        }\n\n        if (tvlLookupMap.has(pathB.poolAB) && tvlLookupMap.has(pathB.poolBC!)) {\n          const poolAB_B = tvlLookupMap.get(pathB.poolAB)!\n          const poolBC_B = tvlLookupMap.get(pathB.poolBC!)!\n          minTvlB = Math.min(poolAB_B.tvl, poolBC_B.tvl)\n        }\n        return minTvlB - minTvlA\n      })\n    }\n\n    routerSwapParams = [...singleStepPaths, ...multiStepPaths]\n\n    if (routerSwapParams.length === 0) {\n      if (multiPoolParams != null) {\n        const fallbackSwapResult = await this.sdk.Swap.preSwapWithMultiPool(multiPoolParams)\n\n        const fallbackPath: OnePath = {\n          amountIn: new BN(fallbackSwapResult!.estimatedAmountIn),\n          amountOut: new BN(fallbackSwapResult!.estimatedAmountOut),\n          poolAddress: [fallbackSwapResult!.poolAddress],\n          a2b: [fallbackSwapResult!.aToB],\n          rawAmountLimit: isFixedInput ? [fallbackSwapResult!.estimatedAmountOut] : [fallbackSwapResult!.estimatedAmountIn],\n          isExceed: fallbackSwapResult!.isExceed,\n          coinType: [fromCoin, toCoin],\n        }\n\n        const fallbackRouterParams = {\n          paths: [fallbackPath],\n          partner: partnerObjectId,\n          priceSlippagePoint: slippagePoint,\n        }\n\n        const fallbackResult: BestInternalRouterResult = {\n          amountIn: new BN(fallbackSwapResult!.estimatedAmountIn),\n          amountOut: new BN(fallbackSwapResult!.estimatedAmountOut),\n          paths: [fallbackPath],\n          a2b: fallbackSwapResult!.aToB,\n          b2c: undefined,\n          byAmountIn: isFixedInput,\n          isExceed: fallbackSwapResult!.isExceed,\n          targetSqrtPrice: [fallbackSwapResult!.estimatedEndSqrtPrice],\n          currentSqrtPrice: [fallbackSwapResult!.estimatedStartSqrtPrice],\n          coinTypeA: fromCoin,\n          coinTypeB: toCoin,\n          coinTypeC: undefined,\n          createTxParams: fallbackRouterParams,\n        }\n        return fallbackResult\n      }\n      throw new ClmmpoolsError('No parameters available for service downgrade', RouterErrorCode.NoDowngradeNeedParams)\n    }\n\n    const optimalSwapResult = await this.preRouterSwapA2B2C(routerSwapParams.slice(0, 16))\n    if (optimalSwapResult == null) {\n      if (multiPoolParams != null) {\n        const fallbackSwapResult = await this.sdk.Swap.preSwapWithMultiPool(multiPoolParams)\n\n        const fallbackPath: OnePath = {\n          amountIn: new BN(fallbackSwapResult!.estimatedAmountIn),\n          amountOut: new BN(fallbackSwapResult!.estimatedAmountOut),\n          poolAddress: [fallbackSwapResult!.poolAddress],\n          a2b: [fallbackSwapResult!.aToB],\n          rawAmountLimit: isFixedInput ? [fallbackSwapResult!.estimatedAmountOut] : [fallbackSwapResult!.estimatedAmountIn],\n          isExceed: fallbackSwapResult!.isExceed,\n          coinType: [fromCoin, toCoin],\n        }\n\n        const fallbackRouterParams = {\n          paths: [fallbackPath],\n          partner: partnerObjectId,\n          priceSlippagePoint: slippagePoint,\n        }\n\n        const fallbackResult: BestInternalRouterResult = {\n          amountIn: new BN(fallbackSwapResult!.estimatedAmountIn),\n          amountOut: new BN(fallbackSwapResult!.estimatedAmountOut),\n          paths: [fallbackPath],\n          a2b: fallbackSwapResult!.aToB,\n          b2c: undefined,\n          byAmountIn: isFixedInput,\n          isExceed: fallbackSwapResult!.isExceed,\n          targetSqrtPrice: [fallbackSwapResult!.estimatedEndSqrtPrice],\n          currentSqrtPrice: [fallbackSwapResult!.estimatedStartSqrtPrice],\n          coinTypeA: fromCoin,\n          coinTypeB: toCoin,\n          coinTypeC: undefined,\n          createTxParams: fallbackRouterParams,\n        }\n        return fallbackResult\n      }\n\n      const emptyResult: BestInternalRouterResult = {\n        amountIn: ZERO,\n        amountOut: ZERO,\n        paths: [],\n        a2b: false,\n        b2c: false,\n        byAmountIn: isFixedInput,\n        isExceed: true,\n        targetSqrtPrice: [],\n        currentSqrtPrice: [],\n        coinTypeA: '',\n        coinTypeB: '',\n        coinTypeC: undefined,\n        createTxParams: undefined,\n      }\n\n      return emptyResult\n    }\n\n    const optimalPathIndex = optimalSwapResult!.index\n\n    const optimalPoolAddresses =\n      routerSwapParams[optimalPathIndex].poolBC != null\n        ? [routerSwapParams[optimalPathIndex].poolAB, routerSwapParams[optimalPathIndex].poolBC!]\n        : [routerSwapParams[optimalPathIndex].poolAB]\n\n    const optimalAmountLimits = isFixedInput\n      ? [optimalSwapResult!.amountMedium, optimalSwapResult!.amountOut]\n      : [optimalSwapResult!.amountIn, optimalSwapResult!.amountMedium]\n\n    const optimalDirections = []\n    optimalDirections.push(routerSwapParams[optimalPathIndex].a2b)\n    if (optimalSwapResult!.stepNum! > 1) {\n      optimalDirections.push(routerSwapParams[optimalPathIndex].b2c!)\n    }\n\n    const optimalCoinTypes = []\n    optimalCoinTypes.push(routerSwapParams[optimalPathIndex].coinTypeA)\n    optimalCoinTypes.push(routerSwapParams[optimalPathIndex].coinTypeB)\n    if (optimalSwapResult!.stepNum! > 1) {\n      optimalCoinTypes.push(routerSwapParams[optimalPathIndex].coinTypeC!)\n    }\n\n    const optimalPath: OnePath = {\n      amountIn: optimalSwapResult!.amountIn,\n      amountOut: optimalSwapResult!.amountOut,\n      poolAddress: optimalPoolAddresses,\n      a2b: optimalDirections,\n      rawAmountLimit: optimalAmountLimits,\n      isExceed: optimalSwapResult!.isExceed,\n      coinType: optimalCoinTypes,\n    }\n\n    const routerTransactionParams = {\n      paths: [optimalPath],\n      partner: partnerObjectId,\n      priceSlippagePoint: slippagePoint,\n    }\n\n    const finalResult: BestInternalRouterResult = {\n      amountIn: optimalSwapResult!.amountIn,\n      amountOut: optimalSwapResult!.amountOut,\n      paths: [optimalPath],\n      a2b: routerSwapParams[optimalPathIndex].a2b,\n      b2c: optimalSwapResult!.stepNum! > 1 ? routerSwapParams[optimalPathIndex].b2c! : undefined,\n      byAmountIn: isFixedInput,\n      isExceed: optimalSwapResult!.isExceed,\n      targetSqrtPrice: optimalSwapResult!.targetSqrtPrice,\n      currentSqrtPrice: optimalSwapResult!.currentSqrtPrice,\n      coinTypeA: routerSwapParams[optimalPathIndex].coinTypeA,\n      coinTypeB: routerSwapParams[optimalPathIndex].coinTypeB,\n      coinTypeC: optimalSwapResult!.stepNum! > 1 ? routerSwapParams[optimalPathIndex].coinTypeC! : undefined,\n      createTxParams: routerTransactionParams,\n    }\n    return finalResult\n  }\n\n  /**\n   * Loads graph data from the remote API endpoint\n   */\n  async loadGraphData() {\n    const coinRegistry = new Map()\n    const poolRegistry = new Map()\n\n    const apiResponse: any = await fetch(this.sdk.sdkOptions.swapCountUrl!, { method: 'GET' })\n    const poolsData = await apiResponse.json()\n\n    if (poolsData.code === 200) {\n      for (const poolInfo of poolsData.pools) {\n        if (poolInfo.is_closed) {\n          continue\n        }\n\n        let coinA_address = poolInfo.coin_a.address\n        let coinB_address = poolInfo.coin_b.address\n\n        coinRegistry.set(coinA_address, {\n          address: poolInfo.coin_a.address,\n          decimals: poolInfo.coin_a.decimals,\n        })\n        coinRegistry.set(coinB_address, {\n          address: poolInfo.coin_b.address,\n          decimals: poolInfo.coin_b.decimals,\n        })\n\n        const tradingPair = `${coinA_address}-${coinB_address}`\n        const existingPathProvider = poolRegistry.get(tradingPair)\n        if (existingPathProvider) {\n          existingPathProvider.addressMap.set(Number(poolInfo.fee) * 100, poolInfo.address)\n        } else {\n          poolRegistry.set(tradingPair, {\n            base: coinA_address,\n            quote: coinB_address,\n            addressMap: new Map([[Number(poolInfo.fee) * 100, poolInfo.address]]),\n          })\n        }\n      }\n    } else {\n      throw new ClmmpoolsError(`No response from server. Cannot load graph data`)\n    }\n\n    const coinData: CoinProvider = {\n      coins: Array.from(coinRegistry.values()),\n    }\n    const pathData: PathProvider = {\n      paths: Array.from(poolRegistry.values()),\n    }\n\n    this.sdk.Router.loadGraph(coinData, pathData)\n  }\n\n  /**\n   * Pre-calculates routing swap results for multiple parameter sets\n   * @param parameterSets - Array of router swap parameters to evaluate\n   * @returns Best swap result or null if none found\n   */\n  async preRouterSwapA2B2C(parameterSets: PreRouterSwapParams[]) {\n    if (parameterSets.length === 0) {\n      return null\n    }\n\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n    const transaction = new Transaction()\n    for (const swapParams of parameterSets) {\n      if (swapParams.stepNums > 1) {\n        const transactionArgs = [\n          transaction.object(swapParams.poolAB),\n          transaction.object(swapParams.poolBC!),\n          transaction.pure.bool(swapParams.a2b),\n          transaction.pure.bool(swapParams.b2c!),\n          transaction.pure.bool(swapParams.byAmountIn),\n          transaction.pure.u64(swapParams.amount.toString()),\n        ]\n        const typeParameters = []\n        if (swapParams.a2b) {\n          typeParameters.push(swapParams.coinTypeA, swapParams.coinTypeB)\n        } else {\n          typeParameters.push(swapParams.coinTypeB, swapParams.coinTypeA)\n        }\n\n        if (swapParams.b2c) {\n          typeParameters.push(swapParams.coinTypeB, swapParams.coinTypeC!)\n        } else {\n          typeParameters.push(swapParams.coinTypeC!, swapParams.coinTypeB)\n        }\n\n        transaction.moveCall({\n          target: `${integrate.published_at}::${ClmmIntegrateRouterModule}::calculate_router_swap_result`,\n          typeArguments: typeParameters,\n          arguments: transactionArgs,\n        })\n      } else {\n        const transactionArgs = [\n          transaction.object(swapParams.poolAB),\n          transaction.pure.bool(swapParams.a2b),\n          transaction.pure.bool(swapParams.byAmountIn),\n          transaction.pure.u64(swapParams.amount.toString()),\n        ]\n        const typeParameters = swapParams.a2b ? [swapParams.coinTypeA, swapParams.coinTypeB] : [swapParams.coinTypeB, swapParams.coinTypeA]\n        transaction.moveCall({\n          target: `${integrate.published_at}::${ClmmExpectSwapModule}::get_expect_swap_result`,\n          arguments: transactionArgs,\n          typeArguments: typeParameters,\n        })\n      }\n    }\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError('Invalid simulation account configuration', ConfigErrorCode.InvalidSimulateAccount)\n    }\n\n    const simulationResult = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: transaction,\n      sender: simulationAccount.address,\n    })\n\n    const eventData: any = simulationResult.events?.filter((event: any) => {\n      return (\n        extractStructTagFromType(event.type).name === `CalculatedRouterSwapResultEvent` ||\n        extractStructTagFromType(event.type).name === `ExpectSwapResultEvent`\n      )\n    })\n    if (eventData.length === 0) {\n      return null\n    }\n\n    let optimalAmount = parameterSets[0].byAmountIn ? ZERO : U64_MAX\n    let optimalIndex = 0\n\n    for (let eventIndex = 0; eventIndex < eventData.length; eventIndex += 1) {\n      if (eventData[eventIndex].parsedJson.data.is_exceed) {\n        continue\n      }\n\n      if (parameterSets[0].byAmountIn) {\n        const outputAmount = new BN(eventData[eventIndex].parsedJson.data.amount_out)\n        if (outputAmount.gt(optimalAmount)) {\n          optimalIndex = eventIndex\n          optimalAmount = outputAmount\n        }\n      } else {\n        const inputAmount =\n          parameterSets[eventIndex].stepNums > 1\n            ? new BN(eventData[eventIndex].parsedJson.data.amount_in)\n            : new BN(eventData[eventIndex].parsedJson.data.amount_in).add(new BN(eventData[eventIndex].parsedJson.data.fee_amount))\n        if (inputAmount.lt(optimalAmount)) {\n          optimalIndex = eventIndex\n          optimalAmount = inputAmount\n        }\n      }\n    }\n\n    const currentPrices = []\n    const targetPrices = []\n    if (parameterSets[optimalIndex].stepNums > 1) {\n      targetPrices.push(\n        eventData[optimalIndex].parsedJson.data.target_sqrt_price_ab,\n        eventData[optimalIndex].parsedJson.data.target_sqrt_price_cd\n      )\n      currentPrices.push(\n        eventData[optimalIndex].parsedJson.data.current_sqrt_price_ab,\n        eventData[optimalIndex].parsedJson.data.current_sqrt_price_cd\n      )\n    } else {\n      targetPrices.push(eventData[optimalIndex].parsedJson.data.after_sqrt_price)\n      currentPrices.push(eventData[optimalIndex].parsedJson.current_sqrt_price)\n    }\n\n    const optimalResult: PreSwapResult = {\n      index: optimalIndex,\n      amountIn: parameterSets[0].byAmountIn ? parameterSets[optimalIndex].amount : optimalAmount,\n      amountMedium: eventData[optimalIndex].parsedJson.data.amount_medium,\n      amountOut: parameterSets[0].byAmountIn ? optimalAmount : parameterSets[optimalIndex].amount,\n      targetSqrtPrice: targetPrices,\n      currentSqrtPrice: currentPrices,\n      isExceed: eventData[optimalIndex].parsedJson.data.is_exceed,\n      stepNum: parameterSets[optimalIndex].stepNums,\n    }\n    return optimalResult\n  }\n\n  /**\n   * Retrieves pool information with TVL data from API\n   * @returns Array of pools with their TVL information\n   */\n  async getPoolWithTVL(): Promise<PoolWithTvl[]> {\n    const poolTvlResults: PoolWithTvl[] = []\n\n    const { swapCountUrl } = this._sdk.sdkOptions\n    if (!swapCountUrl) {\n      return poolTvlResults\n    }\n\n    let apiResponse\n    try {\n      apiResponse = await fetch(swapCountUrl)\n    } catch (fetchError) {\n      throw new ClmmpoolsError(`Failed to get pool list with liquidity from ${swapCountUrl}.`, RouterErrorCode.InvalidSwapCountUrl)\n    }\n\n    let responseData\n    try {\n      responseData = await apiResponse.json()\n    } catch (parseError) {\n      throw new ClmmpoolsError(`Failed to parse response from ${swapCountUrl}.`, RouterErrorCode.InvalidSwapCountUrl)\n    }\n\n    if (responseData.code !== 200) {\n      throw new ClmmpoolsError(\n        `Failed to get pool list from ${swapCountUrl}. Status code is ${responseData.code}.`,\n        RouterErrorCode.InvalidSwapCountUrl\n      )\n    }\n\n    const { pools } = responseData\n\n    for (const poolData of pools) {\n      poolTvlResults.push({\n        poolAddress: poolData.address,\n        tvl: Number(poolData.tvl_in_usd),\n      })\n    }\n\n    return poolTvlResults\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/clmm-pool'\nimport { FerraClmmSDK } 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 './router'\nimport { ClmmpoolsError, ConfigErrorCode, SwapErrorCode, UtilsErrorCode } from '../errors/errors'\n\n/**\n * Swap module for executing token swaps in CLMM pools\n * Handles swap calculations, fee estimation, price impact analysis, and transaction creation\n * Supports both single-pool and multi-pool swap operations with gas optimization\n */\nexport class SwapModule implements IModule {\n  protected _sdk: FerraClmmSDK\n\n  constructor(sdk: FerraClmmSDK) {\n    this._sdk = sdk\n  }\n\n  get sdk() {\n    return this._sdk\n  }\n\n  /**\n   * Calculates total swap fees across multiple split paths\n   * @param splitPaths - Array of split paths containing fee information\n   * @returns Total fee amount as string\n   */\n  calculateSwapFee(splitPaths: SplitPath[]) {\n    let totalFee = d(0)\n\n    splitPaths.forEach((pathItem) => {\n      const numberOfPaths = pathItem.basePaths.length\n      if (numberOfPaths > 0) {\n        const firstPath = pathItem.basePaths[0]\n        const feeRate = firstPath.label === 'Ferra' ? new Decimal(firstPath.feeRate).div(10 ** 6) : new Decimal(firstPath.feeRate).div(10 ** 9)\n        const firstFeeAmount = d(firstPath.inputAmount)\n          .div(10 ** firstPath.fromDecimal)\n          .mul(feeRate)\n        totalFee = totalFee.add(firstFeeAmount)\n\n        if (numberOfPaths > 1) {\n          const secondPath = pathItem.basePaths[1]\n          const firstPrice = firstPath.direction ? firstPath.currentPrice : new Decimal(1).div(firstPath.currentPrice)\n          const secondPrice = secondPath.direction ? secondPath.currentPrice : new Decimal(1).div(secondPath.currentPrice)\n          const secondFeeRate = secondPath.label === 'Ferra' ? new Decimal(secondPath.feeRate).div(10 ** 6) : new Decimal(secondPath.feeRate).div(10 ** 9)\n\n          const secondFeeAmount = d(secondPath.outputAmount)\n            .div(10 ** secondPath.toDecimal)\n            .mul(secondFeeRate)\n          const adjustedSecondFee = secondFeeAmount.div(firstPrice.mul(secondPrice))\n          totalFee = totalFee.add(adjustedSecondFee)\n        }\n      }\n    })\n\n    return totalFee.toString()\n  }\n\n  /**\n   * Calculates price impact percentage across multiple split paths\n   * @param splitPaths - Array of split paths for impact calculation\n   * @returns Total price impact as string percentage\n   */\n  calculateSwapPriceImpact(splitPaths: SplitPath[]) {\n    let totalImpact = d(0)\n\n    splitPaths.forEach((pathItem) => {\n      const numberOfPaths = pathItem.basePaths.length\n\n      if (numberOfPaths === 1) {\n        const singlePath = pathItem.basePaths[0]\n        const outputAmount = d(singlePath.outputAmount).div(10 ** singlePath.toDecimal)\n        const inputAmount = d(singlePath.inputAmount).div(10 ** singlePath.fromDecimal)\n        const exchangeRate = outputAmount.div(inputAmount)\n        const currentPrice = singlePath.direction ? new Decimal(singlePath.currentPrice) : new Decimal(1).div(singlePath.currentPrice)\n        totalImpact = totalImpact.add(this.calculateSingleImpact(exchangeRate, currentPrice))\n      }\n\n      if (numberOfPaths === 2) {\n        const firstPath = pathItem.basePaths[0]\n        const secondPath = pathItem.basePaths[1]\n        const firstPrice = firstPath.direction ? new Decimal(firstPath.currentPrice) : new Decimal(1).div(firstPath.currentPrice)\n        const secondPrice = secondPath.direction ? new Decimal(secondPath.currentPrice) : new Decimal(1).div(secondPath.currentPrice)\n        const combinedPrice = firstPrice.mul(secondPrice)\n        const outputAmount = new Decimal(secondPath.outputAmount).div(10 ** secondPath.toDecimal)\n        const inputAmount = new Decimal(firstPath.inputAmount).div(10 ** firstPath.fromDecimal)\n        const exchangeRate = outputAmount.div(inputAmount)\n        totalImpact = totalImpact.add(this.calculateSingleImpact(exchangeRate, combinedPrice))\n      }\n    })\n\n    return totalImpact.toString()\n  }\n\n  /**\n   * Calculates price impact for a single path\n   * @param exchangeRate - Actual exchange rate achieved\n   * @param marketPrice - Current market price\n   * @returns Price impact percentage\n   */\n  private calculateSingleImpact = (exchangeRate: Decimal, marketPrice: Decimal) => {\n    // Calculate impact as: ((marketPrice - exchangeRate) / marketPrice) * 100\n    return marketPrice.minus(exchangeRate).div(marketPrice).mul(100)\n  }\n\n  /**\n   * Performs pre-swap simulation across multiple pools to find optimal execution\n   * @param swapParams - Parameters for multi-pool swap simulation\n   * @returns Promise resolving to optimal swap data or null if no valid swap found\n   */\n  async preSwapWithMultiPool(swapParams: PreSwapWithMultiPoolParams) {\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n    const transaction = new Transaction()\n\n    const coinTypes = [swapParams.coinTypeA, swapParams.coinTypeB]\n    for (let poolIndex = 0; poolIndex < swapParams.poolAddresses.length; poolIndex += 1) {\n      const transactionArgs = [\n        transaction.object(swapParams.poolAddresses[poolIndex]),\n        transaction.pure.bool(swapParams.a2b),\n        transaction.pure.bool(swapParams.byAmountIn),\n        transaction.pure.u64(swapParams.amount),\n      ]\n      transaction.moveCall({\n        target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n        arguments: transactionArgs,\n        typeArguments: coinTypes,\n      })\n    }\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError('Invalid simulation account configuration', ConfigErrorCode.InvalidSimulateAccount)\n    }\n\n    const simulationResult = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: transaction,\n      sender: simulationAccount.address,\n    })\n\n    if (simulationResult.error != null) {\n      throw new ClmmpoolsError(\n        `Multi-pool pre-swap failed: ${simulationResult.error ?? 'unknown error'}, please check configuration and parameters`,\n        ConfigErrorCode.InvalidConfig\n      )\n    }\n\n    const swapEventData: any = simulationResult.events?.filter((event: any) => {\n      return extractStructTagFromType(event.type).name === `CalculatedSwapResultEvent`\n    })\n\n    if (swapEventData.length === 0) {\n      return null\n    }\n\n    if (swapEventData.length !== swapParams.poolAddresses.length) {\n      throw new ClmmpoolsError('Event data length does not match pool count', SwapErrorCode.ParamsLengthNotEqual)\n    }\n\n    let optimalAmount = swapParams.byAmountIn ? ZERO : U64_MAX\n    let optimalPoolIndex = 0\n\n    for (let eventIndex = 0; eventIndex < swapEventData.length; eventIndex += 1) {\n      if (swapEventData[eventIndex].parsedJson.data.is_exceed) {\n        continue\n      }\n\n      if (swapParams.byAmountIn) {\n        const outputAmount = new BN(swapEventData[eventIndex].parsedJson.data.amount_out)\n        if (outputAmount.gt(optimalAmount)) {\n          optimalPoolIndex = eventIndex\n          optimalAmount = outputAmount\n        }\n      } else {\n        const outputAmount = new BN(swapEventData[eventIndex].parsedJson.data.amount_out)\n        if (outputAmount.lt(optimalAmount)) {\n          optimalPoolIndex = eventIndex\n          optimalAmount = outputAmount\n        }\n      }\n    }\n\n    return this.transformSwapWithMultiPoolData(\n      {\n        poolAddress: swapParams.poolAddresses[optimalPoolIndex],\n        a2b: swapParams.a2b,\n        byAmountIn: swapParams.byAmountIn,\n        amount: swapParams.amount,\n        coinTypeA: swapParams.coinTypeA,\n        coinTypeB: swapParams.coinTypeB,\n      },\n      swapEventData[optimalPoolIndex].parsedJson\n    )\n  }\n\n  /**\n   * Performs pre-swap simulation for a single pool\n   * @param swapParams - Parameters for single pool swap simulation\n   * @returns Promise resolving to swap simulation data or null if simulation fails\n   */\n  async preswap(swapParams: PreSwapParams) {\n    const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n    const transaction = new Transaction()\n\n    const coinTypes = [swapParams.coinTypeA, swapParams.coinTypeB]\n    const transactionArgs = [\n      transaction.object(swapParams.pool.poolAddress),\n      transaction.pure.bool(swapParams.a2b),\n      transaction.pure.bool(swapParams.byAmountIn),\n      transaction.pure.u64(swapParams.amount)\n    ]\n\n    transaction.moveCall({\n      target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n      arguments: transactionArgs,\n      typeArguments: coinTypes,\n    })\n\n    if (!checkInvalidSuiAddress(simulationAccount.address)) {\n      throw new ClmmpoolsError('Invalid simulation account configuration', ConfigErrorCode.InvalidSimulateAccount)\n    }\n\n    const simulationResult = await this.sdk.fullClient.devInspectTransactionBlock({\n      transactionBlock: transaction,\n      sender: simulationAccount.address,\n    })\n\n    if (simulationResult.error != null) {\n      throw new ClmmpoolsError(\n        `Pre-swap simulation failed: ${simulationResult.error ?? 'unknown error'}, please check configuration and parameters`,\n        ConfigErrorCode.InvalidConfig\n      )\n    }\n\n    const swapEventData: any = simulationResult.events?.filter((event: any) => {\n      return extractStructTagFromType(event.type).name === `CalculatedSwapResultEvent`\n    })\n\n    if (swapEventData.length === 0) {\n      return null\n    }\n\n    return this.transformSwapData(swapParams, swapEventData[0].parsedJson.data)\n  }\n\n  /**\n   * Transforms raw swap simulation data into structured swap result\n   * @param swapParams - Original swap parameters\n   * @param simulationData - Raw simulation result data\n   * @returns Structured swap data object\n   */\n  private transformSwapData(swapParams: PreSwapParams, simulationData: any) {\n    const calculatedAmountIn = simulationData.amount_in && simulationData.fee_amount\n      ? new BN(simulationData.amount_in).add(new BN(simulationData.fee_amount)).toString()\n      : ''\n\n    return {\n      poolAddress: swapParams.pool.poolAddress,\n      currentSqrtPrice: swapParams.currentSqrtPrice,\n      estimatedAmountIn: calculatedAmountIn,\n      estimatedAmountOut: simulationData.amount_out,\n      estimatedEndSqrtPrice: simulationData.after_sqrt_price,\n      estimatedFeeAmount: simulationData.fee_amount,\n      isExceed: simulationData.is_exceed,\n      amount: swapParams.amount,\n      aToB: swapParams.a2b,\n      byAmountIn: swapParams.byAmountIn,\n    }\n  }\n\n  /**\n   * Transforms multi-pool swap simulation data into structured result\n   * @param swapParams - Original multi-pool swap parameters\n   * @param responseData - Raw JSON response from simulation\n   * @returns Structured multi-pool swap data object\n   */\n  private transformSwapWithMultiPoolData(swapParams: TransPreSwapWithMultiPoolParams, responseData: any) {\n    const { data } = responseData\n\n    console.log('Multi-pool swap simulation data: ', data)\n\n    const calculatedAmountIn = data.amount_in && data.fee_amount\n      ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString()\n      : ''\n\n    return {\n      poolAddress: swapParams.poolAddress,\n      estimatedAmountIn: calculatedAmountIn,\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: swapParams.amount,\n      aToB: swapParams.a2b,\n      byAmountIn: swapParams.byAmountIn,\n    }\n  }\n\n  /**\n   * Calculates swap rates and impact metrics using local computation\n   * @param calculationParams - Parameters for rate calculation including pool data and ticks\n   * @returns Detailed calculation results including amounts, fees, and price impact\n   */\n  calculateRates(calculationParams: CalculateRatesParams): CalculateRatesResult {\n    const { currentPool } = calculationParams\n    const poolData = transClmmpoolDataWithoutTicks(currentPool)\n\n    let sortedTicks\n    if (calculationParams.a2b) {\n      sortedTicks = calculationParams.swapTicks.sort((tickA, tickB) => {\n        return tickB.index - tickA.index\n      })\n    } else {\n      sortedTicks = calculationParams.swapTicks.sort((tickA, tickB) => {\n        return tickA.index - tickB.index\n      })\n    }\n\n    const swapCalculationResult = computeSwap(calculationParams.a2b, calculationParams.byAmountIn, calculationParams.amount, poolData, sortedTicks)\n\n    let hasExceededLimits = false\n    if (calculationParams.byAmountIn) {\n      hasExceededLimits = swapCalculationResult.amountIn.lt(calculationParams.amount)\n    } else {\n      hasExceededLimits = swapCalculationResult.amountOut.lt(calculationParams.amount)\n    }\n\n    const priceLimit = SwapUtils.getDefaultSqrtPriceLimit(calculationParams.a2b)\n    if (calculationParams.a2b && swapCalculationResult.nextSqrtPrice.lt(priceLimit)) {\n      hasExceededLimits = true\n    }\n\n    if (!calculationParams.a2b && swapCalculationResult.nextSqrtPrice.gt(priceLimit)) {\n      hasExceededLimits = true\n    }\n\n    let additionalComputeLimit = 0\n    if (swapCalculationResult.crossTickNum > 6 && swapCalculationResult.crossTickNum < 40) {\n      additionalComputeLimit = 22000 * (swapCalculationResult.crossTickNum - 6)\n    }\n\n    if (swapCalculationResult.crossTickNum > 40) {\n      hasExceededLimits = true\n    }\n\n    const initialPrice = TickMath.sqrtPriceX64ToPrice(poolData.currentSqrtPrice, calculationParams.decimalsA, calculationParams.decimalsB).toNumber()\n    const finalPrice = TickMath.sqrtPriceX64ToPrice(swapCalculationResult.nextSqrtPrice, calculationParams.decimalsA, calculationParams.decimalsB).toNumber()\n\n    const priceImpactPercentage = (Math.abs(initialPrice - finalPrice) / initialPrice) * 100\n\n    return {\n      estimatedAmountIn: swapCalculationResult.amountIn,\n      estimatedAmountOut: swapCalculationResult.amountOut,\n      estimatedEndSqrtPrice: swapCalculationResult.nextSqrtPrice,\n      estimatedFeeAmount: swapCalculationResult.feeAmount,\n      isExceed: hasExceededLimits,\n      extraComputeLimit: additionalComputeLimit,\n      amount: calculationParams.amount,\n      aToB: calculationParams.a2b,\n      byAmountIn: calculationParams.byAmountIn,\n      priceImpactPct: priceImpactPercentage,\n    }\n  }\n\n  /**\n   * Creates a complete swap transaction with automatic coin management\n   * @param swapParams - Parameters for swap execution\n   * @param gasEstimationConfig - Optional gas estimation configuration for SUI swaps\n   * @returns Promise resolving to executable transaction\n   */\n  async createSwapTransactionPayload(\n    swapParams: SwapParams,\n    gasEstimationConfig?: {\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: Ferra CLMM SDK requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n\n    const userCoinAssets = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n\n    if (gasEstimationConfig) {\n      const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(swapParams)\n\n      if ((swapParams.a2b && isAdjustCoinA) || (!swapParams.a2b && isAdjustCoinB)) {\n        const gasOptimizedTransaction = await TransactionUtil.buildSwapTransactionForGas(this._sdk, swapParams, userCoinAssets, gasEstimationConfig)\n        return gasOptimizedTransaction\n      }\n    }\n\n    return TransactionUtil.buildSwapTransaction(this.sdk, swapParams, userCoinAssets)\n  }\n\n  /**\n   * Creates a swap transaction without automatic coin transfers (for advanced usage)\n   * @param swapParams - Parameters for swap execution\n   * @param gasEstimationConfig - Optional gas estimation configuration for SUI swaps\n   * @returns Promise resolving to transaction and coin arguments for manual handling\n   */\n  async createSwapTransactionWithoutTransferCoinsPayload(\n    swapParams: SwapParams,\n    gasEstimationConfig?: {\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: Ferra CLMM SDK requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n        UtilsErrorCode.InvalidSendAddress\n      )\n    }\n\n    const userCoinAssets = await this._sdk.getOwnerCoinAssets(this.sdk.senderAddress)\n\n    if (gasEstimationConfig) {\n      const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(swapParams)\n\n      if ((swapParams.a2b && isAdjustCoinA) || (!swapParams.a2b && isAdjustCoinB)) {\n        const gasOptimizedResult = await TransactionUtil.buildSwapTransactionWithoutTransferCoinsForGas(this._sdk, swapParams, userCoinAssets, gasEstimationConfig)\n        return gasOptimizedResult\n      }\n    }\n\n    return TransactionUtil.buildSwapTransactionWithoutTransferCoins(this.sdk, swapParams, userCoinAssets)\n  }\n}","import { CoinBalance } from '@mysten/sui/client'\nimport { PoolModule } from './modules/pool'\nimport { PositionModule } from './modules/position'\nimport { RewarderModule } from './modules/rewarder'\nimport { RouterModule } from './modules/router'\nimport { SwapModule } from './modules/swap'\nimport { CachedContent, cacheTime24h, extractStructTagFromType, getFutureTime, patchFixSuiObjectId } from './utils'\nimport { ClmmConfig, CoinAsset, Package, SuiResource, SuiAddressType, TokenConfig } from './types'\nimport { RpcModule } from './modules/rpc'\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 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   * The URL for the swap count\n   */\n  swapCountUrl?: string\n\n}\n\n/**\n * The entry class of FerraClmmSDK, which is almost responsible for all interactions with CLMM.\n */\nexport class FerraClmmSDK {\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 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\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   * 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 { FerraClmmSDK, SdkOptions } from './sdk'\n\nexport { FerraClmmSDK }\nexport type { SdkOptions }\n\nexport default FerraClmmSDK","import FerraClmmSDK, { SdkOptions } from '../main'\nimport { checkInvalidSuiAddress } from '../utils'\n\nconst SDKConfig = {\n  clmmConfig: {\n    pools_id: '0xcf8cd5934d0ba8ab70a6db533ac4ff20b0ccd55e54b82688811007723cf8e468',\n    global_config_id: '0x32bcdffb86333e3092ff3aa2d97847cde7a36724a026844732ade63a42fc8b45',\n    global_rewarder_vault_id: '0x97e1f1e0931eed67806e598fdf33b699cb988ae04558ff0ae7d74d23cab06d42',\n    admin_cap_id: '0x124fde729c561a4dc1bdcf2415fe365c67bf50a1352f2bae890da1ebddbb1ec4',\n  }\n}\n\n// mainnet\nexport const clmmMainnet: SdkOptions = {\n  fullRpcUrl: 'https://mainnet.suiet.app:443',\n  simulationAccount: {\n    address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n  },\n  clmm_pool: {\n    package_id: '0x677a8ee8489097070f95ffdac5c385ee1ee84e1056ea3d29ede5e09f3e612420',\n    published_at: '0x677a8ee8489097070f95ffdac5c385ee1ee84e1056ea3d29ede5e09f3e612420',\n    config: SDKConfig.clmmConfig,\n  },\n  integrate: {\n    package_id: '0x97084e44e7778be7414a8fa00623a6274f0161ab0735390a6f2a569e1bdaef7f',\n    published_at: '0x97084e44e7778be7414a8fa00623a6274f0161ab0735390a6f2a569e1bdaef7f',\n  },\n  swapCountUrl: 'https://api-beta.ferra.xyz/clmm/swap/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): FerraClmmSDK {\n  if (fullNodeUrl) {\n    clmmMainnet.fullRpcUrl = fullNodeUrl\n  }\n  const sdk = new FerraClmmSDK(clmmMainnet)\n  if (wallet && checkInvalidSuiAddress(wallet)) {\n    sdk.senderAddress = wallet\n  }\n  return sdk\n}\n","import FerraClmmSDK, { SdkOptions } from '../main'\nimport { checkInvalidSuiAddress } from '../utils'\n\n\nconst SDKConfig = {\n  clmmConfig: {\n    pools_id: '0x03efd79c7c2bb27379ca66ff4f992ab3cbfe2a451aa3fec3df5406349ff7f572',\n    global_config_id: '0x0f21705a8a674ce564b8e320c7bfccae236b763370786d504f7631af6425ff62',\n    global_rewarder_vault_id: '0x8662e8854da9a4f5f90188869d5fcef81e3b9c589af377739138f2ee92c7b5ab',\n    admin_cap_id: '0x7206003008b41cc9c5132d6b23fb0f8f5e8aeb0f235d9698e56a93ddd3ee32d8',\n  }\n}\n\n// test on mainnet\nexport const clmmTestnet: SdkOptions = {\n  fullRpcUrl: 'https://mainnet.suiet.app:443',\n  simulationAccount: {\n    address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n  },\n  clmm_pool: {\n    package_id: '0xc7d71347aa2bafbdf09b594b3153ff8b5b74078dba8d6d0e2b4bf39ca6f5716c',\n    published_at: '0xc7d71347aa2bafbdf09b594b3153ff8b5b74078dba8d6d0e2b4bf39ca6f5716c',\n    config: SDKConfig.clmmConfig,\n  },\n  integrate: {\n    package_id: '0x39f2aefb839d0dbddc018b951e88f16d6502234c754df707cd3a0b70cf6dfba3',\n    published_at: '0x39f2aefb839d0dbddc018b951e88f16d6502234c754df707cd3a0b70cf6dfba3',\n  },\n  swapCountUrl: 'https://api-dev.ferra.xyz/clmm/swap/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): FerraClmmSDK {\n  if (fullNodeUrl) {\n    clmmTestnet.fullRpcUrl = fullNodeUrl\n  }\n  const sdk = new FerraClmmSDK(clmmTestnet)\n  if (wallet && checkInvalidSuiAddress(wallet)) {\n    sdk.senderAddress = wallet\n  }\n  return sdk\n}\n","import FerraClmmSDK, { SdkOptions } from '../main'\nimport { checkInvalidSuiAddress } from '../utils'\n\n\nconst SDKConfig = {\n  clmmConfig: {\n    pools_id: '0x10137e02719ec3a4979da862b1eb20a8e0c552323adcbe166606e84a9cf4d7b6',\n    global_config_id: '0xf95e1634845d71c56dcfcea3c96cef4c81ee2451b2e058a85ed763d81f06abf4',\n    global_rewarder_vault_id: '0x7cf968d5ee8ee6c3bda3768839b4a65876c44bda06174e7476b926ad07dddec0',\n    admin_cap_id: '0x7079548ef164ebd71ad0e24f517d8a18eba8353682065da48c96887c1c5ee948',\n  }\n}\n//https://suivision.xyz/txblock/B4WbFgHnh8j5VYJstjQog87hsK5ya7sbXmjsBSF87ogj?tab=Changes\n// https://suivision.xyz/txblock/8LQqVty6723xznbMVeasAxbAtqyBwsTbcYTZvpjmkGuQ?tab=Changes\n// test on mainnet\nexport const clmmBeta: SdkOptions = {\n  fullRpcUrl: 'https://mainnet.suiet.app:443',\n  simulationAccount: {\n    address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n  },\n  clmm_pool: {\n    package_id: '0xf9bd23323871f0f3f300b8704a107b0475d3a203880d02ec7d22a7c003091919',\n    published_at: '0xf9bd23323871f0f3f300b8704a107b0475d3a203880d02ec7d22a7c003091919',\n    config: SDKConfig.clmmConfig,\n  },\n  integrate: {\n    package_id: '0x7192515dcffbd115662edad5b41e808b3d926a098c963ad53e0196f32365e0e5',\n    published_at: '0x7192515dcffbd115662edad5b41e808b3d926a098c963ad53e0196f32365e0e5',\n  },\n  swapCountUrl: 'https://api-beta.ferra.xyz/clmm/swap/pools'\n}\n\n/**\n * Initialize the beta 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 initBetaSDK(fullNodeUrl?: string, wallet?: string): FerraClmmSDK {\n  if (fullNodeUrl) {\n    clmmBeta.fullRpcUrl = fullNodeUrl\n  }\n  const sdk = new FerraClmmSDK(clmmBeta)\n  if (wallet && checkInvalidSuiAddress(wallet)) {\n    sdk.senderAddress = wallet\n  }\n  return sdk\n}\n","import FerraClmmSDK from '../main'\nimport { initMainnetSDK } from './mainnet'\nimport { initTestnetSDK } from './testnet'\nimport { initBetaSDK } from './beta'\n\ninterface InitFerraSDKOptions {\n  network: 'mainnet' | 'testnet' | 'beta'\n  fullNodeUrl?: string\n  wallet?: string\n}\n\n/**\n * Helper function to initialize the Ferra 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 Ferra SDK.\n */\nexport function initFerraSDK(options: InitFerraSDKOptions): FerraClmmSDK {\n  const { network, fullNodeUrl, wallet } = options\n  switch (network) {\n    case 'mainnet':\n      return initMainnetSDK(fullNodeUrl, wallet)\n    case 'testnet':\n      return initTestnetSDK(fullNodeUrl, wallet)\n    case 'beta':\n      return initBetaSDK(fullNodeUrl, wallet)\n\n    default:\n      break;\n  }\n  return initTestnetSDK(fullNodeUrl, wallet)\n}\n\nexport function initFerraClmmSDK(options: InitFerraSDKOptions): FerraClmmSDK {\n  return initFerraSDK(options)\n}\n","import { FerraClmmSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './math'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport type { SdkOptions }\nexport { FerraClmmSDK }\nexport default FerraClmmSDK\n"]}