@ferra-labs/damm 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/pool.ts","../src/utils/cached-content.ts","../src/utils/common.ts","../src/types/damm-pool.ts","../src/math/utils.ts","../src/utils/decimal.ts","../src/errors/errors.ts","../src/types/constants.ts","../src/types/sui.ts","../src/types/damm-type.ts","../src/types/liquidity.ts","../src/math/apr.ts","../src/math/tick.ts","../src/math/damm.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/utils/swap-utils.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","DammPositionStatus","SwapDirection","Decimal","structTag","AmountSpecified","PositionStatus","SplitUnit","asUintN","coinSelection","item","object","isValidSuiAddress","normalizeStructTag","ONE","ZERO","getDeltaUpFromInput","getDeltaDownFromOutput","getNextSqrtPriceFromInput","getNextSqrtPriceFromOutput","computeSwapStep","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, checkValidSuiAddress, getFutureTime } from '../utils'\nimport {\n CreatePoolAddLiquidityParams,\n CreatePoolParams,\n FetchParams,\n DammConfig,\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/damm-pool'\nimport {\n DammFetcherModule,\n DammIntegratePoolModule,\n DammPartnerModule,\n CLOCK_ADDRESS,\n DataPage,\n PageQuery,\n PaginationArgs,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport { DammpoolsError, ConfigErrorCode, PartnerErrorCode, PoolErrorCode, PositionErrorCode, UtilsErrorCode } from '../errors/errors'\nimport { RpcModule } from './rpc'\nimport { inspect } from 'util'\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\nexport type FeeTier = {\n tick_spacing: number\n dynamic_fee: {\n decay_period: number\n filter_period: number\n max_volatility_accumulator: number\n reduction_factor: number\n variable_fee_control: number\n }\n fee_rate: number\n fee_scheduler: {\n exponential: {\n cliff_fee_numerator: string\n number_of_period: number\n period_frequency: string\n reduction_factor: string\n }\n linear: {\n cliff_fee_numerator: string\n number_of_period: number\n period_frequency: string\n reduction_factor: string\n }\n }\n}\n\n/**\n * Pool module for comprehensive DAMM pool management\n * Handles pool creation, data retrieval, liquidity operations, and tick management\n * Includes caching mechanisms for optimal performance\n *\n * @example\n * // Get pool information\n * const pool = await sdk.Pool.getPool('0x_pool_address');\n * console.log(`Liquidity: ${pool.liquidity}`);\n * console.log(`Current tick: ${pool.currentTickIndex}`);\n * console.log(`Fee rate: ${pool.feeRate / 10000000}%`);\n *\n * @example\n * // Fetch all ticks for a pool\n * const ticks = await sdk.Pool.fetchTicksByRpc('0x_pool_address');\n * console.log(`Found ${ticks.length} initialized ticks`);\n *\n * @example\n * // Create a new pool with initial liquidity\n * const createPoolTx = await sdk.Pool.createPoolTransactionPayload({\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * tick_spacing: 60,\n * initialize_sqrt_price: \"79228162514264337593543950336\", // 1:1 price\n * uri: \"https://example.com/pool-metadata.json\",\n * amount_a: 1000000000, // 1 SUI\n * amount_b: 1000000, // 1 COIN\n * fix_amount_a: true,\n * tick_lower: -120,\n * tick_upper: 120,\n * slippage: 0.05\n * });\n */\nexport class PoolModule implements IModule {\n protected _sdk: FerraDammSDK\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: FerraDammSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Retrieves available base fee tiers and their parameters\n * Returns all supported fee configurations including dynamic fee settings\n * @returns Array of fee tier configurations with tick spacing and fee parameters\n * @throws {DammpoolsError} If config fetch fails\n * @example\n * const feeTiers = await sdk.Pool.getBaseFeesAvailable();\n * feeTiers.forEach(tier => {\n * console.log(`Tick spacing: ${tier.tick_spacing}`);\n * console.log(`Fee rate: ${tier.fee_rate / 10000000}%`);\n * console.log(`Dynamic fee enabled: ${tier.dynamic_fee !== null}`);\n * });\n */\n async getBaseFeesAvailable() {\n const {\n config: { global_config_id },\n } = this.sdk.sdkOptions.damm_pool\n\n const data = await this.sdk.fullClient.getObject({ id: global_config_id, options: { showContent: true } })\n if (data.data.content.dataType === 'package') {\n return []\n }\n const contents = data.data.content.fields as Record<string, any>\n\n return contents.fee_tiers?.fields?.contents.map((v) => ({\n tick_spacing: v.fields.key,\n dynamic_fee: v.fields.value.fields.dynamic_fee.fields,\n fee_rate: Number(v.fields.value.fields.fee_rate),\n fee_scheduler: {\n exponential: v.fields.value.fields.fee_scheduler.fields.exponential.fields,\n linear: v.fields.value.fields.fee_scheduler.fields.linear.fields,\n },\n })) as FeeTier[]\n }\n\n /**\n * Gets all positions for a specific pool\n * Fetches position data from the pool's position manager\n * @param positionHandle - Position manager handle ID from pool object\n * @param paginationArgs - Pagination configuration or 'all' to fetch everything\n * @returns Paginated list of positions\n * @throws {DammpoolsError} If position handle is invalid\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const positions = await sdk.Pool.getPositionList(\n * pool.positionManager.positionsHandle,\n * { cursor: null, limit: 50 }\n * );\n * console.log(`Found ${positions.data.length} positions`);\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 DammpoolsError(\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 * Fetches pool immutable data (type, addresses, spacing) for multiple pools\n * Immutables don't change after pool creation - safe to cache long-term\n * @param assignPoolIDs - Specific pool IDs to fetch (empty = all pools)\n * @param offset - Starting index for pagination\n * @param limit - Maximum number of pools to return\n * @param forceRefresh - Bypass cache and fetch fresh data\n * @returns Array of pool immutable data\n * @example\n * // Get all pools\n * const allPools = await sdk.Pool.getPoolImmutables();\n *\n * // Get specific pools\n * const specificPools = await sdk.Pool.getPoolImmutables([\n * '0x_pool1',\n * '0x_pool2'\n * ]);\n *\n * specificPools.forEach(pool => {\n * console.log(`${pool.name}: ${pool.coin_type_a} / ${pool.coin_type_b}`);\n * });\n */\n async getPoolImmutables(assignPoolIDs: string[] = [], offset = 0, limit = 100, forceRefresh = false): Promise<PoolImmutables[]> {\n const { package_id } = this._sdk.sdkOptions.damm_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 * Fetches complete pool state including current liquidity, price, and fees\n * This is the main method for getting up-to-date pool data\n * @param assignPools - Specific pool IDs to fetch (empty = 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\n * @example\n * const pools = await sdk.Pool.getPools(['0x_pool_id']);\n * const pool = pools[0];\n *\n * console.log(`Current sqrt price: ${pool.currentSqrtPrice}`);\n * console.log(`Current tick: ${pool.currentTickIndex}`);\n * console.log(`Total liquidity: ${pool.liquidity}`);\n * console.log(`Coin A amount: ${pool.coinAmountA}`);\n * console.log(`Coin B amount: ${pool.coinAmountB}`);\n * console.log(`Fee rate: ${pool.feeRate / 10000000}%`);\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 DammpoolsError(\n `getPools error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n // console.log('suiObj', inspect(suiObj.data.content.fields, { depth: null, colors: true }));\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.damm_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 DammpoolsError(\n `getPoolWithPages error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n const pool = buildPool(suiObj)\n allPool.push(pool)\n const cacheKey = `${pool.poolAddress}_getPoolObject`\n this.updateCache(cacheKey, pool, cacheTime24h)\n }\n return allPool\n }\n\n /**\n * Gets a single pool's complete state by ID\n * Preferred method for fetching individual pool data - includes caching\n * @param poolID - Pool object ID (0x-prefixed address)\n * @param forceRefresh - Skip cache and fetch fresh data (default: true)\n * @returns Complete pool object with current state\n * @throws {DammpoolsError} If pool doesn't exist or fetch fails (PoolErrorCode.InvalidPoolObject)\n * @example\n * const pool = await sdk.Pool.getPool('0x_pool_address');\n *\n * // Check if pool is paused\n * if (pool.isPause) {\n * console.log('Pool is currently paused');\n * }\n *\n * // Calculate current price from sqrt price\n * const sqrtPrice = new BN(pool.currentSqrtPrice);\n * const price = TickMath.sqrtPriceX64ToPrice(sqrtPrice, 9, 6);\n * console.log(`Current price: ${price.toString()} COIN per SUI`);\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 DammpoolsError(\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 * Creates a transaction to instantiate a new pool with initial liquidity\n * Automatically sorts coins and validates parameters\n * @param params - Pool creation parameters including coins, fee tier, and initial position\n * @returns Transaction ready for signing and execution\n * @throws {DammpoolsError} If coin types are invalid or amounts insufficient\n * @example\n * const tx = await sdk.Pool.createPoolTransactionPayload({\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * tick_spacing: 60, // Standard 0.3% fee tier\n * initialize_sqrt_price: \"79228162514264337593543950336\", // 1:1 price\n * uri: \"https://ferra.xyz/pool-metadata.json\",\n * amount_a: 10_000_000_000, // 10 SUI\n * amount_b: 10_000_000, // 10 COIN\n * fix_amount_a: true,\n * tick_lower: -600, // Wide range\n * tick_upper: 600,\n * slippage: 0.05\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: tx,\n * signer: keypair\n * });\n *\n * // Extract pool ID from events\n * const poolCreatedEvent = result.events?.find(\n * e => e.type.includes('::PoolCreatedEvent')\n * );\n * const poolId = poolCreatedEvent?.parsedJson?.pool_id;\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-damm-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 * Gets DAMM global configuration including registry IDs and settings\n * Configuration is cached for performance\n * @param forceRefresh - Bypass cache and fetch fresh config\n * @returns Global DAMM configuration object\n * @example\n * const config = await sdk.Pool.getDammConfigs();\n * console.log(`Global config ID: ${config.global_config_id}`);\n * console.log(`Pools registry: ${config.pools_id}`);\n * console.log(`Rewarder vault: ${config.global_rewarder_vault_id}`);\n */\n async getDammConfigs(forceRefresh = false): Promise<DammConfig> {\n const { package_id } = this._sdk.sdkOptions.damm_pool\n const cacheKey = `${package_id}_getInitEvent`\n const cacheData = this.getCache<DammConfig>(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 dammConfig: DammConfig = {\n pools_id: '',\n global_config_id: '',\n global_rewarder_vault_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 dammConfig.global_config_id = fields.global_config_id\n break\n case `${package_id}::factory::InitFactoryEvent`:\n dammConfig.pools_id = fields.pools_id\n break\n case `${package_id}::rewarder::RewarderInitEvent`:\n dammConfig.global_rewarder_vault_id = fields.global_rewarder_vault_id\n break\n case `${package_id}::partner::InitPartnerEvent`:\n dammConfig.partners_id = fields.partners_id\n break\n default:\n break\n }\n }\n })\n this.updateCache(cacheKey, dammConfig, cacheTime24h)\n return dammConfig\n }\n\n return dammConfig\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 * Gets transaction history for a specific pool\n * Returns swaps, adds/removes liquidity, fee collections\n * @param pool_id - Pool object ID\n * @param limit - Maximum transactions to return (default: 100)\n * @param offset - Starting offset for pagination\n * @returns Array of pool transaction info\n * @example\n * const txList = await sdk.Pool.getPoolTransactionList({\n * pool_id: poolId,\n * limit: 50,\n * offset: 0\n * });\n *\n * txList.forEach(tx => {\n * const type = tx.type.split('::').pop();\n * console.log(`${type}: ${tx.tx}`);\n * });\n */\n async getPoolTransactionList({\n poolId,\n paginationArgs,\n order = 'descending',\n fullRpcUrl,\n }: {\n poolId: string\n fullRpcUrl?: string\n paginationArgs: PageQuery\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PoolTransactionInfo>> {\n const { fullClient, sdkOptions } = this._sdk\n let client\n if (fullRpcUrl) {\n client = new RpcModule({\n url: fullRpcUrl,\n })\n } else {\n client = fullClient\n }\n const data: DataPage<PoolTransactionInfo> = {\n data: [],\n hasNextPage: false,\n }\n\n const limit = 50\n const query = paginationArgs\n const userLimit = paginationArgs.limit || 10\n\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.damm_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 * 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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n UtilsErrorCode.InvalidSendAddress\n )\n }\n\n params.tick_lower ??= -443636\n params.tick_upper ??= 443636\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n const { integrate, damm_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(damm_pool.config.global_config_id),\n tx.object(damm_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.bool(params.fix_amount_a),\n tx.pure.u8(params.collect_fee_mode),\n tx.pure.bool(params.is_quote_y),\n tx.pure.u8(params.fee_scheduler_mode),\n tx.pure.bool(params.enable_fee_scheduler),\n tx.pure.bool(params.enable_dynamic_fee),\n tx.pure.u64(params.activation_timestamp),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DammIntegratePoolModule}::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 * Fetches all initialized ticks for a pool from on-chain events\n * More comprehensive but slower than fetchTicksByRpc\n * Use this when you need complete tick history including deleted ticks\n * @param params - Fetch parameters with pool ID\n * @returns Array of all tick data from pool history\n * @example\n * const ticks = await sdk.Pool.fetchTicks({ pool_id: poolId });\n * console.log(`Total ticks: ${ticks.length}`);\n *\n * // Find ticks in specific range\n * const ticksInRange = ticks.filter(\n * t => t.index >= -120 && t.index <= 120\n * );\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}::${DammFetcherModule}::fetch_ticks`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError(\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 DammpoolsError(\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 position rewards from events for multiple positions\n * Useful for displaying historical reward claims\n * @param params - Fetch parameters with pool ID\n * @returns Array of position reward data\n * @example\n * const rewards = await sdk.Pool.fetchPositionRewardList({\n * pool_id: poolId\n * });\n *\n * rewards.forEach(reward => {\n * console.log(`Position: ${reward.pos_object_id}`);\n * console.log(`Reward 0: ${reward.reward_amount_owed_0}`);\n * console.log(`Reward 1: ${reward.reward_amount_owed_1}`);\n * console.log(`Reward 2: ${reward.reward_amount_owed_2}`);\n * });\n */\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}::${DammFetcherModule}::fetch_positions`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 current tick state directly from pool's tick manager (RPC)\n * Faster than event-based fetch, returns only currently active ticks\n * Recommended for most use cases\n * @param tickHandle - Tick manager handle ID from pool object\n * @returns Array of currently active tick data\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const ticks = await sdk.Pool.fetchTicksByRpc(pool.ticksHandle);\n *\n * // Sort ticks by index for swap simulation\n * ticks.sort((a, b) => a.index - b.index);\n *\n * // Find nearest tick below current\n * const nearestBelow = ticks\n * .filter(t => t.index < pool.currentTickIndex)\n * .sort((a, b) => b.index - a.index)[0];\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 DammpoolsError(\n `getTicksByRpc error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n\n const tick = buildTickData(suiObj)\n if (tick != null) {\n ticks.push(tick)\n }\n }\n return ticks\n }\n\n /**\n * Gets tick data for a specific tick index\n * Returns null if tick is not initialized\n * @param tickHandle - Tick manager handle ID\n * @param tickIndex - Specific tick index to fetch\n * @returns Tick data or throws if tick doesn't exist\n * @throws {DammpoolsError} If tick is not initialized\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * try {\n * const tick = await sdk.Pool.getTickDataByIndex(\n * pool.ticksHandle,\n * -120\n * );\n * console.log(`Liquidity at tick -120: ${tick.liquidityGross.toString()}`);\n * } catch (error) {\n * console.log('Tick -120 is not initialized');\n * }\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 DammpoolsError(`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 DammpoolsError(\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 DammpoolsError(\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 DammpoolsError(\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 * Claims partner referral fees accumulated for a partner\n * Requires partner capability NFT\n * @param partnerCap - Partner capability object ID\n * @param partner - Partner address\n * @param coinType - Type of coin to claim fees in\n * @returns Transaction for claiming partner fees\n * @throws {DammpoolsError} If partner not found or invalid (PartnerErrorCode.NotFoundPartnerObject)\n * @example\n * const tx = await sdk.Pool.claimPartnerRefFeePayload(\n * '0x_partner_cap_id',\n * '0x_partner_address',\n * '0x2::sui::SUI'\n * );\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: tx,\n * signer: partnerKeypair\n * });\n */\n async claimPartnerRefFeePayload(partnerCap: string, partner: string, coinType: string): Promise<Transaction> {\n const tx = new Transaction()\n const { damm_pool } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(damm_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: `${damm_pool.published_at}::${DammPartnerModule}::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}\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 DammPositionStatus,\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/damm-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 { DammpoolsError, 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 BigInt(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 DammpoolsError(`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 console.log('???????', getObjectId(objects));\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 isQuoteY: Boolean(fields.is_quote_y),\n collectFeeMode: Number(asIntN(BigInt(fields.collect_fee_mode))),\n parameters: {\n idReference: Number(asIntN(BigInt(fields.parameters.fields.id_reference.fields.bits))),\n activationTimestamp: BigInt(fields.parameters.fields.activation_timestamp),\n currentTickIndex: Number(asIntN(BigInt(fields.parameters.fields.current_tick_index.fields.bits))),\n tickLowerIndex: Number(asIntN(BigInt(0n))),\n tickUpperIndex: Number(asIntN(BigInt(0n))),\n currentSqrtPrice: BigInt(fields.parameters.fields.current_sqrt_price),\n cliffFeeNumerator: BigInt(fields.parameters.fields.cliff_fee_numerator),\n decayPeriod: BigInt(fields.parameters.fields.decay_period),\n enabledDynamicFee: Boolean(fields.parameters.fields.enabled_dynamic_fee),\n enabledFeeScheduler: Boolean(fields.parameters.fields.enabled_fee_scheduler),\n feeRate: Number(fields.parameters.fields.fee_rate),\n feeSchedulerMode: BigInt(fields.parameters.fields.fee_scheduler_mode),\n isQuoteY: Boolean(fields.is_quote_y),\n feeSchedulerReductionFactor: BigInt(fields.parameters.fields.fee_scheduler_reduction_factor),\n filterPeriod: BigInt(fields.parameters.fields.filter_period),\n maxVolatilityAccumulator: Number(fields.parameters.fields.max_volatility_accumulator),\n numberOfPeriod: Number(fields.parameters.fields.number_of_period),\n periodFrequency: Number(fields.parameters.fields.period_frequency),\n reductionFactor: Number(fields.parameters.fields.reduction_factor),\n tickSpacing: Number(fields.parameters.fields.tick_spacing),\n timeOfLastUpdate: Number(fields.parameters.fields.time_of_last_update),\n variableFeeControl: Number(fields.parameters.fields.variable_fee_control),\n volatilityAccumulator: Number(fields.parameters.fields.volatility_accumulator),\n volatilityReference: Number(fields.parameters.fields.volatility_reference),\n },\n currentSqrtPrice: BigInt(fields.parameters.fields.current_sqrt_price),\n currentTickIndex: Number(asIntN(BigInt(fields.parameters.fields.current_tick_index.fields.bits))),\n feeGrowthGlobalA: fields.fee_growth_global_a,\n feeGrowthGlobalB: fields.fee_growth_global_b,\n feeProtocolCoinA: fields.fee_protocol_coin_a,\n feeProtocolCoinB: fields.fee_protocol_coin_b,\n feeRate: Number(fields.parameters.fields.fee_rate),\n isPause: fields.is_pause,\n liquidity: fields.liquidity,\n positionManager: {\n positionsHandle: fields.position_manager.fields.positions.fields.id.id,\n size: fields.position_manager.fields.positions.fields.size,\n },\n rewarderInfos: rewarders,\n rewarderLastUpdatedTime: fields.rewarder_manager.fields.last_updated_time,\n tickSpacing: String(fields.parameters.fields.tick_spacing),\n ticksHandle: 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 DammpoolsError(`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: DammPositionStatus.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: Number(asIntN(BigInt(fields.tick_lower_index.fields.bits))),\n tick_upper_index: Number(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: DammPositionStatus.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 = DammPositionStatus.Deleted\n }\n const objectNotExistsResponse = getObjectNotExistsResponse(object)\n if (objectNotExistsResponse) {\n position.pos_object_id = objectNotExistsResponse\n position.position_status = DammPositionStatus.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: Number(asIntN(BigInt(tick_lower_index))),\n tick_upper_index: Number(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 DammpoolsError(`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: Number(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 DammpoolsError(`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: Number(index),\n sqrtPrice,\n liquidityNet,\n liquidityGross,\n feeGrowthOutsideA,\n feeGrowthOutsideB,\n rewardersGrowthOutside,\n }\n\n return tick\n}\n\nexport function buildDammPositionName(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 './damm-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 DammpoolData = {\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 DammpoolData format.\n * @param {Pool} pool - The liquidity pool object to transform.\n * @returns {DammpoolData} The transformed DammpoolData object.\n */\nexport function transDammpoolDataWithoutTicks(pool: Pool): DammpoolData {\n const poolData: DammpoolData = {\n coinA: pool.coinTypeA, // string\n coinB: pool.coinTypeB, // string\n currentSqrtPrice: new BN(pool.currentSqrtPrice), // BN\n currentTickIndex: pool.currentTickIndex, // number\n feeGrowthGlobalA: new BN(pool.feeGrowthGlobalA), // BN\n feeGrowthGlobalB: new BN(pool.feeGrowthGlobalB), // BN\n feeProtocolCoinA: new BN(pool.feeProtocolCoinA), // BN\n feeProtocolCoinB: new BN(pool.feeProtocolCoinB), // BN\n feeRate: new BN(pool.feeRate), // 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 { DammpoolsError, 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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsErrorCode =\n | MathErrorCode\n | SwapErrorCode\n | CoinErrorCode\n | PoolErrorCode\n | PositionErrorCode\n | PartnerErrorCode\n | ConfigErrorCode\n | UtilsErrorCode\n | RouterErrorCode\n | TypesErrorCode\n\nexport class DammpoolsError extends Error {\n override message: string\n\n errorCode?: DammpoolsErrorCode\n\n constructor(message: string, errorCode?: DammpoolsErrorCode) {\n super(message)\n this.message = message\n this.errorCode = errorCode\n }\n\n static isDammpoolsErrorCode(e: any, code: DammpoolsErrorCode): boolean {\n return e instanceof DammpoolsError && e.errorCode === code\n }\n}\n","import BN from 'bn.js'\n\n/**\n * The maximum tick index supported by the dammpool program.\n * @category Constants\n */\nexport const MAX_TICK_INDEX = 443636\n\n/**\n * The minimum tick index supported by the dammpool program.\n * @category Constants\n */\nexport const MIN_TICK_INDEX = -443636\n\n/**\n * The maximum sqrt-price supported by the dammpool 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 dammpool 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_000)\n","import { TransactionArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\nimport { DammpoolsError, 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 DAMM (Cryptocurrency Liquidity Mining Module).\n */\nexport const DammPartnerModule = 'partner'\nexport const DammIntegratePoolModule = 'pool_script'\nexport const DammIntegrateRouterModule = 'router'\nexport const DammIntegrateRouterWithPartnerModule = 'router_with_partner'\nexport const DammFetcherModule = 'fetcher_script'\nexport const DammExpectSwapModule = 'expect_swap'\nexport const DammIntegrateUtilsModule = '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 DammpoolsError(`Unknown type for value: ${value}`, TypesErrorCode.InvalidType)\n}\n","import BN from 'bn.js'\nimport { NFT, SuiAddressType, SuiObjectIdType } from './sui'\nimport { TickData } from './damm-pool'\nimport { DammpoolsError, ConfigErrorCode } from '../errors/errors'\nimport type { Transaction, TransactionResult } from '@mysten/sui/transactions'\n/**\n * Enumerates the possible status values of a position within a liquidity mining module.\n */\nexport enum DammPositionStatus {\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 dammpool'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: DammPositionStatus\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 Damm protocol, which defines the trading pairs of \"dammpool\".\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: bigint\n /**\n * The amount of coin b.\n */\n coinAmountB: bigint\n /**\n * The current sqrt price\n */\n isQuoteY: boolean\n /**\n * The current sqrt price\n */\n currentSqrtPrice: bigint\n collectFeeMode: number\n currentTickIndex: number\n parameters: {\n currentSqrtPrice: bigint\n currentTickIndex: number\n tickLowerIndex: number\n tickUpperIndex: number\n activationTimestamp: bigint\n cliffFeeNumerator: bigint\n decayPeriod: bigint\n enabledDynamicFee: boolean\n isQuoteY: boolean\n enabledFeeScheduler: boolean\n feeRate: number\n feeSchedulerMode: bigint\n feeSchedulerReductionFactor: bigint\n filterPeriod: bigint\n idReference: number\n maxVolatilityAccumulator: number\n numberOfPeriod: number\n periodFrequency: number\n reductionFactor: number\n tickSpacing: number\n timeOfLastUpdate: number\n variableFeeControl: number\n volatilityAccumulator: number\n volatilityReference: number\n }\n /**\n * The global fee growth of coin a as Q64.64\n */\n feeGrowthGlobalB: number\n /**\n * The global fee growth of coin b as Q64.64\n */\n feeGrowthGlobalA: number\n /**\n * The amounts of coin a owend to protocol\n */\n feeProtocolCoinA: number\n /**\n * The amounts of coin b owend to protocol\n */\n feeProtocolCoinB: number\n /**\n * The numerator of fee rate, the denominator is 1_000_000.\n */\n feeRate: number\n /**\n * is the pool pause\n */\n isPause: 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 positionManager: {\n positionsHandle: string\n size: number\n }\n /**\n * The rewarder manager\n */\n rewarderInfos: Array<Rewarder>\n rewarderLastUpdatedTime: string\n /**\n * The tick manager handle\n */\n ticksHandle: 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 (DAMM).\n */\nexport type DammConfig = {\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 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 collect_fee_mode: number\n is_quote_y: boolean\n fee_scheduler_mode: number\n enable_fee_scheduler: boolean\n enable_dynamic_fee: boolean\n activation_timestamp: 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 DammPoolUtil.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 DammPoolUtil.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\nexport type RemoveLiquidityAndClaimRewardsParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: bigint\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: bigint\n /**\n * The actual change in liquidity that has been added.\n */\n delta_liquidity: string\n /**\n * The identifier of the position.\n */\n pos_id: SuiObjectIdType\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 DammpoolsError(`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)\nconst MAX_BASIS_POINT = 10000\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).div(MAX_BASIS_POINT)\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 { DammpoolsError, 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 DammpoolsError('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 { DammpoolsError, MathErrorCode, CoinErrorCode } from '../errors/errors'\nimport type { DammpoolData, TickData } from '../types/damm-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 startSqrtPrice: BN\n nextSqrtPrice: BN\n isExceed: boolean\n stepResults: Array<{\n currentSqrtPrice: BN\n targetSqrtPrice: BN\n currentLiquidity: BN\n amountIn: BN\n amountOut: BN\n feeAmount: BN\n remainderAmount: BN\n }>\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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('getNextSqrtPriceAUp - Next sqrt price less than min sqrt price', CoinErrorCode.CoinAmountMinSubceeded)\n }\n if (nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n throw new DammpoolsError('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 DammpoolsError('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 console.log('feeRate', feeRate.toNumber());\n \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 poolData: DammpoolData,\n a2b: boolean,\n byAmountIn: boolean,\n amount: BN,\n swapTicks: Array<TickData>\n): SwapResult {\n \n let currentSqrtPrice = poolData.currentSqrtPrice\n let currentLiquidity = poolData.liquidity\n let remainingAmount = amount\n let amountInTotal = ZERO\n let amountOutTotal = ZERO\n let feeAmountTotal = ZERO\n \n const result: SwapResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n feeAmount: ZERO,\n startSqrtPrice: currentSqrtPrice,\n nextSqrtPrice: currentSqrtPrice,\n isExceed: false,\n stepResults: []\n }\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b)\n\n for (const tick of swapTicks) {\n if (a2b && poolData.currentTickIndex < tick.index) continue\n if (!a2b && poolData.currentTickIndex >= tick.index) continue\n\n if (remainingAmount.eq(ZERO)) break\n\n let targetSqrtPriceStep: BN\n if ((a2b && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!a2b && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n targetSqrtPriceStep = sqrtPriceLimit\n result.isExceed = true \n } else {\n targetSqrtPriceStep = tick.sqrtPrice\n }\n\n const stepResult = computeSwapStep(\n currentSqrtPrice,\n targetSqrtPriceStep,\n currentLiquidity,\n remainingAmount,\n poolData.feeRate,\n byAmountIn\n )\n\n if (!stepResult.amountIn.eq(ZERO)) {\n if (byAmountIn) {\n remainingAmount = remainingAmount.sub(stepResult.amountIn).sub(stepResult.feeAmount)\n } else {\n remainingAmount = remainingAmount.sub(stepResult.amountOut)\n }\n }\n\n amountInTotal = amountInTotal.add(stepResult.amountIn)\n amountOutTotal = amountOutTotal.add(stepResult.amountOut)\n feeAmountTotal = feeAmountTotal.add(stepResult.feeAmount)\n\n result.stepResults.push({\n currentSqrtPrice: currentSqrtPrice,\n targetSqrtPrice: targetSqrtPriceStep,\n currentLiquidity: currentLiquidity,\n amountIn: stepResult.amountIn,\n amountOut: stepResult.amountOut,\n feeAmount: stepResult.feeAmount,\n remainderAmount: remainingAmount\n })\n\n if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n const liquidityNet = new BN(tick.liquidityNet.toString())\n let signedLiquidityChange = liquidityNet\n\n if (a2b) {\n signedLiquidityChange = liquidityNet.neg()\n }\n \n if (signedLiquidityChange.isNeg()) {\n currentLiquidity = currentLiquidity.sub(signedLiquidityChange.abs())\n } else {\n currentLiquidity = currentLiquidity.add(signedLiquidityChange)\n }\n \n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice\n }\n\n if (remainingAmount.eq(ZERO)) {\n break\n }\n }\n\n result.amountIn = amountInTotal.add(feeAmountTotal)\n \n result.amountOut = amountOutTotal\n result.feeAmount = feeAmountTotal\n result.nextSqrtPrice = currentSqrtPrice // Giá cuối cùng sau khi swap\n\n return result\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 DammPoolUtil {\n /**\n * Update fee rate.\n * @param damm - dammpool 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(damm: DammpoolData, 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 damm.feeProtocolCoinA = damm.feeProtocolCoinA.add(protocolFee)\n } else {\n damm.feeProtocolCoinB = damm.feeProtocolCoinB.add(protocolFee)\n }\n if (poolFee.eq(ZERO) || damm.liquidity.eq(ZERO)) {\n return { refFee, damm }\n }\n const growthFee = poolFee.shln(64).div(damm.liquidity)\n if (iscoinA) {\n damm.feeGrowthGlobalA = damm.feeGrowthGlobalA.add(growthFee)\n } else {\n damm.feeGrowthGlobalB = damm.feeGrowthGlobalB.add(growthFee)\n }\n return { refFee, damm }\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 DammpoolsError('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 DammpoolsError('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 = DammPoolUtil.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 DammpoolsError('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 } = DammPoolUtil.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 } = DammPoolUtil.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 { DammpoolsError, 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 DammpoolsError(`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 ? 1 : 0))\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/damm-pool'\nimport { MathUtil } from './utils'\n\n/**\n * @category CollectFeesQuoteParam\n */\nexport type CollectFeesQuoteParam = {\n dammpool: 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 dammpool The DAMM 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(dammpool: 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 (dammpool.currentTickIndex < tickLower.index) {\n fee_growth_below_a = MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalA), new BN(tickLower.feeGrowthOutsideA))\n fee_growth_below_b = MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalB), 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 (dammpool.currentTickIndex < 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(dammpool.feeGrowthGlobalA), new BN(tickUpper.feeGrowthOutsideA))\n fee_growth_above_b = MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalB), new BN(tickUpper.feeGrowthOutsideB))\n }\n const fee_growth_inside_a = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalA), fee_growth_below_a),\n fee_growth_above_a\n )\n const fee_growth_inside_b = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalB), 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 Dammpool 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.dammpool, 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 './damm'\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/damm-type'\nimport { DammpoolData, TickData, transDammpoolDataWithoutTicks } from '../types/damm-pool'\nimport { computeSwapStep, SwapStepResult } from './damm'\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: DammpoolData,\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 dammpool: Pool\n\n private ticks: TickData[]\n\n private splitSwapResult: SplitSwapResult\n\n constructor(amount: BN, unit: SplitUnit, dammpool: Pool, a2b: boolean, byAmountIn: boolean, tickData: TickData[]) {\n this.minSplitUnit = unit\n this.a2b = a2b\n this.byAmountIn = byAmountIn\n this.dammpool = dammpool\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 = transDammpoolDataWithoutTicks(this.dammpool)\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/damm-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.rewarderInfos\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.currentTickIndex < 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.currentTickIndex >= 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/damm-pool'\nimport {\n DammIntegrateRouterWithPartnerModule,\n DammIntegratePoolModule,\n DammIntegrateRouterModule,\n DammIntegrateUtilsModule,\n CLOCK_ADDRESS,\n} from '../types/sui'\nimport SDK, {\n AddLiquidityFixTokenParams,\n adjustForSlippage,\n asUintN,\n DammPoolUtil,\n CoinAsset,\n CoinPairType,\n CollectRewarderParams,\n d,\n getPackagerConfigs,\n normalizeCoinType,\n Percentage,\n Pool,\n RemoveLiquidityAndClaimRewardsParams,\n SdkOptions,\n SwapParams,\n SwapUtils,\n ZERO,\n} from '../index'\nimport { BasePath, OnePath, SwapWithRouterParams } from '../modules/router'\nimport { DammpoolsError, 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\ntype TxCoin =\n | {\n $kind: 'NestedResult'\n NestedResult: [number, number]\n }\n | ((tx: Transaction) => {\n $kind: 'NestedResult'\n NestedResult: [number, number]\n })\n | ((tx: Transaction) => TransactionResult)\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 DAMM-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 static createRemoveLiquidityPayload(\n params: RemoveLiquidityAndClaimRewardsParams,\n sdkOptions: SdkOptions,\n tx: Transaction\n ): [coinA: TxCoin, coinB: TxCoin] {\n const coinTypeA = params.coinTypeA\n const coinTypeB = params.coinTypeB\n\n const { published_at, config } = sdkOptions.damm_pool\n\n if (!config) {\n throw new Error('No config found in sdk options')\n }\n\n const { global_config_id } = config\n const [v3, v2] = tx.moveCall({\n target: `${published_at}::pool::remove_liquidity`,\n arguments: [tx.object(global_config_id), tx.object(params.pool_id), tx.object(params.pos_id), tx.pure.u128(params.delta_liquidity), tx.object(CLOCK_ADDRESS)],\n typeArguments: [coinTypeA, coinTypeB],\n })\n\n const [coinA] = this.balanceToCoinTx(v3, coinTypeA, tx);\n const [coinB] = this.balanceToCoinTx(v2, coinTypeB, tx);\n\n this.checkCoinThresholdInternal(coinA, params.min_amount_a, coinTypeA, sdkOptions, tx)\n this.checkCoinThresholdInternal(coinB, params.min_amount_b, coinTypeB, sdkOptions, tx)\n\n const [v4, v5] = tx.moveCall({\n target: `${published_at}::pool::collect_fee`,\n arguments: [tx.object(global_config_id), tx.object(params.pool_id), tx.object(params.pos_id), tx.pure.bool(false)],\n typeArguments: [coinTypeA, coinTypeB],\n })\n\n const [feeA] = this.balanceToCoinTx(v4, coinTypeA, tx);\n const [feeB] = this.balanceToCoinTx(v5, coinTypeB, tx);\n\n this.joinCoinTx(coinA, feeA, coinTypeA, tx)\n this.joinCoinTx(coinB, feeB, coinTypeB, tx)\n\n return [coinA, coinB]\n }\n\n static joinBalanceTx(currentBalance: TxCoin, targetBalance: TxCoin, coinType: string, transaction: Transaction) {\n transaction.moveCall({\n target: '0x2::balance::join',\n arguments: [currentBalance, targetBalance],\n typeArguments: [coinType],\n })\n }\n\n static joinCoinTx(currentCoin: TxCoin, targetCoin: TxCoin, coinType: string, transaction: Transaction) {\n transaction.moveCall({\n target: '0x2::coin::join',\n arguments: [currentCoin, targetCoin],\n typeArguments: [coinType],\n })\n }\n\n static balanceToCoinTx(balance: TxCoin, coinType: string, tx: Transaction) {\n return tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [balance],\n typeArguments: [coinType],\n })\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 DammpoolsError(`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 DammpoolsError(`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(\n liquidityParams,\n gasEstimationConfig.slippage,\n gasEstimationConfig.curSqrtPrice\n )\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(\n liquidityParams: AddLiquidityFixTokenParams,\n slippageRate: number,\n currentSqrtPrice: BN\n ): AddLiquidityFixTokenParams {\n const fixedCoinAmount = liquidityParams.fix_amount_a ? liquidityParams.amount_a : liquidityParams.amount_b\n const liquidityCalculation = DammPoolUtil.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 { damm_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 dammConfiguration = getPackagerConfigs(damm_pool)\n const transactionArgs = liquidityParams.is_open\n ? [\n transaction.object(dammConfiguration.global_config_id),\n transaction.object(liquidityParams.pool_id),\n coinAInputs.targetCoin,\n coinBInputs.targetCoin,\n transaction.pure.u64(liquidityParams.amount_a),\n transaction.pure.u64(liquidityParams.amount_b),\n transaction.pure.u32(Number(asUintN(BigInt(liquidityParams.tick_lower)).toString())),\n transaction.pure.u32(Number(asUintN(BigInt(liquidityParams.tick_upper)).toString())),\n transaction.pure.bool(liquidityParams.fix_amount_a),\n transaction.object(CLOCK_ADDRESS),\n ]\n : [\n transaction.object(dammConfiguration.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}::${DammIntegratePoolModule}::${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 { damm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapParams.a2b)\n const typeArguments = [swapParams.coinTypeA, swapParams.coinTypeB]\n const { global_config_id } = getPackagerConfigs(damm_pool)\n\n if (global_config_id === undefined) {\n throw Error('DAMM 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}::${DammIntegratePoolModule}::${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 { damm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapParams.a2b)\n\n const { global_config_id } = getPackagerConfigs(damm_pool)\n\n if (global_config_id === undefined) {\n throw Error('DAMM 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 ? DammIntegrateRouterWithPartnerModule : DammIntegrateRouterModule\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: Number(currentPool.currentSqrtPrice),\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 DammpoolsError(\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\n .reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0)\n .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\n .reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0)\n .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\n .reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0)\n .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(\n availableCoins: CoinAsset[],\n transaction: Transaction,\n coinType: string,\n buildVector = true\n ): 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(\n transaction,\n [...availableCoins],\n [...targetCoinAssets],\n amounts.amountFirst,\n coinType,\n buildVector,\n fixAmount\n )\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(\n transaction,\n [...availableCoins],\n [...targetCoinAssets],\n amounts.amountFirst,\n coinType,\n buildVector,\n fixAmount\n )\n }\n\n if (totalAvailableAmount < amounts.amountSecond) {\n throw new DammpoolsError(\n `Insufficient balance: available ${totalAvailableAmount} for ${coinType}, required ${amounts.amountSecond}`,\n UtilsErrorCode.InsufficientBalance\n )\n }\n\n return TransactionUtil.buildCoin(\n transaction,\n [...availableCoins],\n [...targetCoinAssets],\n amounts.amountSecond,\n coinType,\n buildVector,\n fixAmount\n )\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 { damm_pool, integrate } = sdk.sdkOptions\n const globalConfigId = getPackagerConfigs(damm_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 ? DammIntegrateRouterWithPartnerModule : DammIntegrateRouterModule\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}::${DammIntegrateRouterModule}::check_coin_threshold`,\n typeArguments: [coinType],\n arguments: [outputCoin, transaction.pure.u64(minimumAmount)],\n })\n }\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 checkCoinThresholdInternal(\n coin: TransactionObjectArgument,\n minimumAmount: bigint,\n coinType: string,\n sdkOptions: SdkOptions,\n transaction: Transaction\n ) {\n transaction.moveCall({\n target: `${sdkOptions.integrate.published_at}::${DammIntegrateRouterModule}::check_coin_threshold`,\n typeArguments: [coinType],\n arguments: [coin, transaction.pure.u64(minimumAmount)],\n })\n }\n\n /**\n * Builds DAMM 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 buildDammBasePathTx(\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 { damm_pool, integrate } = sdk.sdkOptions\n const globalConfigId = getPackagerConfigs(damm_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 ? DammIntegrateRouterWithPartnerModule : DammIntegrateRouterModule\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}::${DammIntegrateUtilsModule}::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(\n sdk: SDK,\n transaction: Transaction,\n coinToTransfer: TransactionObjectArgument,\n coinType: string,\n recipient?: string\n ) {\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 damm_pool: { config },\n } = sdkOptions\n\n const { global_config_id } = config ?? {}\n\n if (!global_config_id) {\n throw new DammpoolsError('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}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { DammpoolsError, UtilsErrorCode } from '../errors/errors'\nimport { isValidSuiAddress } from '@mysten/sui/utils'\n\n/**\n * Check if the address is a valid sui address.\n * @param {string}address\n * @returns\n */\nexport function checkValidSuiAddress(address: string): boolean {\n return !!address && isValidSuiAddress(address)\n}\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 DammpoolsError('The length of recipients and amounts must be the same', UtilsErrorCode.InvalidRecipientAndAmountLength)\n }\n\n for (const recipient of recipients) {\n if (!checkValidSuiAddress(recipient)) {\n throw new DammpoolsError('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 (!checkValidSuiAddress(recipient)) {\n throw new DammpoolsError('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 (!checkValidSuiAddress(recipient)) {\n throw new DammpoolsError('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 { Inputs, Transaction } from '@mysten/sui/transactions'\nimport {\n DevInspectResults,\n DynamicFieldPage,\n PaginatedEvents,\n PaginatedObjectsResponse,\n PaginatedTransactionResponse,\n QueryTransactionBlocksParams,\n SuiClient,\n SuiEventFilter,\n SuiObjectDataOptions,\n SuiObjectResponse,\n SuiObjectResponseQuery,\n SuiTransactionBlockResponse,\n TransactionFilter,\n} from '@mysten/sui/client'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\n\n\nimport { DataPage, PaginationArgs, SuiObjectIdType } from '../types'\n\n/**\n * Represents a module for making RPC (Remote Procedure Call) requests.\n */\nexport class RpcModule extends SuiClient {\n /**\n * Get events for a given query criteria\n * @param query\n * @param paginationArgs\n * @returns\n */\n async queryEventsByPage(query: SuiEventFilter, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n\n do {\n const res: PaginatedEvents = await this.queryEvents({\n query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n async queryTransactionBlocksByPage(\n filter?: TransactionFilter,\n paginationArgs: PaginationArgs = 'all',\n order: 'ascending' | 'descending' | null | undefined = 'ascending'\n ): Promise<DataPage<SuiTransactionBlockResponse>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n\n do {\n const res: PaginatedTransactionResponse = await this.queryTransactionBlocks({\n filter,\n cursor: nextCursor,\n order,\n limit: queryAll ? null : paginationArgs.limit,\n options: { showEvents: true },\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Get all objects owned by an address\n * @param owner\n * @param query\n * @param paginationArgs\n * @returns\n */\n async getOwnedObjectsByPage(\n owner: string,\n query: SuiObjectResponseQuery,\n paginationArgs: PaginationArgs = 'all'\n ): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: PaginatedObjectsResponse = await this.getOwnedObjects({\n owner,\n ...query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Return the list of dynamic field objects owned by an object\n * @param parentId\n * @param paginationArgs\n * @returns\n */\n async getDynamicFieldsByPage(parentId: SuiObjectIdType, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: DynamicFieldPage = await this.getDynamicFields({\n parentId,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Batch get details about a list of objects. If any of the object ids are duplicates the call will fail\n * @param ids\n * @param options\n * @param limit\n * @returns\n */\n async batchGetObjects(ids: SuiObjectIdType[], options?: SuiObjectDataOptions, limit = 50): Promise<SuiObjectResponse[]> {\n let objectDataResponses: SuiObjectResponse[] = []\n\n for (let i = 0; i < Math.ceil(ids.length / limit); i++) {\n try {\n const res = await this.multiGetObjects({\n ids: ids.slice(i * limit, limit * (i + 1)),\n options,\n })\n objectDataResponses = [...objectDataResponses, ...res]\n } catch (error) {\n console.error(`Batch ${i} failed:`, error)\n throw error\n }\n }\n\n return objectDataResponses\n }\n\n /**\n * Calculates the gas cost of a transaction block.\n * @param {Transaction} tx - The transaction block to calculate gas for.\n * @returns {Promise<number>} - The estimated gas cost of the transaction block.\n * @throws {Error} - Throws an error if the sender is empty or devInspect fails.\n */\n async calculationTxGas(tx: Transaction): Promise<number> {\n const { sender } = tx.blockData\n\n if (sender === undefined) {\n throw Error('Transaction sender is required')\n }\n\n const devResult = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender,\n })\n\n // CHECK FOR ERRORS FIRST\n if (devResult.error) {\n console.error('DevInspect failed:', devResult.error)\n throw new Error(`Gas estimation failed: ${devResult.error}`)\n }\n\n // CHECK EFFECTS EXISTS\n if (!devResult.effects) {\n throw new Error('Gas estimation failed: No effects returned from devInspect')\n }\n\n // CHECK GASUSED EXISTS\n if (!devResult.effects.gasUsed) {\n throw new Error('Gas estimation failed: No gas information in effects')\n }\n\n const { gasUsed } = devResult.effects\n\n // VALIDATE GAS VALUES\n if (!gasUsed.computationCost || !gasUsed.storageCost || gasUsed.storageRebate === undefined) {\n throw new Error('Gas estimation failed: Incomplete gas information')\n }\n\n const estimateGas =\n Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)\n\n // SANITY CHECK\n if (estimateGas < 0 || !Number.isFinite(estimateGas)) {\n throw new Error(`Gas estimation failed: Invalid gas value ${estimateGas}`)\n }\n\n return estimateGas\n }\n\n /**\n * Sends a transaction block after signing it with the provided keypair.\n *\n * @param {Ed25519Keypair | Secp256k1Keypair} keypair - The keypair used for signing the transaction.\n * @param {Transaction} tx - The transaction block to send.\n * @returns {Promise<SuiTransactionBlockResponse | undefined>} - The response of the sent transaction block.\n */\n async sendTransaction(keypair: Ed25519Keypair | Secp256k1Keypair, tx: Transaction): Promise<SuiTransactionBlockResponse | undefined> {\n try {\n const resultTxn = await this.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showEvents: true,\n },\n })\n return resultTxn\n } catch (error) {\n console.error('Transaction failed:', error)\n throw error\n }\n }\n\n /**\n * Send a simulation transaction.\n * @param tx - The transaction block.\n * @param simulationAccount - The simulation account.\n * @param useDevInspect - A flag indicating whether to use DevInspect. Defaults to true.\n * @returns A promise that resolves to DevInspectResults or undefined.\n */\n async sendSimulationTransaction(\n tx: Transaction,\n simulationAccount: string,\n useDevInspect = true\n ): Promise<DevInspectResults | undefined> {\n try {\n if (useDevInspect) {\n const simulateRes = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount,\n })\n return simulateRes\n }\n\n } catch (error) {\n console.error('sendSimulationTransaction failed:', error)\n throw error\n }\n }\n}\n","import BN from 'bn.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { isValidSuiObjectId, normalizeStructTag } 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 checkValidSuiAddress,\n extractStructTagFromType,\n getFutureTime,\n} from '../utils'\nimport { BuildCoinResult, findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport {\n DammFetcherModule,\n DammIntegratePoolModule,\n CLOCK_ADDRESS,\n DataPage,\n PaginationArgs,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectFields } from '../utils/objects'\nimport { CollectFeesQuote } from '../math'\nimport { FetchPosFeeParams } from './rewarder'\nimport { DammpoolsError, 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 DAMM pools\n * Handles position creation, liquidity adjustments, fee collection, and rewards\n * Positions are represented as NFTs that can be transferred or locked\n *\n * @example\n * // Get all positions for a wallet\n * const positions = await sdk.Position.getPositionList(\n * '0x_wallet_address',\n * [] // All pools\n * );\n *\n * positions.forEach(pos => {\n * console.log(`Position ${pos.pos_object_id}`);\n * console.log(`Pool: ${pos.pool}`);\n * console.log(`Liquidity: ${pos.liquidity}`);\n * console.log(`Range: [${pos.tick_lower_index}, ${pos.tick_upper_index}]`);\n * });\n *\n * @example\n * // Add liquidity to existing position\n * const addLiqTx = await sdk.Position.createAddLiquidityPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * delta_liquidity: \"1000000000\",\n * max_amount_a: \"1100000000\", // 10% slippage\n * max_amount_b: \"1100000\"\n * });\n *\n * @example\n * // Collect fees from position\n * const pool = await sdk.Pool.getPool(poolId);\n * const collectTx = await sdk.Position.collectFeeTransactionPayload({\n * pool,\n * pos_id: positionId,\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB\n * });\n */\nexport class PositionModule implements IModule {\n protected _sdk: FerraDammSDK\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: FerraDammSDK) {\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 ferraDamm = this._sdk.sdkOptions.damm_pool.package_id\n return `${ferraDamm}::position::Position`\n }\n\n /**\n * Gets transaction history for specific positions\n * Returns liquidity changes, fee collections, reward claims\n * @param account - Wallet address that owns positions\n * @param positionIds - Array of position NFT IDs\n * @param limit - Max transactions to return (default: 100)\n * @param offset - Starting offset for pagination\n * @returns Array of position transaction info\n * @example\n * const txList = await sdk.Position.getPositionTransactionList({\n * account: walletAddress,\n * positionIds: [posId1, posId2],\n * limit: 50\n * });\n * \n * txList.forEach(tx => {\n * console.log(`${tx.type}: ${tx.txDigest}`);\n * console.log(` Timestamp: ${new Date(Number(tx.timestampMs))}`);\n * });\n */\n async getPositionTransactionList({\n posId,\n paginationArgs = 'all',\n order = 'ascending',\n fullRpcUrl,\n originPosId,\n }: {\n posId: string\n originPosId?: string\n fullRpcUrl?: string\n paginationArgs?: PaginationArgs\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PositionTransactionInfo>> {\n const { fullClient } = this._sdk\n const filterIds: string[] = [posId]\n if (originPosId) {\n filterIds.push(originPosId)\n }\n\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 * Gets all positions owned by a specific wallet address\n * Optionally filters by pool IDs\n * @param accountAddress - Wallet address to query positions for\n * @param assignPoolIds - Filter by specific pool IDs (empty = all pools)\n * @param showDisplay - Include NFT display metadata (default: true)\n * @returns Array of position objects owned by the account\n * @example\n * // Get all positions\n * const allPositions = await sdk.Position.getPositionList(\n * '0x_wallet_address'\n * );\n *\n * // Get positions for specific pools only\n * const filteredPositions = await sdk.Position.getPositionList(\n * '0x_wallet_address',\n * ['0x_pool1', '0x_pool2']\n * );\n *\n * // Check position status\n * filteredPositions.forEach(pos => {\n * const pool = await sdk.Pool.getPool(pos.pool);\n * const status = PositionUtil.getPositionStatus(\n * pool.currentTickIndex,\n * pos.tick_lower_index,\n * pos.tick_upper_index\n * );\n * console.log(`Position ${pos.pos_object_id}: ${status}`);\n * });\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.damm_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 * Gets complete position data by position ID\n * This is the recommended method - simpler than getPosition()\n * @param positionID - Position NFT object ID\n * @param calculateRewarder - Calculate pending rewards (default: true)\n * @param showDisplay - Include NFT metadata (default: true)\n * @returns Complete position object\n * @throws {DammpoolsError} If position doesn't exist\n * @example\n * const position = await sdk.Position.getPositionById(\n * '0x_position_id',\n * true // Calculate rewards\n * );\n *\n * console.log(`Liquidity: ${position.liquidity}`);\n * console.log(`Fee owed A: ${position.fee_owed_a}`);\n * console.log(`Fee owed B: ${position.fee_owed_b}`);\n * console.log(`Reward 0: ${position.reward_amount_owed_0}`);\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.positionManager.positionsHandle, position)\n return result\n }\n return position\n }\n\n /**\n * Gets basic position data without reward calculations\n * Faster than getPositionById when rewards not needed\n * @param positionID - Position NFT object ID\n * @param showDisplay - Include NFT metadata (default: true)\n * @returns Position object without reward amounts\n * @example\n * // Quick position check\n * const position = await sdk.Position.getSimplePosition(positionId);\n * console.log(`Range: [${position.tick_lower_index}, ${position.tick_upper_index}]`);\n * console.log(`In pool: ${position.pool}`);\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 fetches simple position data for multiple positions\n * More efficient than calling getSimplePosition multiple times\n * @param positionIDs - Array of position NFT IDs\n * @param showDisplay - Include NFT metadata (default: true)\n * @returns Array of position objects\n * @example\n * const positions = await sdk.Position.getSipmlePositionList([\n * '0x_pos1',\n * '0x_pos2',\n * '0x_pos3'\n * ]);\n *\n * // Quick overview\n * positions.forEach(pos => {\n * console.log(`${pos.pos_object_id}: ${pos.liquidity} liquidity`);\n * });\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 * Calculates pending fees for multiple positions\n * Uses on-chain simulation for accurate calculations\n * @param params - Array of position and pool parameters\n * @returns Array of fee quotes (amounts owed)\n * @example\n * const fees = await sdk.Position.fetchPosFeeAmount([\n * {\n * pool_id: poolId1,\n * pos_id: posId1,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\"\n * },\n * {\n * pool_id: poolId2,\n * pos_id: posId2,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x456::usdc::USDC\"\n * }\n * ]);\n *\n * fees.forEach(fee => {\n * console.log(`Position: ${fee.position_id}`);\n * console.log(`Fee A: ${fee.feeOwedA.toString()}`);\n * console.log(`Fee B: ${fee.feeOwedB.toString()}`);\n * });\n */\n public async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { damm_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(damm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${DammFetcherModule}::fetch_position_fees`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 pending fees for multiple positions by ID\n * Convenient wrapper around fetchPosFeeAmount\n * @param positionIDs - Array of position NFT IDs\n * @returns Map of position ID to fee quote\n * @example\n * const feeMap = await sdk.Position.batchFetchPositionFees([\n * '0x_pos1',\n * '0x_pos2'\n * ]);\n *\n * for (const [posId, fees] of Object.entries(feeMap)) {\n * console.log(`Position ${posId}:`);\n * console.log(` Fee A: ${fees.feeOwedA.toString()}`);\n * console.log(` Fee B: ${fees.feeOwedB.toString()}`);\n * }\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 a transaction to add liquidity with fixed token amounts\n * Useful when you want to specify exact amounts rather than liquidity delta\n * @param params - Parameters including amounts and slippage tolerance\n * @returns Transaction for adding liquidity\n * @example\n * const tx = await sdk.Position.createAddLiquidityFixTokenPayload({\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * pool_id: poolId,\n * pos_id: positionId,\n * amount_a: 1000000000, // 1 SUI\n * amount_b: 5000000, // 5 COIN\n * fix_amount_a: true, // Fix SUI, adjust COIN\n * slippage: 0.05, // 5% slippage\n * tick_lower: -120,\n * tick_upper: 120,\n * collect_fee: true // Auto-collect fees before adding\n * });\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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 * Retrieves the balance of multiple coin types from a RewarderGlobalVault on the SUI network.\n *\n * This function queries the RewarderGlobalVault's dynamic fields (stored in a Bag)\n * to find the balance for each provided coin type. If a coin type is not found in the vault,\n * it returns 0n for that coin type.\n *\n * @param {SuiClient} client - The SUI client instance used to make RPC calls\n * @param {string} rewarderVaultId - The object ID of the RewarderGlobalVault on SUI blockchain\n * @param {string[]} coinTypes - Array of coin type identifiers to query balances for\n *\n * @returns {Promise<bigint[]>} Array of balances corresponding to each coin type.\n * Returns 0n if a coin type doesn't exist in the vault.\n * The order matches the input coinTypes array.\n *\n * @example\n * ```typescript\n * const client = new SuiClient({ url: \"https://fullnode.mainnet.sui.io\" });\n *\n * const balances = await getRewarderBalances(\n * client,\n * \"0xd68c56a1610953b0a81c48ad26e463c6c51e50ddcc13e5e4121fe70ee75c1bf7\",\n * [\n * \"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC\",\n * \"0x2::sui::SUI\",\n * ]\n * );\n *\n * console.log(balances); // [47463762n, 0n]\n * ```\n *\n * @throws {Error} Throws if the vault object is invalid or not a moveObject\n */\n public async getRewarderBalances<T extends Array<string>>(coinTypes: T): Promise<SizedArray<bigint, T['length']>> {\n const config = this.sdk.sdkOptions\n const client = this.sdk.fullClient\n const { global_rewarder_vault_id } = config.damm_pool.config ?? {}\n if (!global_rewarder_vault_id) {\n throw new Error('Rewarder vault id not found from config')\n }\n\n const vault = await client.getObject({\n id: global_rewarder_vault_id,\n options: {\n showContent: true,\n showType: true,\n },\n })\n\n if (vault.data?.content?.dataType !== 'moveObject') {\n throw new Error('Invalid vault object')\n }\n\n const vaultContent = vault.data.content.fields as any\n\n const balancesBagId = vaultContent.balances.fields.id.id\n\n let cursor: string | null = null\n const dynamicFieldsMap = new Map<string, string>()\n\n do {\n const response = await client.getDynamicFields({\n parentId: balancesBagId,\n cursor,\n limit: 100,\n })\n\n for (const field of response.data) {\n if (field.name.type === '0x1::type_name::TypeName') {\n const fieldName = field.name.value as any\n\n const coinType = fieldName.name?.fields?.name || fieldName?.name\n\n dynamicFieldsMap.set(normalizeStructTag(coinType), field.objectId)\n }\n }\n\n cursor = response.hasNextPage ? response.nextCursor : null\n } while (cursor)\n\n const results: bigint[] = []\n\n for (let coinType of coinTypes) {\n coinType = normalizeStructTag(coinType)\n let objectId = dynamicFieldsMap.get(coinType)\n\n if (!objectId) {\n results.push(0n)\n continue\n }\n\n try {\n const dynamicField = await client.getObject({\n id: objectId,\n options: {\n showContent: true,\n },\n })\n\n if (dynamicField.data?.content?.dataType === 'moveObject') {\n const fieldContent = dynamicField.data.content.fields as any\n const balance = BigInt(fieldContent.value || '0')\n results.push(balance)\n } else {\n results.push(0n)\n }\n } catch {\n results.push(0n)\n }\n }\n\n return results as SizedArray<bigint, T['length']>\n }\n\n /**\n * Creates a transaction to add liquidity with exact liquidity delta\n * Preferred method when you know the exact liquidity amount to add\n * @param params - Parameters including liquidity delta and amount limits\n * @returns Transaction for adding liquidity\n * @example\n * const tx = await sdk.Position.createAddLiquidityPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * delta_liquidity: \"1000000000\",\n * max_amount_a: \"1100000000\", // Max SUI to spend\n * max_amount_b: \"1100000\" // Max COIN to spend\n * });\n */\n async createAddLiquidityPayload(\n params: AddLiquidityParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n const { integrate, damm_pool } = this._sdk.sdkOptions\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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\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}::${DammIntegratePoolModule}::open_position_with_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(damm_pool).global_config_id),\n tx.object(params.pool_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 } 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}::${DammIntegratePoolModule}::add_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(damm_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 a transaction to remove liquidity from a position\n * @param params - Parameters including liquidity amount to remove and minimum outputs\n * @param tx - Optional existing transaction to extend\n * @returns Transaction for removing liquidity\n * @example\n * // Remove 50% of liquidity\n * const position = await sdk.Position.getPositionById(positionId);\n * const halfLiquidity = new BN(position.liquidity).divn(2);\n *\n * const tx = await sdk.Position.removeLiquidityTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * delta_liquidity: halfLiquidity.toString(),\n * min_amount_a: \"900000000\", // Minimum SUI to receive\n * min_amount_b: \"4500000\", // Minimum COIN to receive\n * collect_fee: true // Also collect pending fees\n * });\n */\n async removeLiquidityTransactionPayload(params: RemoveLiquidityParams, tx?: Transaction): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n UtilsErrorCode.InvalidSendAddress\n )\n }\n const { damm_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(damm_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}::${DammIntegratePoolModule}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Creates a transaction to close a position (remove all liquidity)\n * Position NFT is burned after closing\n * @param params - Parameters including slippage tolerance\n * @param tx - Optional existing transaction to extend\n * @returns Transaction for closing position\n * @example\n * const tx = await sdk.Position.closePositionTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * min_amount_a: \"950000000\", // Accept 5% slippage\n * min_amount_b: \"4750000\",\n * collect_fee: true,\n * rewarder_coin_types: [\n * \"0x_reward_coin_1\",\n * \"0x_reward_coin_2\",\n * \"0x_reward_coin_3\"\n * ]\n * });\n */\n async closePositionTransactionPayload(params: ClosePositionParams, tx?: Transaction): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n UtilsErrorCode.InvalidSendAddress\n )\n }\n const { damm_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}::${DammIntegratePoolModule}::close_position`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(damm_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 { damm_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 args = [\n tx.object(getPackagerConfigs(damm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DammIntegratePoolModule}::`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Locks a position until a specific timestamp\n * Locked positions cannot be closed or have liquidity removed\n * Useful for governance or vesting mechanisms\n * @param pool - Pool object\n * @param positionId - Position NFT ID\n * @param untilTimestamp - Unix timestamp (seconds) when lock expires\n * @param tx - Optional transaction to extend\n * @returns Transaction for locking position\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const oneWeekFromNow = Math.floor(Date.now() / 1000) + (7 * 24 * 60 * 60);\n *\n * const tx = await sdk.Position.lockPosition(\n * pool,\n * positionId,\n * oneWeekFromNow\n * );\n *\n * console.log(`Position locked until: ${new Date(oneWeekFromNow * 1000)}`);\n */\n public async lockPosition(pool: Pool, positionId: string, untilTimestamp: number, tx = new Transaction()) {\n const sender = this.sdk.senderAddress\n\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 /**\n * Gets lock status for a position by ID\n * @param positionId - Position NFT ID\n * @returns Tuple of [lockTimestamp, currentTimestamp, isLocked]\n * @example\n * const [lockTime, currentTime, isLocked] =\n * await sdk.Position.getLockPositionStatusById(positionId);\n *\n * if (isLocked) {\n * const unlockDate = new Date(lockTime * 1000);\n * console.log(`Locked until: ${unlockDate}`);\n * console.log(`Time remaining: ${lockTime - currentTime}s`);\n * } else {\n * console.log('Position is unlocked');\n * }\n */\n public async getLockPositionStatusById(\n positionId: string\n ): 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 a transaction to collect accumulated fees from a position\n * Fees can be collected without affecting liquidity\n * @param params - Parameters including pool and position info\n * @param tx - Optional transaction to extend\n * @returns Transaction for collecting fees\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * const collectTx = await sdk.Position.collectFeeTransactionPayload({\n * pool,\n * pos_id: positionId,\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: collectTx,\n * signer: keypair\n * });\n *\n * // Check collected amounts from events\n * const collectEvent = result.events?.find(\n * e => e.type.includes('CollectFeeEvent')\n * );\n * console.log(`Collected A: ${collectEvent?.parsedJson?.amount_a}`);\n * console.log(`Collected B: ${collectEvent?.parsedJson?.amount_b}`);\n */\n async collectFeeTransactionPayload(\n params: CollectFeeParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 { damm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::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 { damm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * Calculates pending fees for a position using local computation\n * Faster than on-chain simulation but less accurate\n * @param params - Pool and position parameters\n * @returns Fee quote with amounts owed\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const position = await sdk.Position.getPositionById(positionId);\n * const ticks = await sdk.Pool.fetchTicksByRpc(pool.ticksHandle);\n * \n * const tickLower = ticks.find(t => t.index === position.tick_lower_index);\n * const tickUpper = ticks.find(t => t.index === position.tick_upper_index);\n * \n * const fees = await sdk.Position.calculateFee({\n * pool,\n * position,\n * tickLower,\n * tickUpper\n * });\n * \n * console.log(`Pending fee A: ${fees.feeOwedA.toString()}`);\n * console.log(`Pending fee B: ${fees.feeOwedB.toString()}`);\n */\n async calculateFee(params: CollectFeeParams) {\n const paylod = await this.collectFeeTransactionPayload(params)\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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}\n\ntype SizedArray<T, S extends number, Arr extends T[] = []> = Arr['length'] extends S ? Arr : SizedArray<T, S, [...Arr, T]>\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport BN from 'bn.js'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { BuildCoinResult, checkValidSuiAddress, extractStructTagFromType, normalizeCoinType, TransactionUtil } from '../utils'\nimport { DammFetcherModule, DammIntegratePoolModule, CLOCK_ADDRESS } from '../types/sui'\nimport { getRewardInTickRange } from '../utils/tick'\nimport { MathUtil, ONE, ZERO } from '../math/utils'\nimport { TickData } from '../types/damm-pool'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { CollectRewarderParams, getPackagerConfigs, Pool, Position, PositionReward, Rewarder, RewarderAmountOwed } from '../types'\nimport { CollectFeesQuote } from '../math'\nimport { DammpoolsError, 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 pool incentive rewards\n * Handles reward calculations, claiming, and emissions tracking\n * Supports up to 3 simultaneous reward tokens per pool\n *\n * @example\n * // Check daily emissions for a pool\n * const emissions = await sdk.Rewarder.emissionsEveryDay(poolId);\n * console.log(`Rewarder 0: ${emissions[0]} tokens/day`);\n * console.log(`Rewarder 1: ${emissions[1]} tokens/day`);\n * console.log(`Rewarder 2: ${emissions[2]} tokens/day`);\n *\n * @example\n * // Fetch pending rewards for a position\n * const pool = await sdk.Pool.getPool(poolId);\n * const rewards = await sdk.Rewarder.fetchPositionRewarders(pool, positionId);\n *\n * rewards.forEach((reward, index) => {\n * const rewarderInfo = pool.rewarderInfos[index];\n * console.log(`Reward ${index} (${rewarderInfo.coinAddress}):`);\n * console.log(` Owed: ${reward.amount_owed}`);\n * });\n *\n * @example\n * // Claim all rewards from a position\n * const claimTx = await sdk.Rewarder.collectRewarderTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * rewarder_coin_types: [\n * pool.rewarderInfos[0].coinAddress,\n * pool.rewarderInfos[1].coinAddress,\n * pool.rewarderInfos[2].coinAddress\n * ],\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB\n * });\n */\nexport class RewarderModule implements IModule {\n protected _sdk: FerraDammSDK\n private growthGlobal: BN[]\n\n constructor(sdk: FerraDammSDK) {\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 emission rates for all rewarders in a pool\n * Emissions are continuous, this converts to daily amounts\n * @param poolID - Pool object ID\n * @returns Array of daily emission amounts [rewarder0, rewarder1, rewarder2]\n * @example\n * const emissions = await sdk.Rewarder.emissionsEveryDay(poolId);\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * pool.rewarderInfos.forEach((info, i) => {\n * const dailyEmission = emissions[i];\n * console.log(`${info.coinAddress}: ${dailyEmission} per day`);\n * });\n */\n async emissionsEveryDay(poolID: string) {\n const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n const rewarderInfos = currentPool.rewarderInfos\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.rewarderLastUpdatedTime\n currentPool.rewarderLastUpdatedTime = 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.rewarderInfos\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 * Batch fetches pending rewards for multiple positions\n * More efficient than calling fetchPositionRewarders multiple times\n * @param positionIDs - Array of position NFT IDs\n * @returns Map of position ID to array of reward amounts\n * @example\n * const rewardMap = await sdk.Rewarder.batchFetchPositionRewarders([\n * '0x_pos1',\n * '0x_pos2',\n * '0x_pos3'\n * ]);\n *\n * for (const [posId, rewards] of Object.entries(rewardMap)) {\n * console.log(`Position ${posId}:`);\n * rewards.forEach((reward, i) => {\n * console.log(` Reward ${i}: ${reward.amount_owed}`);\n * });\n * }\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.rewarderInfos,\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 pending reward amounts for a specific position\n * Uses on-chain data for accurate calculations\n * @param pool - Pool object containing rewarder info\n * @param positionId - Position NFT ID\n * @returns Array of reward amounts owed\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const rewards = await sdk.Rewarder.fetchPositionRewarders(pool, positionId);\n *\n * // Display rewards with token info\n * for (let i = 0; i < rewards.length; i++) {\n * const rewarder = pool.rewarderInfos[i];\n * const reward = rewards[i];\n * console.log(`Rewarder ${i}:`);\n * console.log(` Token: ${rewarder.coinAddress}`);\n * console.log(` Owed: ${reward.amount_owed}`);\n * console.log(` Growth inside: ${reward.growth_inside}`);\n * }\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.rewarderInfos,\n }\n\n const result = await this.fetchPosRewardersAmount([param])\n\n return result[0].rewarderAmountOwed\n }\n\n /**\n * Fetches both fees and rewards for multiple positions\n * Convenience method that combines fee and reward queries\n * @param positionIDs - Array of position NFT IDs\n * @returns Map of position ID to fee quote\n * @example\n * const feeMap = await sdk.Rewarder.batchFetchPositionFees([\n * '0x_pos1',\n * '0x_pos2'\n * ]);\n *\n * for (const [posId, fees] of Object.entries(feeMap)) {\n * console.log(`Position ${posId}:`);\n * console.log(` Fee A: ${fees.feeOwedA.toString()}`);\n * console.log(` Fee B: ${fees.feeOwedB.toString()}`);\n * }\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 * Fetches pending fee amounts for multiple positions\n * Uses on-chain simulation for accurate results\n * @param params - Array of position and pool parameters\n * @returns Array of fee quotes\n * @example\n * const fees = await sdk.Rewarder.fetchPosFeeAmount([\n * {\n * pool_id: poolId1,\n * pos_id: posId1,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\"\n * }\n * ]);\n *\n * fees.forEach(fee => {\n * console.log(`Fees for ${fee.position_id}:`);\n * console.log(` A: ${fee.feeOwedA.toString()}`);\n * console.log(` B: ${fee.feeOwedB.toString()}`);\n * });\n */\n async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { damm_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(damm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${DammFetcherModule}::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 * Fetches pending reward amounts for multiple positions\n * Uses on-chain simulation for accurate calculations\n * @param params - Array of position and pool parameters\n * @returns Array of reward amount quotes\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * const rewards = await sdk.Rewarder.fetchPosRewardersAmount([\n * {\n * pool_id: poolId,\n * pos_id: posId1,\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress)\n * }\n * ]);\n *\n * rewards.forEach(reward => {\n * console.log(`Position: ${reward.pos_object_id}`);\n * console.log(`Rewards: ${reward.rewarder_amounts}`);\n * });\n */\n async fetchPosRewardersAmount(params: FetchPosRewardParams[]) {\n const { damm_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(damm_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}::${DammFetcherModule}::fetch_position_rewards`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError(\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 DammpoolsError(\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 DammpoolsError('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 * Fetches total accumulated rewards for an account in a specific pool\n * Aggregates rewards across all positions in the pool\n * @param account - Wallet address\n * @param poolObjectId - Pool object ID\n * @returns Total reward amounts by token\n * @example\n * const poolRewards = await sdk.Rewarder.fetchPoolRewardersAmount(\n * walletAddress,\n * poolId\n * );\n *\n * console.log('Total pool rewards for account:');\n * poolRewards.forEach((amount, index) => {\n * console.log(` Rewarder ${index}: ${amount}`);\n * });\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.rewarderInfos,\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 a transaction to collect rewards from a position\n * Can optionally collect fees at the same time\n * @param params - Parameters including reward coin types\n * @param tx - Optional transaction to extend\n * @returns Transaction for collecting rewards\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * const claimTx = await sdk.Rewarder.collectRewarderTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress),\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true // Also collect trading fees\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: claimTx,\n * signer: keypair\n * });\n */\n async collectRewarderTransactionPayload(params: CollectRewarderParams, tx?: Transaction): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 ??= new Transaction()\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n return tx\n }\n\n /**\n * Creates a transaction to batch collect rewards from multiple positions\n * More gas efficient than individual collection transactions\n * @param paramsList - Array of reward collection parameters\n * @param allCoinAsset - Available coin assets for the wallet\n * @returns Transaction for batch reward collection\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const coinAssets = await sdk.getOwnerCoinAssets(walletAddress);\n *\n * const batchTx = await sdk.Rewarder.batchCollectRewardePayload(\n * [\n * {\n * pool_id: poolId,\n * pos_id: posId1,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress),\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true\n * },\n * {\n * pool_id: poolId,\n * pos_id: posId2,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress),\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true\n * }\n * ],\n * coinAssets\n * );\n */\n async batchCollectRewardePayload(\n params: CollectRewarderParams[],\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ) {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 { damm_pool, integrate } = this.sdk.sdkOptions\n const dammConfigs = getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(dammConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(dammConfigs.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 { damm_pool, integrate } = this.sdk.sdkOptions\n const dammConfigs = getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(dammConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(dammConfigs.global_rewarder_vault_id),\n primaryCoinInputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n}\n","import BN from 'bn.js'\nimport { Graph, GraphEdge, GraphVertex } from '@syntsugar/cc-graph'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { PreSwapLpChangeParams, PreSwapWithMultiPoolParams } from '../types'\nimport { checkValidSuiAddress, extractStructTagFromType } from '../utils'\nimport { DammExpectSwapModule, DammIntegrateRouterModule, SuiAddressType } from '../types/sui'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { U64_MAX, ZERO } from '../math'\nimport { DammpoolsError, ConfigErrorCode, RouterErrorCode } from '../errors/errors'\nimport Decimal from '../utils/decimal'\nimport { isValidSuiAddress, 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\ninterface CoinInfo {\n address: string\n decimals: number\n}\n\ninterface PoolInfo {\n address: string\n is_closed: boolean\n fee: number\n\n // Token information\n coin_a: CoinInfo\n coin_b: CoinInfo\n}\n\ninterface GraphApiResponse {\n code: number\n pools: PoolInfo[]\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 multi-hop swap paths\n * Analyzes liquidity across pools to find best execution routes\n * Supports complex routing with intermediate tokens\n * \n * @example\n * // Find best route for SUI -> USDC swap\n * await sdk.Router.loadGraphData(); // Load pool graph first\n * \n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\", // 1 SUI\n * byAmountIn: true,\n * depth: 3 // Allow up to 3 hops\n * });\n * \n * if (route) {\n * console.log(`Best route: ${route.paths.map(p => p.coinType).join(' -> ')}`);\n * console.log(`Expected output: ${route.amountOut}`);\n * console.log(`Price impact: ${route.priceImpact}%`);\n * }\n * \n * @example\n * // Execute multi-hop swap\n * const swapTx = await sdk.Router.createSwapTransactionPayload({\n * paths: route.paths,\n * partner: null,\n * byAmountIn: true\n * });\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: FerraDammSDK\n\n constructor(sdk: FerraDammSDK) {\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 * Loads pool and coin graph data for routing\n * Must be called before using routing functions\n * Caches data for performance\n * @example\n * // Load graph once at app startup\n * await sdk.Router.loadGraphData();\n * \n * // Now you can use routing\n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\",\n * byAmountIn: true\n * });\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 swap route between two tokens\n * Analyzes all possible paths considering liquidity and fees\n * @param params - Routing parameters including tokens and amount\n * @returns Best route with expected output and path details, or null if no path found\n * @example\n * await sdk.Router.loadGraphData();\n * \n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\", // 1 SUI\n * byAmountIn: true,\n * depth: 3, // Max 3 hops\n * splitCount: 1 // Single path (no split routing)\n * });\n * \n * if (!route) {\n * console.log('No route found');\n * return;\n * }\n * \n * console.log('Route found:');\n * route.paths.forEach((path, i) => {\n * console.log(` Hop ${i + 1}: ${path.coinType}`);\n * console.log(` Pool: ${path.poolAddress}`);\n * console.log(` Direction: ${path.a2b ? 'A->B' : 'B->A'}`);\n * });\n * console.log(`Total output: ${route.amountOut}`);\n * console.log(`Price impact: ${route.priceImpact}%`);\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 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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 = await fetch(this.sdk.sdkOptions.swapCountUrl!, { method: 'GET' })\n const poolsData = (await apiResponse.json()) as GraphApiResponse\n\n if (poolsData.code === 200) {\n for (const poolInfo of poolsData.pools) {\n if (\n poolInfo.is_closed ||\n !(\n isValidSuiAddress(poolInfo.address) &&\n isValidSuiAddress(poolInfo.coin_a.address) &&\n isValidSuiAddress(poolInfo.coin_b.address) &&\n poolInfo.fee\n )\n ) {\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 DammpoolsError(`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 * Simulates multi-hop swaps across different parameter sets\n * Useful for comparing different amounts or paths\n * @param parameterSets - Array of routing parameters to test\n * @returns Array of best routes for each parameter set\n * @example\n * await sdk.Router.loadGraphData();\n * \n * const routes = await sdk.Router.preRouterSwapA2B2C([\n * {\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\", // 1 SUI\n * byAmountIn: true\n * },\n * {\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"10000000000\", // 10 SUI\n * byAmountIn: true\n * }\n * ]);\n * \n * routes.forEach((route, i) => {\n * console.log(`Route ${i + 1}:`);\n * console.log(` Output: ${route?.amountOut ?? 'No route'}`);\n * });\n */\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}::${DammIntegrateRouterModule}::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}::${DammExpectSwapModule}::get_expect_swap_result`,\n arguments: transactionArgs,\n typeArguments: typeParameters,\n })\n }\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 * Gets all pools with their Total Value Locked (TVL)\n * Useful for analytics and pool selection\n * @returns Array of pools with TVL data\n * @example\n * const poolsWithTvl = await sdk.Router.getPoolWithTVL();\n * \n * // Sort by TVL\n * poolsWithTvl.sort((a, b) => b.tvl - a.tvl);\n * \n * console.log('Top 10 pools by TVL:');\n * poolsWithTvl.slice(0, 10).forEach(pool => {\n * console.log(`${pool.name}: $${pool.tvl.toLocaleString()}`);\n * });\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 DammpoolsError(`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 DammpoolsError(`Failed to parse response from ${swapCountUrl}.`, RouterErrorCode.InvalidSwapCountUrl)\n }\n\n if (responseData.code !== 200) {\n throw new DammpoolsError(\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}\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 { CLOCK_ADDRESS, DammFetcherModule } from '../types/sui'\nimport { TickData, transDammpoolDataWithoutTicks } from '../types/damm-pool'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { SwapUtils } from '../math/swap'\nimport { computeSwap } from '../math/damm'\nimport { TickMath } from '../math/tick'\nimport { checkValidSuiAddress, d } from '../utils'\nimport { SplitPath } from './router'\nimport { DammpoolsError, ConfigErrorCode, SwapErrorCode, UtilsErrorCode } from '../errors/errors'\nimport { simulateSwap } from '../utils/swap-utils'\n\n/**\n * Swap module for executing token swaps in DAMM 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: FerraDammSDK\n\n constructor(sdk: FerraDammSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\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}::${DammFetcherModule}::calculate_swap_result`,\n arguments: transactionArgs,\n typeArguments: coinTypes,\n })\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 DammpoolsError('Event data length does not match pool count', SwapErrorCode.ParamsLengthNotEqual)\n }\n\n let optimalAmount = swapParams.byAmountIn ? ZERO : U64_MAX\n let optimalPoolIndex = -1\n\n for (let eventIndex = 0; eventIndex < swapEventData.length; eventIndex += 1) {\n if (swapEventData[eventIndex].parsedJson.data.is_exceed) {\n continue\n }\n const outputAmount = swapParams.byAmountIn\n ? new BN(swapEventData[eventIndex].parsedJson.data.amount_out)\n : new BN(swapEventData[eventIndex].parsedJson.data.amount_in)\n\n if (optimalPoolIndex === -1) {\n optimalPoolIndex = eventIndex\n optimalAmount = outputAmount\n } else if (swapParams.byAmountIn && outputAmount.gt(optimalAmount)) {\n optimalPoolIndex = eventIndex\n optimalAmount = outputAmount\n } else if (!swapParams.byAmountIn && outputAmount.lt(optimalAmount)) {\n optimalPoolIndex = eventIndex\n optimalAmount = outputAmount\n }\n }\n\n if (optimalPoolIndex === -1) {\n throw new Error('No valid pool for swap')\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 transaction.object(CLOCK_ADDRESS),\n ]\n\n transaction.moveCall({\n target: `${integrate.published_at}::${DammFetcherModule}::calculate_swap_result`,\n arguments: transactionArgs,\n typeArguments: coinTypes,\n })\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 return {\n poolAddress: swapParams.pool.poolAddress,\n currentSqrtPrice: swapParams.currentSqrtPrice,\n estimatedAmountIn: simulationData.amount_in,\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 ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\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 currentTimestampMs = new BN(Date.now())\n\n const sortedTicks = calculationParams.swapTicks.sort((tickA, tickB) => {\n return tickA.index - tickB.index\n })\n\n const swapCalculationResult = simulateSwap(\n currentPool,\n sortedTicks,\n calculationParams.a2b,\n calculationParams.byAmountIn,\n calculationParams.amount,\n currentTimestampMs,\n )\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.afterSqrtPrice.lt(priceLimit)) {\n hasExceededLimits = true\n }\n\n if (!calculationParams.a2b && swapCalculationResult.afterSqrtPrice.gt(priceLimit)) {\n hasExceededLimits = true\n }\n\n let additionalComputeLimit = 0\n if (swapCalculationResult.stepResults.length > 6 && swapCalculationResult.stepResults.length < 40) {\n additionalComputeLimit = 22000 * (swapCalculationResult.stepResults.length - 6)\n }\n\n if (swapCalculationResult.stepResults.length > 40) {\n hasExceededLimits = true\n }\n\n let initialPrice = TickMath.sqrtPriceX64ToPrice(\n new BN(currentPool.currentSqrtPrice),\n calculationParams.decimalsA,\n calculationParams.decimalsB\n ).toNumber()\n let decimalAdjustment = Math.pow(10, calculationParams.decimalsA - calculationParams.decimalsB)\n\n if (calculationParams.a2b === false) {\n initialPrice = 1 / initialPrice\n decimalAdjustment = Math.pow(10, calculationParams.decimalsB - calculationParams.decimalsA)\n }\n\n const executionPrice = new Decimal(swapCalculationResult.amountOut.toNumber())\n .div(swapCalculationResult.amountIn.toNumber())\n .mul(decimalAdjustment)\n .toNumber()\n\n const priceImpactPercentage = ((executionPrice - initialPrice) / initialPrice) * 100\n\n return {\n estimatedAmountIn: swapCalculationResult.amountIn,\n estimatedAmountOut: swapCalculationResult.amountOut,\n estimatedEndSqrtPrice: swapCalculationResult.afterSqrtPrice,\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 transaction for multi-hop swap execution\n * Builds the complete swap path through multiple pools\n * @param params - Swap parameters including path and partner info\n * @returns Transaction ready for execution\n * @example\n * // First find the best route\n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\",\n * byAmountIn: true\n * });\n *\n * // Then create transaction\n * const tx = await sdk.Router.createSwapTransactionPayload({\n * paths: route.paths,\n * partner: null, // Or partner ID for fee sharing\n * byAmountIn: true\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: tx,\n * signer: keypair\n * });\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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: Ferra DAMM 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(\n this._sdk,\n swapParams,\n userCoinAssets,\n gasEstimationConfig\n )\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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: Ferra DAMM 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(\n this._sdk,\n swapParams,\n userCoinAssets,\n gasEstimationConfig\n )\n return gasOptimizedResult\n }\n }\n\n return TransactionUtil.buildSwapTransactionWithoutTransferCoins(this.sdk, swapParams, userCoinAssets)\n }\n}\n","import BN from \"bn.js\";\nimport { Pool, TickData } from \"../types\";\n\n// ============================================================\n// Constants\n// ============================================================\nconst PRECISION = new BN(\"1000000000\"); // 1e9\nconst MAX_FEE = new BN(\"500000000\"); // 50%\nconst MAX_SQRT_PRICE_X64 = new BN(\"79226673515401279992447579055\");\nconst MIN_SQRT_PRICE_X64 = new BN(\"4295048016\");\nconst ONE = new BN(1);\nconst ZERO = new BN(0);\n\nconst COLLECT_FEE_MODE_ON_BOTH = 0;\nconst COLLECT_FEE_MODE_ON_QUOTE = 1;\n\nexport interface SwapStepResult {\n currentSqrtPrice: BN;\n targetSqrtPrice: BN;\n currentLiquidity: BN;\n amountIn: BN;\n amountOut: BN;\n feeAmount: BN;\n remainderAmount: BN;\n}\n\nexport interface CalculatedSwapResult {\n amountIn: BN;\n amountOut: BN;\n feeAmount: BN;\n baseFee: BN;\n dynamicFee: BN;\n beforeSqrtPrice: BN;\n afterSqrtPrice: BN;\n isExceed: boolean;\n collectFeeOnInput: boolean;\n stepResults: SwapStepResult[];\n}\n\nexport interface SwapQuote {\n amountIn: string;\n amountOut: string;\n feeAmount: string;\n baseFee: string;\n dynamicFee: string;\n isExceed: boolean;\n afterSqrtPrice: string;\n priceImpact: number;\n steps: number;\n}\n\n// ============================================================\n// BN Utility Helpers\n// ============================================================\n\nfunction toBN(val: bigint | number | string | BN): BN {\n if (BN.isBN(val)) return val;\n return new BN(val.toString());\n}\n\nfunction mulShr(a: BN, b: BN, shift: number): BN {\n return a.mul(b).shrn(shift);\n}\n\nfunction mulDivFloor(a: BN, b: BN, denom: BN): BN {\n return a.mul(b).div(denom);\n}\n\nfunction mulDivCeil(a: BN, b: BN, denom: BN): BN {\n const product = a.mul(b);\n const result = product.div(denom);\n if (product.mod(denom).gt(ZERO)) {\n return result.add(ONE);\n }\n return result;\n}\n\nfunction divRound(num: BN, denom: BN, roundUp: boolean): BN {\n const result = num.div(denom);\n if (roundUp && num.mod(denom).gt(ZERO)) {\n return result.add(ONE);\n }\n return result;\n}\n\n// ============================================================\n// Tick Math (Q64.64 sqrt price <-> tick)\n// ============================================================\n\nconst NEG_TICK_MULTIPLIERS: BN[] = [\n new BN(\"18445821805675392311\"),\n new BN(\"18444899583751176498\"),\n new BN(\"18443055278223354162\"),\n new BN(\"18439367220385604838\"),\n new BN(\"18431993317065449817\"),\n new BN(\"18417254355718160513\"),\n new BN(\"18387811781193591352\"),\n new BN(\"18329067761203520168\"),\n new BN(\"18212142134806087854\"),\n new BN(\"17980523815641551639\"),\n new BN(\"17526086738831147013\"),\n new BN(\"16651378430235024244\"),\n new BN(\"15030750278693429944\"),\n new BN(\"12247334978882834399\"),\n new BN(\"8131365268884726200\"),\n new BN(\"3584323654723342297\"),\n new BN(\"696457651847595233\"),\n new BN(\"26294789957452057\"),\n new BN(\"37481735321082\"),\n];\n\nconst POS_TICK_MULTIPLIERS: BN[] = [\n new BN(\"79232123823359799118286999567\"),\n new BN(\"79236085330515764027303304731\"),\n new BN(\"79244008939048815603706035061\"),\n new BN(\"79259858533276714757314932305\"),\n new BN(\"79291567232598584799939703904\"),\n new BN(\"79355022692464371645785046466\"),\n new BN(\"79482085999252804386437311141\"),\n new BN(\"79736823300114093921829183326\"),\n new BN(\"80248749790819932309965073892\"),\n new BN(\"81282483887344747381513967011\"),\n new BN(\"83390072131320151908154831281\"),\n new BN(\"87770609709833776024991924138\"),\n new BN(\"97234110755111693312479820773\"),\n new BN(\"119332217159966728226237229890\"),\n new BN(\"179736315981702064433883588727\"),\n new BN(\"407748233172238350107850275304\"),\n new BN(\"2098478828474011932436660412517\"),\n new BN(\"55581415166113811149459800483533\"),\n new BN(\"38992368544603139932233054999993551\"),\n];\n\nconst BASE_NEG = new BN(\"18446744073709551616\"); // 2^64\nconst BASE_POS = new BN(\"79228162514264337593543950336\");\n\nexport function getSqrtPriceAtTick(tick: number): BN {\n if (tick < -443636 || tick > 443636) throw new Error(\"Invalid tick\");\n if (tick < 0) return getSqrtPriceAtNegativeTick(tick);\n return getSqrtPriceAtPositiveTick(tick);\n}\n\nfunction getSqrtPriceAtNegativeTick(tick: number): BN {\n const absTick = Math.abs(tick);\n let ratio = absTick & 0x1 ? new BN(NEG_TICK_MULTIPLIERS[0]) : new BN(BASE_NEG);\n for (let i = 1; i < 19; i++) {\n if (absTick & (1 << i)) {\n ratio = mulShr(ratio, NEG_TICK_MULTIPLIERS[i], 64);\n }\n }\n return ratio;\n}\n\nfunction getSqrtPriceAtPositiveTick(tick: number): BN {\n const absTick = Math.abs(tick);\n let ratio = absTick & 0x1 ? new BN(POS_TICK_MULTIPLIERS[0]) : new BN(BASE_POS);\n for (let i = 1; i < 19; i++) {\n if (absTick & (1 << i)) {\n ratio = mulShr(ratio, POS_TICK_MULTIPLIERS[i], 96);\n }\n }\n return ratio.shrn(32);\n}\n\nexport function getTickAtSqrtPrice(sqrtPrice: BN): number {\n if (sqrtPrice.lt(MIN_SQRT_PRICE_X64) || sqrtPrice.gt(MAX_SQRT_PRICE_X64)) {\n throw new Error(\"Invalid sqrt price\");\n }\n\n let r = sqrtPrice.clone();\n let msb = 0;\n\n if (r.gte(new BN(1).shln(64))) { msb |= 64; r = r.shrn(64); }\n if (r.gte(new BN(1).shln(32))) { msb |= 32; r = r.shrn(32); }\n if (r.gte(new BN(1).shln(16))) { msb |= 16; r = r.shrn(16); }\n if (r.gte(new BN(1).shln(8))) { msb |= 8; r = r.shrn(8); }\n if (r.gte(new BN(1).shln(4))) { msb |= 4; r = r.shrn(4); }\n if (r.gte(new BN(1).shln(2))) { msb |= 2; r = r.shrn(2); }\n if (r.gte(new BN(2))) { msb |= 1; }\n\n let log2_x32 = new BN(msb - 64).shln(32);\n r = msb >= 64 ? sqrtPrice.shrn(msb - 63) : sqrtPrice.shln(63 - msb);\n\n for (let shift = 31; shift >= 18; shift--) {\n r = r.mul(r).shrn(63);\n const f = r.shrn(64).toNumber();\n log2_x32 = log2_x32.or(new BN(f).shln(shift));\n r = r.shrn(f);\n }\n\n const log_sqrt_10001 = log2_x32.mul(new BN(\"59543866431366\"));\n\n const tickLow = log_sqrt_10001\n .sub(new BN(\"184467440737095516\"))\n .shrn(64)\n .toNumber();\n\n const tickHigh = log_sqrt_10001\n .add(new BN(\"15793534762490258745\"))\n .shrn(64)\n .toNumber();\n\n if (tickLow === tickHigh) return tickLow;\n if (getSqrtPriceAtTick(tickHigh).lte(sqrtPrice)) return tickHigh;\n return tickLow;\n}\n\n// ============================================================\n// CLMM Math - Delta Calculations (Q64.64 fixed point)\n// ============================================================\n\nfunction getDeltaA(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const diff = sqrtPrice0.gt(sqrtPrice1)\n ? sqrtPrice0.sub(sqrtPrice1)\n : sqrtPrice1.sub(sqrtPrice0);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n const numerator = liquidity.mul(diff).shln(64);\n const denominator = sqrtPrice0.mul(sqrtPrice1);\n return divRound(numerator, denominator, roundUp);\n}\n\nfunction getDeltaB(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const diff = sqrtPrice0.gt(sqrtPrice1)\n ? sqrtPrice0.sub(sqrtPrice1)\n : sqrtPrice1.sub(sqrtPrice0);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n const product = liquidity.mul(diff);\n const lo64Mask = new BN(1).shln(64).sub(ONE);\n const shouldRoundUp = roundUp && product.and(lo64Mask).gt(ZERO);\n const result = product.shrn(64);\n return shouldRoundUp ? result.add(ONE) : result;\n}\n\nfunction getDeltaUpFromInput(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n a2b: boolean\n): BN {\n const diff = currentSqrtPrice.gt(targetSqrtPrice)\n ? currentSqrtPrice.sub(targetSqrtPrice)\n : targetSqrtPrice.sub(currentSqrtPrice);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n if (a2b) {\n const numerator = liquidity.mul(diff).shln(64);\n const denominator = currentSqrtPrice.mul(targetSqrtPrice);\n return divRound(numerator, denominator, true);\n } else {\n const product = liquidity.mul(diff);\n const lo64Mask = new BN(1).shln(64).sub(ONE);\n const shouldRoundUp = product.and(lo64Mask).gt(ZERO);\n const result = product.shrn(64);\n return shouldRoundUp ? result.add(ONE) : result;\n }\n}\n\nfunction getDeltaDownFromOutput(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n a2b: boolean\n): BN {\n const diff = currentSqrtPrice.gt(targetSqrtPrice)\n ? currentSqrtPrice.sub(targetSqrtPrice)\n : targetSqrtPrice.sub(currentSqrtPrice);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n if (a2b) {\n return liquidity.mul(diff).shrn(64);\n } else {\n const numerator = liquidity.mul(diff).shln(64);\n const denominator = currentSqrtPrice.mul(targetSqrtPrice);\n return divRound(numerator, denominator, false);\n }\n}\n\nfunction getNextSqrtPriceFromInput(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n a2b: boolean\n): BN {\n if (amount.isZero()) return sqrtPrice;\n if (a2b) {\n const numerator = sqrtPrice.mul(liquidity).shln(64);\n const liquidityShl64 = liquidity.shln(64);\n const product = sqrtPrice.mul(amount);\n const denominator = liquidityShl64.add(product);\n return divRound(numerator, denominator, true);\n } else {\n const deltaSqrtPrice = divRound(amount.shln(64), liquidity, false);\n return sqrtPrice.add(deltaSqrtPrice);\n }\n}\n\nfunction getNextSqrtPriceFromOutput(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n a2b: boolean\n): BN {\n if (amount.isZero()) return sqrtPrice;\n if (a2b) {\n const deltaSqrtPrice = divRound(amount.shln(64), liquidity, true);\n return sqrtPrice.sub(deltaSqrtPrice);\n } else {\n const numerator = sqrtPrice.mul(liquidity).shln(64);\n const liquidityShl64 = liquidity.shln(64);\n const product = sqrtPrice.mul(amount);\n const denominator = liquidityShl64.sub(product);\n return divRound(numerator, denominator, true);\n }\n}\n\n// ============================================================\n// Compute Swap Step\n// ============================================================\n\ninterface SwapStepComputed {\n amountIn: BN;\n amountOut: BN;\n nextSqrtPrice: BN;\n feeAmount: BN;\n}\n\nfunction computeSwapStep(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n collectFeeOnInput: boolean,\n feeRate: BN,\n a2b: boolean,\n byAmountIn: boolean\n): SwapStepComputed {\n let nextSqrtPrice = targetSqrtPrice.clone();\n let amountIn = ZERO;\n let amountOut = ZERO;\n let feeAmount = ZERO;\n\n if (liquidity.isZero()) {\n return { amountIn, amountOut, nextSqrtPrice, feeAmount };\n }\n\n if (byAmountIn) {\n if (collectFeeOnInput) {\n const amountRemain = mulDivFloor(amount, PRECISION.sub(feeRate), PRECISION);\n const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\n if (maxAmountIn.gt(amountRemain)) {\n amountIn = amountRemain;\n feeAmount = amount.sub(amountRemain);\n nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amountRemain, a2b);\n } else {\n amountIn = maxAmountIn;\n feeAmount = mulDivCeil(amountIn, feeRate, PRECISION.sub(feeRate));\n nextSqrtPrice = targetSqrtPrice;\n }\n amountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b);\n } else {\n const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\n if (maxAmountIn.gt(amount)) {\n amountIn = amount;\n nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amount, a2b);\n } else {\n amountIn = maxAmountIn;\n nextSqrtPrice = targetSqrtPrice;\n }\n const grossAmountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b);\n feeAmount = mulDivCeil(grossAmountOut, feeRate, PRECISION);\n amountOut = grossAmountOut.sub(feeAmount);\n }\n } else {\n if (collectFeeOnInput) {\n const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\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 = mulDivCeil(amountIn, feeRate, PRECISION.sub(feeRate));\n } else {\n const amountWithFee = mulDivCeil(amount, PRECISION, PRECISION.sub(feeRate));\n const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\n if (maxAmountOut.gt(amountWithFee)) {\n nextSqrtPrice = getNextSqrtPriceFromOutput(currentSqrtPrice, liquidity, amountWithFee, a2b);\n amountOut = amount;\n feeAmount = amountWithFee.sub(amount);\n } else {\n const grossOut = maxAmountOut;\n feeAmount = mulDivCeil(grossOut, feeRate, PRECISION);\n amountOut = grossOut.sub(feeAmount);\n nextSqrtPrice = targetSqrtPrice;\n }\n amountIn = getDeltaUpFromInput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b);\n }\n }\n\n return { amountIn, amountOut, nextSqrtPrice, feeAmount };\n}\n\n// ============================================================\n// Fee Scheduler - Base Fee Calculation\n// ============================================================\n\nfunction getBaseFee(\n params: Pool[\"parameters\"],\n currentTimestampMs: BN\n): BN {\n const feeRate = new BN(params.feeRate);\n\n if (!params.enabledFeeScheduler || toBN(params.activationTimestamp).isZero()) {\n return feeRate;\n }\n\n const activationTs = toBN(params.activationTimestamp);\n const periodFrequency = new BN(params.periodFrequency);\n const numberOfPeriod = new BN(params.numberOfPeriod);\n const cliffFee = toBN(params.cliffFeeNumerator);\n const reductionFactor = toBN(params.feeSchedulerReductionFactor);\n\n let period: BN;\n if (periodFrequency.isZero()) {\n period = ZERO;\n } else if (currentTimestampMs.lt(activationTs)) {\n period = numberOfPeriod;\n } else {\n const elapsed = currentTimestampMs.sub(activationTs);\n period = BN.min(elapsed.div(periodFrequency), numberOfPeriod);\n }\n\n if (period.eq(numberOfPeriod)) {\n return feeRate;\n }\n\n const feeSchedulerMode = Number(params.feeSchedulerMode);\n\n if (feeSchedulerMode === 1) {\n return getBaseFeeExponential(cliffFee, reductionFactor, period);\n } else {\n const totalReduction = reductionFactor.mul(period);\n return cliffFee.sub(totalReduction);\n }\n}\n\nfunction getBaseFeeExponential(cliffFee: BN, reductionFactor: BN, period: BN): BN {\n const scale = new BN(1).shln(64);\n const basisPointMax = new BN(10000);\n\n const base = scale.sub(mulDivFloor(reductionFactor, scale, basisPointMax));\n const totalReduction = powQ64x64(base, period);\n\n return mulDivFloor(cliffFee, totalReduction, scale);\n}\n\nfunction powQ64x64(base: BN, exp: BN): BN {\n const scale = new BN(1).shln(64);\n let result = scale.clone();\n let b = base.clone();\n let e = exp.clone();\n\n while (e.gt(ZERO)) {\n if (e.and(ONE).eq(ONE)) {\n result = result.mul(b).shrn(64);\n }\n b = b.mul(b).shrn(64);\n e = e.shrn(1);\n }\n return result;\n}\n\n// ============================================================\n// Dynamic Fee (Variable Fee from volatility)\n// ============================================================\n\nfunction getVariableFee(params: Pool[\"parameters\"], volatilityAccumulator: number): BN {\n if (!params.enabledDynamicFee) return ZERO;\n if (params.variableFeeControl === 0) return ZERO;\n\n const volatility = new BN(volatilityAccumulator);\n const step = new BN(params.tickSpacing);\n const vfc = new BN(params.variableFeeControl);\n\n const prod = volatility.mul(step);\n return prod.mul(prod).mul(vfc).add(new BN(99)).div(new BN(100));\n}\n\n// ============================================================\n// Volatility Params (simulation copy, avoid mutating pool)\n// ============================================================\n\ninterface VolatilityParams {\n volatilityAccumulator: number;\n volatilityReference: number;\n idReference: number;\n timeOfLastUpdate: number;\n}\n\nfunction updateReferences(\n vol: VolatilityParams,\n params: Pool[\"parameters\"],\n timestampSec: number\n): void {\n const dt = timestampSec - vol.timeOfLastUpdate;\n\n if (dt >= Number(params.filterPeriod)) {\n vol.idReference = params.currentTickIndex;\n if (dt < Number(params.decayPeriod)) {\n const volAcc = vol.volatilityAccumulator;\n const rf = params.reductionFactor;\n const volRef = Math.floor((volAcc * rf) / 10000);\n vol.volatilityReference = Math.min(volRef, 0xfffff);\n } else {\n vol.volatilityReference = 0;\n }\n }\n\n vol.timeOfLastUpdate = timestampSec;\n}\n\nfunction updateVolatilityAccumulator(\n vol: VolatilityParams,\n params: Pool[\"parameters\"],\n activeId: number\n): void {\n const idRef = vol.idReference;\n const idDiff = Math.abs(activeId - idRef);\n const deltaId = Math.floor(idDiff / params.tickSpacing);\n\n const volRef = vol.volatilityReference;\n const volatilityPerBin = 10;\n const volAcc = volRef + deltaId * volatilityPerBin;\n vol.volatilityAccumulator = Math.min(volAcc, params.maxVolatilityAccumulator);\n}\n\n// ============================================================\n// Tick Navigation\n// ============================================================\n\nfunction findFirstTickForSwap(\n ticks: TickData[],\n currentTickIndex: number,\n a2b: boolean\n): number {\n if (a2b) {\n for (let i = ticks.length - 1; i >= 0; i--) {\n if (ticks[i].index <= currentTickIndex) return i;\n }\n return -1;\n } else {\n for (let i = 0; i < ticks.length; i++) {\n if (ticks[i].index > currentTickIndex) return i;\n }\n return -1;\n }\n}\n\nfunction getNextTickArrayIndex(currentIdx: number, a2b: boolean): number {\n return a2b ? currentIdx - 1 : currentIdx + 1;\n}\n\n// ============================================================\n// Main: simulateSwap\n// Port of calculate_swap_result from pool.move\n// ============================================================\n\n/**\n * Simulate a swap on a CLMM pool.\n *\n * @param pool - Pool object (from on-chain, matches the Pool type)\n * @param ticks - Sorted array of initialized TickData (ascending by index)\n * @param a2b - true = swap token A → B, false = swap B → A\n * @param byAmountIn - true = amount is input, false = amount is desired output\n * @param amount - The swap amount (u64)\n * @param currentTimestampMs - Current timestamp in milliseconds\n */\nexport function simulateSwap(\n pool: Pool,\n ticks: TickData[],\n a2b: boolean,\n byAmountIn: boolean,\n amount: BN,\n currentTimestampMs: BN,\n): CalculatedSwapResult {\n const params = pool.parameters;\n const collectFeeMode = pool.collectFeeMode;\n const isQuoteY = pool.isQuoteY;\n\n let currentSqrtPrice = toBN(params.currentSqrtPrice);\n let currentLiquidity = new BN(pool.liquidity);\n\n const TIMESTAMP_DIVISOR = 1000;\n const currentTimestampSec = Math.floor(\n currentTimestampMs.toNumber() / TIMESTAMP_DIVISOR\n );\n\n // Clone volatility params for simulation\n const vol: VolatilityParams = {\n volatilityAccumulator: params.volatilityAccumulator,\n volatilityReference: params.volatilityReference,\n idReference: params.idReference,\n timeOfLastUpdate: params.timeOfLastUpdate,\n };\n\n updateReferences(vol, params, currentTimestampSec);\n\n // Determine collect_fee_on_input\n let collectFeeOnInput: boolean;\n if (collectFeeMode === COLLECT_FEE_MODE_ON_BOTH) {\n collectFeeOnInput = true;\n } else if (collectFeeMode === COLLECT_FEE_MODE_ON_QUOTE) {\n collectFeeOnInput = (a2b && !isQuoteY) || (!a2b && isQuoteY);\n } else {\n collectFeeOnInput = true;\n }\n\n let remainingAmount = amount.clone();\n let tickIdx = findFirstTickForSwap(ticks, params.currentTickIndex, a2b);\n\n const result: CalculatedSwapResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n feeAmount: ZERO,\n baseFee: ZERO,\n dynamicFee: ZERO,\n beforeSqrtPrice: currentSqrtPrice.clone(),\n afterSqrtPrice: currentSqrtPrice.clone(),\n isExceed: false,\n collectFeeOnInput,\n stepResults: [],\n };\n\n while (remainingAmount.gt(ZERO)) {\n if (tickIdx < 0 || tickIdx >= ticks.length) {\n result.isExceed = true;\n break;\n }\n\n const tick = ticks[tickIdx];\n const tickSqrtPrice = tick.sqrtPrice.isZero()\n ? getSqrtPriceAtTick(tick.index)\n : tick.sqrtPrice;\n\n // Update volatility accumulator for this tick\n updateVolatilityAccumulator(vol, params, tick.index);\n\n // Calculate total fee rate with updated volatility\n const baseFeeRate = getBaseFee(params, currentTimestampMs);\n const variableFee = getVariableFee(params, vol.volatilityAccumulator);\n const feeRate = BN.min(baseFeeRate.add(variableFee), MAX_FEE);\n\n // Compute swap step\n const stepResult = computeSwapStep(\n currentSqrtPrice,\n tickSqrtPrice,\n currentLiquidity,\n remainingAmount,\n collectFeeOnInput,\n feeRate,\n a2b,\n byAmountIn\n );\n\n // Update remaining amount\n if (!stepResult.amountIn.isZero() || !stepResult.feeAmount.isZero()) {\n if (byAmountIn) {\n if (collectFeeOnInput) {\n const afterFee = remainingAmount.sub(stepResult.amountIn);\n remainingAmount = afterFee.sub(stepResult.feeAmount);\n } else {\n remainingAmount = remainingAmount.sub(stepResult.amountIn);\n }\n } else {\n remainingAmount = remainingAmount.sub(stepResult.amountOut);\n }\n\n // Split fee into base_fee and dynamic_fee portions\n let stepBaseFee: BN;\n let stepDynamicFee: BN;\n if (feeRate.isZero()) {\n stepBaseFee = ZERO;\n stepDynamicFee = ZERO;\n } else {\n stepBaseFee = mulDivCeil(stepResult.feeAmount, baseFeeRate, feeRate);\n stepDynamicFee = stepResult.feeAmount.sub(stepBaseFee);\n }\n\n result.amountIn = result.amountIn.add(stepResult.amountIn);\n result.amountOut = result.amountOut.add(stepResult.amountOut);\n result.feeAmount = result.feeAmount.add(stepResult.feeAmount);\n result.baseFee = result.baseFee.add(stepBaseFee);\n result.dynamicFee = result.dynamicFee.add(stepDynamicFee);\n }\n\n // Record step\n result.stepResults.push({\n currentSqrtPrice: currentSqrtPrice.clone(),\n targetSqrtPrice: tickSqrtPrice.clone(),\n currentLiquidity: currentLiquidity.clone(),\n amountIn: stepResult.amountIn,\n amountOut: stepResult.amountOut,\n feeAmount: stepResult.feeAmount,\n remainderAmount: remainingAmount.clone(),\n });\n\n // Cross tick if we reached the target\n if (stepResult.nextSqrtPrice.eq(tickSqrtPrice)) {\n currentSqrtPrice = tickSqrtPrice;\n\n // Apply liquidity net (negate for a2b direction)\n let liquidityNet = tick.liquidityNet.clone();\n if (a2b) {\n liquidityNet = liquidityNet.neg();\n }\n\n if (liquidityNet.gte(ZERO)) {\n currentLiquidity = currentLiquidity.add(liquidityNet);\n } else {\n currentLiquidity = currentLiquidity.sub(liquidityNet.abs());\n }\n\n // Move to next tick in sorted array\n tickIdx = getNextTickArrayIndex(tickIdx, a2b);\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice;\n }\n }\n\n // Adjust amount_in to include fee if collected on input\n if (collectFeeOnInput) {\n result.amountIn = result.amountIn.add(result.feeAmount);\n }\n\n result.afterSqrtPrice = currentSqrtPrice;\n\n return result;\n}\n\n// ============================================================\n// Convenience: getSwapOut\n// ============================================================\n\n/**\n * Simulate a swap and return a simple quote.\n *\n * @param pool - Pool object (from on-chain)\n * @param ticks - Sorted initialized ticks (ascending by index)\n * @param a2b - true = swap token A → B, false = swap B → A\n * @param amountIn - Amount of input token (as string or BN)\n * @param currentTimestampMs - Current timestamp in milliseconds\n */\nexport function getSwapOut(\n pool: Pool,\n ticks: TickData[],\n a2b: boolean,\n amountIn: string | BN,\n currentTimestampMs: number | BN,\n): SwapQuote {\n const amount = typeof amountIn === \"string\" ? new BN(amountIn) : amountIn;\n const ts =\n typeof currentTimestampMs === \"number\"\n ? new BN(currentTimestampMs)\n : currentTimestampMs;\n\n const result = simulateSwap(\n pool,\n ticks,\n a2b,\n true,\n amount,\n ts,\n );\n\n // Calculate price impact\n const beforePrice = toBN(pool.parameters.currentSqrtPrice);\n const afterPrice = result.afterSqrtPrice;\n let priceImpact = 0;\n if (!beforePrice.isZero()) {\n const diff = afterPrice.gt(beforePrice)\n ? afterPrice.sub(beforePrice)\n : beforePrice.sub(afterPrice);\n priceImpact =\n diff.mul(new BN(10000)).div(beforePrice).toNumber() / 100;\n }\n\n return {\n amountIn: result.amountIn.toString(),\n amountOut: result.amountOut.toString(),\n feeAmount: result.feeAmount.toString(),\n baseFee: result.baseFee.toString(),\n dynamicFee: result.dynamicFee.toString(),\n isExceed: result.isExceed,\n afterSqrtPrice: result.afterSqrtPrice.toString(),\n priceImpact,\n steps: result.stepResults.length,\n };\n}\n\n// ============================================================\n// Usage Example\n// ============================================================\n\n/*\nimport { getSwapOut, Pool, TickData } from \"./simulate_swap\";\nimport BN from \"bn.js\";\n\n// 1. Fetch pool & ticks from on-chain\nconst pool: Pool = { ... }; // your Pool object\nconst ticks: TickData[] = [ ... ]; // sorted ascending by index\n\n// 2. Get swap quote: swap 1_000_000 of token A → token B\nconst quote = getSwapOut(pool, ticks, true, \"1000000\", Date.now());\nconsole.log(\"Amount out:\", quote.amountOut);\nconsole.log(\"Fee:\", quote.feeAmount);\nconsole.log(\"Price impact:\", quote.priceImpact, \"%\");\nconsole.log(\"Steps:\", quote.steps);\n\n// 3. Swap B → A\nconst quoteB2A = getSwapOut(pool, ticks, false, \"500000\", Date.now());\nconsole.log(\"Amount out:\", quoteB2A.amountOut);\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 { DammConfig, 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 (DAMM) pool configurations.\n */\n damm_pool: Package<DammConfig>\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 FerraDammSDK, which is almost responsible for all interactions with DAMM.\n */\nexport class FerraDammSDK {\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 damm pools with a pool router interface.\n */\n protected _pool: PoolModule\n\n /**\n * Provide interact with damm 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 { FerraDammSDK, SdkOptions } from './sdk'\n\nexport { FerraDammSDK }\nexport type { SdkOptions }\n\nexport default FerraDammSDK","import FerraDammSDK, { SdkOptions } from '../main'\nimport { checkValidSuiAddress } from '../utils'\n\nconst SDKConfig = {\n dammConfig: {\n pools_id: '0x16b4ec2ead4377b11fe56479b19809885198d0cb3422d2e1048a160c8f9ba1e5',\n global_config_id: '0x3bf945ddf84971e57497ee5e733d77984f540db6b07b6fdb00568ce2d4b0f517',\n global_rewarder_vault_id: '0x8c4946886cd31a6d213b235e245ba2a8e39d2877993ee493f6a4ede060f68d12'\n }\n}\n\n// mainnet\nexport const dammMainnet: SdkOptions = {\n fullRpcUrl: 'https://mainnet.suiet.app:443',\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n damm_pool: {\n package_id: '0x66fb6a132c415278c32ab52ecdc2bd73b08b649e396841f48f6f9cccd01b6bbb',\n published_at: '0x5810a6545d6046d98eee8867ed1106ab5fc472f36feda8acdd3f0a331968cef8',\n config: SDKConfig.dammConfig,\n },\n integrate: {\n package_id: '0x8df3a90c236e6555bc5edc9c11165dbddf456814f8c670d03e729f92367ce473',\n published_at: '0x8df3a90c236e6555bc5edc9c11165dbddf456814f8c670d03e729f92367ce473',\n },\n swapCountUrl: 'https://api.ferra.xyz/damm/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): FerraDammSDK {\n if (fullNodeUrl) {\n dammMainnet.fullRpcUrl = fullNodeUrl\n }\n const sdk = new FerraDammSDK(dammMainnet)\n if (wallet && checkValidSuiAddress(wallet)) {\n sdk.senderAddress = wallet\n }\n return sdk\n}\n","import FerraDammSDK, { SdkOptions } from '../main'\nimport { checkValidSuiAddress } from '../utils'\n\n\nconst SDKConfig = {\n dammConfig: {\n pools_id: '0xb043187ee46183afa5736d88a5882cb7da3c805aa76b7021065bcd3d7cf36b9b',\n global_config_id: '0x0127b12b47d46c80e988efb47dd26ee93d549999293bb96e5de99443883f3d60',\n global_rewarder_vault_id: '0x02f83bca10e586ef9acd01209dbeb7d013ff3453760e7c0e6dea2e00ac93434a'\n }\n}\n\n// test on mainnet\nexport const dammTestnet: SdkOptions = {\n fullRpcUrl: 'https://mainnet.suiet.app:443',\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n damm_pool: {\n package_id: '0xf9df0f7fab7c453818f33f04c6dbb7518c369fd879b7535d39e683a45bafae19',\n published_at: '0xf9df0f7fab7c453818f33f04c6dbb7518c369fd879b7535d39e683a45bafae19',\n config: SDKConfig.dammConfig,\n },\n integrate: {\n package_id: '0x93835d11de5bba7bd1dc4d180a48d82ee718d32024070247d5549aea4ddd26b9',\n published_at: '0x93835d11de5bba7bd1dc4d180a48d82ee718d32024070247d5549aea4ddd26b9',\n },\n swapCountUrl: 'https://api-dev.ferra.xyz/damm/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): FerraDammSDK {\n if (fullNodeUrl) {\n dammTestnet.fullRpcUrl = fullNodeUrl\n }\n const sdk = new FerraDammSDK(dammTestnet)\n if (wallet && checkValidSuiAddress(wallet)) {\n sdk.senderAddress = wallet\n }\n return sdk\n}\n","import FerraDammSDK, { SdkOptions } from '../main'\nimport { checkValidSuiAddress } from '../utils'\n\n\nconst SDKConfig = {\n dammConfig: {\n pools_id: '0xadae2faa029b3b0be430e3b1b787ac0d528f3b3be9d32c61530fabaa6f171431',\n global_config_id: '0x2d1269e1ade81a5189b625ee87c9425bc29249d21d273245269eb07e67dc6965',\n global_rewarder_vault_id: '0xbe8d4702ed1f4bf2ad8101ee68d785538fb6d50e2f187bbafd134d1e2c67aa89'\n }\n}\n//https://suivision.xyz/txblock/B4WbFgHnh8j5VYJstjQog87hsK5ya7sbXmjsBSF87ogj?tab=Changes\n// https://suivision.xyz/txblock/8LQqVty6723xznbMVeasAxbAtqyBwsTbcYTZvpjmkGuQ?tab=Changes\n// test on mainnet\nexport const dammBeta: SdkOptions = {\n fullRpcUrl: 'https://mainnet.suiet.app:443',\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n damm_pool: {\n package_id: '0x8e1144ad9fbc388c61ac30d74ebef4eb741d213e3a086da48124256290233723',\n published_at: '0x8e1144ad9fbc388c61ac30d74ebef4eb741d213e3a086da48124256290233723',\n config: SDKConfig.dammConfig,\n },\n integrate: {\n package_id: '0x46f0964200ea12c1bd3f7280cb49f55c11e4c0df8ae2a40f71253a3a19859a17',\n published_at: '0x46f0964200ea12c1bd3f7280cb49f55c11e4c0df8ae2a40f71253a3a19859a17',\n },\n swapCountUrl: 'https://api-beta.ferra.xyz/damm/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): FerraDammSDK {\n if (fullNodeUrl) {\n dammBeta.fullRpcUrl = fullNodeUrl\n }\n const sdk = new FerraDammSDK(dammBeta)\n if (wallet && checkValidSuiAddress(wallet)) {\n sdk.senderAddress = wallet\n }\n return sdk\n}\n","import FerraDammSDK 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): FerraDammSDK {\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 initFerraDammSDK(options: InitFerraSDKOptions): FerraDammSDK {\n return initFerraSDK(options)\n}\n","import { FerraDammSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './math'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport type { SdkOptions }\nexport { FerraDammSDK }\nexport default FerraDammSDK\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/pool.ts","../src/utils/cached-content.ts","../src/utils/common.ts","../src/types/damm-pool.ts","../src/math/utils.ts","../src/utils/decimal.ts","../src/errors/errors.ts","../src/types/constants.ts","../src/types/sui.ts","../src/types/damm-type.ts","../src/types/liquidity.ts","../src/math/apr.ts","../src/math/tick.ts","../src/math/damm.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/utils/swap-utils.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","DammPositionStatus","SwapDirection","Decimal","structTag","AmountSpecified","PositionStatus","SplitUnit","asUintN","coinSelection","item","object","isValidSuiAddress","normalizeStructTag","ONE","ZERO","getDeltaUpFromInput","getDeltaDownFromOutput","getNextSqrtPriceFromInput","getNextSqrtPriceFromOutput","computeSwapStep","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, checkValidSuiAddress, getFutureTime } from '../utils'\nimport {\n CreatePoolAddLiquidityParams,\n CreatePoolParams,\n FetchParams,\n DammConfig,\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/damm-pool'\nimport {\n DammFetcherModule,\n DammIntegratePoolModule,\n DammPartnerModule,\n CLOCK_ADDRESS,\n DataPage,\n PageQuery,\n PaginationArgs,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport { DammpoolsError, ConfigErrorCode, PartnerErrorCode, PoolErrorCode, PositionErrorCode, UtilsErrorCode } from '../errors/errors'\nimport { RpcModule } from './rpc'\nimport { inspect } from 'util'\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\nexport type FeeTier = {\n tick_spacing: number\n dynamic_fee: {\n decay_period: number\n filter_period: number\n max_volatility_accumulator: number\n reduction_factor: number\n variable_fee_control: number\n }\n fee_rate: number\n fee_scheduler: {\n exponential: {\n cliff_fee_numerator: string\n number_of_period: number\n period_frequency: string\n reduction_factor: string\n }\n linear: {\n cliff_fee_numerator: string\n number_of_period: number\n period_frequency: string\n reduction_factor: string\n }\n }\n}\n\n/**\n * Pool module for comprehensive DAMM pool management\n * Handles pool creation, data retrieval, liquidity operations, and tick management\n * Includes caching mechanisms for optimal performance\n *\n * @example\n * // Get pool information\n * const pool = await sdk.Pool.getPool('0x_pool_address');\n * console.log(`Liquidity: ${pool.liquidity}`);\n * console.log(`Current tick: ${pool.currentTickIndex}`);\n * console.log(`Fee rate: ${pool.feeRate / 10000000}%`);\n *\n * @example\n * // Fetch all ticks for a pool\n * const ticks = await sdk.Pool.fetchTicksByRpc('0x_pool_address');\n * console.log(`Found ${ticks.length} initialized ticks`);\n *\n * @example\n * // Create a new pool with initial liquidity\n * const createPoolTx = await sdk.Pool.createPoolTransactionPayload({\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * tick_spacing: 60,\n * initialize_sqrt_price: \"79228162514264337593543950336\", // 1:1 price\n * uri: \"https://example.com/pool-metadata.json\",\n * amount_a: 1000000000, // 1 SUI\n * amount_b: 1000000, // 1 COIN\n * fix_amount_a: true,\n * tick_lower: -120,\n * tick_upper: 120,\n * slippage: 0.05\n * });\n */\nexport class PoolModule implements IModule {\n protected _sdk: FerraDammSDK\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: FerraDammSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Retrieves available base fee tiers and their parameters\n * Returns all supported fee configurations including dynamic fee settings\n * @returns Array of fee tier configurations with tick spacing and fee parameters\n * @throws {DammpoolsError} If config fetch fails\n * @example\n * const feeTiers = await sdk.Pool.getBaseFeesAvailable();\n * feeTiers.forEach(tier => {\n * console.log(`Tick spacing: ${tier.tick_spacing}`);\n * console.log(`Fee rate: ${tier.fee_rate / 10000000}%`);\n * console.log(`Dynamic fee enabled: ${tier.dynamic_fee !== null}`);\n * });\n */\n async getBaseFeesAvailable() {\n const {\n config: { global_config_id },\n } = this.sdk.sdkOptions.damm_pool\n\n const data = await this.sdk.fullClient.getObject({ id: global_config_id, options: { showContent: true } })\n if (data.data.content.dataType === 'package') {\n return []\n }\n const contents = data.data.content.fields as Record<string, any>\n\n return contents.fee_tiers?.fields?.contents.map((v) => ({\n tick_spacing: v.fields.key,\n dynamic_fee: v.fields.value.fields.dynamic_fee.fields,\n fee_rate: Number(v.fields.value.fields.fee_rate),\n fee_scheduler: {\n exponential: v.fields.value.fields.fee_scheduler.fields.exponential.fields,\n linear: v.fields.value.fields.fee_scheduler.fields.linear.fields,\n },\n })) as FeeTier[]\n }\n\n /**\n * Gets all positions for a specific pool\n * Fetches position data from the pool's position manager\n * @param positionHandle - Position manager handle ID from pool object\n * @param paginationArgs - Pagination configuration or 'all' to fetch everything\n * @returns Paginated list of positions\n * @throws {DammpoolsError} If position handle is invalid\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const positions = await sdk.Pool.getPositionList(\n * pool.positionManager.positionsHandle,\n * { cursor: null, limit: 50 }\n * );\n * console.log(`Found ${positions.data.length} positions`);\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 DammpoolsError(\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 * Fetches pool immutable data (type, addresses, spacing) for multiple pools\n * Immutables don't change after pool creation - safe to cache long-term\n * @param assignPoolIDs - Specific pool IDs to fetch (empty = all pools)\n * @param offset - Starting index for pagination\n * @param limit - Maximum number of pools to return\n * @param forceRefresh - Bypass cache and fetch fresh data\n * @returns Array of pool immutable data\n * @example\n * // Get all pools\n * const allPools = await sdk.Pool.getPoolImmutables();\n *\n * // Get specific pools\n * const specificPools = await sdk.Pool.getPoolImmutables([\n * '0x_pool1',\n * '0x_pool2'\n * ]);\n *\n * specificPools.forEach(pool => {\n * console.log(`${pool.name}: ${pool.coin_type_a} / ${pool.coin_type_b}`);\n * });\n */\n async getPoolImmutables(assignPoolIDs: string[] = [], offset = 0, limit = 100, forceRefresh = false): Promise<PoolImmutables[]> {\n const { package_id } = this._sdk.sdkOptions.damm_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 * Fetches complete pool state including current liquidity, price, and fees\n * This is the main method for getting up-to-date pool data\n * @param assignPools - Specific pool IDs to fetch (empty = 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\n * @example\n * const pools = await sdk.Pool.getPools(['0x_pool_id']);\n * const pool = pools[0];\n *\n * console.log(`Current sqrt price: ${pool.currentSqrtPrice}`);\n * console.log(`Current tick: ${pool.currentTickIndex}`);\n * console.log(`Total liquidity: ${pool.liquidity}`);\n * console.log(`Coin A amount: ${pool.coinAmountA}`);\n * console.log(`Coin B amount: ${pool.coinAmountB}`);\n * console.log(`Fee rate: ${pool.feeRate / 10000000}%`);\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 DammpoolsError(\n `getPools error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n // console.log('suiObj', inspect(suiObj.data.content.fields, { depth: null, colors: true }));\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.damm_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 DammpoolsError(\n `getPoolWithPages error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n const pool = buildPool(suiObj)\n allPool.push(pool)\n const cacheKey = `${pool.poolAddress}_getPoolObject`\n this.updateCache(cacheKey, pool, cacheTime24h)\n }\n return allPool\n }\n\n /**\n * Gets a single pool's complete state by ID\n * Preferred method for fetching individual pool data - includes caching\n * @param poolID - Pool object ID (0x-prefixed address)\n * @param forceRefresh - Skip cache and fetch fresh data (default: true)\n * @returns Complete pool object with current state\n * @throws {DammpoolsError} If pool doesn't exist or fetch fails (PoolErrorCode.InvalidPoolObject)\n * @example\n * const pool = await sdk.Pool.getPool('0x_pool_address');\n *\n * // Check if pool is paused\n * if (pool.isPause) {\n * console.log('Pool is currently paused');\n * }\n *\n * // Calculate current price from sqrt price\n * const sqrtPrice = new BN(pool.currentSqrtPrice);\n * const price = TickMath.sqrtPriceX64ToPrice(sqrtPrice, 9, 6);\n * console.log(`Current price: ${price.toString()} COIN per SUI`);\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 DammpoolsError(\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 * Creates a transaction to instantiate a new pool with initial liquidity\n * Automatically sorts coins and validates parameters\n * @param params - Pool creation parameters including coins, fee tier, and initial position\n * @returns Transaction ready for signing and execution\n * @throws {DammpoolsError} If coin types are invalid or amounts insufficient\n * @example\n * const tx = await sdk.Pool.createPoolTransactionPayload({\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * tick_spacing: 60, // Standard 0.3% fee tier\n * initialize_sqrt_price: \"79228162514264337593543950336\", // 1:1 price\n * uri: \"https://ferra.xyz/pool-metadata.json\",\n * amount_a: 10_000_000_000, // 10 SUI\n * amount_b: 10_000_000, // 10 COIN\n * fix_amount_a: true,\n * tick_lower: -600, // Wide range\n * tick_upper: 600,\n * slippage: 0.05\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: tx,\n * signer: keypair\n * });\n *\n * // Extract pool ID from events\n * const poolCreatedEvent = result.events?.find(\n * e => e.type.includes('::PoolCreatedEvent')\n * );\n * const poolId = poolCreatedEvent?.parsedJson?.pool_id;\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-damm-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 * Gets DAMM global configuration including registry IDs and settings\n * Configuration is cached for performance\n * @param forceRefresh - Bypass cache and fetch fresh config\n * @returns Global DAMM configuration object\n * @example\n * const config = await sdk.Pool.getDammConfigs();\n * console.log(`Global config ID: ${config.global_config_id}`);\n * console.log(`Pools registry: ${config.pools_id}`);\n * console.log(`Rewarder vault: ${config.global_rewarder_vault_id}`);\n */\n async getDammConfigs(forceRefresh = false): Promise<DammConfig> {\n const { package_id } = this._sdk.sdkOptions.damm_pool\n const cacheKey = `${package_id}_getInitEvent`\n const cacheData = this.getCache<DammConfig>(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 dammConfig: DammConfig = {\n pools_id: '',\n global_config_id: '',\n global_rewarder_vault_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 dammConfig.global_config_id = fields.global_config_id\n break\n case `${package_id}::factory::InitFactoryEvent`:\n dammConfig.pools_id = fields.pools_id\n break\n case `${package_id}::rewarder::RewarderInitEvent`:\n dammConfig.global_rewarder_vault_id = fields.global_rewarder_vault_id\n break\n case `${package_id}::partner::InitPartnerEvent`:\n dammConfig.partners_id = fields.partners_id\n break\n default:\n break\n }\n }\n })\n this.updateCache(cacheKey, dammConfig, cacheTime24h)\n return dammConfig\n }\n\n return dammConfig\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 * Gets transaction history for a specific pool\n * Returns swaps, adds/removes liquidity, fee collections\n * @param pool_id - Pool object ID\n * @param limit - Maximum transactions to return (default: 100)\n * @param offset - Starting offset for pagination\n * @returns Array of pool transaction info\n * @example\n * const txList = await sdk.Pool.getPoolTransactionList({\n * pool_id: poolId,\n * limit: 50,\n * offset: 0\n * });\n *\n * txList.forEach(tx => {\n * const type = tx.type.split('::').pop();\n * console.log(`${type}: ${tx.tx}`);\n * });\n */\n async getPoolTransactionList({\n poolId,\n paginationArgs,\n order = 'descending',\n fullRpcUrl,\n }: {\n poolId: string\n fullRpcUrl?: string\n paginationArgs: PageQuery\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PoolTransactionInfo>> {\n const { fullClient, sdkOptions } = this._sdk\n let client\n if (fullRpcUrl) {\n client = new RpcModule({\n url: fullRpcUrl,\n })\n } else {\n client = fullClient\n }\n const data: DataPage<PoolTransactionInfo> = {\n data: [],\n hasNextPage: false,\n }\n\n const limit = 50\n const query = paginationArgs\n const userLimit = paginationArgs.limit || 10\n\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.damm_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 * 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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n UtilsErrorCode.InvalidSendAddress\n )\n }\n\n params.tick_lower ??= -443636\n params.tick_upper ??= 443636\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n const { integrate, damm_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(damm_pool.config.global_config_id),\n tx.object(damm_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.bool(params.fix_amount_a),\n tx.pure.u8(params.collect_fee_mode),\n tx.pure.bool(params.is_quote_y),\n tx.pure.u8(params.fee_scheduler_mode),\n tx.pure.bool(params.enable_fee_scheduler),\n tx.pure.bool(params.enable_dynamic_fee),\n tx.pure.u64(params.activation_timestamp),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DammIntegratePoolModule}::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 * Fetches all initialized ticks for a pool from on-chain events\n * More comprehensive but slower than fetchTicksByRpc\n * Use this when you need complete tick history including deleted ticks\n * @param params - Fetch parameters with pool ID\n * @returns Array of all tick data from pool history\n * @example\n * const ticks = await sdk.Pool.fetchTicks({ pool_id: poolId });\n * console.log(`Total ticks: ${ticks.length}`);\n *\n * // Find ticks in specific range\n * const ticksInRange = ticks.filter(\n * t => t.index >= -120 && t.index <= 120\n * );\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}::${DammFetcherModule}::fetch_ticks`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError(\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 DammpoolsError(\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 position rewards from events for multiple positions\n * Useful for displaying historical reward claims\n * @param params - Fetch parameters with pool ID\n * @returns Array of position reward data\n * @example\n * const rewards = await sdk.Pool.fetchPositionRewardList({\n * pool_id: poolId\n * });\n *\n * rewards.forEach(reward => {\n * console.log(`Position: ${reward.pos_object_id}`);\n * console.log(`Reward 0: ${reward.reward_amount_owed_0}`);\n * console.log(`Reward 1: ${reward.reward_amount_owed_1}`);\n * console.log(`Reward 2: ${reward.reward_amount_owed_2}`);\n * });\n */\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}::${DammFetcherModule}::fetch_positions`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 current tick state directly from pool's tick manager (RPC)\n * Faster than event-based fetch, returns only currently active ticks\n * Recommended for most use cases\n * @param tickHandle - Tick manager handle ID from pool object\n * @returns Array of currently active tick data\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const ticks = await sdk.Pool.fetchTicksByRpc(pool.ticksHandle);\n *\n * // Sort ticks by index for swap simulation\n * ticks.sort((a, b) => a.index - b.index);\n *\n * // Find nearest tick below current\n * const nearestBelow = ticks\n * .filter(t => t.index < pool.currentTickIndex)\n * .sort((a, b) => b.index - a.index)[0];\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 DammpoolsError(\n `getTicksByRpc error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n\n const tick = buildTickData(suiObj)\n if (tick != null) {\n ticks.push(tick)\n }\n }\n return ticks\n }\n\n /**\n * Gets tick data for a specific tick index\n * Returns null if tick is not initialized\n * @param tickHandle - Tick manager handle ID\n * @param tickIndex - Specific tick index to fetch\n * @returns Tick data or throws if tick doesn't exist\n * @throws {DammpoolsError} If tick is not initialized\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * try {\n * const tick = await sdk.Pool.getTickDataByIndex(\n * pool.ticksHandle,\n * -120\n * );\n * console.log(`Liquidity at tick -120: ${tick.liquidityGross.toString()}`);\n * } catch (error) {\n * console.log('Tick -120 is not initialized');\n * }\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 DammpoolsError(`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 DammpoolsError(\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 DammpoolsError(\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 DammpoolsError(\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 * Claims partner referral fees accumulated for a partner\n * Requires partner capability NFT\n * @param partnerCap - Partner capability object ID\n * @param partner - Partner address\n * @param coinType - Type of coin to claim fees in\n * @returns Transaction for claiming partner fees\n * @throws {DammpoolsError} If partner not found or invalid (PartnerErrorCode.NotFoundPartnerObject)\n * @example\n * const tx = await sdk.Pool.claimPartnerRefFeePayload(\n * '0x_partner_cap_id',\n * '0x_partner_address',\n * '0x2::sui::SUI'\n * );\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: tx,\n * signer: partnerKeypair\n * });\n */\n async claimPartnerRefFeePayload(partnerCap: string, partner: string, coinType: string): Promise<Transaction> {\n const tx = new Transaction()\n const { damm_pool } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(damm_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: `${damm_pool.published_at}::${DammPartnerModule}::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}\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 DammPositionStatus,\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/damm-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 { DammpoolsError, 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 BigInt(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 DammpoolsError(`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 console.log('???????', getObjectId(objects));\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 isQuoteY: Boolean(fields.is_quote_y),\n collectFeeMode: Number(asIntN(BigInt(fields.collect_fee_mode))),\n parameters: {\n idReference: Number(asIntN(BigInt(fields.parameters.fields.id_reference.fields.bits))),\n activationTimestamp: BigInt(fields.parameters.fields.activation_timestamp),\n currentTickIndex: Number(asIntN(BigInt(fields.parameters.fields.current_tick_index.fields.bits))),\n tickLowerIndex: Number(asIntN(BigInt(0n))),\n tickUpperIndex: Number(asIntN(BigInt(0n))),\n currentSqrtPrice: BigInt(fields.parameters.fields.current_sqrt_price),\n cliffFeeNumerator: BigInt(fields.parameters.fields.cliff_fee_numerator),\n decayPeriod: BigInt(fields.parameters.fields.decay_period),\n enabledDynamicFee: Boolean(fields.parameters.fields.enabled_dynamic_fee),\n enabledFeeScheduler: Boolean(fields.parameters.fields.enabled_fee_scheduler),\n feeRate: Number(fields.parameters.fields.fee_rate),\n feeSchedulerMode: BigInt(fields.parameters.fields.fee_scheduler_mode),\n isQuoteY: Boolean(fields.is_quote_y),\n feeSchedulerReductionFactor: BigInt(fields.parameters.fields.fee_scheduler_reduction_factor),\n filterPeriod: BigInt(fields.parameters.fields.filter_period),\n maxVolatilityAccumulator: Number(fields.parameters.fields.max_volatility_accumulator),\n numberOfPeriod: Number(fields.parameters.fields.number_of_period),\n periodFrequency: Number(fields.parameters.fields.period_frequency),\n reductionFactor: Number(fields.parameters.fields.reduction_factor),\n tickSpacing: Number(fields.parameters.fields.tick_spacing),\n timeOfLastUpdate: Number(fields.parameters.fields.time_of_last_update),\n variableFeeControl: Number(fields.parameters.fields.variable_fee_control),\n volatilityAccumulator: Number(fields.parameters.fields.volatility_accumulator),\n volatilityReference: Number(fields.parameters.fields.volatility_reference),\n },\n currentSqrtPrice: BigInt(fields.parameters.fields.current_sqrt_price),\n currentTickIndex: Number(asIntN(BigInt(fields.parameters.fields.current_tick_index.fields.bits))),\n feeGrowthGlobalA: fields.fee_growth_global_a,\n feeGrowthGlobalB: fields.fee_growth_global_b,\n feeProtocolCoinA: fields.fee_protocol_coin_a,\n feeProtocolCoinB: fields.fee_protocol_coin_b,\n feeRate: Number(fields.parameters.fields.fee_rate),\n isPause: fields.is_pause,\n liquidity: fields.liquidity,\n positionManager: {\n positionsHandle: fields.position_manager.fields.positions.fields.id.id,\n size: fields.position_manager.fields.positions.fields.size,\n },\n rewarderInfos: rewarders,\n rewarderLastUpdatedTime: fields.rewarder_manager.fields.last_updated_time,\n tickSpacing: String(fields.parameters.fields.tick_spacing),\n ticksHandle: 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 DammpoolsError(`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: DammPositionStatus.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: Number(asIntN(BigInt(fields.tick_lower_index.fields.bits))),\n tick_upper_index: Number(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: DammPositionStatus.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 = DammPositionStatus.Deleted\n }\n const objectNotExistsResponse = getObjectNotExistsResponse(object)\n if (objectNotExistsResponse) {\n position.pos_object_id = objectNotExistsResponse\n position.position_status = DammPositionStatus.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: Number(asIntN(BigInt(tick_lower_index))),\n tick_upper_index: Number(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 DammpoolsError(`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: Number(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 DammpoolsError(`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: Number(index),\n sqrtPrice,\n liquidityNet,\n liquidityGross,\n feeGrowthOutsideA,\n feeGrowthOutsideB,\n rewardersGrowthOutside,\n }\n\n return tick\n}\n\nexport function buildDammPositionName(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 './damm-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 DammpoolData = {\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 DammpoolData format.\n * @param {Pool} pool - The liquidity pool object to transform.\n * @returns {DammpoolData} The transformed DammpoolData object.\n */\nexport function transDammpoolDataWithoutTicks(pool: Pool): DammpoolData {\n const poolData: DammpoolData = {\n coinA: pool.coinTypeA, // string\n coinB: pool.coinTypeB, // string\n currentSqrtPrice: new BN(pool.currentSqrtPrice), // BN\n currentTickIndex: pool.currentTickIndex, // number\n feeGrowthGlobalA: new BN(pool.feeGrowthGlobalA), // BN\n feeGrowthGlobalB: new BN(pool.feeGrowthGlobalB), // BN\n feeProtocolCoinA: new BN(pool.feeProtocolCoinA), // BN\n feeProtocolCoinB: new BN(pool.feeProtocolCoinB), // BN\n feeRate: new BN(pool.feeRate), // 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 { DammpoolsError, 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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsErrorCode =\n | MathErrorCode\n | SwapErrorCode\n | CoinErrorCode\n | PoolErrorCode\n | PositionErrorCode\n | PartnerErrorCode\n | ConfigErrorCode\n | UtilsErrorCode\n | RouterErrorCode\n | TypesErrorCode\n\nexport class DammpoolsError extends Error {\n override message: string\n\n errorCode?: DammpoolsErrorCode\n\n constructor(message: string, errorCode?: DammpoolsErrorCode) {\n super(message)\n this.message = message\n this.errorCode = errorCode\n }\n\n static isDammpoolsErrorCode(e: any, code: DammpoolsErrorCode): boolean {\n return e instanceof DammpoolsError && e.errorCode === code\n }\n}\n","import BN from 'bn.js'\n\n/**\n * The maximum tick index supported by the dammpool program.\n * @category Constants\n */\nexport const MAX_TICK_INDEX = 443636\n\n/**\n * The minimum tick index supported by the dammpool program.\n * @category Constants\n */\nexport const MIN_TICK_INDEX = -443636\n\n/**\n * The maximum sqrt-price supported by the dammpool 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 dammpool 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_000)\n","import { TransactionArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\nimport { DammpoolsError, 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 DAMM (Cryptocurrency Liquidity Mining Module).\n */\nexport const DammPartnerModule = 'partner'\nexport const DammIntegratePoolModule = 'pool_script'\nexport const DammIntegrateRouterModule = 'router'\nexport const DammIntegrateRouterWithPartnerModule = 'router_with_partner'\nexport const DammFetcherModule = 'fetcher_script'\nexport const DammExpectSwapModule = 'expect_swap'\nexport const DammIntegrateUtilsModule = '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 DammpoolsError(`Unknown type for value: ${value}`, TypesErrorCode.InvalidType)\n}\n","import BN from 'bn.js'\nimport { NFT, SuiAddressType, SuiObjectIdType } from './sui'\nimport { TickData } from './damm-pool'\nimport { DammpoolsError, ConfigErrorCode } from '../errors/errors'\nimport type { Transaction, TransactionResult } from '@mysten/sui/transactions'\n/**\n * Enumerates the possible status values of a position within a liquidity mining module.\n */\nexport enum DammPositionStatus {\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 dammpool'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: DammPositionStatus\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 Damm protocol, which defines the trading pairs of \"dammpool\".\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: bigint\n /**\n * The amount of coin b.\n */\n coinAmountB: bigint\n /**\n * The current sqrt price\n */\n isQuoteY: boolean\n /**\n * The current sqrt price\n */\n currentSqrtPrice: bigint\n collectFeeMode: number\n currentTickIndex: number\n parameters: {\n currentSqrtPrice: bigint\n currentTickIndex: number\n tickLowerIndex: number\n tickUpperIndex: number\n activationTimestamp: bigint\n cliffFeeNumerator: bigint\n decayPeriod: bigint\n enabledDynamicFee: boolean\n isQuoteY: boolean\n enabledFeeScheduler: boolean\n feeRate: number\n feeSchedulerMode: bigint\n feeSchedulerReductionFactor: bigint\n filterPeriod: bigint\n idReference: number\n maxVolatilityAccumulator: number\n numberOfPeriod: number\n periodFrequency: number\n reductionFactor: number\n tickSpacing: number\n timeOfLastUpdate: number\n variableFeeControl: number\n volatilityAccumulator: number\n volatilityReference: number\n }\n /**\n * The global fee growth of coin a as Q64.64\n */\n feeGrowthGlobalB: number\n /**\n * The global fee growth of coin b as Q64.64\n */\n feeGrowthGlobalA: number\n /**\n * The amounts of coin a owend to protocol\n */\n feeProtocolCoinA: number\n /**\n * The amounts of coin b owend to protocol\n */\n feeProtocolCoinB: number\n /**\n * The numerator of fee rate, the denominator is 1_000_000.\n */\n feeRate: number\n /**\n * is the pool pause\n */\n isPause: 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 positionManager: {\n positionsHandle: string\n size: number\n }\n /**\n * The rewarder manager\n */\n rewarderInfos: Array<Rewarder>\n rewarderLastUpdatedTime: string\n /**\n * The tick manager handle\n */\n ticksHandle: 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 (DAMM).\n */\nexport type DammConfig = {\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 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 collect_fee_mode: number\n is_quote_y: boolean\n fee_scheduler_mode: number\n enable_fee_scheduler: boolean\n enable_dynamic_fee: boolean\n activation_timestamp: 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 DammPoolUtil.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 DammPoolUtil.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\nexport type RemoveLiquidityAndClaimRewardsParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: bigint\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: bigint\n /**\n * The actual change in liquidity that has been added.\n */\n delta_liquidity: string\n /**\n * The identifier of the position.\n */\n pos_id: SuiObjectIdType\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 DammpoolsError(`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)\nconst MAX_BASIS_POINT = 10000\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).div(MAX_BASIS_POINT)\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 { DammpoolsError, 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 DammpoolsError('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 { DammpoolsError, MathErrorCode, CoinErrorCode } from '../errors/errors'\nimport type { DammpoolData, TickData } from '../types/damm-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 startSqrtPrice: BN\n nextSqrtPrice: BN\n isExceed: boolean\n stepResults: Array<{\n currentSqrtPrice: BN\n targetSqrtPrice: BN\n currentLiquidity: BN\n amountIn: BN\n amountOut: BN\n feeAmount: BN\n remainderAmount: BN\n }>\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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('getNextSqrtPriceAUp - Next sqrt price less than min sqrt price', CoinErrorCode.CoinAmountMinSubceeded)\n }\n if (nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n throw new DammpoolsError('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 DammpoolsError('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 console.log('feeRate', feeRate.toNumber());\n \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 poolData: DammpoolData,\n a2b: boolean,\n byAmountIn: boolean,\n amount: BN,\n swapTicks: Array<TickData>\n): SwapResult {\n \n let currentSqrtPrice = poolData.currentSqrtPrice\n let currentLiquidity = poolData.liquidity\n let remainingAmount = amount\n let amountInTotal = ZERO\n let amountOutTotal = ZERO\n let feeAmountTotal = ZERO\n \n const result: SwapResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n feeAmount: ZERO,\n startSqrtPrice: currentSqrtPrice,\n nextSqrtPrice: currentSqrtPrice,\n isExceed: false,\n stepResults: []\n }\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b)\n\n for (const tick of swapTicks) {\n if (a2b && poolData.currentTickIndex < tick.index) continue\n if (!a2b && poolData.currentTickIndex >= tick.index) continue\n\n if (remainingAmount.eq(ZERO)) break\n\n let targetSqrtPriceStep: BN\n if ((a2b && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!a2b && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n targetSqrtPriceStep = sqrtPriceLimit\n result.isExceed = true \n } else {\n targetSqrtPriceStep = tick.sqrtPrice\n }\n\n const stepResult = computeSwapStep(\n currentSqrtPrice,\n targetSqrtPriceStep,\n currentLiquidity,\n remainingAmount,\n poolData.feeRate,\n byAmountIn\n )\n\n if (!stepResult.amountIn.eq(ZERO)) {\n if (byAmountIn) {\n remainingAmount = remainingAmount.sub(stepResult.amountIn).sub(stepResult.feeAmount)\n } else {\n remainingAmount = remainingAmount.sub(stepResult.amountOut)\n }\n }\n\n amountInTotal = amountInTotal.add(stepResult.amountIn)\n amountOutTotal = amountOutTotal.add(stepResult.amountOut)\n feeAmountTotal = feeAmountTotal.add(stepResult.feeAmount)\n\n result.stepResults.push({\n currentSqrtPrice: currentSqrtPrice,\n targetSqrtPrice: targetSqrtPriceStep,\n currentLiquidity: currentLiquidity,\n amountIn: stepResult.amountIn,\n amountOut: stepResult.amountOut,\n feeAmount: stepResult.feeAmount,\n remainderAmount: remainingAmount\n })\n\n if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n const liquidityNet = new BN(tick.liquidityNet.toString())\n let signedLiquidityChange = liquidityNet\n\n if (a2b) {\n signedLiquidityChange = liquidityNet.neg()\n }\n \n if (signedLiquidityChange.isNeg()) {\n currentLiquidity = currentLiquidity.sub(signedLiquidityChange.abs())\n } else {\n currentLiquidity = currentLiquidity.add(signedLiquidityChange)\n }\n \n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice\n }\n\n if (remainingAmount.eq(ZERO)) {\n break\n }\n }\n\n result.amountIn = amountInTotal.add(feeAmountTotal)\n \n result.amountOut = amountOutTotal\n result.feeAmount = feeAmountTotal\n result.nextSqrtPrice = currentSqrtPrice // Giá cuối cùng sau khi swap\n\n return result\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 DammPoolUtil {\n /**\n * Update fee rate.\n * @param damm - dammpool 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(damm: DammpoolData, 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 damm.feeProtocolCoinA = damm.feeProtocolCoinA.add(protocolFee)\n } else {\n damm.feeProtocolCoinB = damm.feeProtocolCoinB.add(protocolFee)\n }\n if (poolFee.eq(ZERO) || damm.liquidity.eq(ZERO)) {\n return { refFee, damm }\n }\n const growthFee = poolFee.shln(64).div(damm.liquidity)\n if (iscoinA) {\n damm.feeGrowthGlobalA = damm.feeGrowthGlobalA.add(growthFee)\n } else {\n damm.feeGrowthGlobalB = damm.feeGrowthGlobalB.add(growthFee)\n }\n return { refFee, damm }\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 DammpoolsError('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 DammpoolsError('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 = DammPoolUtil.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 DammpoolsError('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 } = DammPoolUtil.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 } = DammPoolUtil.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 { DammpoolsError, 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 DammpoolsError(`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 ? 1 : 0))\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/damm-pool'\nimport { MathUtil } from './utils'\n\n/**\n * @category CollectFeesQuoteParam\n */\nexport type CollectFeesQuoteParam = {\n dammpool: 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 dammpool The DAMM 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(dammpool: 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 (dammpool.currentTickIndex < tickLower.index) {\n fee_growth_below_a = MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalA), new BN(tickLower.feeGrowthOutsideA))\n fee_growth_below_b = MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalB), 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 (dammpool.currentTickIndex < 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(dammpool.feeGrowthGlobalA), new BN(tickUpper.feeGrowthOutsideA))\n fee_growth_above_b = MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalB), new BN(tickUpper.feeGrowthOutsideB))\n }\n const fee_growth_inside_a = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalA), fee_growth_below_a),\n fee_growth_above_a\n )\n const fee_growth_inside_b = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(dammpool.feeGrowthGlobalB), 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 Dammpool 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.dammpool, 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 './damm'\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/damm-type'\nimport { DammpoolData, TickData, transDammpoolDataWithoutTicks } from '../types/damm-pool'\nimport { computeSwapStep, SwapStepResult } from './damm'\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: DammpoolData,\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 dammpool: Pool\n\n private ticks: TickData[]\n\n private splitSwapResult: SplitSwapResult\n\n constructor(amount: BN, unit: SplitUnit, dammpool: Pool, a2b: boolean, byAmountIn: boolean, tickData: TickData[]) {\n this.minSplitUnit = unit\n this.a2b = a2b\n this.byAmountIn = byAmountIn\n this.dammpool = dammpool\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 = transDammpoolDataWithoutTicks(this.dammpool)\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/damm-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.rewarderInfos\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.currentTickIndex < 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.currentTickIndex >= 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/damm-pool'\nimport {\n DammIntegrateRouterWithPartnerModule,\n DammIntegratePoolModule,\n DammIntegrateRouterModule,\n DammIntegrateUtilsModule,\n CLOCK_ADDRESS,\n} from '../types/sui'\nimport SDK, {\n AddLiquidityFixTokenParams,\n adjustForSlippage,\n asUintN,\n DammPoolUtil,\n CoinAsset,\n CoinPairType,\n CollectRewarderParams,\n d,\n getPackagerConfigs,\n normalizeCoinType,\n Percentage,\n Pool,\n RemoveLiquidityAndClaimRewardsParams,\n SdkOptions,\n SwapParams,\n SwapUtils,\n ZERO,\n} from '../index'\nimport { BasePath, OnePath, SwapWithRouterParams } from '../modules/router'\nimport { DammpoolsError, 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\ntype TxCoin =\n | {\n $kind: 'NestedResult'\n NestedResult: [number, number]\n }\n | ((tx: Transaction) => {\n $kind: 'NestedResult'\n NestedResult: [number, number]\n })\n | ((tx: Transaction) => TransactionResult)\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 DAMM-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 static createRemoveLiquidityPayload(\n params: RemoveLiquidityAndClaimRewardsParams,\n sdkOptions: SdkOptions,\n tx: Transaction\n ): [coinA: TxCoin, coinB: TxCoin] {\n const coinTypeA = params.coinTypeA\n const coinTypeB = params.coinTypeB\n\n const { published_at, config } = sdkOptions.damm_pool\n\n if (!config) {\n throw new Error('No config found in sdk options')\n }\n\n const { global_config_id } = config\n const [v3, v2] = tx.moveCall({\n target: `${published_at}::pool::remove_liquidity`,\n arguments: [tx.object(global_config_id), tx.object(params.pool_id), tx.object(params.pos_id), tx.pure.u128(params.delta_liquidity), tx.object(CLOCK_ADDRESS)],\n typeArguments: [coinTypeA, coinTypeB],\n })\n\n const [coinA] = this.balanceToCoinTx(v3, coinTypeA, tx);\n const [coinB] = this.balanceToCoinTx(v2, coinTypeB, tx);\n\n this.checkCoinThresholdInternal(coinA, params.min_amount_a, coinTypeA, sdkOptions, tx)\n this.checkCoinThresholdInternal(coinB, params.min_amount_b, coinTypeB, sdkOptions, tx)\n\n const [v4, v5] = tx.moveCall({\n target: `${published_at}::pool::collect_fee`,\n arguments: [tx.object(global_config_id), tx.object(params.pool_id), tx.object(params.pos_id), tx.pure.bool(false)],\n typeArguments: [coinTypeA, coinTypeB],\n })\n\n const [feeA] = this.balanceToCoinTx(v4, coinTypeA, tx);\n const [feeB] = this.balanceToCoinTx(v5, coinTypeB, tx);\n\n this.joinCoinTx(coinA, feeA, coinTypeA, tx)\n this.joinCoinTx(coinB, feeB, coinTypeB, tx)\n\n return [coinA, coinB]\n }\n\n static joinBalanceTx(currentBalance: TxCoin, targetBalance: TxCoin, coinType: string, transaction: Transaction) {\n transaction.moveCall({\n target: '0x2::balance::join',\n arguments: [currentBalance, targetBalance],\n typeArguments: [coinType],\n })\n }\n\n static joinCoinTx(currentCoin: TxCoin, targetCoin: TxCoin, coinType: string, transaction: Transaction) {\n transaction.moveCall({\n target: '0x2::coin::join',\n arguments: [currentCoin, targetCoin],\n typeArguments: [coinType],\n })\n }\n\n static balanceToCoinTx(balance: TxCoin, coinType: string, tx: Transaction) {\n return tx.moveCall({\n target: '0x2::coin::from_balance',\n arguments: [balance],\n typeArguments: [coinType],\n })\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 DammpoolsError(`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 DammpoolsError(`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(\n liquidityParams,\n gasEstimationConfig.slippage,\n gasEstimationConfig.curSqrtPrice\n )\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(\n liquidityParams: AddLiquidityFixTokenParams,\n slippageRate: number,\n currentSqrtPrice: BN\n ): AddLiquidityFixTokenParams {\n const fixedCoinAmount = liquidityParams.fix_amount_a ? liquidityParams.amount_a : liquidityParams.amount_b\n const liquidityCalculation = DammPoolUtil.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 { damm_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 dammConfiguration = getPackagerConfigs(damm_pool)\n const transactionArgs = liquidityParams.is_open\n ? [\n transaction.object(dammConfiguration.global_config_id),\n transaction.object(liquidityParams.pool_id),\n coinAInputs.targetCoin,\n coinBInputs.targetCoin,\n transaction.pure.u64(liquidityParams.amount_a),\n transaction.pure.u64(liquidityParams.amount_b),\n transaction.pure.u32(Number(asUintN(BigInt(liquidityParams.tick_lower)).toString())),\n transaction.pure.u32(Number(asUintN(BigInt(liquidityParams.tick_upper)).toString())),\n transaction.pure.bool(liquidityParams.fix_amount_a),\n transaction.object(CLOCK_ADDRESS),\n ]\n : [\n transaction.object(dammConfiguration.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}::${DammIntegratePoolModule}::${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 { damm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapParams.a2b)\n const typeArguments = [swapParams.coinTypeA, swapParams.coinTypeB]\n const { global_config_id } = getPackagerConfigs(damm_pool)\n\n if (global_config_id === undefined) {\n throw Error('DAMM 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}::${DammIntegratePoolModule}::${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 { damm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(swapParams.a2b)\n\n const { global_config_id } = getPackagerConfigs(damm_pool)\n\n if (global_config_id === undefined) {\n throw Error('DAMM 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 ? DammIntegrateRouterWithPartnerModule : DammIntegrateRouterModule\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: Number(currentPool.currentSqrtPrice),\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 DammpoolsError(\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\n .reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0)\n .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\n .reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0)\n .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\n .reduce((accumulator, currentValue) => Number(accumulator) + Number(currentValue), 0)\n .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(\n availableCoins: CoinAsset[],\n transaction: Transaction,\n coinType: string,\n buildVector = true\n ): 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(\n transaction,\n [...availableCoins],\n [...targetCoinAssets],\n amounts.amountFirst,\n coinType,\n buildVector,\n fixAmount\n )\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(\n transaction,\n [...availableCoins],\n [...targetCoinAssets],\n amounts.amountFirst,\n coinType,\n buildVector,\n fixAmount\n )\n }\n\n if (totalAvailableAmount < amounts.amountSecond) {\n throw new DammpoolsError(\n `Insufficient balance: available ${totalAvailableAmount} for ${coinType}, required ${amounts.amountSecond}`,\n UtilsErrorCode.InsufficientBalance\n )\n }\n\n return TransactionUtil.buildCoin(\n transaction,\n [...availableCoins],\n [...targetCoinAssets],\n amounts.amountSecond,\n coinType,\n buildVector,\n fixAmount\n )\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 { damm_pool, integrate } = sdk.sdkOptions\n const globalConfigId = getPackagerConfigs(damm_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 ? DammIntegrateRouterWithPartnerModule : DammIntegrateRouterModule\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}::${DammIntegrateRouterModule}::check_coin_threshold`,\n typeArguments: [coinType],\n arguments: [outputCoin, transaction.pure.u64(minimumAmount)],\n })\n }\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 checkCoinThresholdInternal(\n coin: TransactionObjectArgument,\n minimumAmount: bigint,\n coinType: string,\n sdkOptions: SdkOptions,\n transaction: Transaction\n ) {\n transaction.moveCall({\n target: `${sdkOptions.integrate.published_at}::${DammIntegrateRouterModule}::check_coin_threshold`,\n typeArguments: [coinType],\n arguments: [coin, transaction.pure.u64(minimumAmount)],\n })\n }\n\n /**\n * Builds DAMM 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 buildDammBasePathTx(\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 { damm_pool, integrate } = sdk.sdkOptions\n const globalConfigId = getPackagerConfigs(damm_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 ? DammIntegrateRouterWithPartnerModule : DammIntegrateRouterModule\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}::${DammIntegrateUtilsModule}::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(\n sdk: SDK,\n transaction: Transaction,\n coinToTransfer: TransactionObjectArgument,\n coinType: string,\n recipient?: string\n ) {\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 damm_pool: { config },\n } = sdkOptions\n\n const { global_config_id } = config ?? {}\n\n if (!global_config_id) {\n throw new DammpoolsError('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}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { DammpoolsError, UtilsErrorCode } from '../errors/errors'\nimport { isValidSuiAddress } from '@mysten/sui/utils'\n\n/**\n * Check if the address is a valid sui address.\n * @param {string}address\n * @returns\n */\nexport function checkValidSuiAddress(address: string): boolean {\n return !!address && isValidSuiAddress(address)\n}\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 DammpoolsError('The length of recipients and amounts must be the same', UtilsErrorCode.InvalidRecipientAndAmountLength)\n }\n\n for (const recipient of recipients) {\n if (!checkValidSuiAddress(recipient)) {\n throw new DammpoolsError('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 (!checkValidSuiAddress(recipient)) {\n throw new DammpoolsError('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 (!checkValidSuiAddress(recipient)) {\n throw new DammpoolsError('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 { Inputs, Transaction } from '@mysten/sui/transactions'\nimport {\n DevInspectResults,\n DynamicFieldPage,\n PaginatedEvents,\n PaginatedObjectsResponse,\n PaginatedTransactionResponse,\n QueryTransactionBlocksParams,\n SuiClient,\n SuiEventFilter,\n SuiObjectDataOptions,\n SuiObjectResponse,\n SuiObjectResponseQuery,\n SuiTransactionBlockResponse,\n TransactionFilter,\n} from '@mysten/sui/client'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\n\n\nimport { DataPage, PaginationArgs, SuiObjectIdType } from '../types'\n\n/**\n * Represents a module for making RPC (Remote Procedure Call) requests.\n */\nexport class RpcModule extends SuiClient {\n /**\n * Get events for a given query criteria\n * @param query\n * @param paginationArgs\n * @returns\n */\n async queryEventsByPage(query: SuiEventFilter, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n\n do {\n const res: PaginatedEvents = await this.queryEvents({\n query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n async queryTransactionBlocksByPage(\n filter?: TransactionFilter,\n paginationArgs: PaginationArgs = 'all',\n order: 'ascending' | 'descending' | null | undefined = 'ascending'\n ): Promise<DataPage<SuiTransactionBlockResponse>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n\n do {\n const res: PaginatedTransactionResponse = await this.queryTransactionBlocks({\n filter,\n cursor: nextCursor,\n order,\n limit: queryAll ? null : paginationArgs.limit,\n options: { showEvents: true },\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Get all objects owned by an address\n * @param owner\n * @param query\n * @param paginationArgs\n * @returns\n */\n async getOwnedObjectsByPage(\n owner: string,\n query: SuiObjectResponseQuery,\n paginationArgs: PaginationArgs = 'all'\n ): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: PaginatedObjectsResponse = await this.getOwnedObjects({\n owner,\n ...query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Return the list of dynamic field objects owned by an object\n * @param parentId\n * @param paginationArgs\n * @returns\n */\n async getDynamicFieldsByPage(parentId: SuiObjectIdType, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: DynamicFieldPage = await this.getDynamicFields({\n parentId,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Batch get details about a list of objects. If any of the object ids are duplicates the call will fail\n * @param ids\n * @param options\n * @param limit\n * @returns\n */\n async batchGetObjects(ids: SuiObjectIdType[], options?: SuiObjectDataOptions, limit = 50): Promise<SuiObjectResponse[]> {\n let objectDataResponses: SuiObjectResponse[] = []\n\n for (let i = 0; i < Math.ceil(ids.length / limit); i++) {\n try {\n const res = await this.multiGetObjects({\n ids: ids.slice(i * limit, limit * (i + 1)),\n options,\n })\n objectDataResponses = [...objectDataResponses, ...res]\n } catch (error) {\n console.error(`Batch ${i} failed:`, error)\n throw error\n }\n }\n\n return objectDataResponses\n }\n\n /**\n * Calculates the gas cost of a transaction block.\n * @param {Transaction} tx - The transaction block to calculate gas for.\n * @returns {Promise<number>} - The estimated gas cost of the transaction block.\n * @throws {Error} - Throws an error if the sender is empty or devInspect fails.\n */\n async calculationTxGas(tx: Transaction): Promise<number> {\n const { sender } = tx.blockData\n\n if (sender === undefined) {\n throw Error('Transaction sender is required')\n }\n\n const devResult = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender,\n })\n\n // CHECK FOR ERRORS FIRST\n if (devResult.error) {\n console.error('DevInspect failed:', devResult.error)\n throw new Error(`Gas estimation failed: ${devResult.error}`)\n }\n\n // CHECK EFFECTS EXISTS\n if (!devResult.effects) {\n throw new Error('Gas estimation failed: No effects returned from devInspect')\n }\n\n // CHECK GASUSED EXISTS\n if (!devResult.effects.gasUsed) {\n throw new Error('Gas estimation failed: No gas information in effects')\n }\n\n const { gasUsed } = devResult.effects\n\n // VALIDATE GAS VALUES\n if (!gasUsed.computationCost || !gasUsed.storageCost || gasUsed.storageRebate === undefined) {\n throw new Error('Gas estimation failed: Incomplete gas information')\n }\n\n const estimateGas =\n Number(gasUsed.computationCost) +\n Number(gasUsed.storageCost) -\n Number(gasUsed.storageRebate)\n\n // SANITY CHECK\n if (estimateGas < 0 || !Number.isFinite(estimateGas)) {\n throw new Error(`Gas estimation failed: Invalid gas value ${estimateGas}`)\n }\n\n return estimateGas\n }\n\n /**\n * Sends a transaction block after signing it with the provided keypair.\n *\n * @param {Ed25519Keypair | Secp256k1Keypair} keypair - The keypair used for signing the transaction.\n * @param {Transaction} tx - The transaction block to send.\n * @returns {Promise<SuiTransactionBlockResponse | undefined>} - The response of the sent transaction block.\n */\n async sendTransaction(keypair: Ed25519Keypair | Secp256k1Keypair, tx: Transaction): Promise<SuiTransactionBlockResponse | undefined> {\n try {\n const resultTxn = await this.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showEvents: true,\n },\n })\n return resultTxn\n } catch (error) {\n console.error('Transaction failed:', error)\n throw error\n }\n }\n\n /**\n * Send a simulation transaction.\n * @param tx - The transaction block.\n * @param simulationAccount - The simulation account.\n * @param useDevInspect - A flag indicating whether to use DevInspect. Defaults to true.\n * @returns A promise that resolves to DevInspectResults or undefined.\n */\n async sendSimulationTransaction(\n tx: Transaction,\n simulationAccount: string,\n useDevInspect = true\n ): Promise<DevInspectResults | undefined> {\n try {\n if (useDevInspect) {\n const simulateRes = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount,\n })\n return simulateRes\n }\n\n } catch (error) {\n console.error('sendSimulationTransaction failed:', error)\n throw error\n }\n }\n}\n","import BN from 'bn.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { isValidSuiObjectId, normalizeStructTag } 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 checkValidSuiAddress,\n extractStructTagFromType,\n getFutureTime,\n} from '../utils'\nimport { BuildCoinResult, findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport {\n DammFetcherModule,\n DammIntegratePoolModule,\n CLOCK_ADDRESS,\n DataPage,\n PaginationArgs,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectFields } from '../utils/objects'\nimport { CollectFeesQuote } from '../math'\nimport { FetchPosFeeParams } from './rewarder'\nimport { DammpoolsError, 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 DAMM pools\n * Handles position creation, liquidity adjustments, fee collection, and rewards\n * Positions are represented as NFTs that can be transferred or locked\n *\n * @example\n * // Get all positions for a wallet\n * const positions = await sdk.Position.getPositionList(\n * '0x_wallet_address',\n * [] // All pools\n * );\n *\n * positions.forEach(pos => {\n * console.log(`Position ${pos.pos_object_id}`);\n * console.log(`Pool: ${pos.pool}`);\n * console.log(`Liquidity: ${pos.liquidity}`);\n * console.log(`Range: [${pos.tick_lower_index}, ${pos.tick_upper_index}]`);\n * });\n *\n * @example\n * // Add liquidity to existing position\n * const addLiqTx = await sdk.Position.createAddLiquidityPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * delta_liquidity: \"1000000000\",\n * max_amount_a: \"1100000000\", // 10% slippage\n * max_amount_b: \"1100000\"\n * });\n *\n * @example\n * // Collect fees from position\n * const pool = await sdk.Pool.getPool(poolId);\n * const collectTx = await sdk.Position.collectFeeTransactionPayload({\n * pool,\n * pos_id: positionId,\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB\n * });\n */\nexport class PositionModule implements IModule {\n protected _sdk: FerraDammSDK\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: FerraDammSDK) {\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 ferraDamm = this._sdk.sdkOptions.damm_pool.package_id\n return `${ferraDamm}::position::Position`\n }\n\n /**\n * Gets transaction history for specific positions\n * Returns liquidity changes, fee collections, reward claims\n * @param account - Wallet address that owns positions\n * @param positionIds - Array of position NFT IDs\n * @param limit - Max transactions to return (default: 100)\n * @param offset - Starting offset for pagination\n * @returns Array of position transaction info\n * @example\n * const txList = await sdk.Position.getPositionTransactionList({\n * account: walletAddress,\n * positionIds: [posId1, posId2],\n * limit: 50\n * });\n * \n * txList.forEach(tx => {\n * console.log(`${tx.type}: ${tx.txDigest}`);\n * console.log(` Timestamp: ${new Date(Number(tx.timestampMs))}`);\n * });\n */\n async getPositionTransactionList({\n posId,\n paginationArgs = 'all',\n order = 'ascending',\n fullRpcUrl,\n originPosId,\n }: {\n posId: string\n originPosId?: string\n fullRpcUrl?: string\n paginationArgs?: PaginationArgs\n order?: 'ascending' | 'descending' | null | undefined\n }): Promise<DataPage<PositionTransactionInfo>> {\n const { fullClient } = this._sdk\n const filterIds: string[] = [posId]\n if (originPosId) {\n filterIds.push(originPosId)\n }\n\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 * Gets all positions owned by a specific wallet address\n * Optionally filters by pool IDs\n * @param accountAddress - Wallet address to query positions for\n * @param assignPoolIds - Filter by specific pool IDs (empty = all pools)\n * @param showDisplay - Include NFT display metadata (default: true)\n * @returns Array of position objects owned by the account\n * @example\n * // Get all positions\n * const allPositions = await sdk.Position.getPositionList(\n * '0x_wallet_address'\n * );\n *\n * // Get positions for specific pools only\n * const filteredPositions = await sdk.Position.getPositionList(\n * '0x_wallet_address',\n * ['0x_pool1', '0x_pool2']\n * );\n *\n * // Check position status\n * filteredPositions.forEach(pos => {\n * const pool = await sdk.Pool.getPool(pos.pool);\n * const status = PositionUtil.getPositionStatus(\n * pool.currentTickIndex,\n * pos.tick_lower_index,\n * pos.tick_upper_index\n * );\n * console.log(`Position ${pos.pos_object_id}: ${status}`);\n * });\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.damm_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 * Gets complete position data by position ID\n * This is the recommended method - simpler than getPosition()\n * @param positionID - Position NFT object ID\n * @param calculateRewarder - Calculate pending rewards (default: true)\n * @param showDisplay - Include NFT metadata (default: true)\n * @returns Complete position object\n * @throws {DammpoolsError} If position doesn't exist\n * @example\n * const position = await sdk.Position.getPositionById(\n * '0x_position_id',\n * true // Calculate rewards\n * );\n *\n * console.log(`Liquidity: ${position.liquidity}`);\n * console.log(`Fee owed A: ${position.fee_owed_a}`);\n * console.log(`Fee owed B: ${position.fee_owed_b}`);\n * console.log(`Reward 0: ${position.reward_amount_owed_0}`);\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.positionManager.positionsHandle, position)\n return result\n }\n return position\n }\n\n /**\n * Gets basic position data without reward calculations\n * Faster than getPositionById when rewards not needed\n * @param positionID - Position NFT object ID\n * @param showDisplay - Include NFT metadata (default: true)\n * @returns Position object without reward amounts\n * @example\n * // Quick position check\n * const position = await sdk.Position.getSimplePosition(positionId);\n * console.log(`Range: [${position.tick_lower_index}, ${position.tick_upper_index}]`);\n * console.log(`In pool: ${position.pool}`);\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 fetches simple position data for multiple positions\n * More efficient than calling getSimplePosition multiple times\n * @param positionIDs - Array of position NFT IDs\n * @param showDisplay - Include NFT metadata (default: true)\n * @returns Array of position objects\n * @example\n * const positions = await sdk.Position.getSipmlePositionList([\n * '0x_pos1',\n * '0x_pos2',\n * '0x_pos3'\n * ]);\n *\n * // Quick overview\n * positions.forEach(pos => {\n * console.log(`${pos.pos_object_id}: ${pos.liquidity} liquidity`);\n * });\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 * Calculates pending fees for multiple positions\n * Uses on-chain simulation for accurate calculations\n * @param params - Array of position and pool parameters\n * @returns Array of fee quotes (amounts owed)\n * @example\n * const fees = await sdk.Position.fetchPosFeeAmount([\n * {\n * pool_id: poolId1,\n * pos_id: posId1,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\"\n * },\n * {\n * pool_id: poolId2,\n * pos_id: posId2,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x456::usdc::USDC\"\n * }\n * ]);\n *\n * fees.forEach(fee => {\n * console.log(`Position: ${fee.position_id}`);\n * console.log(`Fee A: ${fee.feeOwedA.toString()}`);\n * console.log(`Fee B: ${fee.feeOwedB.toString()}`);\n * });\n */\n public async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { damm_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(damm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${DammFetcherModule}::fetch_position_fees`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 pending fees for multiple positions by ID\n * Convenient wrapper around fetchPosFeeAmount\n * @param positionIDs - Array of position NFT IDs\n * @returns Map of position ID to fee quote\n * @example\n * const feeMap = await sdk.Position.batchFetchPositionFees([\n * '0x_pos1',\n * '0x_pos2'\n * ]);\n *\n * for (const [posId, fees] of Object.entries(feeMap)) {\n * console.log(`Position ${posId}:`);\n * console.log(` Fee A: ${fees.feeOwedA.toString()}`);\n * console.log(` Fee B: ${fees.feeOwedB.toString()}`);\n * }\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 a transaction to add liquidity with fixed token amounts\n * Useful when you want to specify exact amounts rather than liquidity delta\n * @param params - Parameters including amounts and slippage tolerance\n * @returns Transaction for adding liquidity\n * @example\n * const tx = await sdk.Position.createAddLiquidityFixTokenPayload({\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * pool_id: poolId,\n * pos_id: positionId,\n * amount_a: 1000000000, // 1 SUI\n * amount_b: 5000000, // 5 COIN\n * fix_amount_a: true, // Fix SUI, adjust COIN\n * slippage: 0.05, // 5% slippage\n * tick_lower: -120,\n * tick_upper: 120,\n * collect_fee: true // Auto-collect fees before adding\n * });\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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 * Retrieves the balance of multiple coin types from a RewarderGlobalVault on the SUI network.\n *\n * This function queries the RewarderGlobalVault's dynamic fields (stored in a Bag)\n * to find the balance for each provided coin type. If a coin type is not found in the vault,\n * it returns 0n for that coin type.\n *\n * @param {SuiClient} client - The SUI client instance used to make RPC calls\n * @param {string} rewarderVaultId - The object ID of the RewarderGlobalVault on SUI blockchain\n * @param {string[]} coinTypes - Array of coin type identifiers to query balances for\n *\n * @returns {Promise<bigint[]>} Array of balances corresponding to each coin type.\n * Returns 0n if a coin type doesn't exist in the vault.\n * The order matches the input coinTypes array.\n *\n * @example\n * ```typescript\n * const client = new SuiClient({ url: \"https://fullnode.mainnet.sui.io\" });\n *\n * const balances = await getRewarderBalances(\n * client,\n * \"0xd68c56a1610953b0a81c48ad26e463c6c51e50ddcc13e5e4121fe70ee75c1bf7\",\n * [\n * \"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC\",\n * \"0x2::sui::SUI\",\n * ]\n * );\n *\n * console.log(balances); // [47463762n, 0n]\n * ```\n *\n * @throws {Error} Throws if the vault object is invalid or not a moveObject\n */\n public async getRewarderBalances<T extends Array<string>>(coinTypes: T): Promise<SizedArray<bigint, T['length']>> {\n const config = this.sdk.sdkOptions\n const client = this.sdk.fullClient\n const { global_rewarder_vault_id } = config.damm_pool.config ?? {}\n if (!global_rewarder_vault_id) {\n throw new Error('Rewarder vault id not found from config')\n }\n\n const vault = await client.getObject({\n id: global_rewarder_vault_id,\n options: {\n showContent: true,\n showType: true,\n },\n })\n\n if (vault.data?.content?.dataType !== 'moveObject') {\n throw new Error('Invalid vault object')\n }\n\n const vaultContent = vault.data.content.fields as any\n\n const balancesBagId = vaultContent.balances.fields.id.id\n\n let cursor: string | null = null\n const dynamicFieldsMap = new Map<string, string>()\n\n do {\n const response = await client.getDynamicFields({\n parentId: balancesBagId,\n cursor,\n limit: 100,\n })\n\n for (const field of response.data) {\n if (field.name.type === '0x1::type_name::TypeName') {\n const fieldName = field.name.value as any\n\n const coinType = fieldName.name?.fields?.name || fieldName?.name\n\n dynamicFieldsMap.set(normalizeStructTag(coinType), field.objectId)\n }\n }\n\n cursor = response.hasNextPage ? response.nextCursor : null\n } while (cursor)\n\n const results: bigint[] = []\n\n for (let coinType of coinTypes) {\n coinType = normalizeStructTag(coinType)\n let objectId = dynamicFieldsMap.get(coinType)\n\n if (!objectId) {\n results.push(0n)\n continue\n }\n\n try {\n const dynamicField = await client.getObject({\n id: objectId,\n options: {\n showContent: true,\n },\n })\n\n if (dynamicField.data?.content?.dataType === 'moveObject') {\n const fieldContent = dynamicField.data.content.fields as any\n const balance = BigInt(fieldContent.value || '0')\n results.push(balance)\n } else {\n results.push(0n)\n }\n } catch {\n results.push(0n)\n }\n }\n\n return results as SizedArray<bigint, T['length']>\n }\n\n /**\n * Creates a transaction to add liquidity with exact liquidity delta\n * Preferred method when you know the exact liquidity amount to add\n * @param params - Parameters including liquidity delta and amount limits\n * @returns Transaction for adding liquidity\n * @example\n * const tx = await sdk.Position.createAddLiquidityPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * delta_liquidity: \"1000000000\",\n * max_amount_a: \"1100000000\", // Max SUI to spend\n * max_amount_b: \"1100000\" // Max COIN to spend\n * });\n */\n async createAddLiquidityPayload(\n params: AddLiquidityParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n const { integrate, damm_pool } = this._sdk.sdkOptions\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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\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}::${DammIntegratePoolModule}::open_position_with_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(damm_pool).global_config_id),\n tx.object(params.pool_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 } 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}::${DammIntegratePoolModule}::add_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(damm_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 a transaction to remove liquidity from a position\n * @param params - Parameters including liquidity amount to remove and minimum outputs\n * @param tx - Optional existing transaction to extend\n * @returns Transaction for removing liquidity\n * @example\n * // Remove 50% of liquidity\n * const position = await sdk.Position.getPositionById(positionId);\n * const halfLiquidity = new BN(position.liquidity).divn(2);\n *\n * const tx = await sdk.Position.removeLiquidityTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * delta_liquidity: halfLiquidity.toString(),\n * min_amount_a: \"900000000\", // Minimum SUI to receive\n * min_amount_b: \"4500000\", // Minimum COIN to receive\n * collect_fee: true // Also collect pending fees\n * });\n */\n async removeLiquidityTransactionPayload(params: RemoveLiquidityParams, tx?: Transaction): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n UtilsErrorCode.InvalidSendAddress\n )\n }\n const { damm_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(damm_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}::${DammIntegratePoolModule}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Creates a transaction to close a position (remove all liquidity)\n * Position NFT is burned after closing\n * @param params - Parameters including slippage tolerance\n * @param tx - Optional existing transaction to extend\n * @returns Transaction for closing position\n * @example\n * const tx = await sdk.Position.closePositionTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\",\n * min_amount_a: \"950000000\", // Accept 5% slippage\n * min_amount_b: \"4750000\",\n * collect_fee: true,\n * rewarder_coin_types: [\n * \"0x_reward_coin_1\",\n * \"0x_reward_coin_2\",\n * \"0x_reward_coin_3\"\n * ]\n * });\n */\n async closePositionTransactionPayload(params: ClosePositionParams, tx?: Transaction): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm sdk requires a valid sender address. Please set it using sdk.senderAddress = \"0x...\"',\n UtilsErrorCode.InvalidSendAddress\n )\n }\n const { damm_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}::${DammIntegratePoolModule}::close_position`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(damm_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 { damm_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 args = [\n tx.object(getPackagerConfigs(damm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DammIntegratePoolModule}::`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Locks a position until a specific timestamp\n * Locked positions cannot be closed or have liquidity removed\n * Useful for governance or vesting mechanisms\n * @param pool - Pool object\n * @param positionId - Position NFT ID\n * @param untilTimestamp - Unix timestamp (seconds) when lock expires\n * @param tx - Optional transaction to extend\n * @returns Transaction for locking position\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const oneWeekFromNow = Math.floor(Date.now() / 1000) + (7 * 24 * 60 * 60);\n *\n * const tx = await sdk.Position.lockPosition(\n * pool,\n * positionId,\n * oneWeekFromNow\n * );\n *\n * console.log(`Position locked until: ${new Date(oneWeekFromNow * 1000)}`);\n */\n public async lockPosition(pool: Pool, positionId: string, untilTimestamp: number, tx = new Transaction()) {\n const sender = this.sdk.senderAddress\n\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 /**\n * Gets lock status for a position by ID\n * @param positionId - Position NFT ID\n * @returns Tuple of [lockTimestamp, currentTimestamp, isLocked]\n * @example\n * const [lockTime, currentTime, isLocked] =\n * await sdk.Position.getLockPositionStatusById(positionId);\n *\n * if (isLocked) {\n * const unlockDate = new Date(lockTime * 1000);\n * console.log(`Locked until: ${unlockDate}`);\n * console.log(`Time remaining: ${lockTime - currentTime}s`);\n * } else {\n * console.log('Position is unlocked');\n * }\n */\n public async getLockPositionStatusById(\n positionId: string\n ): 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 a transaction to collect accumulated fees from a position\n * Fees can be collected without affecting liquidity\n * @param params - Parameters including pool and position info\n * @param tx - Optional transaction to extend\n * @returns Transaction for collecting fees\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * const collectTx = await sdk.Position.collectFeeTransactionPayload({\n * pool,\n * pos_id: positionId,\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: collectTx,\n * signer: keypair\n * });\n *\n * // Check collected amounts from events\n * const collectEvent = result.events?.find(\n * e => e.type.includes('CollectFeeEvent')\n * );\n * console.log(`Collected A: ${collectEvent?.parsedJson?.amount_a}`);\n * console.log(`Collected B: ${collectEvent?.parsedJson?.amount_b}`);\n */\n async collectFeeTransactionPayload(\n params: CollectFeeParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 { damm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::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 { damm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * Calculates pending fees for a position using local computation\n * Faster than on-chain simulation but less accurate\n * @param params - Pool and position parameters\n * @returns Fee quote with amounts owed\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const position = await sdk.Position.getPositionById(positionId);\n * const ticks = await sdk.Pool.fetchTicksByRpc(pool.ticksHandle);\n * \n * const tickLower = ticks.find(t => t.index === position.tick_lower_index);\n * const tickUpper = ticks.find(t => t.index === position.tick_upper_index);\n * \n * const fees = await sdk.Position.calculateFee({\n * pool,\n * position,\n * tickLower,\n * tickUpper\n * });\n * \n * console.log(`Pending fee A: ${fees.feeOwedA.toString()}`);\n * console.log(`Pending fee B: ${fees.feeOwedB.toString()}`);\n */\n async calculateFee(params: CollectFeeParams) {\n const paylod = await this.collectFeeTransactionPayload(params)\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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}\n\ntype SizedArray<T, S extends number, Arr extends T[] = []> = Arr['length'] extends S ? Arr : SizedArray<T, S, [...Arr, T]>\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport BN from 'bn.js'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { BuildCoinResult, checkValidSuiAddress, extractStructTagFromType, normalizeCoinType, TransactionUtil } from '../utils'\nimport { DammFetcherModule, DammIntegratePoolModule, CLOCK_ADDRESS } from '../types/sui'\nimport { getRewardInTickRange } from '../utils/tick'\nimport { MathUtil, ONE, ZERO } from '../math/utils'\nimport { TickData } from '../types/damm-pool'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { CollectRewarderParams, getPackagerConfigs, Pool, Position, PositionReward, Rewarder, RewarderAmountOwed } from '../types'\nimport { CollectFeesQuote } from '../math'\nimport { DammpoolsError, 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 pool incentive rewards\n * Handles reward calculations, claiming, and emissions tracking\n * Supports up to 3 simultaneous reward tokens per pool\n *\n * @example\n * // Check daily emissions for a pool\n * const emissions = await sdk.Rewarder.emissionsEveryDay(poolId);\n * console.log(`Rewarder 0: ${emissions[0]} tokens/day`);\n * console.log(`Rewarder 1: ${emissions[1]} tokens/day`);\n * console.log(`Rewarder 2: ${emissions[2]} tokens/day`);\n *\n * @example\n * // Fetch pending rewards for a position\n * const pool = await sdk.Pool.getPool(poolId);\n * const rewards = await sdk.Rewarder.fetchPositionRewarders(pool, positionId);\n *\n * rewards.forEach((reward, index) => {\n * const rewarderInfo = pool.rewarderInfos[index];\n * console.log(`Reward ${index} (${rewarderInfo.coinAddress}):`);\n * console.log(` Owed: ${reward.amount_owed}`);\n * });\n *\n * @example\n * // Claim all rewards from a position\n * const claimTx = await sdk.Rewarder.collectRewarderTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * rewarder_coin_types: [\n * pool.rewarderInfos[0].coinAddress,\n * pool.rewarderInfos[1].coinAddress,\n * pool.rewarderInfos[2].coinAddress\n * ],\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB\n * });\n */\nexport class RewarderModule implements IModule {\n protected _sdk: FerraDammSDK\n private growthGlobal: BN[]\n\n constructor(sdk: FerraDammSDK) {\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 emission rates for all rewarders in a pool\n * Emissions are continuous, this converts to daily amounts\n * @param poolID - Pool object ID\n * @returns Array of daily emission amounts [rewarder0, rewarder1, rewarder2]\n * @example\n * const emissions = await sdk.Rewarder.emissionsEveryDay(poolId);\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * pool.rewarderInfos.forEach((info, i) => {\n * const dailyEmission = emissions[i];\n * console.log(`${info.coinAddress}: ${dailyEmission} per day`);\n * });\n */\n async emissionsEveryDay(poolID: string) {\n const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n const rewarderInfos = currentPool.rewarderInfos\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.rewarderLastUpdatedTime\n currentPool.rewarderLastUpdatedTime = 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.rewarderInfos\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 * Batch fetches pending rewards for multiple positions\n * More efficient than calling fetchPositionRewarders multiple times\n * @param positionIDs - Array of position NFT IDs\n * @returns Map of position ID to array of reward amounts\n * @example\n * const rewardMap = await sdk.Rewarder.batchFetchPositionRewarders([\n * '0x_pos1',\n * '0x_pos2',\n * '0x_pos3'\n * ]);\n *\n * for (const [posId, rewards] of Object.entries(rewardMap)) {\n * console.log(`Position ${posId}:`);\n * rewards.forEach((reward, i) => {\n * console.log(` Reward ${i}: ${reward.amount_owed}`);\n * });\n * }\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.rewarderInfos,\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 pending reward amounts for a specific position\n * Uses on-chain data for accurate calculations\n * @param pool - Pool object containing rewarder info\n * @param positionId - Position NFT ID\n * @returns Array of reward amounts owed\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const rewards = await sdk.Rewarder.fetchPositionRewarders(pool, positionId);\n *\n * // Display rewards with token info\n * for (let i = 0; i < rewards.length; i++) {\n * const rewarder = pool.rewarderInfos[i];\n * const reward = rewards[i];\n * console.log(`Rewarder ${i}:`);\n * console.log(` Token: ${rewarder.coinAddress}`);\n * console.log(` Owed: ${reward.amount_owed}`);\n * console.log(` Growth inside: ${reward.growth_inside}`);\n * }\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.rewarderInfos,\n }\n\n const result = await this.fetchPosRewardersAmount([param])\n\n return result[0].rewarderAmountOwed\n }\n\n /**\n * Fetches both fees and rewards for multiple positions\n * Convenience method that combines fee and reward queries\n * @param positionIDs - Array of position NFT IDs\n * @returns Map of position ID to fee quote\n * @example\n * const feeMap = await sdk.Rewarder.batchFetchPositionFees([\n * '0x_pos1',\n * '0x_pos2'\n * ]);\n *\n * for (const [posId, fees] of Object.entries(feeMap)) {\n * console.log(`Position ${posId}:`);\n * console.log(` Fee A: ${fees.feeOwedA.toString()}`);\n * console.log(` Fee B: ${fees.feeOwedB.toString()}`);\n * }\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 * Fetches pending fee amounts for multiple positions\n * Uses on-chain simulation for accurate results\n * @param params - Array of position and pool parameters\n * @returns Array of fee quotes\n * @example\n * const fees = await sdk.Rewarder.fetchPosFeeAmount([\n * {\n * pool_id: poolId1,\n * pos_id: posId1,\n * coinTypeA: \"0x2::sui::SUI\",\n * coinTypeB: \"0x5d4b...::coin::COIN\"\n * }\n * ]);\n *\n * fees.forEach(fee => {\n * console.log(`Fees for ${fee.position_id}:`);\n * console.log(` A: ${fee.feeOwedA.toString()}`);\n * console.log(` B: ${fee.feeOwedB.toString()}`);\n * });\n */\n async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { damm_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(damm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${DammFetcherModule}::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 * Fetches pending reward amounts for multiple positions\n * Uses on-chain simulation for accurate calculations\n * @param params - Array of position and pool parameters\n * @returns Array of reward amount quotes\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * const rewards = await sdk.Rewarder.fetchPosRewardersAmount([\n * {\n * pool_id: poolId,\n * pos_id: posId1,\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress)\n * }\n * ]);\n *\n * rewards.forEach(reward => {\n * console.log(`Position: ${reward.pos_object_id}`);\n * console.log(`Rewards: ${reward.rewarder_amounts}`);\n * });\n */\n async fetchPosRewardersAmount(params: FetchPosRewardParams[]) {\n const { damm_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(damm_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}::${DammFetcherModule}::fetch_position_rewards`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError(\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 DammpoolsError(\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 DammpoolsError('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 * Fetches total accumulated rewards for an account in a specific pool\n * Aggregates rewards across all positions in the pool\n * @param account - Wallet address\n * @param poolObjectId - Pool object ID\n * @returns Total reward amounts by token\n * @example\n * const poolRewards = await sdk.Rewarder.fetchPoolRewardersAmount(\n * walletAddress,\n * poolId\n * );\n *\n * console.log('Total pool rewards for account:');\n * poolRewards.forEach((amount, index) => {\n * console.log(` Rewarder ${index}: ${amount}`);\n * });\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.rewarderInfos,\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 a transaction to collect rewards from a position\n * Can optionally collect fees at the same time\n * @param params - Parameters including reward coin types\n * @param tx - Optional transaction to extend\n * @returns Transaction for collecting rewards\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n *\n * const claimTx = await sdk.Rewarder.collectRewarderTransactionPayload({\n * pool_id: poolId,\n * pos_id: positionId,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress),\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true // Also collect trading fees\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: claimTx,\n * signer: keypair\n * });\n */\n async collectRewarderTransactionPayload(params: CollectRewarderParams, tx?: Transaction): Promise<Transaction> {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 ??= new Transaction()\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n return tx\n }\n\n /**\n * Creates a transaction to batch collect rewards from multiple positions\n * More gas efficient than individual collection transactions\n * @param paramsList - Array of reward collection parameters\n * @param allCoinAsset - Available coin assets for the wallet\n * @returns Transaction for batch reward collection\n * @example\n * const pool = await sdk.Pool.getPool(poolId);\n * const coinAssets = await sdk.getOwnerCoinAssets(walletAddress);\n *\n * const batchTx = await sdk.Rewarder.batchCollectRewardePayload(\n * [\n * {\n * pool_id: poolId,\n * pos_id: posId1,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress),\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true\n * },\n * {\n * pool_id: poolId,\n * pos_id: posId2,\n * rewarder_coin_types: pool.rewarderInfos.map(r => r.coinAddress),\n * coinTypeA: pool.coinTypeA,\n * coinTypeB: pool.coinTypeB,\n * collect_fee: true\n * }\n * ],\n * coinAssets\n * );\n */\n async batchCollectRewardePayload(\n params: CollectRewarderParams[],\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ) {\n if (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: ferra damm 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 { damm_pool, integrate } = this.sdk.sdkOptions\n const dammConfigs = getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(dammConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(dammConfigs.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 { damm_pool, integrate } = this.sdk.sdkOptions\n const dammConfigs = getPackagerConfigs(damm_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}::${DammIntegratePoolModule}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(dammConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(dammConfigs.global_rewarder_vault_id),\n primaryCoinInputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n}\n","import BN from 'bn.js'\nimport { Graph, GraphEdge, GraphVertex } from '@syntsugar/cc-graph'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { PreSwapLpChangeParams, PreSwapWithMultiPoolParams } from '../types'\nimport { checkValidSuiAddress, extractStructTagFromType } from '../utils'\nimport { DammExpectSwapModule, DammIntegrateRouterModule, SuiAddressType } from '../types/sui'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { U64_MAX, ZERO } from '../math'\nimport { DammpoolsError, ConfigErrorCode, RouterErrorCode } from '../errors/errors'\nimport Decimal from '../utils/decimal'\nimport { isValidSuiAddress, 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\ninterface CoinInfo {\n address: string\n decimals: number\n}\n\ninterface PoolInfo {\n address: string\n is_closed: boolean\n fee: number\n\n // Token information\n coin_a: CoinInfo\n coin_b: CoinInfo\n}\n\ninterface GraphApiResponse {\n code: number\n pools: PoolInfo[]\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 multi-hop swap paths\n * Analyzes liquidity across pools to find best execution routes\n * Supports complex routing with intermediate tokens\n * \n * @example\n * // Find best route for SUI -> USDC swap\n * await sdk.Router.loadGraphData(); // Load pool graph first\n * \n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\", // 1 SUI\n * byAmountIn: true,\n * depth: 3 // Allow up to 3 hops\n * });\n * \n * if (route) {\n * console.log(`Best route: ${route.paths.map(p => p.coinType).join(' -> ')}`);\n * console.log(`Expected output: ${route.amountOut}`);\n * console.log(`Price impact: ${route.priceImpact}%`);\n * }\n * \n * @example\n * // Execute multi-hop swap\n * const swapTx = await sdk.Router.createSwapTransactionPayload({\n * paths: route.paths,\n * partner: null,\n * byAmountIn: true\n * });\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: FerraDammSDK\n\n constructor(sdk: FerraDammSDK) {\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 * Loads pool and coin graph data for routing\n * Must be called before using routing functions\n * Caches data for performance\n * @example\n * // Load graph once at app startup\n * await sdk.Router.loadGraphData();\n * \n * // Now you can use routing\n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\",\n * byAmountIn: true\n * });\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 swap route between two tokens\n * Analyzes all possible paths considering liquidity and fees\n * @param params - Routing parameters including tokens and amount\n * @returns Best route with expected output and path details, or null if no path found\n * @example\n * await sdk.Router.loadGraphData();\n * \n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\", // 1 SUI\n * byAmountIn: true,\n * depth: 3, // Max 3 hops\n * splitCount: 1 // Single path (no split routing)\n * });\n * \n * if (!route) {\n * console.log('No route found');\n * return;\n * }\n * \n * console.log('Route found:');\n * route.paths.forEach((path, i) => {\n * console.log(` Hop ${i + 1}: ${path.coinType}`);\n * console.log(` Pool: ${path.poolAddress}`);\n * console.log(` Direction: ${path.a2b ? 'A->B' : 'B->A'}`);\n * });\n * console.log(`Total output: ${route.amountOut}`);\n * console.log(`Price impact: ${route.priceImpact}%`);\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 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 DammpoolsError('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 DammpoolsError('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 DammpoolsError('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 = await fetch(this.sdk.sdkOptions.swapCountUrl!, { method: 'GET' })\n const poolsData = (await apiResponse.json()) as GraphApiResponse\n\n if (poolsData.code === 200) {\n for (const poolInfo of poolsData.pools) {\n if (\n poolInfo.is_closed ||\n !(\n isValidSuiAddress(poolInfo.address) &&\n isValidSuiAddress(poolInfo.coin_a.address) &&\n isValidSuiAddress(poolInfo.coin_b.address) &&\n poolInfo.fee\n )\n ) {\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 DammpoolsError(`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 * Simulates multi-hop swaps across different parameter sets\n * Useful for comparing different amounts or paths\n * @param parameterSets - Array of routing parameters to test\n * @returns Array of best routes for each parameter set\n * @example\n * await sdk.Router.loadGraphData();\n * \n * const routes = await sdk.Router.preRouterSwapA2B2C([\n * {\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\", // 1 SUI\n * byAmountIn: true\n * },\n * {\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"10000000000\", // 10 SUI\n * byAmountIn: true\n * }\n * ]);\n * \n * routes.forEach((route, i) => {\n * console.log(`Route ${i + 1}:`);\n * console.log(` Output: ${route?.amountOut ?? 'No route'}`);\n * });\n */\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}::${DammIntegrateRouterModule}::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}::${DammExpectSwapModule}::get_expect_swap_result`,\n arguments: transactionArgs,\n typeArguments: typeParameters,\n })\n }\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 * Gets all pools with their Total Value Locked (TVL)\n * Useful for analytics and pool selection\n * @returns Array of pools with TVL data\n * @example\n * const poolsWithTvl = await sdk.Router.getPoolWithTVL();\n * \n * // Sort by TVL\n * poolsWithTvl.sort((a, b) => b.tvl - a.tvl);\n * \n * console.log('Top 10 pools by TVL:');\n * poolsWithTvl.slice(0, 10).forEach(pool => {\n * console.log(`${pool.name}: $${pool.tvl.toLocaleString()}`);\n * });\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 DammpoolsError(`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 DammpoolsError(`Failed to parse response from ${swapCountUrl}.`, RouterErrorCode.InvalidSwapCountUrl)\n }\n\n if (responseData.code !== 200) {\n throw new DammpoolsError(\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}\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 { CLOCK_ADDRESS, DammFetcherModule } from '../types/sui'\nimport { TickData, transDammpoolDataWithoutTicks } from '../types/damm-pool'\nimport { FerraDammSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { SwapUtils } from '../math/swap'\nimport { computeSwap } from '../math/damm'\nimport { TickMath } from '../math/tick'\nimport { checkValidSuiAddress, d } from '../utils'\nimport { SplitPath } from './router'\nimport { DammpoolsError, ConfigErrorCode, SwapErrorCode, UtilsErrorCode } from '../errors/errors'\nimport { simulateSwap } from '../utils/swap-utils'\n\n/**\n * Swap module for executing token swaps in DAMM 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: FerraDammSDK\n\n constructor(sdk: FerraDammSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\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}::${DammFetcherModule}::calculate_swap_result`,\n arguments: transactionArgs,\n typeArguments: coinTypes,\n })\n }\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 DammpoolsError('Event data length does not match pool count', SwapErrorCode.ParamsLengthNotEqual)\n }\n\n let optimalAmount = swapParams.byAmountIn ? ZERO : U64_MAX\n let optimalPoolIndex = -1\n\n for (let eventIndex = 0; eventIndex < swapEventData.length; eventIndex += 1) {\n if (swapEventData[eventIndex].parsedJson.data.is_exceed) {\n continue\n }\n const outputAmount = swapParams.byAmountIn\n ? new BN(swapEventData[eventIndex].parsedJson.data.amount_out)\n : new BN(swapEventData[eventIndex].parsedJson.data.amount_in)\n\n if (optimalPoolIndex === -1) {\n optimalPoolIndex = eventIndex\n optimalAmount = outputAmount\n } else if (swapParams.byAmountIn && outputAmount.gt(optimalAmount)) {\n optimalPoolIndex = eventIndex\n optimalAmount = outputAmount\n } else if (!swapParams.byAmountIn && outputAmount.lt(optimalAmount)) {\n optimalPoolIndex = eventIndex\n optimalAmount = outputAmount\n }\n }\n\n if (optimalPoolIndex === -1) {\n throw new Error('No valid pool for swap')\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 transaction.object(CLOCK_ADDRESS),\n ]\n\n transaction.moveCall({\n target: `${integrate.published_at}::${DammFetcherModule}::calculate_swap_result`,\n arguments: transactionArgs,\n typeArguments: coinTypes,\n })\n\n if (!checkValidSuiAddress(simulationAccount.address)) {\n throw new DammpoolsError('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 DammpoolsError(\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 return {\n poolAddress: swapParams.pool.poolAddress,\n currentSqrtPrice: swapParams.currentSqrtPrice,\n estimatedAmountIn: simulationData.amount_in,\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 ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\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 currentTimestampMs = new BN(Date.now())\n\n const sortedTicks = calculationParams.swapTicks.sort((tickA, tickB) => {\n return tickA.index - tickB.index\n })\n\n const swapCalculationResult = simulateSwap(\n currentPool,\n sortedTicks,\n calculationParams.a2b,\n calculationParams.byAmountIn,\n calculationParams.amount,\n currentTimestampMs,\n )\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.afterSqrtPrice.lt(priceLimit)) {\n hasExceededLimits = true\n }\n\n if (!calculationParams.a2b && swapCalculationResult.afterSqrtPrice.gt(priceLimit)) {\n hasExceededLimits = true\n }\n\n let additionalComputeLimit = 0\n if (swapCalculationResult.stepResults.length > 6 && swapCalculationResult.stepResults.length < 40) {\n additionalComputeLimit = 22000 * (swapCalculationResult.stepResults.length - 6)\n }\n\n if (swapCalculationResult.stepResults.length > 40) {\n hasExceededLimits = true\n }\n\n let initialPrice = TickMath.sqrtPriceX64ToPrice(\n new BN(currentPool.currentSqrtPrice),\n calculationParams.decimalsA,\n calculationParams.decimalsB\n ).toNumber()\n let decimalAdjustment = Math.pow(10, calculationParams.decimalsA - calculationParams.decimalsB)\n\n if (calculationParams.a2b === false) {\n initialPrice = 1 / initialPrice\n decimalAdjustment = Math.pow(10, calculationParams.decimalsB - calculationParams.decimalsA)\n }\n\n const executionPrice = new Decimal(swapCalculationResult.amountOut.toNumber())\n .div(swapCalculationResult.amountIn.toNumber())\n .mul(decimalAdjustment)\n .toNumber()\n\n const priceImpactPercentage = ((executionPrice - initialPrice) / initialPrice) * 100\n\n return {\n estimatedAmountIn: swapCalculationResult.amountIn,\n estimatedAmountOut: swapCalculationResult.amountOut,\n estimatedEndSqrtPrice: swapCalculationResult.afterSqrtPrice,\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 transaction for multi-hop swap execution\n * Builds the complete swap path through multiple pools\n * @param params - Swap parameters including path and partner info\n * @returns Transaction ready for execution\n * @example\n * // First find the best route\n * const route = await sdk.Router.getBestInternalRouter({\n * from: \"0x2::sui::SUI\",\n * target: \"0x5d4b...::usdc::USDC\",\n * amount: \"1000000000\",\n * byAmountIn: true\n * });\n *\n * // Then create transaction\n * const tx = await sdk.Router.createSwapTransactionPayload({\n * paths: route.paths,\n * partner: null, // Or partner ID for fee sharing\n * byAmountIn: true\n * });\n *\n * const result = await sdk.fullClient.signAndExecuteTransaction({\n * transaction: tx,\n * signer: keypair\n * });\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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: Ferra DAMM 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(\n this._sdk,\n swapParams,\n userCoinAssets,\n gasEstimationConfig\n )\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 (!checkValidSuiAddress(this.sdk.senderAddress)) {\n throw new DammpoolsError(\n 'Invalid sender address: Ferra DAMM 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(\n this._sdk,\n swapParams,\n userCoinAssets,\n gasEstimationConfig\n )\n return gasOptimizedResult\n }\n }\n\n return TransactionUtil.buildSwapTransactionWithoutTransferCoins(this.sdk, swapParams, userCoinAssets)\n }\n}\n","import BN from \"bn.js\";\nimport { Pool, TickData } from \"../types\";\n\n// ============================================================\n// Constants\n// ============================================================\nconst PRECISION = new BN(\"1000000000\"); // 1e9\nconst MAX_FEE = new BN(\"500000000\"); // 50%\nconst MAX_SQRT_PRICE_X64 = new BN(\"79226673515401279992447579055\");\nconst MIN_SQRT_PRICE_X64 = new BN(\"4295048016\");\nconst ONE = new BN(1);\nconst ZERO = new BN(0);\n\nconst COLLECT_FEE_MODE_ON_BOTH = 0;\nconst COLLECT_FEE_MODE_ON_QUOTE = 1;\n\nexport interface SwapStepResult {\n currentSqrtPrice: BN;\n targetSqrtPrice: BN;\n currentLiquidity: BN;\n amountIn: BN;\n amountOut: BN;\n feeAmount: BN;\n remainderAmount: BN;\n}\n\nexport interface CalculatedSwapResult {\n amountIn: BN;\n amountOut: BN;\n feeAmount: BN;\n baseFee: BN;\n dynamicFee: BN;\n beforeSqrtPrice: BN;\n afterSqrtPrice: BN;\n isExceed: boolean;\n collectFeeOnInput: boolean;\n stepResults: SwapStepResult[];\n}\n\nexport interface SwapQuote {\n amountIn: string;\n amountOut: string;\n feeAmount: string;\n baseFee: string;\n dynamicFee: string;\n isExceed: boolean;\n afterSqrtPrice: string;\n priceImpact: number;\n steps: number;\n}\n\n// ============================================================\n// BN Utility Helpers\n// ============================================================\n\nfunction toBN(val: bigint | number | string | BN): BN {\n if (BN.isBN(val)) return val;\n return new BN(val.toString());\n}\n\nfunction mulShr(a: BN, b: BN, shift: number): BN {\n return a.mul(b).shrn(shift);\n}\n\nfunction mulDivFloor(a: BN, b: BN, denom: BN): BN {\n return a.mul(b).div(denom);\n}\n\nfunction mulDivCeil(a: BN, b: BN, denom: BN): BN {\n const product = a.mul(b);\n const result = product.div(denom);\n if (product.mod(denom).gt(ZERO)) {\n return result.add(ONE);\n }\n return result;\n}\n\nfunction divRound(num: BN, denom: BN, roundUp: boolean): BN {\n const result = num.div(denom);\n if (roundUp && num.mod(denom).gt(ZERO)) {\n return result.add(ONE);\n }\n return result;\n}\n\n// ============================================================\n// Tick Math (Q64.64 sqrt price <-> tick)\n// ============================================================\n\nconst NEG_TICK_MULTIPLIERS: BN[] = [\n new BN(\"18445821805675392311\"),\n new BN(\"18444899583751176498\"),\n new BN(\"18443055278223354162\"),\n new BN(\"18439367220385604838\"),\n new BN(\"18431993317065449817\"),\n new BN(\"18417254355718160513\"),\n new BN(\"18387811781193591352\"),\n new BN(\"18329067761203520168\"),\n new BN(\"18212142134806087854\"),\n new BN(\"17980523815641551639\"),\n new BN(\"17526086738831147013\"),\n new BN(\"16651378430235024244\"),\n new BN(\"15030750278693429944\"),\n new BN(\"12247334978882834399\"),\n new BN(\"8131365268884726200\"),\n new BN(\"3584323654723342297\"),\n new BN(\"696457651847595233\"),\n new BN(\"26294789957452057\"),\n new BN(\"37481735321082\"),\n];\n\nconst POS_TICK_MULTIPLIERS: BN[] = [\n new BN(\"79232123823359799118286999567\"),\n new BN(\"79236085330515764027303304731\"),\n new BN(\"79244008939048815603706035061\"),\n new BN(\"79259858533276714757314932305\"),\n new BN(\"79291567232598584799939703904\"),\n new BN(\"79355022692464371645785046466\"),\n new BN(\"79482085999252804386437311141\"),\n new BN(\"79736823300114093921829183326\"),\n new BN(\"80248749790819932309965073892\"),\n new BN(\"81282483887344747381513967011\"),\n new BN(\"83390072131320151908154831281\"),\n new BN(\"87770609709833776024991924138\"),\n new BN(\"97234110755111693312479820773\"),\n new BN(\"119332217159966728226237229890\"),\n new BN(\"179736315981702064433883588727\"),\n new BN(\"407748233172238350107850275304\"),\n new BN(\"2098478828474011932436660412517\"),\n new BN(\"55581415166113811149459800483533\"),\n new BN(\"38992368544603139932233054999993551\"),\n];\n\nconst BASE_NEG = new BN(\"18446744073709551616\"); // 2^64\nconst BASE_POS = new BN(\"79228162514264337593543950336\");\n\nexport function getSqrtPriceAtTick(tick: number): BN {\n if (tick < -443636 || tick > 443636) throw new Error(\"Invalid tick\");\n if (tick < 0) return getSqrtPriceAtNegativeTick(tick);\n return getSqrtPriceAtPositiveTick(tick);\n}\n\nfunction getSqrtPriceAtNegativeTick(tick: number): BN {\n const absTick = Math.abs(tick);\n let ratio = absTick & 0x1 ? new BN(NEG_TICK_MULTIPLIERS[0]) : new BN(BASE_NEG);\n for (let i = 1; i < 19; i++) {\n if (absTick & (1 << i)) {\n ratio = mulShr(ratio, NEG_TICK_MULTIPLIERS[i], 64);\n }\n }\n return ratio;\n}\n\nfunction getSqrtPriceAtPositiveTick(tick: number): BN {\n const absTick = Math.abs(tick);\n let ratio = absTick & 0x1 ? new BN(POS_TICK_MULTIPLIERS[0]) : new BN(BASE_POS);\n for (let i = 1; i < 19; i++) {\n if (absTick & (1 << i)) {\n ratio = mulShr(ratio, POS_TICK_MULTIPLIERS[i], 96);\n }\n }\n return ratio.shrn(32);\n}\n\nexport function getTickAtSqrtPrice(sqrtPrice: BN): number {\n if (sqrtPrice.lt(MIN_SQRT_PRICE_X64) || sqrtPrice.gt(MAX_SQRT_PRICE_X64)) {\n throw new Error(\"Invalid sqrt price\");\n }\n\n let r = sqrtPrice.clone();\n let msb = 0;\n\n if (r.gte(new BN(1).shln(64))) { msb |= 64; r = r.shrn(64); }\n if (r.gte(new BN(1).shln(32))) { msb |= 32; r = r.shrn(32); }\n if (r.gte(new BN(1).shln(16))) { msb |= 16; r = r.shrn(16); }\n if (r.gte(new BN(1).shln(8))) { msb |= 8; r = r.shrn(8); }\n if (r.gte(new BN(1).shln(4))) { msb |= 4; r = r.shrn(4); }\n if (r.gte(new BN(1).shln(2))) { msb |= 2; r = r.shrn(2); }\n if (r.gte(new BN(2))) { msb |= 1; }\n\n let log2_x32 = new BN(msb - 64).shln(32);\n r = msb >= 64 ? sqrtPrice.shrn(msb - 63) : sqrtPrice.shln(63 - msb);\n\n for (let shift = 31; shift >= 18; shift--) {\n r = r.mul(r).shrn(63);\n const f = r.shrn(64).toNumber();\n log2_x32 = log2_x32.or(new BN(f).shln(shift));\n r = r.shrn(f);\n }\n\n const log_sqrt_10001 = log2_x32.mul(new BN(\"59543866431366\"));\n\n const tickLow = log_sqrt_10001\n .sub(new BN(\"184467440737095516\"))\n .shrn(64)\n .toNumber();\n\n const tickHigh = log_sqrt_10001\n .add(new BN(\"15793534762490258745\"))\n .shrn(64)\n .toNumber();\n\n if (tickLow === tickHigh) return tickLow;\n if (getSqrtPriceAtTick(tickHigh).lte(sqrtPrice)) return tickHigh;\n return tickLow;\n}\n\n// ============================================================\n// CLMM Math - Delta Calculations (Q64.64 fixed point)\n// ============================================================\n\nfunction getDeltaA(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const diff = sqrtPrice0.gt(sqrtPrice1)\n ? sqrtPrice0.sub(sqrtPrice1)\n : sqrtPrice1.sub(sqrtPrice0);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n const numerator = liquidity.mul(diff).shln(64);\n const denominator = sqrtPrice0.mul(sqrtPrice1);\n return divRound(numerator, denominator, roundUp);\n}\n\nfunction getDeltaB(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const diff = sqrtPrice0.gt(sqrtPrice1)\n ? sqrtPrice0.sub(sqrtPrice1)\n : sqrtPrice1.sub(sqrtPrice0);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n const product = liquidity.mul(diff);\n const lo64Mask = new BN(1).shln(64).sub(ONE);\n const shouldRoundUp = roundUp && product.and(lo64Mask).gt(ZERO);\n const result = product.shrn(64);\n return shouldRoundUp ? result.add(ONE) : result;\n}\n\nfunction getDeltaUpFromInput(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n a2b: boolean\n): BN {\n const diff = currentSqrtPrice.gt(targetSqrtPrice)\n ? currentSqrtPrice.sub(targetSqrtPrice)\n : targetSqrtPrice.sub(currentSqrtPrice);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n if (a2b) {\n const numerator = liquidity.mul(diff).shln(64);\n const denominator = currentSqrtPrice.mul(targetSqrtPrice);\n return divRound(numerator, denominator, true);\n } else {\n const product = liquidity.mul(diff);\n const lo64Mask = new BN(1).shln(64).sub(ONE);\n const shouldRoundUp = product.and(lo64Mask).gt(ZERO);\n const result = product.shrn(64);\n return shouldRoundUp ? result.add(ONE) : result;\n }\n}\n\nfunction getDeltaDownFromOutput(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n a2b: boolean\n): BN {\n const diff = currentSqrtPrice.gt(targetSqrtPrice)\n ? currentSqrtPrice.sub(targetSqrtPrice)\n : targetSqrtPrice.sub(currentSqrtPrice);\n if (diff.isZero() || liquidity.isZero()) return ZERO;\n\n if (a2b) {\n return liquidity.mul(diff).shrn(64);\n } else {\n const numerator = liquidity.mul(diff).shln(64);\n const denominator = currentSqrtPrice.mul(targetSqrtPrice);\n return divRound(numerator, denominator, false);\n }\n}\n\nfunction getNextSqrtPriceFromInput(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n a2b: boolean\n): BN {\n if (amount.isZero()) return sqrtPrice;\n if (a2b) {\n const numerator = sqrtPrice.mul(liquidity).shln(64);\n const liquidityShl64 = liquidity.shln(64);\n const product = sqrtPrice.mul(amount);\n const denominator = liquidityShl64.add(product);\n return divRound(numerator, denominator, true);\n } else {\n const deltaSqrtPrice = divRound(amount.shln(64), liquidity, false);\n return sqrtPrice.add(deltaSqrtPrice);\n }\n}\n\nfunction getNextSqrtPriceFromOutput(\n sqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n a2b: boolean\n): BN {\n if (amount.isZero()) return sqrtPrice;\n if (a2b) {\n const deltaSqrtPrice = divRound(amount.shln(64), liquidity, true);\n return sqrtPrice.sub(deltaSqrtPrice);\n } else {\n const numerator = sqrtPrice.mul(liquidity).shln(64);\n const liquidityShl64 = liquidity.shln(64);\n const product = sqrtPrice.mul(amount);\n const denominator = liquidityShl64.sub(product);\n return divRound(numerator, denominator, true);\n }\n}\n\n// ============================================================\n// Compute Swap Step\n// ============================================================\n\ninterface SwapStepComputed {\n amountIn: BN;\n amountOut: BN;\n nextSqrtPrice: BN;\n feeAmount: BN;\n}\n\nfunction computeSwapStep(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n collectFeeOnInput: boolean,\n feeRate: BN,\n a2b: boolean,\n byAmountIn: boolean\n): SwapStepComputed {\n let nextSqrtPrice = targetSqrtPrice.clone();\n let amountIn = ZERO;\n let amountOut = ZERO;\n let feeAmount = ZERO;\n\n if (liquidity.isZero()) {\n return { amountIn, amountOut, nextSqrtPrice, feeAmount };\n }\n\n if (byAmountIn) {\n if (collectFeeOnInput) {\n const amountRemain = mulDivFloor(amount, PRECISION.sub(feeRate), PRECISION);\n const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\n if (maxAmountIn.gt(amountRemain)) {\n amountIn = amountRemain;\n feeAmount = amount.sub(amountRemain);\n nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amountRemain, a2b);\n } else {\n amountIn = maxAmountIn;\n feeAmount = mulDivCeil(amountIn, feeRate, PRECISION.sub(feeRate));\n nextSqrtPrice = targetSqrtPrice;\n }\n amountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b);\n } else {\n const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\n if (maxAmountIn.gt(amount)) {\n amountIn = amount;\n nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amount, a2b);\n } else {\n amountIn = maxAmountIn;\n nextSqrtPrice = targetSqrtPrice;\n }\n const grossAmountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b);\n feeAmount = mulDivCeil(grossAmountOut, feeRate, PRECISION);\n amountOut = grossAmountOut.sub(feeAmount);\n }\n } else {\n if (collectFeeOnInput) {\n const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\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 = mulDivCeil(amountIn, feeRate, PRECISION.sub(feeRate));\n } else {\n const amountWithFee = mulDivCeil(amount, PRECISION, PRECISION.sub(feeRate));\n const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b);\n\n if (maxAmountOut.gt(amountWithFee)) {\n nextSqrtPrice = getNextSqrtPriceFromOutput(currentSqrtPrice, liquidity, amountWithFee, a2b);\n amountOut = amount;\n feeAmount = amountWithFee.sub(amount);\n } else {\n const grossOut = maxAmountOut;\n feeAmount = mulDivCeil(grossOut, feeRate, PRECISION);\n amountOut = grossOut.sub(feeAmount);\n nextSqrtPrice = targetSqrtPrice;\n }\n amountIn = getDeltaUpFromInput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b);\n }\n }\n\n return { amountIn, amountOut, nextSqrtPrice, feeAmount };\n}\n\n// ============================================================\n// Fee Scheduler - Base Fee Calculation\n// ============================================================\n\nfunction getBaseFee(\n params: Pool[\"parameters\"],\n currentTimestampMs: BN\n): BN {\n const feeRate = new BN(params.feeRate);\n\n if (!params.enabledFeeScheduler || toBN(params.activationTimestamp).isZero()) {\n return feeRate;\n }\n\n const activationTs = toBN(params.activationTimestamp);\n const periodFrequency = new BN(params.periodFrequency);\n const numberOfPeriod = new BN(params.numberOfPeriod);\n const cliffFee = toBN(params.cliffFeeNumerator);\n const reductionFactor = toBN(params.feeSchedulerReductionFactor);\n\n let period: BN;\n if (periodFrequency.isZero()) {\n period = ZERO;\n } else if (currentTimestampMs.lt(activationTs)) {\n period = numberOfPeriod;\n } else {\n const elapsed = currentTimestampMs.sub(activationTs);\n period = BN.min(elapsed.div(periodFrequency), numberOfPeriod);\n }\n\n if (period.eq(numberOfPeriod)) {\n return feeRate;\n }\n\n const feeSchedulerMode = Number(params.feeSchedulerMode);\n\n if (feeSchedulerMode === 1) {\n return getBaseFeeExponential(cliffFee, reductionFactor, period);\n } else {\n const totalReduction = reductionFactor.mul(period);\n return cliffFee.sub(totalReduction);\n }\n}\n\nfunction getBaseFeeExponential(cliffFee: BN, reductionFactor: BN, period: BN): BN {\n const scale = new BN(1).shln(64);\n const basisPointMax = new BN(10000);\n\n const base = scale.sub(mulDivFloor(reductionFactor, scale, basisPointMax));\n const totalReduction = powQ64x64(base, period);\n\n return mulDivFloor(cliffFee, totalReduction, scale);\n}\n\nfunction powQ64x64(base: BN, exp: BN): BN {\n const scale = new BN(1).shln(64);\n let result = scale.clone();\n let b = base.clone();\n let e = exp.clone();\n\n while (e.gt(ZERO)) {\n if (e.and(ONE).eq(ONE)) {\n result = result.mul(b).shrn(64);\n }\n b = b.mul(b).shrn(64);\n e = e.shrn(1);\n }\n return result;\n}\n\n// ============================================================\n// Dynamic Fee (Variable Fee from volatility)\n// ============================================================\n\nfunction getVariableFee(params: Pool[\"parameters\"], volatilityAccumulator: number): BN {\n if (!params.enabledDynamicFee) return ZERO;\n if (params.variableFeeControl === 0) return ZERO;\n\n const volatility = new BN(volatilityAccumulator);\n const step = new BN(params.tickSpacing);\n const vfc = new BN(params.variableFeeControl);\n\n const prod = volatility.mul(step);\n return prod.mul(prod).mul(vfc).add(new BN(99)).div(new BN(100));\n}\n\n// ============================================================\n// Volatility Params (simulation copy, avoid mutating pool)\n// ============================================================\n\ninterface VolatilityParams {\n volatilityAccumulator: number;\n volatilityReference: number;\n idReference: number;\n timeOfLastUpdate: number;\n}\n\nfunction updateReferences(\n vol: VolatilityParams,\n params: Pool[\"parameters\"],\n timestampSec: number\n): void {\n const dt = timestampSec - vol.timeOfLastUpdate;\n\n if (dt >= Number(params.filterPeriod)) {\n vol.idReference = params.currentTickIndex;\n if (dt < Number(params.decayPeriod)) {\n const volAcc = vol.volatilityAccumulator;\n const rf = params.reductionFactor;\n const volRef = Math.floor((volAcc * rf) / 10000);\n vol.volatilityReference = Math.min(volRef, 0xfffff);\n } else {\n vol.volatilityReference = 0;\n }\n }\n\n vol.timeOfLastUpdate = timestampSec;\n}\n\nfunction updateVolatilityAccumulator(\n vol: VolatilityParams,\n params: Pool[\"parameters\"],\n activeId: number\n): void {\n const idRef = vol.idReference;\n const idDiff = Math.abs(activeId - idRef);\n const deltaId = Math.floor(idDiff / params.tickSpacing);\n\n const volRef = vol.volatilityReference;\n const volatilityPerBin = 10;\n const volAcc = volRef + deltaId * volatilityPerBin;\n vol.volatilityAccumulator = Math.min(volAcc, params.maxVolatilityAccumulator);\n}\n\n// ============================================================\n// Tick Navigation\n// ============================================================\n\nfunction findFirstTickForSwap(\n ticks: TickData[],\n currentTickIndex: number,\n a2b: boolean\n): number {\n if (a2b) {\n for (let i = ticks.length - 1; i >= 0; i--) {\n if (ticks[i].index <= currentTickIndex) return i;\n }\n return -1;\n } else {\n for (let i = 0; i < ticks.length; i++) {\n if (ticks[i].index > currentTickIndex) return i;\n }\n return -1;\n }\n}\n\nfunction getNextTickArrayIndex(currentIdx: number, a2b: boolean): number {\n return a2b ? currentIdx - 1 : currentIdx + 1;\n}\n\n// ============================================================\n// Main: simulateSwap\n// Port of calculate_swap_result from pool.move\n// ============================================================\n\n/**\n * Simulate a swap on a CLMM pool.\n *\n * @param pool - Pool object (from on-chain, matches the Pool type)\n * @param ticks - Sorted array of initialized TickData (ascending by index)\n * @param a2b - true = swap token A → B, false = swap B → A\n * @param byAmountIn - true = amount is input, false = amount is desired output\n * @param amount - The swap amount (u64)\n * @param currentTimestampMs - Current timestamp in milliseconds\n */\nexport function simulateSwap(\n pool: Pool,\n ticks: TickData[],\n a2b: boolean,\n byAmountIn: boolean,\n amount: BN,\n currentTimestampMs: BN,\n): CalculatedSwapResult {\n const params = pool.parameters;\n const collectFeeMode = pool.collectFeeMode;\n const isQuoteY = pool.isQuoteY;\n\n let currentSqrtPrice = toBN(params.currentSqrtPrice);\n let currentLiquidity = new BN(pool.liquidity);\n\n const TIMESTAMP_DIVISOR = 1000;\n const currentTimestampSec = Math.floor(\n currentTimestampMs.toNumber() / TIMESTAMP_DIVISOR\n );\n\n // Clone volatility params for simulation\n const vol: VolatilityParams = {\n volatilityAccumulator: params.volatilityAccumulator,\n volatilityReference: params.volatilityReference,\n idReference: params.idReference,\n timeOfLastUpdate: params.timeOfLastUpdate,\n };\n\n updateReferences(vol, params, currentTimestampSec);\n\n // Determine collect_fee_on_input\n let collectFeeOnInput: boolean;\n if (collectFeeMode === COLLECT_FEE_MODE_ON_BOTH) {\n collectFeeOnInput = true;\n } else if (collectFeeMode === COLLECT_FEE_MODE_ON_QUOTE) {\n collectFeeOnInput = (a2b && !isQuoteY) || (!a2b && isQuoteY);\n } else {\n collectFeeOnInput = true;\n }\n\n let remainingAmount = amount.clone();\n let tickIdx = findFirstTickForSwap(ticks, params.currentTickIndex, a2b);\n\n const result: CalculatedSwapResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n feeAmount: ZERO,\n baseFee: ZERO,\n dynamicFee: ZERO,\n beforeSqrtPrice: currentSqrtPrice.clone(),\n afterSqrtPrice: currentSqrtPrice.clone(),\n isExceed: false,\n collectFeeOnInput,\n stepResults: [],\n };\n\n while (remainingAmount.gt(ZERO)) {\n if (tickIdx < 0 || tickIdx >= ticks.length) {\n result.isExceed = true;\n break;\n }\n\n const tick = ticks[tickIdx];\n const tickSqrtPrice = tick.sqrtPrice.isZero()\n ? getSqrtPriceAtTick(tick.index)\n : tick.sqrtPrice;\n\n // Update volatility accumulator for this tick\n updateVolatilityAccumulator(vol, params, tick.index);\n\n // Calculate total fee rate with updated volatility\n const baseFeeRate = getBaseFee(params, currentTimestampMs);\n const variableFee = getVariableFee(params, vol.volatilityAccumulator);\n const feeRate = BN.min(baseFeeRate.add(variableFee), MAX_FEE);\n\n // Compute swap step\n const stepResult = computeSwapStep(\n currentSqrtPrice,\n tickSqrtPrice,\n currentLiquidity,\n remainingAmount,\n collectFeeOnInput,\n feeRate,\n a2b,\n byAmountIn\n );\n\n // Update remaining amount\n if (!stepResult.amountIn.isZero() || !stepResult.feeAmount.isZero()) {\n if (byAmountIn) {\n if (collectFeeOnInput) {\n const afterFee = remainingAmount.sub(stepResult.amountIn);\n remainingAmount = afterFee.sub(stepResult.feeAmount);\n } else {\n remainingAmount = remainingAmount.sub(stepResult.amountIn);\n }\n } else {\n remainingAmount = remainingAmount.sub(stepResult.amountOut);\n }\n\n // Split fee into base_fee and dynamic_fee portions\n let stepBaseFee: BN;\n let stepDynamicFee: BN;\n if (feeRate.isZero()) {\n stepBaseFee = ZERO;\n stepDynamicFee = ZERO;\n } else {\n stepBaseFee = mulDivCeil(stepResult.feeAmount, baseFeeRate, feeRate);\n stepDynamicFee = stepResult.feeAmount.sub(stepBaseFee);\n }\n\n result.amountIn = result.amountIn.add(stepResult.amountIn);\n result.amountOut = result.amountOut.add(stepResult.amountOut);\n result.feeAmount = result.feeAmount.add(stepResult.feeAmount);\n result.baseFee = result.baseFee.add(stepBaseFee);\n result.dynamicFee = result.dynamicFee.add(stepDynamicFee);\n }\n\n // Record step\n result.stepResults.push({\n currentSqrtPrice: currentSqrtPrice.clone(),\n targetSqrtPrice: tickSqrtPrice.clone(),\n currentLiquidity: currentLiquidity.clone(),\n amountIn: stepResult.amountIn,\n amountOut: stepResult.amountOut,\n feeAmount: stepResult.feeAmount,\n remainderAmount: remainingAmount.clone(),\n });\n\n // Cross tick if we reached the target\n if (stepResult.nextSqrtPrice.eq(tickSqrtPrice)) {\n currentSqrtPrice = tickSqrtPrice;\n\n // Apply liquidity net (negate for a2b direction)\n let liquidityNet = tick.liquidityNet.clone();\n if (a2b) {\n liquidityNet = liquidityNet.neg();\n }\n\n if (liquidityNet.gte(ZERO)) {\n currentLiquidity = currentLiquidity.add(liquidityNet);\n } else {\n currentLiquidity = currentLiquidity.sub(liquidityNet.abs());\n }\n\n // Move to next tick in sorted array\n tickIdx = getNextTickArrayIndex(tickIdx, a2b);\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice;\n }\n }\n\n // Adjust amount_in to include fee if collected on input\n if (collectFeeOnInput) {\n result.amountIn = result.amountIn.add(result.feeAmount);\n }\n\n result.afterSqrtPrice = currentSqrtPrice;\n\n return result;\n}\n\n// ============================================================\n// Convenience: getSwapOut\n// ============================================================\n\n/**\n * Simulate a swap and return a simple quote.\n *\n * @param pool - Pool object (from on-chain)\n * @param ticks - Sorted initialized ticks (ascending by index)\n * @param a2b - true = swap token A → B, false = swap B → A\n * @param amountIn - Amount of input token (as string or BN)\n * @param currentTimestampMs - Current timestamp in milliseconds\n */\nexport function getSwapOut(\n pool: Pool,\n ticks: TickData[],\n a2b: boolean,\n amountIn: string | BN,\n currentTimestampMs: number | BN,\n): SwapQuote {\n const amount = typeof amountIn === \"string\" ? new BN(amountIn) : amountIn;\n const ts =\n typeof currentTimestampMs === \"number\"\n ? new BN(currentTimestampMs)\n : currentTimestampMs;\n\n const result = simulateSwap(\n pool,\n ticks,\n a2b,\n true,\n amount,\n ts,\n );\n\n // Calculate price impact\n const beforePrice = toBN(pool.parameters.currentSqrtPrice);\n const afterPrice = result.afterSqrtPrice;\n let priceImpact = 0;\n if (!beforePrice.isZero()) {\n const diff = afterPrice.gt(beforePrice)\n ? afterPrice.sub(beforePrice)\n : beforePrice.sub(afterPrice);\n priceImpact =\n diff.mul(new BN(10000)).div(beforePrice).toNumber() / 100;\n }\n\n return {\n amountIn: result.amountIn.toString(),\n amountOut: result.amountOut.toString(),\n feeAmount: result.feeAmount.toString(),\n baseFee: result.baseFee.toString(),\n dynamicFee: result.dynamicFee.toString(),\n isExceed: result.isExceed,\n afterSqrtPrice: result.afterSqrtPrice.toString(),\n priceImpact,\n steps: result.stepResults.length,\n };\n}\n\n// ============================================================\n// Usage Example\n// ============================================================\n\n/*\nimport { getSwapOut, Pool, TickData } from \"./simulate_swap\";\nimport BN from \"bn.js\";\n\n// 1. Fetch pool & ticks from on-chain\nconst pool: Pool = { ... }; // your Pool object\nconst ticks: TickData[] = [ ... ]; // sorted ascending by index\n\n// 2. Get swap quote: swap 1_000_000 of token A → token B\nconst quote = getSwapOut(pool, ticks, true, \"1000000\", Date.now());\nconsole.log(\"Amount out:\", quote.amountOut);\nconsole.log(\"Fee:\", quote.feeAmount);\nconsole.log(\"Price impact:\", quote.priceImpact, \"%\");\nconsole.log(\"Steps:\", quote.steps);\n\n// 3. Swap B → A\nconst quoteB2A = getSwapOut(pool, ticks, false, \"500000\", Date.now());\nconsole.log(\"Amount out:\", quoteB2A.amountOut);\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 { DammConfig, 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 (DAMM) pool configurations.\n */\n damm_pool: Package<DammConfig>\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 FerraDammSDK, which is almost responsible for all interactions with DAMM.\n */\nexport class FerraDammSDK {\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 damm pools with a pool router interface.\n */\n protected _pool: PoolModule\n\n /**\n * Provide interact with damm 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 { FerraDammSDK, SdkOptions } from './sdk'\n\nexport { FerraDammSDK }\nexport type { SdkOptions }\n\nexport default FerraDammSDK","import FerraDammSDK, { SdkOptions } from '../main'\nimport { checkValidSuiAddress } from '../utils'\n\nconst SDKConfig = {\n dammConfig: {\n pools_id: '0xf7774e82131b6c581987000046826d1b902c7acba2887d26cc2bccfeff1ace01',\n global_config_id: '0x872637215dbee83854692ac83237a34eaae8ef784d43548fc80ac6c7b5c8fdd1',\n global_rewarder_vault_id: '0xafe43ac8ba302f77f9d9ba46ec1a1d43e748a474b7616a99242ee49ca31adfd5'\n }\n}\n\n// mainnet\nexport const dammMainnet: SdkOptions = {\n fullRpcUrl: 'https://mainnet.suiet.app:443',\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n damm_pool: {\n package_id: '0x9c81b37498c1a49e18993b358fdf715154e36663f99147ef98b7a0c8bfbc9d4e',\n published_at: '0x9c81b37498c1a49e18993b358fdf715154e36663f99147ef98b7a0c8bfbc9d4e',\n config: SDKConfig.dammConfig,\n },\n integrate: {\n package_id: '0x37e8a1abf987431fa2c732808a45d3f4d307cd5ced734b920244540fd8be3a3e',\n published_at: '0x37e8a1abf987431fa2c732808a45d3f4d307cd5ced734b920244540fd8be3a3e',\n },\n swapCountUrl: 'https://api.ferra.xyz/damm/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): FerraDammSDK {\n if (fullNodeUrl) {\n dammMainnet.fullRpcUrl = fullNodeUrl\n }\n const sdk = new FerraDammSDK(dammMainnet)\n if (wallet && checkValidSuiAddress(wallet)) {\n sdk.senderAddress = wallet\n }\n return sdk\n}\n","import FerraDammSDK, { SdkOptions } from '../main'\nimport { checkValidSuiAddress } from '../utils'\n\n\nconst SDKConfig = {\n dammConfig: {\n pools_id: '0xb043187ee46183afa5736d88a5882cb7da3c805aa76b7021065bcd3d7cf36b9b',\n global_config_id: '0x0127b12b47d46c80e988efb47dd26ee93d549999293bb96e5de99443883f3d60',\n global_rewarder_vault_id: '0x02f83bca10e586ef9acd01209dbeb7d013ff3453760e7c0e6dea2e00ac93434a'\n }\n}\n\n// test on mainnet\nexport const dammTestnet: SdkOptions = {\n fullRpcUrl: 'https://mainnet.suiet.app:443',\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n damm_pool: {\n package_id: '0xf9df0f7fab7c453818f33f04c6dbb7518c369fd879b7535d39e683a45bafae19',\n published_at: '0xf9df0f7fab7c453818f33f04c6dbb7518c369fd879b7535d39e683a45bafae19',\n config: SDKConfig.dammConfig,\n },\n integrate: {\n package_id: '0x93835d11de5bba7bd1dc4d180a48d82ee718d32024070247d5549aea4ddd26b9',\n published_at: '0x93835d11de5bba7bd1dc4d180a48d82ee718d32024070247d5549aea4ddd26b9',\n },\n swapCountUrl: 'https://api-dev.ferra.xyz/damm/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): FerraDammSDK {\n if (fullNodeUrl) {\n dammTestnet.fullRpcUrl = fullNodeUrl\n }\n const sdk = new FerraDammSDK(dammTestnet)\n if (wallet && checkValidSuiAddress(wallet)) {\n sdk.senderAddress = wallet\n }\n return sdk\n}\n","import FerraDammSDK, { SdkOptions } from '../main'\nimport { checkValidSuiAddress } from '../utils'\n\n\nconst SDKConfig = {\n dammConfig: {\n pools_id: '0xadae2faa029b3b0be430e3b1b787ac0d528f3b3be9d32c61530fabaa6f171431',\n global_config_id: '0x2d1269e1ade81a5189b625ee87c9425bc29249d21d273245269eb07e67dc6965',\n global_rewarder_vault_id: '0xbe8d4702ed1f4bf2ad8101ee68d785538fb6d50e2f187bbafd134d1e2c67aa89'\n }\n}\n//https://suivision.xyz/txblock/B4WbFgHnh8j5VYJstjQog87hsK5ya7sbXmjsBSF87ogj?tab=Changes\n// https://suivision.xyz/txblock/8LQqVty6723xznbMVeasAxbAtqyBwsTbcYTZvpjmkGuQ?tab=Changes\n// test on mainnet\nexport const dammBeta: SdkOptions = {\n fullRpcUrl: 'https://mainnet.suiet.app:443',\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n damm_pool: {\n package_id: '0x8e1144ad9fbc388c61ac30d74ebef4eb741d213e3a086da48124256290233723',\n published_at: '0x8e1144ad9fbc388c61ac30d74ebef4eb741d213e3a086da48124256290233723',\n config: SDKConfig.dammConfig,\n },\n integrate: {\n package_id: '0x46f0964200ea12c1bd3f7280cb49f55c11e4c0df8ae2a40f71253a3a19859a17',\n published_at: '0x46f0964200ea12c1bd3f7280cb49f55c11e4c0df8ae2a40f71253a3a19859a17',\n },\n swapCountUrl: 'https://api-beta.ferra.xyz/damm/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): FerraDammSDK {\n if (fullNodeUrl) {\n dammBeta.fullRpcUrl = fullNodeUrl\n }\n const sdk = new FerraDammSDK(dammBeta)\n if (wallet && checkValidSuiAddress(wallet)) {\n sdk.senderAddress = wallet\n }\n return sdk\n}\n","import FerraDammSDK 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): FerraDammSDK {\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 initFerraDammSDK(options: InitFerraSDKOptions): FerraDammSDK {\n return initFerraSDK(options)\n}\n","import { FerraDammSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './math'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport type { SdkOptions }\nexport { FerraDammSDK }\nexport default FerraDammSDK\n"]}
|