{"version":3,"sources":["../../src/modules/positionModule.ts"],"sourcesContent":["import {\n  AccountAddress,\n  InputEntryFunctionData,\n  Serializer,\n  U256,\n} from \"@aptos-labs/ts-sdk\";\nimport {\n  AddAMMLiquidityParams,\n  AddCLMMLiquidityParams,\n  AddStableLiquidityParams,\n  CollectFeeParams,\n  CreateAMMPoolAndAddLiquidityParams,\n  CreateCLMMPoolAndAddLiquidityParams,\n  CreateStablePoolAndAddLiquidityParams,\n  DefaultWithdrawalParams,\n  GetPositionParams,\n  GetPositions,\n  ImbalancedWithdrawalParams,\n  LiquidityType,\n  RemoveMultipleAMMLiquidityParams,\n  RemoveMultipleCLMMLiquidityParams,\n  RemoveMultipleStableLiquidityParams,\n  RemoveSingleAMMLiquidityParams,\n  RemoveSingleCLMMLiquidityParams,\n  RemoveSingleStableLiquidityParams,\n  SingleAssetWithdrawalParams\n} from \"../types/position.type\";\n\nimport { TappSDK } from \"../core\";\nimport {\n  getSpacingFromFee,\n  priceToTickIndex,\n  roundPriceToTickSpacing,\n  toU64,\n} from \"../helpers\";\nimport { PaginatedResult, RequestResult } from \"../types\";\n\nconst TICK_BOUND = 443636;\nconst BASE = 1.0001;\nconst EMPTY_MIN_PRICE = Math.pow(BASE, -TICK_BOUND);\n\nexport default class PositionModule {\n  protected _sdk: TappSDK;\n  constructor(sdk: TappSDK) {\n    this._sdk = sdk;\n  }\n\n  /**\n   * Creates the input data for removing liquidity from a single AMM pool.\n   *\n   * @param params - Parameters required to remove liquidity, including:\n   *   - `poolId`: The ID of the pool to remove liquidity from.\n   *   - `positionAddr`: The address of the liquidity position.\n   *   - `mintedShare`: The amount of share tokens to burn.\n   *   - `minAmount0`: Minimum amount of token0 to receive.\n   *   - `minAmount1`: Minimum amount of token1 to receive.\n   *\n   * @returns {InputEntryFunctionData} An object containing the target function identifier and serialized arguments,\n   *          which can be used to call the smart contract.\n   */\n  removeSingleAMMLiquidity(\n    params: RemoveSingleAMMLiquidityParams\n  ): InputEntryFunctionData {\n    const serializer = new Serializer();\n    serializer.serialize(AccountAddress.fromString(params.poolId));\n    serializer.serializeU64(1);\n\n    serializer.serialize(AccountAddress.fromString(params.positionAddr));\n    serializer.serializeU128(params.mintedShare);\n    serializer.serializeU64(params.minAmount0);\n    serializer.serializeU64(params.minAmount1);\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::remove_liquidity`,\n      functionArguments: [serializer.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates the input data for removing liquidity from multiple AMM positions in a single transaction.\n   *\n   * @param params - Parameters required to remove multiple liquidity positions, including:\n   *   - `poolId`: The ID of the pool.\n   *   - `positions`: An array of position objects, each containing:\n   *     - `positionAddr`: The address of the liquidity position.\n   *     - `mintedShare`: The amount of share tokens to burn.\n   *     - `minAmount0`: Minimum amount of token0 to receive.\n   *     - `minAmount1`: Minimum amount of token1 to receive.\n   *\n   * @returns {InputEntryFunctionData} An object containing the target function identifier and serialized arguments,\n   *          which can be used to call the smart contract.\n   */\n  removeMultipleAMMLiquidity(\n    params: RemoveMultipleAMMLiquidityParams\n  ): InputEntryFunctionData {\n    const serializer = new Serializer();\n    serializer.serialize(AccountAddress.fromString(params.poolId));\n    serializer.serializeU64(params.positions.length);\n\n    params.positions.forEach((position) => {\n      serializer.serialize(AccountAddress.fromString(position.positionAddr));\n      serializer.serializeU128(position.mintedShare);\n      serializer.serializeU64(position.minAmount0);\n      serializer.serializeU64(position.minAmount1);\n    });\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::remove_multi_liquidity`,\n      functionArguments: [serializer.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates the input data for removing liquidity from a single CLMM (Concentrated Liquidity Market Maker) position.\n   *\n   * @param params - Parameters required to remove liquidity from a CLMM pool, including:\n   *   - `poolId`: The ID of the CLMM pool.\n   *   - `positionAddr`: The address of the specific liquidity position.\n   *   - `mintedShare`: The amount of share tokens to burn.\n   *   - `minAmount0`: Minimum amount of token0 to receive.\n   *   - `minAmount1`: Minimum amount of token1 to receive.\n   *\n   * @returns {InputEntryFunctionData} An object containing the function identifier and serialized arguments\n   *          used to invoke the `remove_liquidity` function on-chain.\n   */\n  removeSingleCLMMLiquidity(\n    params: RemoveSingleCLMMLiquidityParams\n  ): InputEntryFunctionData {\n    const serializer = new Serializer();\n    serializer.serialize(AccountAddress.fromString(params.poolId));\n    serializer.serialize(AccountAddress.fromString(params.positionAddr));\n    serializer.serializeU128(params.mintedShare);\n    serializer.serializeU64(params.minAmount0);\n    serializer.serializeU64(params.minAmount1);\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::remove_liquidity`,\n      functionArguments: [serializer.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates the input data for removing liquidity from multiple CLMM (Concentrated Liquidity Market Maker) positions\n   * in a single transaction.\n   *\n   * @param params - Parameters required to remove multiple liquidity positions, including:\n   *   - `poolId`: The ID of the CLMM pool.\n   *   - `positions`: An array of objects, each describing a position with:\n   *     - `positionAddr`: The address of the liquidity position.\n   *     - `mintedShare`: The amount of share tokens to burn.\n   *     - `minAmount0`: Minimum amount of token0 to receive.\n   *     - `minAmount1`: Minimum amount of token1 to receive.\n   *\n   * @returns {InputEntryFunctionData} An object containing the contract function identifier and serialized arguments\n   *          for removing multiple liquidity positions on-chain.\n   */\n  removeMultipleCLMMLiquidity(\n    params: RemoveMultipleCLMMLiquidityParams\n  ): InputEntryFunctionData {\n    const serializer = new Serializer();\n    serializer.serialize(AccountAddress.fromString(params.poolId));\n    serializer.serializeU64(params.positions.length);\n\n    params.positions.forEach((position) => {\n      serializer.serialize(AccountAddress.fromString(position.positionAddr));\n      serializer.serializeU128(position.mintedShare);\n      serializer.serializeU64(position.minAmount0);\n      serializer.serializeU64(position.minAmount1);\n    });\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::remove_multi_liquidity`,\n      functionArguments: [serializer.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates the input data for removing liquidity from a single StableSwap-style pool position.\n   * Supports multiple liquidity removal types via a `liquidityType` switch.\n   *\n   * @param params - Parameters required to remove stable liquidity, including:\n   *   - `poolId`: The ID of the stable pool.\n   *   - `position`: The position object with:\n   *     - `positionAddr`: The address of the liquidity position.\n   *     - `mintedShare`: (Used for default case) The amount of share tokens to burn.\n   *     - `amounts`: (Used for default case) Minimum amounts expected to receive.\n   *   - `liquidityType`: Indicates the removal method:\n   *     - `0`: Single asset withdrawal.\n   *     - `1`: Imbalanced withdrawal.\n   *     - Default: Proportional withdrawal using `mintedShare` and `amounts`.\n   *\n   * @returns {InputEntryFunctionData} An object containing the contract function identifier and serialized arguments\n   *          for smart contract execution.\n   */\n  removeSingleStableLiquidity(\n    params: RemoveSingleStableLiquidityParams\n  ): InputEntryFunctionData {\n    const serializer = new Serializer();\n    serializer.serialize(AccountAddress.fromString(params.poolId));\n    serializer.serialize(\n      AccountAddress.fromString(params.position.positionAddr)\n    );\n    serializer.serializeU8(params.liquidityType);\n\n    switch (params.liquidityType) {\n      case LiquidityType.SingleAsset: {\n        // single asset withdrawal\n        const position = params.position as SingleAssetWithdrawalParams;\n\n        serializer.serializeU256(position.mintedShare);\n        serializer.serializeU64(position.tokenOutIndex); // i\n        serializer.serializeU256(position.amount); // min received\n        break;\n      }\n\n      case LiquidityType.Imbalance: {\n        // imbalanced asset withdrawal\n        const position = params.position as ImbalancedWithdrawalParams;\n        const amounts = position.amounts.map((amount) => {\n          return new U256(amount);\n        });\n\n        serializer.serializeVector(amounts);\n        serializer.serializeU256(position.maxMintedShare);\n        break;\n      }\n\n      default: {\n        const position = params.position as DefaultWithdrawalParams;\n        const amounts = position.amounts.map((amount) => {\n          return new U256(amount);\n        });\n\n        serializer.serializeU256(position.mintedShare);\n        serializer.serializeVector(amounts); // min amounts\n        break;\n      }\n    }\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::remove_liquidity`,\n      functionArguments: [serializer.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates the input data for removing liquidity from multiple StableSwap-style pool positions\n   * in a single transaction. Supports multiple liquidity removal strategies via `liquidityType`.\n   *\n   * @param params - Parameters for bulk stable liquidity removal, including:\n   *   - `poolId`: The ID of the stable pool.\n   *   - `positions`: An array of position objects, each containing:\n   *     - `positionAddr`: The address of the individual liquidity position.\n   *     - `mintedShare`: (Used in default case) The amount of share tokens to burn.\n   *     - `amounts`: (Used in default case) The expected minimum token amounts to receive.\n   *   - `liquidityType`: Defines the method of liquidity removal:\n   *     - `0`: Single asset withdrawal (currently not implemented).\n   *     - `1`: Imbalanced withdrawal (currently not implemented).\n   *     - Default: Proportional withdrawal using `mintedShare` and `amounts`.\n   *\n   * @returns {InputEntryFunctionData} An object with the smart contract function identifier and the serialized arguments,\n   *          allowing the user to remove multiple positions' liquidity on-chain.\n   */\n  removeMultipleStableLiquidity(\n    params: RemoveMultipleStableLiquidityParams\n  ): InputEntryFunctionData {\n    const serializer = new Serializer();\n    serializer.serialize(AccountAddress.fromString(params.poolId));\n    serializer.serializeU64(params.positions.length);\n\n    params.positions.forEach((position) => {\n      serializer.serialize(AccountAddress.fromString(position.positionAddr));\n\n      serializer.serializeU8(params.liquidityType);\n\n      switch (params.liquidityType) {\n        case LiquidityType.SingleAsset: {\n          // imbalanced asset withdrawal\n          let pos = position as SingleAssetWithdrawalParams;\n          serializer.serializeU256(pos.mintedShare);\n          serializer.serializeU64(pos.tokenOutIndex); // i\n          serializer.serializeU256(pos.amount); // min received\n          break;\n        }\n\n        case LiquidityType.Imbalance: {\n          // imbalanced asset withdrawal\n          const pos = position as ImbalancedWithdrawalParams;\n          const amounts = pos.amounts.map((amount) => {\n            return new U256(amount);\n          });\n\n          serializer.serializeVector(amounts);\n          serializer.serializeU256(pos.maxMintedShare);\n          break;\n        }\n\n        default: {\n          const pos = position as DefaultWithdrawalParams;\n          const amounts = pos.amounts.map((amount) => {\n            return new U256(amount);\n          });\n\n          serializer.serializeU256(pos.mintedShare);\n          serializer.serializeVector(amounts); // min amounts\n          break;\n        }\n      }\n    });\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::remove_multi_liquidity`,\n      functionArguments: [serializer.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates the input data required to add liquidity to an AMM (Automated Market Maker) pool.\n   *\n   * @param params - Parameters used when adding liquidity, including:\n   *   - `poolId`: The ID of the AMM pool.\n   *   - `amountA`: The amount of token A to add as liquidity.\n   *   - `amountB`: The amount of token B to add as liquidity.\n   *\n   * @returns {InputEntryFunctionData} An object containing the contract function string and serialized arguments\n   *          required to perform the liquidity addition on-chain.\n   */\n  addAMMLiquidity(params: AddAMMLiquidityParams): InputEntryFunctionData {\n    const ser = new Serializer();\n\n    ser.serialize(AccountAddress.fromString(params.poolId));\n    ser.serializeOption();\n    ser.serializeU64(params.amountA);\n    ser.serializeU64(params.amountB);\n    ser.serializeU64(0);\n    ser.serializeU64(0);\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::add_liquidity`,\n      functionArguments: [ser.toUint8Array()],\n    };\n  }\n\n  /**\n   * Constructs input data for adding liquidity to a CLMM (Concentrated Liquidity Market Maker) pool.\n   * This function encodes amounts, price ranges, and tick information based on pool configuration and input.\n   *\n   * @param params - The parameters needed to add liquidity:\n   *   - `poolId`: The unique identifier of the CLMM pool.\n   *   - `amountA`: The amount of token A to add.\n   *   - `amountB`: The amount of token B to add.\n   *   - `fee`: The fee tier of the pool (used to compute tick spacing).\n   *   - `isMaxAmountB`: If true, treats `amountB` as the maximum and increases `amountA` by 10%.\n   *   - `minPrice`: The minimum price boundary of the liquidity range.\n   *   - `maxPrice`: The maximum price boundary of the liquidity range.\n   *\n   * @returns {InputEntryFunctionData} An object containing the target function identifier and serialized arguments\n   *          for executing the liquidity addition on-chain.\n   */\n  addCLMMLiquidity(params: AddCLMMLiquidityParams): InputEntryFunctionData {\n    const { poolId, minPrice, maxPrice, amountA, amountB, fee, isMaxAmountB } =\n      params;\n    const ser = new Serializer();\n\n    ser.serialize(AccountAddress.fromString(poolId));\n    ser.serializeOption();\n    if (amountA > 0 && isMaxAmountB) {\n      ser.serializeU64(Math.round(amountA * 1.1)); // amount_a increase by 10%\n    } else ser.serializeU64(amountA); // amount_a\n    // amount_b increase by 10%\n    ser.serializeU64(\n      amountA == 0 || params.amountB == 0 || params.isMaxAmountB\n        ? amountB\n        : Math.round(amountB * 1.1)\n    );\n\n    // fixed_amount_a\n    if (isMaxAmountB) {\n      ser.serializeBool(false);\n    } else {\n      ser.serializeBool(amountA !== 0);\n    }\n\n    const tickSpacing = getSpacingFromFee(fee);\n    const nearestTick = Math.floor(TICK_BOUND / tickSpacing) * tickSpacing;\n\n    if (minPrice === Infinity) {\n      ser.serializeU64(toU64(nearestTick));\n    } else if (minPrice === roundPriceToTickSpacing(EMPTY_MIN_PRICE, fee)) {\n      ser.serializeU64(toU64(-nearestTick));\n    } else {\n      ser.serializeU64(toU64(priceToTickIndex(minPrice, tickSpacing)));\n    }\n\n    if (maxPrice === Infinity) {\n      ser.serializeU64(toU64(nearestTick));\n    } else if (maxPrice === roundPriceToTickSpacing(EMPTY_MIN_PRICE, fee)) {\n      ser.serializeU64(toU64(-nearestTick));\n    } else {\n      ser.serializeU64(toU64(priceToTickIndex(maxPrice, tickSpacing)));\n    }\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::add_liquidity`,\n      functionArguments: [ser.toUint8Array()],\n    };\n  }\n\n  /**\n   * Constructs the input required to add liquidity to a **Stable Pool**.\n   * Used in cases where multiple assets are pooled together with minimal slippage (e.g., stablecoins).\n   *\n   * @param params - The parameters needed to add liquidity:\n   *   - `poolId`: The ID of the stable pool.\n   *   - `amounts`: An array of token amounts corresponding to the pool's asset composition.\n   *\n   * @returns {InputEntryFunctionData} An object containing:\n   *   - The contract function identifier string.\n   *   - A serialized byte array of the input data suitable for blockchain invocation.\n   */\n  addStableLiquidity(params: AddStableLiquidityParams): InputEntryFunctionData {\n    const { poolId, amounts } = params;\n    const ser = new Serializer();\n\n    ser.serialize(AccountAddress.fromString(poolId));\n    ser.serializeOption();\n\n    ser.serializeVector(amounts.map((amount) => new U256(amount)));\n\n    // min_mint_amount\n    ser.serializeU256(0);\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::add_liquidity`,\n      functionArguments: [ser.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates a new AMM pool and simultaneously adds initial liquidity to it.\n   *\n   * @param params - The parameters required for pool creation and liquidity addition:\n   *   - `tokenAddress`: An array of token addresses to be included in the pool.\n   *   - `fee`: The fee tier to apply to this pool (typically determines tick spacing and swap cost).\n   *   - `amounts`: An array of token amounts to provide as initial liquidity.\n   *\n   * @returns {InputEntryFunctionData} An object containing:\n   *   - `function`: The full identifier of the smart contract function being called.\n   *   - `functionArguments`: A serialized byte array containing the input data formatted for the contract call.\n   */\n  createAMMPoolAndAddLiquidity(\n    params: CreateAMMPoolAndAddLiquidityParams\n  ): InputEntryFunctionData {\n    const { tokenAddress, fee, amounts } = params;\n    const ser = new Serializer();\n\n    ser.serializeU8(2);\n    ser.serializeVector(\n      tokenAddress.map((address) => AccountAddress.fromString(address))\n    );\n    ser.serializeU64(fee);\n\n    amounts.forEach((amount) => {\n      ser.serializeU64(amount);\n    });\n\n    amounts.forEach(() => {\n      ser.serializeU64(0);\n    });\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::create_pool_add_liquidity`,\n      functionArguments: [ser.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates a CLMM (Concentrated Liquidity Market Maker) pool and adds initial liquidity in a single transaction.\n   *\n   * @param params - Configuration object containing:\n   * - `tokenAddress`: An array of token addresses involved in the pool.\n   * - `fee`: The fee tier for the pool, which determines tick spacing.\n   * - `amounts`: The initial token amounts to deposit.\n   * - `initialPrice`: The square root price at which the pool starts (used for initialization).\n   * - `minPrice`: The lower bound price of the liquidity range.\n   * - `maxPrice`: The upper bound price of the liquidity range.\n   * - `isMaxAmountB`: Whether the second token amount (`amountB`) is flexible based on slippage.\n   *\n   * @returns {InputEntryFunctionData} An object ready to be used for blockchain interaction,\n   * including the function path and serialized parameters.\n   */\n  createCLMMPoolAndAddLiquidity(\n    params: CreateCLMMPoolAndAddLiquidityParams\n  ): InputEntryFunctionData {\n    const {\n      tokenAddress,\n      fee,\n      amounts,\n      initialPrice,\n      minPrice,\n      maxPrice,\n      isMaxAmountB,\n    } = params;\n    const ser = new Serializer();\n\n    ser.serializeU8(3);\n    ser.serializeVector(\n      tokenAddress.map((address) => AccountAddress.fromString(address))\n    ); // assets\n    ser.serializeU64(fee);\n\n    const q64 = BigInt(2) ** BigInt(64);\n    const sqrtPInitialPrice = Math.sqrt(initialPrice) * Number(q64);\n    ser.serializeU128(toU64(sqrtPInitialPrice));\n\n    let isSingleSide = false;\n    amounts.forEach((amount, index) => {\n      if (!isSingleSide) isSingleSide = amount === 0;\n      if (index === 0 && amount > 0 && isMaxAmountB) {\n        ser.serializeU64(Math.round(amount * 1.1));\n      } else if (index === 1 && !isSingleSide && !isMaxAmountB) {\n        ser.serializeU64(Math.round(amount * 1.1));\n      } else {\n        ser.serializeU64(amount);\n      }\n    });\n\n    // fixed_amount_a\n    if (isMaxAmountB) {\n      ser.serializeBool(false);\n    } else {\n      ser.serializeBool(amounts?.at(0) !== 0);\n    }\n\n    const tickSpacing = getSpacingFromFee(fee);\n    const nearestTick = Math.floor(TICK_BOUND / tickSpacing) * tickSpacing;\n\n    if (minPrice === Infinity) {\n      ser.serializeU64(toU64(nearestTick));\n    } else if (minPrice === roundPriceToTickSpacing(EMPTY_MIN_PRICE, fee)) {\n      ser.serializeU64(toU64(-nearestTick));\n    } else {\n      ser.serializeU64(toU64(priceToTickIndex(minPrice, tickSpacing)));\n    }\n\n    if (maxPrice === Infinity) {\n      ser.serializeU64(toU64(nearestTick));\n    } else if (maxPrice === roundPriceToTickSpacing(EMPTY_MIN_PRICE, fee)) {\n      ser.serializeU64(toU64(-nearestTick));\n    } else {\n      ser.serializeU64(toU64(priceToTickIndex(maxPrice, tickSpacing)));\n    }\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::create_pool_add_liquidity`,\n      functionArguments: [ser.toUint8Array()],\n    };\n  }\n\n  /**\n   * Creates a stable swap pool and adds initial liquidity in a single transaction.\n   *\n   * @param params - The configuration object containing:\n   * - `tokenAddress`: An array of token addresses in the pool.\n   * - `fee`: The base swap fee (as a percentage, e.g. `0.003` for 0.3%).\n   * - `amounts`: The initial token amounts to deposit.\n   * - `amplificationFactor`: Amplification factor controlling curve stability (used for low-slippage swaps).\n   * - `offpeg_fee_multiplier`: Optional. Multiplier applied to fee when assets are off-peg. Defaults to `20_000_000_000`.\n   *\n   * @returns {InputEntryFunctionData} An object with the function identifier and encoded arguments\n   * for executing the `create_pool_add_liquidity` function.\n   */\n  createStablePoolAndAddLiquidity(\n    params: CreateStablePoolAndAddLiquidityParams\n  ): InputEntryFunctionData {\n    const {\n      tokenAddress,\n      fee,\n      amounts,\n      amplificationFactor,\n      offpeg_fee_multiplier = 20000000000,\n    } = params;\n    const ser = new Serializer();\n\n    ser.serializeU8(4);\n    ser.serializeVector(\n      tokenAddress.map((address) => AccountAddress.fromString(address))\n    ); // assets\n    ser.serializeU64(fee * 10000);\n\n    ser.serializeU256(amplificationFactor);\n\n    // offpeg_fee_multiplier\n    ser.serializeU256(offpeg_fee_multiplier);\n\n    ser.serializeVector(amounts.map((amount) => new U256(amount)));\n\n    // min_mint_amount\n    ser.serializeU256(0);\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::create_pool_add_liquidity`,\n      functionArguments: [ser.toUint8Array()],\n    };\n  }\n\n  /**\n   * Collects accrued fees from a specific liquidity position in a given pool.\n   *\n   * @param params - The configuration object containing:\n   * - `poolId`: The address of the pool from which to collect fees.\n   * - `positionAddr`: The address of the liquidity position.\n   *\n   * @returns {InputEntryFunctionData} An object containing:\n   * - `function`: The fully qualified name of the entry function.\n   * - `functionArguments`: A byte array representing the serialized arguments.\n   */\n  collectFee(params: CollectFeeParams): InputEntryFunctionData {\n    const ser = new Serializer();\n\n    ser.serialize(AccountAddress.fromString(params.poolId));\n    ser.serialize(AccountAddress.fromString(params.positionAddr));\n\n    return {\n      function: `${this._sdk.sdkConfig.contractAddress}::router::collect_fee`,\n      functionArguments: [ser.toUint8Array()],\n    };\n  }\n\n  /**\n   * Retrieves a paginated list of liquidity positions for a given user address.\n   *\n   * @param params - An object containing the following:\n   * - `userAddr`: The user's wallet address to fetch positions for.\n   * - `page` (optional): The page number for pagination (defaults to 1).\n   * - `size` (optional): The number of results per page (defaults to 10).\n   *\n   * @returns {Promise<PaginatedResult<GetPositions>>} A object containing:\n   * - `data`: The list of position entries.\n   * - `total`: The total number of positions available.\n   */\n  async getPositions(\n    params: GetPositionParams\n  ): Promise<PaginatedResult<GetPositions>> {\n    const { userAddr, page = 1, size = 10 } = params;\n\n    const res = await this._sdk.request.post<\n      RequestResult<PaginatedResult<GetPositions>>\n    >(\"public/position\", {\n      userAddr,\n      page,\n      size,\n    });\n\n    return res.result;\n  }\n}\n"],"mappings":"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","names":["AccountAddress","Serializer","U256","TICK_BOUND","BASE","EMPTY_MIN_PRICE","PositionModule","sdk","params","serializer","Serializer","AccountAddress","position","amounts","amount","U256","pos","ser","poolId","minPrice","maxPrice","amountA","amountB","fee","isMaxAmountB","tickSpacing","getSpacingFromFee","nearestTick","toU64","roundPriceToTickSpacing","priceToTickIndex","tokenAddress","address","initialPrice","q64","sqrtPInitialPrice","isSingleSide","index","amplificationFactor","offpeg_fee_multiplier","userAddr","page","size"]}