@magmaprotocol/magma-clmm-sdk 0.5.82 → 0.5.83
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.d.ts +1 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/poolModule.ts","../src/utils/cachedContent.ts","../src/utils/common.ts","../src/types/clmmpool.ts","../src/math/utils.ts","../src/utils/decimal.ts","../src/errors/errors.ts","../src/types/constants.ts","../src/types/sui.ts","../src/types/clmm_type.ts","../src/types/liquidity.ts","../src/math/apr.ts","../src/math/tick.ts","../src/math/clmm.ts","../src/math/swap.ts","../src/utils/contracts.ts","../src/utils/hex.ts","../src/math/CoinAssist.ts","../src/math/collect-fees.ts","../src/math/dlmmWeightToAmounts.ts","../src/math/dlmmStrategy.ts","../src/math/LiquidityHelper.ts","../src/utils/numbers.ts","../src/math/percentage.ts","../src/math/position.ts","../src/math/SplitSwap.ts","../src/math/bin.ts","../src/utils/objects.ts","../src/utils/tick.ts","../src/utils/transaction-util.ts","../src/utils/tx-block.ts","../src/utils/deepbook-utils.ts","../src/modules/positionModule.ts","../src/modules/rewarderModule.ts","../src/modules/routerModule.ts","../src/modules/swapModule.ts","../src/modules/lockModule.ts","../src/modules/tokenModule.ts","../src/modules/routerModuleV2.ts","../src/modules/configModule.ts","../src/modules/rpcModule.ts","../src/modules/gaugeModule.ts","../src/modules/dlmm.ts","../src/sdk.ts","../src/config/mainnet.ts","../src/main.ts","../src/config/testnet.ts","../src/config/config.ts","../src/index.ts"],"sourcesContent":["import { DynamicFieldPage, SuiObjectResponse, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { CachedContent, cacheTime24h, cacheTime5min, checkInvalidSuiAddress, getFutureTime } from '../utils'\nimport {\n CreatePoolAddLiquidityParams,\n CreatePoolParams,\n FetchParams,\n ClmmConfig,\n Pool,\n PoolImmutables,\n Position,\n PositionReward,\n getPackagerConfigs,\n CoinAsset,\n} from '../types'\nimport { TransactionUtil } from '../utils/transaction-util'\nimport { tickScore } from '../math'\nimport { asUintN, buildPool, buildPositionReward, buildTickData, buildTickDataByEvent } from '../utils/common'\nimport { extractStructTagFromType, isSortedSymbols } from '../utils/contracts'\nimport { TickData } from '../types/clmmpool'\nimport {\n ClmmFetcherModule,\n ClmmIntegratePoolModule,\n ClmmPartnerModule,\n CLOCK_ADDRESS,\n DataPage,\n PaginationArgs,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport {\n ClmmpoolsError,\n ConfigErrorCode,\n PartnerErrorCode,\n PoolErrorCode,\n PositionErrorCode,\n RouterErrorCode,\n UtilsErrorCode,\n} from '../errors/errors'\n\ntype GetTickParams = {\n start: number[]\n limit: number\n} & FetchParams\n\n/**\n * Helper class to help interact with clmm pools with a pool router interface.\n */\nexport class PoolModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Gets a list of positions for the given positionHandle.\n * @param {string} positionHandle The handle for the position.\n * @returns {DataPage<Position>} A promise that resolves to an array of Position objects.\n */\n async getPositionList(positionHandle: string, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<Position>> {\n const dataPage: DataPage<Position> = {\n data: [],\n hasNextPage: true,\n }\n const objects = await this._sdk.fullClient.getDynamicFieldsByPage(positionHandle, paginationArgs)\n\n dataPage.hasNextPage = objects.hasNextPage\n dataPage.nextCursor = objects.nextCursor\n\n const positionObjectIDs = objects.data.map((item: any) => {\n if (item.error != null) {\n throw new ClmmpoolsError(\n `when getPositionList get position objects error: ${item.error}, please check the rpc, contracts address config and position id.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n return item.name.value\n })\n\n const allPosition: Position[] = await this._sdk.Position.getSipmlePositionList(positionObjectIDs)\n dataPage.data = allPosition\n return dataPage\n }\n\n /**\n * Gets a list of pool immutables.\n * @param {string[]} assignPoolIDs An array of pool IDs to get.\n * @param {number} offset The offset to start at.\n * @param {number} limit The number of pools to get.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n * @returns {Promise<PoolImmutables[]>} array of PoolImmutable objects.\n */\n async getPoolImmutables(assignPoolIDs: string[] = [], offset = 0, limit = 100, forceRefresh = false): Promise<PoolImmutables[]> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const cacheKey = `${package_id}_getInitPoolEvent`\n const cacheData = this.getCache<PoolImmutables[]>(cacheKey, forceRefresh)\n\n const allPools: PoolImmutables[] = []\n const filterPools: PoolImmutables[] = []\n\n if (cacheData !== undefined) {\n allPools.push(...cacheData)\n }\n\n if (allPools.length === 0) {\n try {\n const objects = await this._sdk.fullClient.queryEventsByPage({ MoveEventType: `${package_id}::factory::CreatePoolEvent` })\n\n objects.data.forEach((object: any) => {\n const fields = object.parsedJson\n if (fields) {\n allPools.push({\n poolAddress: fields.pool_id,\n tickSpacing: fields.tick_spacing,\n coinTypeA: extractStructTagFromType(fields.coin_type_a).full_address,\n coinTypeB: extractStructTagFromType(fields.coin_type_b).full_address,\n })\n }\n })\n this.updateCache(cacheKey, allPools, cacheTime24h)\n } catch (error) {\n console.log('getPoolImmutables', error)\n }\n }\n\n const hasAssignPools = assignPoolIDs.length > 0\n for (let index = 0; index < allPools.length; index += 1) {\n const item = allPools[index]\n if (hasAssignPools && !assignPoolIDs.includes(item.poolAddress)) continue\n if (!hasAssignPools && (index < offset || index >= offset + limit)) continue\n filterPools.push(item)\n }\n return filterPools\n }\n\n /**\n * Gets a list of pools.\n * @param {string[]} assignPools An array of pool IDs to get.\n * @param {number} offset The offset to start at.\n * @param {number} limit The number of pools to get.\n * @returns {Promise<Pool[]>} array of Pool objects.\n */\n async getPools(assignPools: string[] = [], offset = 0, limit = 100): Promise<Pool[]> {\n const allPool: Pool[] = []\n let poolObjectIds: string[] = []\n\n if (assignPools.length > 0) {\n poolObjectIds = [...assignPools]\n } else {\n const poolImmutables = await this.getPoolImmutables([], offset, limit, false)\n poolImmutables.forEach((item) => poolObjectIds.push(item.poolAddress))\n }\n\n const objectDataResponses = await this._sdk.fullClient.batchGetObjects(poolObjectIds, {\n showContent: true,\n showType: true,\n })\n\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPools error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n\n const pool = buildPool(suiObj)\n allPool.push(pool)\n const cacheKey = `${pool.poolAddress}_getPoolObject`\n this.updateCache(cacheKey, pool, cacheTime24h)\n }\n return allPool\n }\n\n /**\n * Gets a list of pool immutables.\n * @param {PaginationArgs} paginationArgs The cursor and limit to start at.\n * @returns {Promise<DataPage<PoolImmutables>>} Array of PoolImmutable objects.\n */\n async getPoolImmutablesWithPage(paginationArgs: PaginationArgs = 'all', forceRefresh = false): Promise<DataPage<PoolImmutables>> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const allPools: PoolImmutables[] = []\n const dataPage: DataPage<PoolImmutables> = {\n data: [],\n hasNextPage: false,\n }\n\n const queryAll = paginationArgs === 'all'\n const cacheAllKey = `${package_id}_getPoolImmutables`\n if (queryAll) {\n const cacheDate = this.getCache<PoolImmutables[]>(cacheAllKey, forceRefresh)\n if (cacheDate) {\n allPools.push(...cacheDate)\n }\n }\n if (allPools.length === 0) {\n try {\n const moveEventType = `${package_id}::factory::CreatePoolEvent`\n const objects = await this._sdk.fullClient.queryEventsByPage({ MoveEventType: moveEventType }, paginationArgs)\n dataPage.hasNextPage = objects.hasNextPage\n dataPage.nextCursor = objects.nextCursor\n objects.data.forEach((object: any) => {\n const fields = object.parsedJson\n if (fields) {\n const poolImmutables = {\n poolAddress: fields.pool_id,\n tickSpacing: fields.tick_spacing,\n coinTypeA: extractStructTagFromType(fields.coin_type_a).full_address,\n coinTypeB: extractStructTagFromType(fields.coin_type_b).full_address,\n }\n allPools.push(poolImmutables)\n }\n })\n } catch (error) {\n console.log('getPoolImmutables', error)\n }\n }\n dataPage.data = allPools\n if (queryAll) {\n this.updateCache(`${package_id}_getPoolImmutables`, allPools, cacheTime24h)\n }\n return dataPage\n }\n\n /**\n * Gets a list of pools.\n * @param {string[]} assignPools An array of pool IDs to get.\n * @param {PaginationArgs} paginationArgs The cursor and limit to start at.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n * @returns {Promise<Pool[]>} An array of Pool objects.\n */\n async getPoolsWithPage(assignPools: string[] = [], paginationArgs: PaginationArgs = 'all', forceRefresh = false): Promise<Pool[]> {\n const allPool: Pool[] = []\n let poolObjectIds: string[] = []\n\n if (assignPools.length > 0) {\n poolObjectIds = [...assignPools]\n } else {\n const poolImmutables = (await this.getPoolImmutablesWithPage(paginationArgs, forceRefresh)).data\n poolImmutables.forEach((item) => poolObjectIds.push(item.poolAddress))\n }\n\n const objectDataResponses: any[] = await this._sdk.fullClient.batchGetObjects(poolObjectIds, {\n showContent: true,\n showType: true,\n })\n\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPoolWithPages error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n const pool = buildPool(suiObj)\n allPool.push(pool)\n const cacheKey = `${pool.poolAddress}_getPoolObject`\n this.updateCache(cacheKey, pool, cacheTime24h)\n }\n return allPool\n }\n\n /**\n * Gets a pool by its object ID.\n * @param {string} poolID The object ID of the pool to get.\n * @param {true} forceRefresh Whether to force a refresh of the cache.\n * @returns {Promise<Pool>} A promise that resolves to a Pool object.\n */\n async getPool(poolID: string, forceRefresh = true): Promise<Pool> {\n const cacheKey = `${poolID}_getPoolObject`\n const cacheData = this.getCache<Pool>(cacheKey, forceRefresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const object = (await this._sdk.fullClient.getObject({\n id: poolID,\n options: {\n showType: true,\n showContent: true,\n },\n })) as SuiObjectResponse\n\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPool error code: ${object.error?.code ?? 'unknown error'}, please check config and object id`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n const pool = buildPool(object)\n this.updateCache(cacheKey, pool)\n return pool\n }\n\n async getPoolByCoins(coins: string[], feeRate?: number): Promise<Pool[]> {\n if (coins.length === 0) {\n return []\n }\n\n const url = this._sdk.sdkOptions.swapCountUrl!\n const response = await fetch(url)\n let json\n try {\n json = await response.json()\n } catch (e) {\n throw new ClmmpoolsError(`Failed tp [arse response from ${url}].`, RouterErrorCode.InvalidSwapCountUrl)\n }\n const pools = json.data.pools\n if (!pools || pools.length === 0) {\n throw new ClmmpoolsError(`Failed tp [arse response from ${url}].`, PoolErrorCode.PoolsNotFound)\n }\n\n const poolAddresses = []\n for (const pool of pools) {\n if (coins.includes(pool.coin_a_address) && coins.includes(pool.coin_b_address)) {\n if (feeRate != null) {\n if (pool.object.feeRate === feeRate) {\n poolAddresses.push(pool.address)\n }\n } else {\n poolAddresses.push(pool.address)\n }\n }\n }\n\n if (poolAddresses.length > 0) {\n const poolObjects = await this.getPools(poolAddresses)\n return poolObjects\n }\n\n return []\n }\n\n /**\n * @deprecated\n * Creates a transaction payload for creating multiple pools.\n * @param {CreatePoolParams[]} paramss The parameters for the pools.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n async creatPoolsTransactionPayload(paramss: CreatePoolParams[]): Promise<Transaction> {\n for (const params of paramss) {\n if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n const swpaCoinTypeB = params.coinTypeB\n params.coinTypeB = params.coinTypeA\n params.coinTypeA = swpaCoinTypeB\n }\n }\n const payload = await this.creatPool(paramss)\n return payload\n }\n\n /**\n * @deprecated rename to createPoolTransactionPayload\n * Create a pool of clmmpool protocol. The pool is identified by (CoinTypeA, CoinTypeB, tick_spacing).\n * @param {CreatePoolParams | CreatePoolAddLiquidityParams} params\n * @returns {Promise<Transaction>}\n */\n async creatPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n const swpaCoinTypeB = params.coinTypeB\n params.coinTypeB = params.coinTypeA\n params.coinTypeA = swpaCoinTypeB\n\n const metadataB = params.metadata_b\n params.metadata_b = params.metadata_a\n params.metadata_a = metadataB\n }\n return await this.createPoolAndAddLiquidity(params)\n }\n\n /**\n * Create a pool of clmmpool protocol. The pool is identified by (CoinTypeA, CoinTypeB, tick_spacing).\n * @param {CreatePoolParams | CreatePoolAddLiquidityParams} params\n * @returns {Promise<Transaction>}\n */\n async createPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n const swpaCoinTypeB = params.coinTypeB\n params.coinTypeB = params.coinTypeA\n params.coinTypeA = swpaCoinTypeB\n const metadataB = params.metadata_b\n params.metadata_b = params.metadata_a\n params.metadata_a = metadataB\n }\n return await this.createPoolAndAddLiquidity(params)\n }\n\n /**\n * Gets the ClmmConfig object for the given package object ID.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n * @returns the ClmmConfig object.\n */\n async getClmmConfigs(forceRefresh = false): Promise<ClmmConfig> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const cacheKey = `${package_id}_getInitEvent`\n const cacheData = this.getCache<ClmmConfig>(cacheKey, forceRefresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const packageObject = await this._sdk.fullClient.getObject({\n id: package_id,\n options: { showPreviousTransaction: true },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n\n const objects = (await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })).data\n\n const clmmConfig: ClmmConfig = {\n pools_id: '',\n global_config_id: '',\n global_vault_id: '',\n admin_cap_id: '',\n }\n\n if (objects.length > 0) {\n objects.forEach((item: any) => {\n const fields = item.parsedJson as any\n\n if (item.type) {\n switch (extractStructTagFromType(item.type).full_address) {\n case `${package_id}::config::InitConfigEvent`:\n clmmConfig.global_config_id = fields.global_config_id\n clmmConfig.admin_cap_id = fields.admin_cap_id\n break\n case `${package_id}::factory::InitFactoryEvent`:\n clmmConfig.pools_id = fields.pools_id\n break\n case `${package_id}::rewarder::RewarderInitEvent`:\n clmmConfig.global_vault_id = fields.global_vault_id\n break\n case `${package_id}::partner::InitPartnerEvent`:\n clmmConfig.partners_id = fields.partners_id\n break\n default:\n break\n }\n }\n })\n this.updateCache(cacheKey, clmmConfig, cacheTime24h)\n return clmmConfig\n }\n\n return clmmConfig\n }\n\n /**\n * Gets the SUI transaction response for a given transaction digest.\n * @param digest - The digest of the transaction for which the SUI transaction response is requested.\n * @param forceRefresh - A boolean flag indicating whether to force a refresh of the response.\n * @returns A Promise that resolves with the SUI transaction block response or null if the response is not available.\n */\n async getSuiTransactionResponse(digest: string, forceRefresh = false): Promise<SuiTransactionBlockResponse | null> {\n const cacheKey = `${digest}_getSuiTransactionResponse`\n const cacheData = this.getCache<SuiTransactionBlockResponse>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n let objects\n try {\n objects = (await this._sdk.fullClient.getTransactionBlock({\n digest,\n options: {\n showEvents: true,\n showEffects: true,\n showBalanceChanges: true,\n showInput: true,\n showObjectChanges: true,\n },\n })) as SuiTransactionBlockResponse\n } catch (error) {\n objects = (await this._sdk.fullClient.getTransactionBlock({\n digest,\n options: {\n showEvents: true,\n showEffects: true,\n },\n })) as SuiTransactionBlockResponse\n }\n\n this.updateCache(cacheKey, objects, cacheTime24h)\n return objects\n }\n\n /**\n * @deprecated\n * Create pool internal.\n * @param {CreatePoolParams[]}params The parameters for the pools.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n private async creatPool(params: CreatePoolParams[]): Promise<Transaction> {\n const tx = new Transaction()\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const eventConfig = getPackagerConfigs(clmm_pool)\n const globalPauseStatusObjectId = eventConfig.global_config_id\n const poolsId = eventConfig.pools_id\n\n params.forEach((params) => {\n const args = [\n tx.object(globalPauseStatusObjectId),\n tx.object(poolsId),\n tx.pure.u32(params.tick_spacing),\n tx.pure.u128(params.initialize_sqrt_price),\n tx.pure.string(params.uri),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::create_pool`,\n typeArguments: [params.coinTypeA, params.coinTypeB],\n arguments: args,\n })\n })\n\n return tx\n }\n\n /**\n * Create pool and add liquidity internal. It will call create_pool_with_liquidity function.\n * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n private async createPoolAndAddLiquidity(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const tx = new Transaction()\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const eventConfig = getPackagerConfigs(clmm_pool)\n const globalPauseStatusObjectId = eventConfig.global_config_id\n const poolsId = eventConfig.pools_id\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinAInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_a), params.coinTypeA, false, true)\n const primaryCoinBInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_b), params.coinTypeB, false, true)\n\n const args = [\n tx.object(globalPauseStatusObjectId),\n tx.object(poolsId),\n tx.pure.u32(params.tick_spacing),\n tx.pure.u128(params.initialize_sqrt_price),\n tx.pure.string(params.uri),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputsR.targetCoin,\n primaryCoinBInputsR.targetCoin,\n tx.object(params.metadata_a),\n tx.object(params.metadata_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::pool_creator_v2::create_pool_v2`,\n typeArguments: [params.coinTypeA, params.coinTypeB],\n arguments: args,\n })\n\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 ticks from the exchange.\n * @param {FetchParams} params The parameters for the fetch.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n async fetchTicks(params: FetchParams): Promise<TickData[]> {\n let ticks: TickData[] = []\n let start: number[] = []\n const limit = 512\n\n while (true) {\n const data = await this.getTicks({\n pool_id: params.pool_id,\n coinTypeA: params.coinTypeA,\n coinTypeB: params.coinTypeB,\n start,\n limit,\n })\n ticks = [...ticks, ...data]\n if (data.length < limit) {\n break\n }\n start = [Number(asUintN(BigInt(data[data.length - 1].index)))]\n }\n return ticks\n }\n\n /**\n * Fetches ticks from the exchange using the simulation exec tx.\n * @param {GetTickParams} params The parameters for the fetch.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n private async getTicks(params: GetTickParams): Promise<TickData[]> {\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const ticks: TickData[] = []\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const tx = new Transaction()\n\n const start = tx.makeMoveVec({\n elements: params.start.map((index) => tx.pure.u32(index)),\n type: 'u32',\n })\n\n const args = [tx.object(params.pool_id), start, tx.pure.u64(params.limit.toString())]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_ticks`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `getTicks error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `FetchTicksResultEvent`) {\n item.parsedJson.ticks.forEach((tick: any) => {\n ticks.push(buildTickDataByEvent(tick))\n })\n }\n })\n return ticks\n }\n\n /**\n * Fetches a list of position rewards from the exchange.\n * @param {FetchParams} params The parameters for the fetch.\n * @returns {Promise<PositionReward[]>} A promise that resolves to an array of position rewards.\n */\n async fetchPositionRewardList(params: FetchParams): Promise<PositionReward[]> {\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const allPosition: PositionReward[] = []\n let start: SuiObjectIdType[] = []\n const limit = 512\n\n while (true) {\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const tx = new Transaction()\n\n const vecStart = tx.makeMoveVec({\n elements: start.map((id) => tx.pure.address(id)),\n type: undefined,\n })\n const args = [tx.object(params.pool_id), vecStart, tx.pure.u64(limit)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_positions`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `fetch position reward error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n PositionErrorCode.InvalidPositionRewardObject\n )\n }\n\n const positionRewards: PositionReward[] = []\n simulateRes?.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `FetchPositionsEvent`) {\n item.parsedJson.positions.forEach((item: any) => {\n const positionReward = buildPositionReward(item)\n positionRewards.push(positionReward)\n })\n }\n })\n\n allPosition.push(...positionRewards)\n\n if (positionRewards.length < limit) {\n break\n } else {\n start = [positionRewards[positionRewards.length - 1].pos_object_id]\n }\n }\n\n return allPosition\n }\n\n /**\n * Fetches ticks from the fullnode using the RPC API.\n * @param {string} tickHandle The handle for the tick. Get tick handle from `sdk.Pool.getPool()`\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n async fetchTicksByRpc(tickHandle: string): Promise<TickData[]> {\n let allTickData: TickData[] = []\n let nextCursor: string | null = null\n const limit = 50\n while (true) {\n const allTickId: SuiObjectIdType[] = []\n const idRes: DynamicFieldPage = await this.sdk.fullClient.getDynamicFields({\n parentId: tickHandle,\n cursor: nextCursor,\n limit,\n })\n nextCursor = idRes.nextCursor\n idRes.data.forEach((item) => {\n if (extractStructTagFromType(item.objectType).module === 'skip_list') {\n allTickId.push(item.objectId)\n }\n })\n\n allTickData = [...allTickData, ...(await this.getTicksByRpc(allTickId))]\n\n if (!idRes.hasNextPage) {\n break\n }\n }\n\n return allTickData\n }\n\n /**\n * Get ticks by tick object ids.\n * @param {string} tickObjectId The object ids of the ticks.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n private async getTicksByRpc(tickObjectId: string[]): Promise<TickData[]> {\n const ticks: TickData[] = []\n const objectDataResponses = await this.sdk.fullClient.batchGetObjects(tickObjectId, { showContent: true, showType: true })\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getTicksByRpc error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n\n const tick = buildTickData(suiObj)\n if (tick != null) {\n ticks.push(tick)\n }\n }\n return ticks\n }\n\n /**\n * Gets the tick data for the given tick index.\n * @param {string} tickHandle The handle for the tick.\n * @param {number} tickIndex The index of the tick.\n * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n */\n async getTickDataByIndex(tickHandle: string, tickIndex: number): Promise<TickData> {\n const name = { type: 'u64', value: asUintN(BigInt(tickScore(tickIndex).toString())).toString() }\n const res = await this.sdk.fullClient.getDynamicFieldObject({\n parentId: tickHandle,\n name,\n })\n\n if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`get tick by index: ${tickIndex} error: ${res.error}`, PoolErrorCode.InvalidTickIndex)\n }\n\n return buildTickData(res)\n }\n\n /**\n * Gets the tick data for the given object ID.\n * @param {string} tickId The object ID of the tick.\n * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n */\n async getTickDataByObjectId(tickId: string): Promise<TickData | null> {\n const res = await this.sdk.fullClient.getObject({\n id: tickId,\n options: { showContent: true },\n })\n\n if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getTicksByRpc error code: ${res.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n return buildTickData(res)\n }\n\n /**\n * Get partner ref fee amount\n * @param {string}partner Partner object id\n * @returns {Promise<CoinAsset[]>} A promise that resolves to an array of coin asset.\n */\n async getPartnerRefFeeAmount(partner: string, showDisplay = true): Promise<CoinAsset[]> {\n const objectDataResponses = await this._sdk.fullClient.batchGetObjects([partner], {\n showOwner: true,\n showContent: true,\n showDisplay,\n showType: true,\n })\n\n if (objectDataResponses[0].data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `get partner by object id: ${partner} error: ${objectDataResponses[0].error}`,\n PartnerErrorCode.NotFoundPartnerObject\n )\n }\n\n const balance = (objectDataResponses[0].data.content.fields as any).balances\n\n const objects = await this._sdk.fullClient.getDynamicFieldsByPage(balance.fields.id.id)\n\n const coins: string[] = []\n objects.data.forEach((object) => {\n if (object.objectId != null) {\n coins.push(object.objectId)\n }\n })\n\n const refFee: CoinAsset[] = []\n const object = await this._sdk.fullClient.batchGetObjects(coins, {\n showOwner: true,\n showContent: true,\n showDisplay,\n showType: true,\n })\n object.forEach((info: any) => {\n if (info.error != null || info.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `get coin by object id: ${info.data.objectId} error: ${info.error}`,\n PartnerErrorCode.InvalidParnterRefFeeFields\n )\n }\n\n const coinAsset: CoinAsset = {\n coinAddress: info.data.content.fields.name,\n coinObjectId: info.data.objectId,\n balance: BigInt(info.data.content.fields.value),\n }\n refFee.push(coinAsset)\n })\n\n return refFee\n }\n\n /**\n * Claim partner ref fee.\n * @param {string} partnerCap partner cap id.\n * @param {string} partner partner id.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n async claimPartnerRefFeePayload(partnerCap: string, partner: string, coinType: string): Promise<Transaction> {\n const tx = new Transaction()\n const { clmm_pool } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n const typeArguments = [coinType]\n\n const args = [tx.object(global_config_id), tx.object(partnerCap), tx.object(partner)]\n\n tx.moveCall({\n target: `${clmm_pool.published_at}::${ClmmPartnerModule}::claim_ref_fee`,\n arguments: args,\n typeArguments,\n })\n\n return tx\n }\n\n /**\n * Updates the cache for the given key.\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import { SuiResource } from '../types/sui'\n\nexport const cacheTime5min = 5 * 60 * 1000\nexport const cacheTime24h = 24 * 60 * 60 * 1000\n\nexport function getFutureTime(interval: number) {\n return Date.parse(new Date().toString()) + interval\n}\n\n/**\n * Defines the structure of a CachedContent object, used for caching resources in memory.\n */\nexport class CachedContent {\n overdueTime: number\n\n value: SuiResource | null\n\n constructor(value: SuiResource | null, overdueTime = 0) {\n this.overdueTime = overdueTime\n this.value = value\n }\n\n isValid(): boolean {\n if (this.value === null) {\n return false\n }\n if (this.overdueTime === 0) {\n return true\n }\n if (Date.parse(new Date().toString()) > this.overdueTime) {\n return false\n }\n return true\n }\n}\n","import BN from 'bn.js'\nimport { fromB64, fromHEX } from '@mysten/bcs'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\nimport { SuiObjectResponse } from '@mysten/sui/client'\nimport { ClmmPositionStatus, Pool, Position, PositionReward, Rewarder } from '../types'\nimport { MathUtil } from '../math'\nimport { NFT } from '../types/sui'\nimport { extractStructTagFromType } from './contracts'\nimport { TickData } from '../types/clmmpool'\nimport { d, decimalsMultiplier } from './numbers'\nimport {\n getMoveObjectType,\n getObjectDeletedResponse,\n getObjectDisplay,\n getObjectFields,\n getObjectId,\n getObjectNotExistsResponse,\n getObjectOwner,\n} from './objects'\nimport { ClmmpoolsError, PoolErrorCode, PositionErrorCode } from '../errors/errors'\n\n/**\n * Converts an amount to a decimal value, based on the number of decimals specified.\n * @param {number | string} amount - The amount to convert to decimal.\n * @param {number | string} decimals - The number of decimals to use in the conversion.\n * @returns {number} - Returns the converted amount as a number.\n */\nexport function toDecimalsAmount(amount: number | string, decimals: number | string): number {\n const mul = decimalsMultiplier(d(decimals))\n\n return Number(d(amount).mul(mul))\n}\n\n/**\n * Converts a bigint to an unsigned integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {string} - Returns the converted unsigned integer as a string.\n */\nexport function asUintN(int: bigint, bits = 32) {\n return BigInt.asUintN(bits, BigInt(int)).toString()\n}\n\n/**\n * Converts a bigint to a signed integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {number} - Returns the converted signed integer as a number.\n */\nexport function asIntN(int: bigint, bits = 32) {\n return Number(BigInt.asIntN(bits, BigInt(int)))\n}\n\n/**\n * Converts an amount in decimals to its corresponding numerical value.\n * @param {number|string} amount - The amount to convert.\n * @param {number|string} decimals - The number of decimal places used in the amount.\n * @returns {number} - Returns the converted numerical value.\n */\nexport function fromDecimalsAmount(amount: number | string, decimals: number | string): number {\n const mul = decimalsMultiplier(d(decimals))\n\n return Number(d(amount).div(mul))\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to an Ed25519 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Ed25519 key pair.\n */\nexport function secretKeyToEd25519Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Ed25519Keypair {\n if (secretKey instanceof Uint8Array) {\n const key = Buffer.from(secretKey)\n return Ed25519Keypair.fromSecretKey(new Uint8Array(key))\n }\n\n const hexKey = ecode === 'hex' ? fromHEX(secretKey) : fromB64(secretKey)\n return Ed25519Keypair.fromSecretKey(hexKey)\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to a Secp256k1 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Secp256k1 key pair.\n */\nexport function secretKeyToSecp256k1Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Secp256k1Keypair {\n if (secretKey instanceof Uint8Array) {\n const key = Buffer.from(secretKey)\n return Secp256k1Keypair.fromSecretKey(new Uint8Array(key))\n }\n const hexKey = ecode === 'hex' ? fromHEX(secretKey) : fromB64(secretKey)\n return Secp256k1Keypair.fromSecretKey(hexKey)\n}\n\n/**\n * Builds a pool name based on two coin types and tick spacing.\n * @param {string} coin_type_a - The type of the first coin.\n * @param {string} coin_type_b - The type of the second coin.\n * @param {string} tick_spacing - The tick spacing of the pool.\n * @returns {string} - The name of the pool.\n */\nfunction buildPoolName(coin_type_a: string, coin_type_b: string, tick_spacing: string) {\n const coinNameA = extractStructTagFromType(coin_type_a).name\n const coinNameB = extractStructTagFromType(coin_type_b).name\n return `${coinNameA}-${coinNameB}[${tick_spacing}]`\n}\n\n/**\n * Builds a Pool object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} objects - The SuiObjectResponse containing information about the pool.\n * @returns {Pool} - The built Pool object.\n */\nexport function buildPool(objects: SuiObjectResponse): Pool {\n const type = getMoveObjectType(objects) as string\n const formatType = extractStructTagFromType(type)\n const fields = getObjectFields(objects)\n if (fields == null) {\n throw new ClmmpoolsError(`Pool id ${getObjectId(objects)} not exists.`, PoolErrorCode.InvalidPoolObject)\n }\n\n const rewarders: Rewarder[] = []\n fields.rewarder_manager.fields.rewarders.forEach((item: any) => {\n const { emissions_per_second } = item.fields\n const emissionSeconds = MathUtil.fromX64(new BN(emissions_per_second))\n const emissionsEveryDay = Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24)\n\n rewarders.push({\n emissions_per_second,\n coinAddress: extractStructTagFromType(item.fields.reward_coin.fields.name).source_address,\n growth_global: item.fields.growth_global,\n emissionsEveryDay,\n })\n })\n\n const pool: Pool = {\n poolAddress: getObjectId(objects),\n poolType: type,\n coinTypeA: formatType.type_arguments[0],\n coinTypeB: formatType.type_arguments[1],\n coinAmountA: fields.coin_a,\n coinAmountB: fields.coin_b,\n current_sqrt_price: fields.current_sqrt_price,\n current_tick_index: asIntN(BigInt(fields.current_tick_index.fields.bits)),\n fee_growth_global_a: fields.fee_growth_global_a,\n fee_growth_global_b: fields.fee_growth_global_b,\n fee_protocol_coin_a: fields.fee_protocol_coin_a,\n fee_protocol_coin_b: fields.fee_protocol_coin_b,\n fee_rate: fields.fee_rate,\n is_pause: fields.is_pause,\n liquidity: fields.liquidity,\n position_manager: {\n positions_handle: fields.position_manager.fields.positions.fields.id.id,\n size: fields.position_manager.fields.positions.fields.size,\n },\n rewarder_infos: rewarders,\n rewarder_last_updated_time: fields.rewarder_manager.fields.last_updated_time,\n tickSpacing: fields.tick_spacing,\n ticks_handle: fields.tick_manager.fields.ticks.fields.id.id,\n uri: fields.url,\n index: Number(fields.index),\n name: '',\n }\n pool.name = buildPoolName(pool.coinTypeA, pool.coinTypeB, pool.tickSpacing)\n return pool\n}\n\n/**\n * Builds an NFT object based on a response containing information about the NFT.\n * @param {any} objects - The response containing information about the NFT.\n * @returns {NFT} - The built NFT object.\n */\nexport function buildNFT(objects: any): NFT {\n const fields = getObjectDisplay(objects).data\n const nft: NFT = {\n creator: '',\n description: '',\n image_url: '',\n link: '',\n name: '',\n project_url: '',\n }\n if (fields) {\n nft.creator = fields.creator\n nft.description = fields.description\n nft.image_url = fields.image_url\n nft.link = fields.link\n nft.name = fields.name\n nft.project_url = fields.project_url\n }\n return nft\n}\n\n/** Builds a Position object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} object - The SuiObjectResponse containing information about the position.\n * @returns {Position} - The built Position object.\n */\nexport function buildPosition(object: SuiObjectResponse): Position {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Position not exists. Get Position error:${object.error}`, PositionErrorCode.InvalidPositionObject)\n }\n\n let nft: NFT = {\n creator: '',\n description: '',\n image_url: '',\n link: '',\n name: '',\n project_url: '',\n }\n\n let position = {\n ...nft,\n pos_object_id: '',\n owner: '',\n type: '',\n coin_type_a: '',\n coin_type_b: '',\n liquidity: '',\n tick_lower_index: 0,\n tick_upper_index: 0,\n index: 0,\n pool: '',\n reward_amount_owed_0: '0',\n reward_amount_owed_1: '0',\n reward_amount_owed_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n fee_growth_inside_a: '0',\n fee_owed_a: '0',\n fee_growth_inside_b: '0',\n fee_owed_b: '0',\n position_status: ClmmPositionStatus.Exists,\n }\n let fields = getObjectFields(object)\n if (fields) {\n const type = getMoveObjectType(object) as string\n const ownerWarp = getObjectOwner(object) as {\n AddressOwner: string\n }\n\n if ('nft' in fields) {\n fields = fields.nft.fields\n nft.description = fields.description as string\n nft.name = fields.name\n nft.link = fields.url\n } else {\n nft = buildNFT(object)\n }\n\n position = {\n ...nft,\n pos_object_id: fields.id.id,\n owner: ownerWarp.AddressOwner,\n type,\n liquidity: fields.liquidity,\n coin_type_a: fields.coin_type_a.fields.name,\n coin_type_b: fields.coin_type_b.fields.name,\n tick_lower_index: asIntN(BigInt(fields.tick_lower_index.fields.bits)),\n tick_upper_index: asIntN(BigInt(fields.tick_upper_index.fields.bits)),\n index: fields.index,\n pool: fields.pool,\n reward_amount_owed_0: '0',\n reward_amount_owed_1: '0',\n reward_amount_owed_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n fee_growth_inside_a: '0',\n fee_owed_a: '0',\n fee_growth_inside_b: '0',\n fee_owed_b: '0',\n position_status: ClmmPositionStatus.Exists,\n }\n }\n\n const deletedResponse = getObjectDeletedResponse(object)\n if (deletedResponse) {\n position.pos_object_id = deletedResponse.objectId\n position.position_status = ClmmPositionStatus.Deleted\n }\n const objectNotExistsResponse = getObjectNotExistsResponse(object)\n if (objectNotExistsResponse) {\n position.pos_object_id = objectNotExistsResponse\n position.position_status = ClmmPositionStatus.NotExists\n }\n\n return position\n}\n\n/**\n * Builds a PositionReward object based on a response containing information about the reward.\n * @param {any} fields - The response containing information about the reward.\n * @returns {PositionReward} - The built PositionReward object.\n */\nexport function buildPositionReward(fields: any): PositionReward {\n const rewarders = {\n reward_amount_owed_0: '0',\n reward_amount_owed_1: '0',\n reward_amount_owed_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n }\n fields = 'fields' in fields ? fields.fields : fields\n\n fields.rewards.forEach((item: any, index: number) => {\n const { amount_owned, growth_inside } = 'fields' in item ? item.fields : item\n if (index === 0) {\n rewarders.reward_amount_owed_0 = amount_owned\n rewarders.reward_growth_inside_0 = growth_inside\n } else if (index === 1) {\n rewarders.reward_amount_owed_1 = amount_owned\n rewarders.reward_growth_inside_1 = growth_inside\n } else if (index === 2) {\n rewarders.reward_amount_owed_2 = amount_owned\n rewarders.reward_growth_inside_2 = growth_inside\n }\n })\n\n const tick_lower_index = 'fields' in fields.tick_lower_index ? fields.tick_lower_index.fields.bits : fields.tick_lower_index.bits\n const tick_upper_index = 'fields' in fields.tick_upper_index ? fields.tick_upper_index.fields.bits : fields.tick_upper_index.bits\n\n const possition: PositionReward = {\n liquidity: fields.liquidity,\n tick_lower_index: asIntN(BigInt(tick_lower_index)),\n tick_upper_index: asIntN(BigInt(tick_upper_index)),\n ...rewarders,\n fee_growth_inside_a: fields.fee_growth_inside_a,\n fee_owed_a: fields.fee_owned_a,\n fee_growth_inside_b: fields.fee_growth_inside_b,\n fee_owed_b: fields.fee_owned_b,\n pos_object_id: fields.position_id,\n }\n return possition\n}\n\n/**\n * Builds a TickData object based on a response containing information about tick data.\n * It must check if the response contains the required fields.\n * @param {SuiObjectResponse} objects - The response containing information about tick data.\n * @returns {TickData} - The built TickData object.\n */\nexport function buildTickData(objects: SuiObjectResponse): TickData {\n if (objects.error != null || objects.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Tick not exists. Get tick data error:${objects.error}`, PoolErrorCode.InvalidTickObject)\n }\n\n const fields = getObjectFields(objects)\n\n const valueItem = fields.value.fields.value.fields\n const possition: TickData = {\n objectId: getObjectId(objects),\n index: asIntN(BigInt(valueItem.index.fields.bits)),\n sqrtPrice: new BN(valueItem.sqrt_price),\n liquidityNet: new BN(valueItem.liquidity_net.fields.bits),\n liquidityGross: new BN(valueItem.liquidity_gross),\n feeGrowthOutsideA: new BN(valueItem.fee_growth_outside_a),\n feeGrowthOutsideB: new BN(valueItem.fee_growth_outside_b),\n rewardersGrowthOutside: valueItem.rewards_growth_outside,\n }\n\n return possition\n}\n\n/**\n * Builds a TickData object based on a given event's fields.\n * @param {any} fields - The fields of an event.\n * @returns {TickData} - The built TickData object.\n * @throws {Error} If any required field is missing.\n */\nexport function buildTickDataByEvent(fields: any): TickData {\n if (\n !fields ||\n !fields.index ||\n !fields.sqrt_price ||\n !fields.liquidity_net ||\n !fields.liquidity_gross ||\n !fields.fee_growth_outside_a ||\n !fields.fee_growth_outside_b\n ) {\n throw new ClmmpoolsError(`Invalid tick fields.`, PoolErrorCode.InvalidTickFields)\n }\n\n // It's assumed that asIntN is a function that converts a BigInt to an integer.\n const index = asIntN(BigInt(fields.index.bits))\n const sqrtPrice = new BN(fields.sqrt_price)\n const liquidityNet = new BN(fields.liquidity_net.bits)\n const liquidityGross = new BN(fields.liquidity_gross)\n const feeGrowthOutsideA = new BN(fields.fee_growth_outside_a)\n const feeGrowthOutsideB = new BN(fields.fee_growth_outside_b)\n const rewardersGrowthOutside = fields.rewards_growth_outside || []\n\n const tick: TickData = {\n objectId: '',\n index,\n sqrtPrice,\n liquidityNet,\n liquidityGross,\n feeGrowthOutsideA,\n feeGrowthOutsideB,\n rewardersGrowthOutside,\n }\n\n return tick\n}\n\nexport function buildClmmPositionName(pool_index: number, position_index: number): string {\n return `Magma LP | Pool${pool_index}-${position_index}`\n}\n","import BN from 'bn.js'\nimport { ZERO } from '../math/utils'\nimport { Pool } from './clmm_type'\n\n/**\n * Represents tick data for a liquidity pool.\n */\nexport type TickData = {\n /**\n * The object identifier of the tick data.\n */\n objectId: string\n\n /**\n * The index of the tick.\n */\n index: number\n\n /**\n * The square root price value for the tick.\n */\n sqrtPrice: BN\n\n /**\n * The net liquidity value for the tick.\n */\n liquidityNet: BN\n\n /**\n * The gross liquidity value for the tick.\n */\n liquidityGross: BN\n\n /**\n * The fee growth outside coin A for the tick.\n */\n feeGrowthOutsideA: BN\n\n /**\n * The fee growth outside coin B for the tick.\n */\n feeGrowthOutsideB: BN\n\n /**\n * An array of rewarders' growth outside values for the tick.\n */\n rewardersGrowthOutside: BN[]\n}\n\n/**\n * Represents a tick for a liquidity pool.\n */\nexport type Tick = {\n /**\n * The index of the tick.\n */\n index: Bits\n\n /**\n * The square root price value for the tick (string representation).\n */\n sqrt_price: string\n\n /**\n * The net liquidity value for the tick (Bits format).\n */\n liquidity_net: Bits\n\n /**\n * The gross liquidity value for the tick (string representation).\n */\n liquidity_gross: string\n\n /**\n * The fee growth outside coin A for the tick (string representation).\n */\n fee_growth_outside_a: string\n\n /**\n * The fee growth outside coin B for the tick (string representation).\n */\n fee_growth_outside_b: string\n\n /**\n * An array of rewarders' growth outside values for the tick (array of string representations).\n */\n rewarders_growth_outside: string[3]\n}\n\n/**\n * Represents bits information.\n */\nexport type Bits = {\n bits: string\n}\n\n/**\n * Represents data for a liquidity mining pool.\n */\nexport type ClmmpoolData = {\n coinA: string\n coinB: string\n currentSqrtPrice: BN\n currentTickIndex: number\n feeGrowthGlobalA: BN\n feeGrowthGlobalB: BN\n feeProtocolCoinA: BN\n feeProtocolCoinB: BN\n feeRate: BN\n liquidity: BN\n tickIndexes: number[]\n tickSpacing: number\n ticks: Array<TickData>\n collection_name: string\n}\n\n/**\n * Transforms a Pool object into ClmmpoolData format.\n * @param {Pool} pool - The liquidity pool object to transform.\n * @returns {ClmmpoolData} The transformed ClmmpoolData object.\n */\nexport function transClmmpoolDataWithoutTicks(pool: Pool): ClmmpoolData {\n const poolData: ClmmpoolData = {\n coinA: pool.coinTypeA, // string\n coinB: pool.coinTypeB, // string\n currentSqrtPrice: new BN(pool.current_sqrt_price), // BN\n currentTickIndex: pool.current_tick_index, // number\n feeGrowthGlobalA: new BN(pool.fee_growth_global_a), // BN\n feeGrowthGlobalB: new BN(pool.fee_growth_global_b), // BN\n feeProtocolCoinA: new BN(pool.fee_protocol_coin_a), // BN\n feeProtocolCoinB: new BN(pool.fee_protocol_coin_b), // BN\n feeRate: new BN(pool.fee_rate), // number\n liquidity: new BN(pool.liquidity), // BN\n tickIndexes: [], // number[]\n tickSpacing: Number(pool.tickSpacing), // number\n ticks: [], // Array<TickData>\n collection_name: '',\n }\n return poolData\n}\n\n/**\n * Creates a Bits object from an index.\n * @param {number | string} index - The index value.\n * @returns {Bits} The created Bits object.\n */\nexport function newBits(index: number | string): Bits {\n const index_BN = new BN(index)\n if (index_BN.lt(ZERO)) {\n return {\n bits: index_BN\n .neg()\n .xor(new BN(2).pow(new BN(64)).sub(new BN(1)))\n .add(new BN(1))\n .toString(),\n }\n }\n return {\n bits: index_BN.toString(),\n }\n}\n","import BN from 'bn.js'\nimport Decimal from '../utils/decimal'\n\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nexport const ZERO = new BN(0)\n\nexport const ONE = new BN(1)\n\nexport const TWO = new BN(2)\n\nexport const U128 = TWO.pow(new BN(128))\n\nexport const U64_MAX = TWO.pow(new BN(64)).sub(ONE)\n\nexport const U128_MAX = TWO.pow(new BN(128)).sub(ONE)\n\n/**\n * @category MathUtil\n */\nexport class MathUtil {\n static toX64_BN(num: BN): BN {\n return num.mul(new BN(2).pow(new BN(64)))\n }\n\n static toX64_Decimal(num: Decimal): Decimal {\n return num.mul(Decimal.pow(2, 64))\n }\n\n static toX64(num: Decimal): BN {\n return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed())\n }\n\n static fromX64(num: BN): Decimal {\n return new Decimal(num.toString()).mul(Decimal.pow(2, -64))\n }\n\n static fromX64_Decimal(num: Decimal): Decimal {\n return num.mul(Decimal.pow(2, -64))\n }\n\n static fromX64_BN(num: BN): BN {\n return num.div(new BN(2).pow(new BN(64)))\n }\n\n static shiftRightRoundUp(n: BN): BN {\n let result = n.shrn(64)\n\n if (n.mod(U64_MAX).gt(ZERO)) {\n result = result.add(ONE)\n }\n\n return result\n }\n\n static divRoundUp(n0: BN, n1: BN): BN {\n const hasRemainder = !n0.mod(n1).eq(ZERO)\n if (hasRemainder) {\n return n0.div(n1).add(new BN(1))\n }\n return n0.div(n1)\n }\n\n static subUnderflowU128(n0: BN, n1: BN): BN {\n if (n0.lt(n1)) {\n return n0.sub(n1).add(U128_MAX)\n }\n\n return n0.sub(n1)\n }\n\n static checkUnsignedSub(n0: BN, n1: BN): BN {\n const n = n0.sub(n1)\n if (n.isNeg()) {\n throw new ClmmpoolsError('Unsigned integer sub overflow', MathErrorCode.UnsignedIntegerOverflow)\n }\n return n\n }\n\n static checkMul(n0: BN, n1: BN, limit: number): BN {\n const n = n0.mul(n1)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication overflow', MathErrorCode.MulOverflow)\n }\n return n\n }\n\n static checkMulDivFloor(n0: BN, n1: BN, denom: BN, limit: number): BN {\n if (denom.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n }\n return n\n }\n\n static checkMulDivCeil(n0: BN, n1: BN, denom: BN, limit: number): BN {\n if (denom.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1).add(denom.sub(ONE)).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n }\n return n\n }\n\n static checkMulDivRound(n0: BN, n1: BN, denom: BN, limit: number): BN {\n if (denom.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1.add(denom.shrn(1))).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n }\n return n\n }\n\n static checkMulShiftRight(n0: BN, n1: BN, shift: number, limit: number): BN {\n const n = n0.mul(n1).div(new BN(2).pow(new BN(shift)))\n // const n = n0.mul(n1).shrn(shift)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication shift right overflow', MathErrorCode.MulShiftRightOverflow)\n }\n return n\n }\n\n static checkMulShiftRight64RoundUpIf(n0: BN, n1: BN, limit: number, roundUp: boolean): BN {\n const p = n0.mul(n1)\n const shoudRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n const result = shoudRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n if (this.isOverflow(result, limit)) {\n throw new ClmmpoolsError('Multiplication shift right overflow', MathErrorCode.MulShiftRightOverflow)\n }\n return result\n }\n\n static checkMulShiftLeft(n0: BN, n1: BN, shift: number, limit: number): BN {\n const n = n0.mul(n1).shln(shift)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication shift left overflow', MathErrorCode.MulShiftLeftOverflow)\n }\n return n\n }\n\n static checkDivRoundUpIf(n0: BN, n1: BN, roundUp: boolean): BN {\n if (n1.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n if (roundUp) {\n return this.divRoundUp(n0, n1)\n }\n return n0.div(n1)\n }\n\n static isOverflow(n: BN, bit: number): boolean {\n return n.gte(TWO.pow(new BN(bit)))\n }\n\n static sign(v: BN): number {\n const signBit = v.testn(127) ? 1 : 0\n return signBit\n }\n\n static is_neg(v: BN): boolean {\n return this.sign(v) === 1\n }\n\n static abs_u128(v: BN): BN {\n if (v.gt(ZERO)) {\n return v\n }\n return this.u128_neg(v.subn(1))\n }\n\n static u128_neg(v: BN): BN {\n return v.uxor(new BN('ffffffffffffffffffffffffffffffff', 16))\n }\n\n static neg(v: BN): BN {\n if (this.is_neg(v)) {\n return v.abs()\n }\n return this.neg_from(v)\n }\n\n static abs(v: BN): BN {\n if (this.sign(v) === 0) {\n return v\n }\n return this.u128_neg(v.sub(new BN(1)))\n }\n\n static neg_from(v: BN): BN {\n if (v.eq(ZERO)) {\n return v\n }\n return this.u128_neg(v).add(new BN(1)).or(new BN(1).shln(127))\n }\n}\n","import Decimal from 'decimal.js'\n\nDecimal.config({\n precision: 64,\n rounding: Decimal.ROUND_DOWN,\n toExpNeg: -64,\n toExpPos: 64,\n})\n\nexport default Decimal\n","export enum MathErrorCode {\n IntegerDowncastOverflow = `IntegerDowncastOverflow`,\n MulOverflow = `MultiplicationOverflow`,\n MulDivOverflow = `MulDivOverflow`,\n MulShiftRightOverflow = `MulShiftRightOverflow`,\n MulShiftLeftOverflow = `MulShiftLeftOverflow`,\n DivideByZero = `DivideByZero`,\n UnsignedIntegerOverflow = `UnsignedIntegerOverflow`,\n InvalidCoinAmount = `InvalidCoinAmount`,\n InvalidLiquidityAmount = `InvalidLiquidityAmount`,\n InvalidReserveAmount = `InvalidReserveAmount`,\n InvalidSqrtPrice = `InvalidSqrtPrice`,\n NotSupportedThisCoin = `NotSupportedThisCoin`,\n InvalidTwoTickIndex = `InvalidTwoTickIndex`,\n}\n\nexport enum CoinErrorCode {\n CoinAmountMaxExceeded = `CoinAmountMaxExceeded`,\n CoinAmountMinSubceeded = `CoinAmountMinSubceeded `,\n SqrtPriceOutOfBounds = `SqrtPriceOutOfBounds`,\n}\n\nexport enum SwapErrorCode {\n InvalidSqrtPriceLimitDirection = `InvalidSqrtPriceLimitDirection`,\n ZeroTradableAmount = `ZeroTradableAmount`,\n AmountOutBelowMinimum = `AmountOutBelowMinimum`,\n AmountInAboveMaximum = `AmountInAboveMaximum`,\n NextTickNotFound = `NextTickNoutFound`,\n TickArraySequenceInvalid = `TickArraySequenceInvalid`,\n TickArrayCrossingAboveMax = `TickArrayCrossingAboveMax`,\n TickArrayIndexNotInitialized = `TickArrayIndexNotInitialized`,\n ParamsLengthNotEqual = `ParamsLengthNotEqual`,\n}\n\nexport enum PositionErrorCode {\n InvalidTickEvent = `InvalidTickEvent`,\n InvalidPositionObject = `InvalidPositionObject`,\n InvalidPositionRewardObject = `InvalidPositionRewardObject`,\n}\n\nexport enum PoolErrorCode {\n InvalidCoinTypeSequence = `InvalidCoinTypeSequence`,\n InvalidTickIndex = `InvalidTickIndex`,\n InvalidPoolObject = `InvalidPoolObject`,\n InvalidTickObjectId = `InvalidTickObjectId`,\n InvalidTickObject = `InvalidTickObject`,\n InvalidTickFields = `InvalidTickFields`,\n PoolsNotFound = `PoolsNotFound`,\n}\n\nexport enum LockErrorCode {\n InvalidLockObject = `InvalidLockObject`,\n InvalidLockFields = `InvalidLockFields`,\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 DlmmStrategyCode {\n InvalidParams = `InvalidParams`,\n}\n\nexport enum TypesErrorCode {\n InvalidType = `InvalidType`,\n}\n\nexport type ClmmpoolsErrorCode =\n | MathErrorCode\n | SwapErrorCode\n | CoinErrorCode\n | PoolErrorCode\n | PositionErrorCode\n | PartnerErrorCode\n | ConfigErrorCode\n | UtilsErrorCode\n | RouterErrorCode\n | TypesErrorCode\n | LockErrorCode\n | DlmmStrategyCode\n\nexport class ClmmpoolsError extends Error {\n override message: string\n\n errorCode?: ClmmpoolsErrorCode\n\n constructor(message: string, errorCode?: ClmmpoolsErrorCode) {\n super(message)\n this.message = message\n this.errorCode = errorCode\n }\n\n static isClmmpoolsErrorCode(e: any, code: ClmmpoolsErrorCode): boolean {\n return e instanceof ClmmpoolsError && e.errorCode === code\n }\n}\n","import BN from 'bn.js'\n\n/**\n * The maximum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_TICK_INDEX = 443636\n\n/**\n * The minimum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_TICK_INDEX = -443636\n\n/**\n * The maximum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_SQRT_PRICE = '79226673515401279992447579055'\n\n/**\n * The number of initialized ticks that a tick-array account can hold.\n * @category Constants\n */\nexport const TICK_ARRAY_SIZE = 64\n\n/**\n * The minimum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_SQRT_PRICE = '4295048016'\n\n/**\n * The denominator which the fee rate is divided on.\n * @category Constants\n */\nexport const FEE_RATE_DENOMINATOR = new BN(1_000_000)\n","import { TransactionArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\nimport { ClmmpoolsError, TypesErrorCode } from '../errors/errors'\n\n/**\n * Represents a SUI address, which is a string.\n */\nexport type SuiAddressType = string\n/**\n * Represents a SUI object identifier, which is a string.\n */\nexport type SuiObjectIdType = string\n/**\n * Represents a BigNumber, which can be a Decimal.Value, number, or string.\n */\nexport type BigNumber = Decimal.Value | number | string\n/**\n * The address representing the clock in the system.\n */\nexport const CLOCK_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000006'\n\n/**\n * Constants for different modules in the CLMM (Cryptocurrency Liquidity Mining Module).\n */\nexport const ClmmPartnerModule = 'partner'\nexport const ClmmIntegratePoolModule = 'pool_script'\nexport const ClmmIntegratePoolV2Module = 'pool_script_v2'\nexport const ClmmIntegratePoolV3Module = 'pool_script_v3'\nexport const ClmmIntegrateRouterModule = 'router'\nexport const ClmmIntegrateRouterWithPartnerModule = 'router_with_partner'\nexport const ClmmFetcherModule = 'fetcher_script'\nexport const ClmmExpectSwapModule = 'expect_swap'\nexport const ClmmIntegrateUtilsModule = 'utils'\nexport const VotingEscrow = 'voting_escrow'\nexport const Voter = 'voter'\nexport const RewardDistributor = 'reward_distributor'\nexport const Gauge = 'gauge'\nexport const Minter = 'minter'\nexport const DlmmScript = 'dlmm_script'\n\n/**\n * The address for CoinInfo module.\n */\nexport const CoinInfoAddress = '0x1::coin::CoinInfo'\n/**\n * The address for CoinStore module.\n */\nexport const CoinStoreAddress = '0x1::coin::CoinStore'\n/**\n * Constants for different modules in the Deepbook system.\n */\n\nexport const DeepbookCustodianV2Moudle = 'custodian_v2'\nexport const DeepbookClobV2Moudle = 'clob_v2'\nexport const DeepbookEndpointsV2Moudle = 'endpoints_v2'\n\n/**\n * Represents a SUI resource, which can be of any type.\n */\nexport type SuiResource = any\n\n/**\n * Represents a paginated data page with optional cursor and limit.\n */\nexport type DataPage<T> = {\n data: T[]\n nextCursor?: any\n hasNextPage: boolean\n}\n\n/**\n * Represents query parameters for pagination.\n */\nexport type PageQuery = {\n cursor?: any\n limit?: number | null\n}\n\n/**\n * Represents arguments for pagination, with options for fetching all data or using PageQuery.\n */\nexport type PaginationArgs = 'all' | PageQuery\n\n/**\n * Represents a Non-Fungible Token (NFT) with associated metadata.\n */\nexport type NFT = {\n /**\n * The address or identifier of the creator of the NFT.\n */\n creator: string\n\n /**\n * A description providing additional information about the NFT.\n */\n description: string\n\n /**\n * The URL to the image representing the NFT visually.\n */\n image_url: string\n\n /**\n * A link associated with the NFT, providing more details or interactions.\n */\n link: string\n\n /**\n * The name or title of the NFT.\n */\n name: string\n\n /**\n * The URL to the project or collection associated with the NFT.\n */\n project_url: string\n}\n\n/**\n * Represents a SUI struct tag.\n */\nexport type SuiStructTag = {\n /**\n * The full address of the struct.\n */\n full_address: string\n\n /**\n * The source address of the struct.\n */\n source_address: string\n\n /**\n * The address of the struct.\n */\n address: SuiAddressType\n\n /**\n * The module to which the struct belongs.\n */\n module: string\n\n /**\n * The name of the struct.\n */\n name: string\n\n /**\n * An array of type arguments (SUI addresses) for the struct.\n */\n type_arguments: SuiAddressType[]\n}\n\n/**\n * Represents basic SUI data types.\n */\nexport type SuiBasicTypes = 'address' | 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'u256'\n\n/**\n * Represents a SUI transaction argument, which can be of various types.\n */\nexport type SuiTxArg = TransactionArgument | string | number | bigint | boolean\n\n/**\n * Represents input types for SUI data.\n */\nexport type SuiInputTypes = 'object' | SuiBasicTypes\n\n/**\n * Gets the default SUI input type based on the provided value.\n * @param value - The value to determine the default input type for.\n * @returns The default SUI input type.\n * @throws Error if the type of the value is unknown.\n */\nexport const getDefaultSuiInputType = (value: any): SuiInputTypes => {\n if (typeof value === 'string' && value.startsWith('0x')) {\n return 'object' // Treat value as an object if it starts with '0x'.\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return 'u64' // Treat number or bigint values as 'u64' type.\n }\n if (typeof value === 'boolean') {\n return 'bool' // Treat boolean values as 'bool' type.\n }\n throw new ClmmpoolsError(`Unknown type for value: ${value}`, TypesErrorCode.InvalidType)\n}\n","import BN from 'bn.js'\nimport { NFT, SuiAddressType, SuiObjectIdType } from './sui'\nimport { TickData } from './clmmpool'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\n/**\n * Enumerates the possible status values of a position within a liquidity mining module.\n */\nexport enum ClmmPositionStatus {\n /**\n * The position has been deleted or removed.\n */\n 'Deleted' = 'Deleted',\n /**\n * The position exists and is active.\n */\n 'Exists' = 'Exists',\n /**\n * The position does not exist or is not active.\n */\n 'NotExists' = 'NotExists',\n}\n/**\n * Represents a package containing specific configuration or data.\n * @template T - The type of configuration or data contained in the package.\n */\nexport type Package<T = undefined> = {\n /**\n * The unique identifier of the package.\n */\n package_id: string\n /**\n * the package was published.\n */\n published_at: string\n /**\n * The version number of the package (optional).\n */\n version?: number\n /**\n * The configuration or data contained in the package (optional).\n */\n config?: T\n}\n/**\n * The Magma clmmpool's position NFT.\n */\nexport type Position = {\n /**\n * The unique identifier of the position object.\n */\n pos_object_id: SuiObjectIdType\n /**\n * The owner of the position.\n */\n owner: SuiObjectIdType\n /**\n * The liquidity pool associated with the position.\n */\n pool: SuiObjectIdType\n /**\n * The type of position represented by an address.\n */\n type: SuiAddressType\n /**\n * The index of the position.\n */\n index: number\n /**\n * The amount of liquidity held by the position.\n */\n liquidity: string\n /**\n * The lower tick index of the position range.\n */\n tick_lower_index: number\n /**\n * The upper tick index of the position range.\n */\n tick_upper_index: number\n /**\n * The status of the position within the liquidity mining module.\n */\n position_status: ClmmPositionStatus\n\n /**\n * The address type of the first coin in the position.\n */\n coin_type_a: SuiAddressType\n /**\n * The address type of the second coin in the position.\n */\n coin_type_b: SuiAddressType\n} & NFT &\n PositionReward\n\n/**\n * Represents reward information associated with a liquidity mining position.\n */\nexport type PositionReward = {\n /**\n * The unique identifier of the position object.\n */\n pos_object_id: SuiObjectIdType\n\n /**\n * The amount of liquidity held by the position.\n */\n liquidity: string\n\n /**\n * The lower tick index of the position range.\n */\n tick_lower_index: number\n\n /**\n * The upper tick index of the position range.\n */\n tick_upper_index: number\n\n /**\n * The accumulated fee growth inside the first coin of the position.\n */\n fee_growth_inside_a: string\n\n /**\n * The accumulated fee owed in the first coin of the position.\n */\n fee_owed_a: string\n\n /**\n * The accumulated fee growth inside the second coin of the position.\n */\n fee_growth_inside_b: string\n\n /**\n * The accumulated fee owed in the second coin of the position.\n */\n fee_owed_b: string\n\n /**\n * The amount of reward owed in the first reward category.\n */\n reward_amount_owed_0: string\n\n /**\n * The amount of reward owed in the second reward category.\n */\n reward_amount_owed_1: string\n\n /**\n * The amount of reward owed in the third reward category.\n */\n reward_amount_owed_2: string\n\n /**\n * The accumulated reward growth inside the first reward category.\n */\n reward_growth_inside_0: string\n\n /**\n * The accumulated reward growth inside the second reward category.\n */\n reward_growth_inside_1: string\n\n /**\n * The accumulated reward growth inside the third reward category.\n */\n reward_growth_inside_2: string\n}\n\n/**\n * Represents a pair of coins used in a financial context.\n */\nexport type CoinPairType = {\n /**\n * The address type of the coin a in the pair.\n */\n coinTypeA: SuiAddressType\n\n /**\n * The address type of the coin b in the pair.\n */\n coinTypeB: SuiAddressType\n}\n\n/**\n * Represents immutable properties of a liquidity pool.\n */\nexport type PoolImmutables = {\n /**\n * The address of the liquidity pool.\n */\n poolAddress: string\n\n /**\n * The tick spacing value used in the pool.\n */\n tickSpacing: string\n} & CoinPairType\n/**\n * \"Pool\" is the core module of Clmm protocol, which defines the trading pairs of \"clmmpool\".\n */\nexport type Pool = {\n /**\n * Represents the type or category of a liquidity pool.\n */\n poolType: string\n /**\n * The amount of coin a.\n */\n coinAmountA: number\n /**\n * The amount of coin b.\n */\n coinAmountB: number\n /**\n * The current sqrt price\n */\n current_sqrt_price: number\n /**\n * The current tick index\n */\n current_tick_index: number\n /**\n * The global fee growth of coin a as Q64.64\n */\n fee_growth_global_b: number\n /**\n * The global fee growth of coin b as Q64.64\n */\n fee_growth_global_a: number\n /**\n * The amounts of coin a owend to protocol\n */\n fee_protocol_coin_a: number\n /**\n * The amounts of coin b owend to protocol\n */\n fee_protocol_coin_b: number\n /**\n * The numerator of fee rate, the denominator is 1_000_000.\n */\n fee_rate: number\n /**\n * is the pool pause\n */\n is_pause: boolean\n /**\n * The liquidity of current tick index\n */\n liquidity: number\n /**\n * The pool index\n */\n index: number\n /**\n * The positions manager\n */\n position_manager: {\n positions_handle: string\n size: number\n }\n /**\n * The rewarder manager\n */\n rewarder_infos: Array<Rewarder>\n rewarder_last_updated_time: string\n /**\n * The tick manager handle\n */\n ticks_handle: string\n /**\n * The url for pool and position\n */\n uri: string\n /**\n * The name for pool\n */\n name: string\n} & PoolImmutables\n\nexport type Rewarder = {\n /**\n * The coin address where rewards will be distributed.\n */\n coinAddress: string\n /**\n * The rate of emissions in coins per second.\n */\n emissions_per_second: number\n /**\n * The global growth factor influencing reward emissions.\n */\n growth_global: number\n /**\n * The total emissions in coins that occur every day.\n */\n emissionsEveryDay: number\n}\n/**\n * Configuration settings for the Cryptocurrency Liquidity Mining Module (CLMM).\n */\nexport type ClmmConfig = {\n /**\n * Identifier of the pools for liquidity mining.\n */\n pools_id: SuiObjectIdType\n\n /**\n * Identifier of the global configuration for the module.\n */\n global_config_id: SuiObjectIdType\n\n /**\n * Identifier of the administrative capacity for the module.\n */\n admin_cap_id: SuiObjectIdType\n\n /**\n * Identifier of the global vault for the module.\n */\n global_vault_id: SuiObjectIdType\n\n /**\n * Optional identifier of partners for the liquidity mining module.\n */\n partners_id?: SuiObjectIdType\n}\n\nexport type DlmmConfig = {\n factory: SuiObjectIdType\n}\n\n/**\n * Represents an event to create a liquidity mining partner.\n */\nexport type CreatePartnerEvent = {\n /**\n * The name of the liquidity mining partner.\n */\n name: string\n\n /**\n * The recipient's address for the partner.\n */\n recipient: SuiAddressType\n\n /**\n * Identifier of the partner.\n */\n partner_id: SuiObjectIdType\n\n /**\n * Identifier of the partner's capacity.\n */\n partner_cap_id: SuiObjectIdType\n\n /**\n * The fee rate associated with the partner.\n */\n fee_rate: string\n\n /**\n * The starting epoch of the partnership.\n */\n start_epoch: string\n\n /**\n * The ending epoch of the partnership.\n */\n end_epoch: string\n}\n\n/**\n * Represents a coin asset with address, object ID, and balance information.\n */\nexport type CoinAsset = {\n /**\n * The address type of the coin asset.\n */\n coinAddress: SuiAddressType\n\n /**\n * The object identifier of the coin asset.\n */\n coinObjectId: SuiObjectIdType\n\n /**\n * The balance amount of the coin asset.\n */\n balance: bigint\n}\n\n/**\n * Represents a faucet coin configuration.\n */\nexport type FaucetCoin = {\n /**\n * The name or identifier of the transaction module.\n */\n transactionModule: string\n\n /**\n * The supply ID or object identifier of the faucet coin.\n */\n suplyID: SuiObjectIdType\n\n /**\n * The number of decimal places used for the faucet coin.\n */\n decimals: number\n}\n\n/**\n * Represents parameters for creating a liquidity pool.\n */\nexport type CreatePoolParams = {\n /**\n * The tick spacing value used for the pool.\n */\n tick_spacing: number\n\n /**\n * The initial square root price value for the pool.\n */\n initialize_sqrt_price: string\n\n /**\n * The Uniform Resource Identifier (URI) associated with the pool.\n */\n uri: string\n} & CoinPairType\n\n/**\n * Represents parameters for adding liquidity to a created liquidity pool.\n * Extends the CreatePoolParams type.\n */\nexport type CreatePoolAddLiquidityParams = CreatePoolParams & {\n /**\n * The amount of the first coin to be added as liquidity.\n * Can be a number or a string.\n */\n amount_a: number | string\n\n /**\n * The amount of the second coin to be added as liquidity.\n * Can be a number or a string.\n */\n amount_b: number | string\n\n /**\n * Indicates whether the amount of the first coin is fixed.\n */\n fix_amount_a: boolean\n\n /**\n * The lower tick index for liquidity provision.\n */\n tick_lower: number\n\n /**\n * The upper tick index for liquidity provision.\n */\n tick_upper: number\n\n metadata_a: SuiObjectIdType\n metadata_b: SuiObjectIdType\n\n /**\n * The allowed slippage percentage for the liquidity provision.\n */\n slippage: number\n}\n\nexport type FetchParams = {\n pool_id: SuiObjectIdType\n} & CoinPairType\n\ntype CommonParams = {\n /**\n * The object id about which pool you want to operation.\n */\n pool_id: SuiObjectIdType\n /**\n * The object id about position.\n */\n pos_id: SuiObjectIdType\n}\n\nexport type AddLiquidityFixTokenParams = {\n /**\n * If fixed amount A, you must set amount_a, amount_b will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n */\n amount_a: number | string\n /**\n * If fixed amount B, you must set amount_b, amount_a will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n */\n amount_b: number | string\n /**\n * Price slippage point.\n */\n slippage: number\n /**\n * true means fixed coinA amount, false means fixed coinB amount\n */\n fix_amount_a: boolean\n /**\n * control whether or not to create a new position or add liquidity on existed position.\n */\n is_open: boolean\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityParams = {\n /**\n * The actual change in liquidity that has been added.\n */\n delta_liquidity: string\n /**\n * The max limit about used coin a amount\n */\n max_amount_a: number | string\n /**\n * The max limit about used coin b amount.\n */\n max_amount_b: number | string\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityCommonParams = {\n /**\n * Represents the index of the lower tick boundary.\n */\n tick_lower: string | number\n /**\n * Represents the index of the upper tick boundary.\n */\n tick_upper: string | number\n /**\n * If you already has one position, you can select collect fees while adding liquidity.\n */\n collect_fee: boolean\n /**\n * If these not empty, it will collect rewarder in this position, if you already open the position.\n */\n rewarder_coin_types: SuiAddressType[]\n} & CoinPairType &\n CommonParams\n\n/**\n * Parameters for opening a position within a liquidity pool.\n * Extends the CoinPairType type.\n */\nexport type OpenPositionParams = CoinPairType & {\n /**\n * The lower tick index for the position.\n */\n tick_lower: string\n\n /**\n * The upper tick index for the position.\n */\n tick_upper: string\n\n /**\n * The object identifier of the liquidity pool.\n */\n pool_id: SuiObjectIdType\n}\n\n/**\n * Parameters for removing liquidity from a pool.\n * Extends the CoinPairType and CommonParams types.\n */\nexport type RemoveLiquidityParams = CoinPairType &\n CommonParams & {\n /**\n * The change in liquidity amount to be removed.\n */\n delta_liquidity: string\n\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: string\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: string\n\n /**\n * Indicates whether to collect fees during the removal.\n */\n collect_fee: boolean\n\n /**\n * Coin types associated with rewarder contracts.\n */\n rewarder_coin_types: string[]\n }\n\n/**\n * Parameters for closing a position within a liquidity pool.\n * Extends the CoinPairType, CommonParams, and CommonParams types.\n */\nexport type ClosePositionParams = CoinPairType &\n CommonParams & {\n /**\n * Coin types associated with rewarder contracts.\n */\n rewarder_coin_types: SuiAddressType[]\n\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: string\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: string\n\n /**\n * Indicates whether to collect fees during the closing.\n */\n collect_fee: boolean\n } & CoinPairType &\n CommonParams\n/**\n * Represents parameters for collecting fees.\n */\nexport type CollectFeeParams = CommonParams & CoinPairType\n\n/**\n * Represents parameters for creating a test transfer transaction payload.\n */\nexport type createTestTransferTxPayloadParams = {\n /**\n * The recipient account address.\n */\n account: string\n\n /**\n * The value to transfer.\n */\n value: number\n}\n\n/**\n * Represents parameters for calculating rates in a swap.\n */\nexport type CalculateRatesParams = {\n /**\n * The number of decimal places for token A.\n */\n decimalsA: number\n\n /**\n * The number of decimal places for token B.\n */\n decimalsB: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The amount to swap.\n */\n amount: BN\n\n /**\n * An array of tick data for swap ticks.\n */\n swapTicks: Array<TickData>\n\n /**\n * The current pool information.\n */\n currentPool: Pool\n}\n\n/**\n * Represents the result of calculating rates in a swap.\n */\nexport type CalculateRatesResult = {\n /**\n * The estimated amount in token A.\n */\n estimatedAmountIn: BN\n\n /**\n * The estimated amount in token B.\n */\n estimatedAmountOut: BN\n\n /**\n * The estimated ending square root price.\n */\n estimatedEndSqrtPrice: BN\n\n /**\n * The estimated fee amount.\n */\n estimatedFeeAmount: BN\n\n /**\n * Indicates if the estimated amount exceeds the limit.\n */\n isExceed: boolean\n\n /**\n * The extra compute limit.\n */\n extraComputeLimit: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n aToB: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The amount to swap.\n */\n amount: BN\n\n /**\n * The price impact percentage.\n */\n priceImpactPct: number\n}\n\n/**\n * Represents parameters for a swap operation.\n */\nexport type SwapParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n\n /**\n * The amount limit for the swap.\n */\n amount_limit: string\n\n /**\n * The optional swap partner.\n */\n swap_partner?: string\n} & CoinPairType\n\n/**\n * Represents parameters for a pre-swap operation.\n */\nexport type PreSwapParams = {\n /**\n * The pool information for the pre-swap.\n */\n pool: Pool\n\n /**\n * The current square root price.\n */\n currentSqrtPrice: number\n\n /**\n * The number of decimal places for token A.\n */\n decimalsA: number\n\n /**\n * The number of decimal places for token B.\n */\n decimalsB: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for a pre-swap operation with multiple pools.\n */\nexport type PreSwapWithMultiPoolParams = {\n /**\n * An array of pool addresses for the pre-swap.\n */\n poolAddresses: string[]\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n/**\n * If changes in liquidity are required before the swap, then this parameter should be passed.\n */\nexport type PreSwapLpChangeParams = {\n /**\n * Unique identifier for the liquidity pool involved in the transaction.\n */\n pool_id: string\n\n /**\n * Lower bound of the liquidity range. In AMM models, like Uniswap V3, liquidity is provided within specific price ranges. This represents the lower limit of that range.\n */\n tick_lower: number\n\n /**\n * Upper bound of the liquidity range, corresponding to the lower bound. This defines the upper limit of the range where liquidity is provided.\n */\n tick_upper: number\n\n /**\n * The change in liquidity, which can be a large number and is thus represented as a string. It can be positive or negative, indicating an increase or decrease in liquidity.\n */\n delta_liquidity: number\n\n /**\n * A boolean value indicating whether the 'delta_liquidity' represents an increase (true) or decrease (false) in liquidity.\n */\n is_increase: boolean\n}\n/**\n * Represents parameters for a transitional pre-swap operation with multiple pools.\n */\nexport type TransPreSwapWithMultiPoolParams = {\n /**\n * The address of the pool for the transitional pre-swap.\n */\n poolAddress: string\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for collecting rewarder fees.\n */\nexport type CollectRewarderParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n\n /**\n * The identifier of the position.\n */\n pos_id: SuiObjectIdType\n\n /**\n * Specifies if the fee should be collected.\n */\n collect_fee: boolean\n\n /**\n * An array of rewarder coin types.\n */\n rewarder_coin_types: SuiAddressType[]\n} & CoinPairType\n\n/**\n * Represents the amount owed by a rewarder.\n */\nexport type RewarderAmountOwed = {\n /**\n * The amount owed.\n */\n amount_owed: BN\n\n /**\n * The address of the coin.\n */\n coin_address: string\n}\n\n/**\n * Utility function to retrieve packager configurations from a package object.\n * @param {Package<T>} packageObj - The package object containing configurations.\n * @throws {Error} Throws an error if the package does not have a valid config.\n * @returns {T} The retrieved configuration.\n */\nexport function getPackagerConfigs<T>(packageObj: Package<T>) {\n if (packageObj.config === undefined) {\n throw new ClmmpoolsError(`package: ${packageObj.package_id} not config in sdk SdkOptions`, ConfigErrorCode.InvalidConfig)\n }\n return packageObj.config\n}\n\nexport type OpenPositionAddLiquidityWithProtectionParams = {\n pool: SuiAddressType\n tick_lower: number\n tick_upper: number\n coin_a: number | string\n coin_b: number | string\n\n /**\n * The address type of the coin A.\n */\n coinAType: SuiAddressType\n\n /**\n * The address type of the coin A.\n */\n coinBType: SuiAddressType\n\n max_amount_a: number\n max_amount_b: number\n min_amount_a: number\n min_amount_b: number\n by_amount_a: boolean\n}\n\nexport type AddLiquidityWithProtectionParams = AddLiquidityFixTokenParams & {\n // pool: SuiAddressType\n // position: SuiObjectIdType\n // coin_a: number | string\n // coin_b: number | string\n // /**\n // * The address type of the coin A.\n // */\n // coinAType: SuiAddressType\n // /**\n // * The address type of the coin A.\n // */\n // coinBType: SuiAddressType\n // max_amount_a: number\n // max_amount_b: number\n // min_amount_a: number\n // min_amount_b: number\n // fix_amount_a: boolean\n}\n","import BN from 'bn.js'\n\n/**\n * Represents input data for adding liquidity to a pool.\n */\nexport type LiquidityInput = {\n /**\n * The amount of coin A.\n */\n coinAmountA: BN\n\n /**\n * The amount of coin B.\n */\n coinAmountB: BN\n\n /**\n * The maximum amount of token A.\n */\n tokenMaxA: BN\n\n /**\n * The maximum amount of token B.\n */\n tokenMaxB: BN\n\n /**\n * The liquidity amount.\n */\n liquidityAmount: BN\n\n fix_amount_a: boolean\n}\n\n/**\n * Represents the direction of a swap.\n */\nexport enum SwapDirection {\n /**\n * Swap from coin A to coin B.\n */\n A2B = 'a2b',\n\n /**\n * Swap from coin B to coin A.\n */\n B2A = 'b2a',\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { TickMath } from './tick'\nimport { MathUtil } from './utils'\n\nconst D365 = new BN(365)\nconst H24 = new BN(24)\nconst S3600 = new BN(3600)\nconst B05 = new BN(0.5)\n\nexport function estPoolAPR(preBlockReward: BN, rewardPrice: BN, totalTradingFee: BN, totalLiquidityValue: BN): BN {\n const annualRate = D365.mul(H24).mul(S3600).mul(B05)\n\n const APR = annualRate.mul(preBlockReward.mul(rewardPrice).add(totalTradingFee).div(totalLiquidityValue))\n\n return APR\n}\n\nfunction calculatePoolValidTVL(\n amountA: BN,\n amountB: BN,\n decimalsA: number,\n decimalsB: number,\n coinAPrice: Decimal,\n coinBPrice: Decimal\n): Decimal {\n const poolValidAmountA = new Decimal(amountA.toString()).div(new Decimal(10 ** decimalsA))\n const poolValidAmountB = new Decimal(amountB.toString()).div(new Decimal(10 ** decimalsB))\n\n const TVL = poolValidAmountA.mul(coinAPrice).add(poolValidAmountB.mul(coinBPrice))\n\n return TVL\n}\n\nexport type estPosAPRResult = {\n feeAPR: Decimal\n posRewarder0APR: Decimal\n posRewarder1APR: Decimal\n posRewarder2APR: Decimal\n}\n\nexport function estPositionAPRWithDeltaMethod(\n currentTickIndex: number,\n lowerTickIndex: number,\n upperTickIndex: number,\n currentSqrtPriceX64: BN,\n poolLiquidity: BN,\n decimalsA: number,\n decimalsB: number,\n decimalsRewarder0: number,\n decimalsRewarder1: number,\n decimalsRewarder2: number,\n feeRate: number,\n amountAStr: string,\n amountBStr: string,\n poolAmountA: BN,\n poolAmountB: BN,\n swapVolumeStr: string,\n poolRewarders0Str: string,\n poolRewarders1Str: string,\n poolRewarders2Str: string,\n coinAPriceStr: string,\n coinBPriceStr: string,\n rewarder0PriceStr: string,\n rewarder1PriceStr: string,\n rewarder2PriceStr: string\n): estPosAPRResult {\n const amountA = new Decimal(amountAStr)\n const amountB = new Decimal(amountBStr)\n const swapVolume = new Decimal(swapVolumeStr)\n const poolRewarders0 = new Decimal(poolRewarders0Str)\n const poolRewarders1 = new Decimal(poolRewarders1Str)\n const poolRewarders2 = new Decimal(poolRewarders2Str)\n const coinAPrice = new Decimal(coinAPriceStr)\n const coinBPrice = new Decimal(coinBPriceStr)\n const rewarder0Price = new Decimal(rewarder0PriceStr)\n const rewarder1Price = new Decimal(rewarder1PriceStr)\n const rewarder2Price = new Decimal(rewarder2PriceStr)\n\n const lowerSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(lowerTickIndex)\n const upperSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(upperTickIndex)\n const lowerSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(lowerSqrtPriceX64)).round()\n const upperSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(upperSqrtPriceX64)).round()\n const currentSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(currentSqrtPriceX64)).round()\n let deltaLiquidity\n const liquidityAmount0 = amountA\n .mul(new Decimal(10 ** decimalsA))\n .mul(upperSqrtPriceD.mul(lowerSqrtPriceD))\n .div(upperSqrtPriceD.sub(lowerSqrtPriceD))\n .round()\n const liquidityAmount1 = amountB\n .mul(new Decimal(10 ** decimalsB))\n .div(upperSqrtPriceD.sub(lowerSqrtPriceD))\n .round()\n if (currentTickIndex < lowerTickIndex) {\n deltaLiquidity = liquidityAmount0\n } else if (currentTickIndex > upperTickIndex) {\n deltaLiquidity = liquidityAmount1\n } else {\n deltaLiquidity = Decimal.min(liquidityAmount0, liquidityAmount1)\n }\n const deltaY = deltaLiquidity.mul(currentSqrtPriceD.sub(lowerSqrtPriceD))\n const deltaX = deltaLiquidity.mul(upperSqrtPriceD.sub(currentSqrtPriceD)).div(currentSqrtPriceD.mul(upperSqrtPriceD))\n const posValidTVL = deltaX\n .div(new Decimal(10 ** decimalsA))\n .mul(coinAPrice)\n .add(deltaY.div(new Decimal(10 ** decimalsB).mul(coinBPrice)))\n const poolValidTVL = calculatePoolValidTVL(poolAmountA, poolAmountB, decimalsA, decimalsB, coinAPrice, coinBPrice)\n const posValidRate = posValidTVL.div(poolValidTVL)\n\n const feeAPR = deltaLiquidity.eq(new Decimal(0))\n ? new Decimal(0)\n : new Decimal(feeRate / 10000)\n .mul(swapVolume)\n .mul(new Decimal(deltaLiquidity.toString()).div(new Decimal(poolLiquidity.toString()).add(new Decimal(deltaLiquidity.toString()))))\n .div(posValidTVL)\n\n const aprCoe = posValidRate.eq(new Decimal(0)) ? new Decimal(0) : posValidRate.mul(new Decimal(36500 / 7)).div(posValidTVL)\n const posRewarder0APR = poolRewarders0\n .div(new Decimal(10 ** decimalsRewarder0))\n .mul(rewarder0Price)\n .mul(aprCoe)\n const posRewarder1APR = poolRewarders1\n .div(new Decimal(10 ** decimalsRewarder1))\n .mul(rewarder1Price)\n .mul(aprCoe)\n const posRewarder2APR = poolRewarders2\n .div(new Decimal(10 ** decimalsRewarder2))\n .mul(rewarder2Price)\n .mul(aprCoe)\n return {\n feeAPR,\n posRewarder0APR,\n posRewarder1APR,\n posRewarder2APR,\n }\n}\n\nexport function estPositionAPRWithMultiMethod(\n lowerUserPrice: number,\n upperUserPrice: number,\n lowerHistPrice: number,\n upperHistPrice: number\n): Decimal {\n const retroLower = Math.max(lowerUserPrice, lowerHistPrice)\n const retroUpper = Math.min(upperUserPrice, upperHistPrice)\n const retroRange = retroUpper - retroLower\n const userRange = upperUserPrice - lowerUserPrice\n const histRange = upperHistPrice - lowerHistPrice\n const userRangeD = new Decimal(userRange.toString())\n const histRangeD = new Decimal(histRange.toString())\n const retroRangeD = new Decimal(retroRange.toString())\n\n let m = new Decimal('0')\n if (retroRange < 0) {\n m = new Decimal('0')\n } else if (userRange === retroRange) {\n m = histRangeD.div(retroRangeD)\n } else if (histRange === retroRange) {\n m = retroRangeD.div(userRangeD)\n } else {\n m = retroRangeD.mul(retroRangeD).div(histRangeD).div(userRangeD)\n }\n\n return m\n}\n","/* eslint-disable import/no-unresolved */\n/* eslint-disable no-bitwise */\nimport BN from 'bn.js'\nimport { asIntN, d } from '../utils'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport Decimal from '../utils/decimal'\nimport { MathUtil } from './utils'\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nconst BIT_PRECISION = 14\nconst LOG_B_2_X32 = '59543866431248'\nconst LOG_B_P_ERR_MARGIN_LOWER_X64 = '184467440737095516'\nconst LOG_B_P_ERR_MARGIN_UPPER_X64 = '15793534762490258745'\nconst TICK_BOUND = 443636\n\nfunction signedShiftLeft(n0: BN, shiftBy: number, bitWidth: number) {\n const twosN0 = n0.toTwos(bitWidth).shln(shiftBy)\n twosN0.imaskn(bitWidth + 1)\n return twosN0.fromTwos(bitWidth)\n}\n\nfunction signedShiftRight(n0: BN, shiftBy: number, bitWidth: number) {\n const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy)\n twoN0.imaskn(bitWidth - shiftBy + 1)\n return twoN0.fromTwos(bitWidth - shiftBy)\n}\n\nfunction tickIndexToSqrtPricePositive(tick: number) {\n let ratio: BN\n\n if ((tick & 1) !== 0) {\n ratio = new BN('79232123823359799118286999567')\n } else {\n ratio = new BN('79228162514264337593543950336')\n }\n\n if ((tick & 2) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79236085330515764027303304731')), 96, 256)\n }\n if ((tick & 4) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79244008939048815603706035061')), 96, 256)\n }\n if ((tick & 8) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79259858533276714757314932305')), 96, 256)\n }\n if ((tick & 16) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79291567232598584799939703904')), 96, 256)\n }\n if ((tick & 32) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79355022692464371645785046466')), 96, 256)\n }\n if ((tick & 64) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79482085999252804386437311141')), 96, 256)\n }\n if ((tick & 128) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79736823300114093921829183326')), 96, 256)\n }\n if ((tick & 256) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('80248749790819932309965073892')), 96, 256)\n }\n if ((tick & 512) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('81282483887344747381513967011')), 96, 256)\n }\n if ((tick & 1024) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('83390072131320151908154831281')), 96, 256)\n }\n if ((tick & 2048) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('87770609709833776024991924138')), 96, 256)\n }\n if ((tick & 4096) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('97234110755111693312479820773')), 96, 256)\n }\n if ((tick & 8192) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('119332217159966728226237229890')), 96, 256)\n }\n if ((tick & 16384) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('179736315981702064433883588727')), 96, 256)\n }\n if ((tick & 32768) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('407748233172238350107850275304')), 96, 256)\n }\n if ((tick & 65536) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('2098478828474011932436660412517')), 96, 256)\n }\n if ((tick & 131072) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('55581415166113811149459800483533')), 96, 256)\n }\n if ((tick & 262144) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('38992368544603139932233054999993551')), 96, 256)\n }\n\n return signedShiftRight(ratio, 32, 256)\n}\n\nfunction tickIndexToSqrtPriceNegative(tickIndex: number) {\n const tick = Math.abs(tickIndex)\n let ratio: BN\n\n if ((tick & 1) !== 0) {\n ratio = new BN('18445821805675392311')\n } else {\n ratio = new BN('18446744073709551616')\n }\n\n if ((tick & 2) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18444899583751176498')), 64, 256)\n }\n if ((tick & 4) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18443055278223354162')), 64, 256)\n }\n if ((tick & 8) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18439367220385604838')), 64, 256)\n }\n if ((tick & 16) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18431993317065449817')), 64, 256)\n }\n if ((tick & 32) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18417254355718160513')), 64, 256)\n }\n if ((tick & 64) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18387811781193591352')), 64, 256)\n }\n if ((tick & 128) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18329067761203520168')), 64, 256)\n }\n if ((tick & 256) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18212142134806087854')), 64, 256)\n }\n if ((tick & 512) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('17980523815641551639')), 64, 256)\n }\n if ((tick & 1024) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('17526086738831147013')), 64, 256)\n }\n if ((tick & 2048) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('16651378430235024244')), 64, 256)\n }\n if ((tick & 4096) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('15030750278693429944')), 64, 256)\n }\n if ((tick & 8192) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('12247334978882834399')), 64, 256)\n }\n if ((tick & 16384) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('8131365268884726200')), 64, 256)\n }\n if ((tick & 32768) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('3584323654723342297')), 64, 256)\n }\n if ((tick & 65536) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('696457651847595233')), 64, 256)\n }\n if ((tick & 131072) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('26294789957452057')), 64, 256)\n }\n if ((tick & 262144) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('37481735321082')), 64, 256)\n }\n\n return ratio\n}\n\nexport class TickMath {\n static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN {\n return MathUtil.toX64(price.mul(Decimal.pow(10, decimalsB - decimalsA)).sqrt())\n }\n\n static sqrtPriceX64ToPrice(sqrtPriceX64: BN, decimalsA: number, decimalsB: number): Decimal {\n return MathUtil.fromX64(sqrtPriceX64)\n .pow(2)\n .mul(Decimal.pow(10, decimalsA - decimalsB))\n }\n\n static tickIndexToSqrtPriceX64(tickIndex: number): BN {\n if (tickIndex > 0) {\n return new BN(tickIndexToSqrtPricePositive(tickIndex))\n }\n return new BN(tickIndexToSqrtPriceNegative(tickIndex))\n }\n\n static sqrtPriceX64ToTickIndex(sqrtPriceX64: BN): number {\n if (sqrtPriceX64.gt(new BN(MAX_SQRT_PRICE)) || sqrtPriceX64.lt(new BN(MIN_SQRT_PRICE))) {\n throw new ClmmpoolsError('Provided sqrtPrice is not within the supported sqrtPrice range.', MathErrorCode.InvalidSqrtPrice)\n }\n\n const msb = sqrtPriceX64.bitLength() - 1\n const adjustedMsb = new BN(msb - 64)\n const log2pIntegerX32 = signedShiftLeft(adjustedMsb, 32, 128)\n\n let bit = new BN('8000000000000000', 'hex')\n let precision = 0\n let log2pFractionX64 = new BN(0)\n\n let r = msb >= 64 ? sqrtPriceX64.shrn(msb - 63) : sqrtPriceX64.shln(63 - msb)\n\n while (bit.gt(new BN(0)) && precision < BIT_PRECISION) {\n r = r.mul(r)\n const rMoreThanTwo = r.shrn(127)\n r = r.shrn(63 + rMoreThanTwo.toNumber())\n log2pFractionX64 = log2pFractionX64.add(bit.mul(rMoreThanTwo))\n bit = bit.shrn(1)\n precision += 1\n }\n\n const log2pFractionX32 = log2pFractionX64.shrn(32)\n\n const log2pX32 = log2pIntegerX32.add(log2pFractionX32)\n const logbpX64 = log2pX32.mul(new BN(LOG_B_2_X32))\n\n const tickLow = signedShiftRight(logbpX64.sub(new BN(LOG_B_P_ERR_MARGIN_LOWER_X64)), 64, 128).toNumber()\n const tickHigh = signedShiftRight(logbpX64.add(new BN(LOG_B_P_ERR_MARGIN_UPPER_X64)), 64, 128).toNumber()\n\n if (tickLow === tickHigh) {\n return tickLow\n }\n const derivedTickHighSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(tickHigh)\n if (derivedTickHighSqrtPriceX64.lte(sqrtPriceX64)) {\n return tickHigh\n }\n return tickLow\n }\n\n static tickIndexToPrice(tickIndex: number, decimalsA: number, decimalsB: number): Decimal {\n return TickMath.sqrtPriceX64ToPrice(TickMath.tickIndexToSqrtPriceX64(tickIndex), decimalsA, decimalsB)\n }\n\n static priceToTickIndex(price: Decimal, decimalsA: number, decimalsB: number): number {\n return TickMath.sqrtPriceX64ToTickIndex(TickMath.priceToSqrtPriceX64(price, decimalsA, decimalsB))\n }\n\n static priceToInitializableTickIndex(price: Decimal, decimalsA: number, decimalsB: number, tickSpacing: number): number {\n return TickMath.getInitializableTickIndex(TickMath.priceToTickIndex(price, decimalsA, decimalsB), tickSpacing)\n }\n\n static getInitializableTickIndex(tickIndex: number, tickSpacing: number): number {\n return tickIndex - (tickIndex % tickSpacing)\n }\n\n /**\n *\n * @param tickIndex\n * @param tickSpacing\n * @returns\n */\n static getNextInitializableTickIndex(tickIndex: number, tickSpacing: number) {\n return TickMath.getInitializableTickIndex(tickIndex, tickSpacing) + tickSpacing\n }\n\n static getPrevInitializableTickIndex(tickIndex: number, tickSpacing: number) {\n return TickMath.getInitializableTickIndex(tickIndex, tickSpacing) - tickSpacing\n }\n}\n\nexport function getTickDataFromUrlData(ticks: any) {\n const tickdatas: any[] = []\n for (const tick of ticks) {\n const td: any = {\n objectId: tick.objectId,\n index: Number(asIntN(BigInt(tick.index)).toString()),\n sqrtPrice: tick.sqrtPrice,\n liquidityNet: new BN(BigInt.asIntN(128, BigInt(BigInt(tick.liquidityNet.toString()))).toString()),\n liquidityGross: tick.liquidityGross,\n feeGrowthOutsideA: tick.feeGrowthOutsideA,\n feeGrowthOutsideB: tick.feeGrowthOutsideB,\n rewardersGrowthOutside: [\n new BN(tick.rewardersGrowthOutside[0]),\n new BN(tick.rewardersGrowthOutside[1]),\n new BN(tick.rewardersGrowthOutside[2]),\n ],\n }\n tickdatas.push(td)\n }\n return tickdatas\n}\n\nexport function tickScore(tickIndex: number) {\n return d(tickIndex).add(d(TICK_BOUND))\n}\n","import BN from 'bn.js'\nimport { asUintN, d } from '../utils'\nimport { LiquidityInput } from '../types/liquidity'\nimport { ClmmpoolsError, MathErrorCode, CoinErrorCode } from '../errors/errors'\nimport type { ClmmpoolData, TickData } from '../types/clmmpool'\nimport { FEE_RATE_DENOMINATOR, MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport Decimal from '../utils/decimal'\nimport { SwapUtils } from './swap'\nimport { TickMath } from './tick'\nimport { MathUtil, ONE, U64_MAX, ZERO } from './utils'\n\nexport type SwapStepResult = {\n amountIn: BN\n amountOut: BN\n nextSqrtPrice: BN\n feeAmount: BN\n}\n\nexport type SwapResult = {\n amountIn: BN\n amountOut: BN\n feeAmount: BN\n refAmount: BN\n nextSqrtPrice: BN\n crossTickNum: number\n}\n\nexport type CoinAmounts = {\n coinA: BN\n coinB: BN\n}\n\nexport function toCoinAmount(a: number, b: number): CoinAmounts {\n return {\n coinA: new BN(a.toString()),\n coinB: new BN(b.toString()),\n }\n}\n\n/**\n * Get the amount A delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaA(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n const numberator = liquidity.mul(sqrtPriceDiff).shln(64)\n const denomminator = sqrtPrice0.mul(sqrtPrice1)\n const quotient = numberator.div(denomminator)\n const remainder = numberator.mod(denomminator)\n const result = roundUp && !remainder.eq(ZERO) ? quotient.add(new BN(1)) : quotient\n // if (MathUtil.isOverflow(result, 64)) {\n // throw new ClmmpoolsError('Result large than u64 max', MathErrorCode.IntegerDowncastOverflow)\n // }\n return result\n}\n\n/**\n * Get the amount B delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaB(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n if (liquidity.eq(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n return ZERO\n }\n const p = liquidity.mul(sqrtPriceDiff)\n const shoudRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n const result = shoudRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n if (MathUtil.isOverflow(result, 64)) {\n throw new ClmmpoolsError('Result large than u64 max', MathErrorCode.IntegerDowncastOverflow)\n }\n return result\n}\n\n/**\n * Get the next sqrt price from give a delta of token_a.\n * `new_sqrt_price = (sqrt_price * liquidity) / (liquidity +/- amount * sqrt_price)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceAUp(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n if (amount.eq(ZERO)) {\n return sqrtPrice\n }\n const numberator = MathUtil.checkMulShiftLeft(sqrtPrice, liquidity, 64, 256)\n const liquidityShl64 = liquidity.shln(64)\n const product = MathUtil.checkMul(sqrtPrice, amount, 256)\n if (!byAmountIn && liquidityShl64.lte(product)) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Unable to divide liquidityShl64 by product', MathErrorCode.DivideByZero)\n }\n const nextSqrtPrice = byAmountIn\n ? MathUtil.checkDivRoundUpIf(numberator, liquidityShl64.add(product), true)\n : MathUtil.checkDivRoundUpIf(numberator, liquidityShl64.sub(product), true)\n if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE))) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price less than min sqrt price', CoinErrorCode.CoinAmountMinSubceeded)\n }\n if (nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price greater than max sqrt price', CoinErrorCode.CoinAmountMaxExceeded)\n }\n\n return nextSqrtPrice\n}\n\n/**\n * Get the next sqrt price from give a delta of token_b.\n * `new_sqrt_price = (sqrt_price +(delta_b / liquidity)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceBDown(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n const deltaSqrtPrice = MathUtil.checkDivRoundUpIf(amount.shln(64), liquidity, !byAmountIn)\n const nextSqrtPrice = byAmountIn ? sqrtPrice.add(deltaSqrtPrice) : sqrtPrice.sub(deltaSqrtPrice)\n\n if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE)) || nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price out of bounds', CoinErrorCode.SqrtPriceOutOfBounds)\n }\n\n return nextSqrtPrice\n}\n\n/**\n * Get next sqrt price from input parameter.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param aToB\n * @returns\n */\nexport function getNextSqrtPriceFromInput(sqrtPrice: BN, liquidity: BN, amount: BN, aToB: boolean): BN {\n return aToB ? getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, true) : getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, true)\n}\n\n/**\n * Get the next sqrt price from output parameters.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param a2b\n * @returns\n */\nexport function getNextSqrtPriceFromOutput(sqrtPrice: BN, liquidity: BN, amount: BN, a2b: boolean): BN {\n return a2b ? getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, false) : getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, false)\n}\n\n/**\n * Get the amount of delta_a or delta_b from input parameters, and round up result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaUpFromInput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n return ZERO\n }\n\n let result\n if (a2b) {\n const numberator = new BN(liquidity).mul(new BN(sqrtPriceDiff)).shln(64)\n const denomminator = targetSqrtPrice.mul(currentSqrtPrice)\n const quotient = numberator.div(denomminator)\n const remainder = numberator.mod(denomminator)\n result = !remainder.eq(ZERO) ? quotient.add(ONE) : quotient\n } else {\n const product = new BN(liquidity).mul(new BN(sqrtPriceDiff))\n const shoudRoundUp = product.and(U64_MAX).gt(ZERO)\n result = shoudRoundUp ? product.shrn(64).add(ONE) : product.shrn(64)\n }\n return result\n}\n\n/**\n * Get the amount of delta_a or delta_b from output parameters, and round down result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaDownFromOutput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n return ZERO\n }\n\n let result\n if (a2b) {\n const product = liquidity.mul(sqrtPriceDiff)\n result = product.shrn(64)\n } else {\n const numberator = liquidity.mul(sqrtPriceDiff).shln(64)\n const denomminator = targetSqrtPrice.mul(currentSqrtPrice)\n result = numberator.div(denomminator)\n }\n return result\n}\n\n/**\n * Simulate per step of swap on every tick.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param amount\n * @param feeRate\n * @param byAmountIn\n * @returns\n */\nexport function computeSwapStep(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n feeRate: BN,\n byAmountIn: boolean\n): SwapStepResult {\n if (liquidity === ZERO) {\n return {\n amountIn: ZERO,\n amountOut: ZERO,\n nextSqrtPrice: targetSqrtPrice,\n feeAmount: ZERO,\n }\n }\n const a2b = currentSqrtPrice.gte(targetSqrtPrice)\n let amountIn: BN\n let amountOut: BN\n let nextSqrtPrice: BN\n let feeAmount: BN\n if (byAmountIn) {\n const amountRemain = MathUtil.checkMulDivFloor(\n amount,\n MathUtil.checkUnsignedSub(FEE_RATE_DENOMINATOR, feeRate),\n FEE_RATE_DENOMINATOR,\n 64\n )\n const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n if (maxAmountIn.gt(amountRemain)) {\n amountIn = amountRemain\n feeAmount = MathUtil.checkUnsignedSub(amount, amountRemain)\n nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amountRemain, a2b)\n } else {\n amountIn = maxAmountIn\n feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n nextSqrtPrice = targetSqrtPrice\n }\n amountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n } else {\n const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n if (maxAmountOut.gt(amount)) {\n amountOut = amount\n nextSqrtPrice = getNextSqrtPriceFromOutput(currentSqrtPrice, liquidity, amount, a2b)\n } else {\n amountOut = maxAmountOut\n nextSqrtPrice = targetSqrtPrice\n }\n amountIn = getDeltaUpFromInput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n }\n return {\n amountIn,\n amountOut,\n nextSqrtPrice,\n feeAmount,\n }\n}\n\n/**\n * Simulate swap by imput lots of ticks.\n * @param aToB\n * @param byAmountIn\n * @param amount\n * @param poolData\n * @param swapTicks\n * @returns\n */\nexport function computeSwap(\n aToB: boolean,\n byAmountIn: boolean,\n amount: BN,\n poolData: ClmmpoolData,\n swapTicks: Array<TickData>\n): SwapResult {\n let remainerAmount = amount\n let currentLiquidity = poolData.liquidity\n let { currentSqrtPrice } = poolData\n const swapResult: SwapResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n feeAmount: ZERO,\n refAmount: ZERO,\n nextSqrtPrice: ZERO,\n crossTickNum: 0,\n }\n let targetSqrtPrice\n let signedLiquidityChange\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(aToB)\n for (const tick of swapTicks) {\n if (aToB && poolData.currentTickIndex < tick.index) {\n continue\n }\n if (!aToB && poolData.currentTickIndex >= tick.index) {\n continue\n }\n if (tick === null) {\n continue\n }\n if ((aToB && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!aToB && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n targetSqrtPrice = sqrtPriceLimit\n } else {\n targetSqrtPrice = tick.sqrtPrice\n }\n\n const stepResult = computeSwapStep(currentSqrtPrice, targetSqrtPrice, currentLiquidity, remainerAmount, poolData.feeRate, byAmountIn)\n\n if (!stepResult.amountIn.eq(ZERO)) {\n remainerAmount = byAmountIn\n ? remainerAmount.sub(stepResult.amountIn.add(stepResult.feeAmount))\n : remainerAmount.sub(stepResult.amountOut)\n }\n\n swapResult.amountIn = swapResult.amountIn.add(stepResult.amountIn)\n swapResult.amountOut = swapResult.amountOut.add(stepResult.amountOut)\n swapResult.feeAmount = swapResult.feeAmount.add(stepResult.feeAmount)\n if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n signedLiquidityChange = tick.liquidityNet.mul(new BN(-1))\n\n if (aToB) {\n if (MathUtil.is_neg(signedLiquidityChange)) {\n currentLiquidity = currentLiquidity.add(new BN(asUintN(BigInt(signedLiquidityChange.toString()), 128)))\n } else {\n currentLiquidity = currentLiquidity.add(signedLiquidityChange)\n }\n } else if (MathUtil.is_neg(signedLiquidityChange)) {\n currentLiquidity = currentLiquidity.sub(new BN(asUintN(BigInt(signedLiquidityChange.toString()), 128)))\n } else {\n currentLiquidity = currentLiquidity.sub(signedLiquidityChange)\n }\n\n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice\n }\n swapResult.crossTickNum += 1\n if (remainerAmount.eq(ZERO)) {\n break\n }\n }\n swapResult.amountIn = swapResult.amountIn.add(swapResult.feeAmount)\n swapResult.nextSqrtPrice = currentSqrtPrice\n return swapResult\n}\n\n/**\n * Estimate liquidity for coin A\n * @param sqrtPriceX - coin A sqrtprice\n * @param sqrtPriceY - coin B sqrtprice\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinA(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n const num = MathUtil.fromX64_BN(coinAmount.mul(upperSqrtPriceX64).mul(lowerSqrtPriceX64))\n const dem = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n return !num.isZero() && !dem.isZero() ? num.div(dem) : new BN(0)\n}\n\n/**\n * Estimate liquidity for coin B\n * @param sqrtPriceX - coin A sqrtprice\n * @param sqrtPriceY - coin B sqrtprice\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinB(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n const delta = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n return !delta.isZero() ? coinAmount.shln(64).div(delta) : new BN(0)\n}\n\nexport class ClmmPoolUtil {\n /**\n * Update fee rate.\n * @param clmm - clmmpool data\n * @param feeAmount - fee Amount\n * @param refRate - ref rate\n * @param protocolFeeRate - protocol fee rate\n * @param iscoinA - is token A\n * @returns percentage\n */\n static updateFeeRate(clmm: ClmmpoolData, feeAmount: BN, refRate: number, protocolFeeRate: number, iscoinA: boolean) {\n const protocolFee = MathUtil.checkMulDivCeil(feeAmount, new BN(protocolFeeRate), FEE_RATE_DENOMINATOR, 64)\n const refFee = refRate === 0 ? ZERO : MathUtil.checkMulDivFloor(feeAmount, new BN(refRate), FEE_RATE_DENOMINATOR, 64)\n const poolFee = feeAmount.mul(protocolFee).mul(refFee)\n if (iscoinA) {\n clmm.feeProtocolCoinA = clmm.feeProtocolCoinA.add(protocolFee)\n } else {\n clmm.feeProtocolCoinB = clmm.feeProtocolCoinB.add(protocolFee)\n }\n if (poolFee.eq(ZERO) || clmm.liquidity.eq(ZERO)) {\n return { refFee, clmm }\n }\n const growthFee = poolFee.shln(64).div(clmm.liquidity)\n if (iscoinA) {\n clmm.feeGrowthGlobalA = clmm.feeGrowthGlobalA.add(growthFee)\n } else {\n clmm.feeGrowthGlobalB = clmm.feeGrowthGlobalB.add(growthFee)\n }\n return { refFee, clmm }\n }\n\n /**\n * Get token amount fron liquidity.\n * @param liquidity - liquidity\n * @param curSqrtPrice - Pool current sqrt price\n * @param lowerSqrtPrice - position lower sqrt price\n * @param upperSqrtPrice - position upper sqrt price\n * @param roundUp - is round up\n * @returns\n */\n static getCoinAmountFromLiquidity(\n liquidity: BN,\n curSqrtPrice: BN,\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n roundUp: boolean\n ): CoinAmounts {\n const liq = new Decimal(liquidity.toString())\n const curSqrtPriceStr = new Decimal(curSqrtPrice.toString())\n const lowerPriceStr = new Decimal(lowerSqrtPrice.toString())\n const upperPriceStr = new Decimal(upperSqrtPrice.toString())\n let coinA\n let coinB\n if (curSqrtPrice.lt(lowerSqrtPrice)) {\n coinA = MathUtil.toX64_Decimal(liq).mul(upperPriceStr.sub(lowerPriceStr)).div(lowerPriceStr.mul(upperPriceStr))\n coinB = new Decimal(0)\n } else if (curSqrtPrice.lt(upperSqrtPrice)) {\n coinA = MathUtil.toX64_Decimal(liq).mul(upperPriceStr.sub(curSqrtPriceStr)).div(curSqrtPriceStr.mul(upperPriceStr))\n\n coinB = MathUtil.fromX64_Decimal(liq.mul(curSqrtPriceStr.sub(lowerPriceStr)))\n } else {\n coinA = new Decimal(0)\n coinB = MathUtil.fromX64_Decimal(liq.mul(upperPriceStr.sub(lowerPriceStr)))\n }\n if (roundUp) {\n return {\n coinA: new BN(coinA.ceil().toString()),\n coinB: new BN(coinB.ceil().toString()),\n }\n }\n return {\n coinA: new BN(coinA.floor().toString()),\n coinB: new BN(coinB.floor().toString()),\n }\n }\n\n /**\n * Estimate liquidity and token amount from one amounts\n * @param lowerTick - lower tick\n * @param upperTick - upper tick\n * @param coinAmount - token amount\n * @param iscoinA - is token A\n * @param roundUp - is round up\n * @param isIncrease - is increase\n * @param slippage - slippage percentage\n * @param curSqrtPrice - current sqrt price.\n * @return IncreaseLiquidityInput\n */\n static estLiquidityAndcoinAmountFromOneAmounts(\n lowerTick: number,\n upperTick: number,\n coinAmount: BN,\n iscoinA: boolean,\n roundUp: boolean,\n slippage: number,\n curSqrtPrice: BN\n ): LiquidityInput {\n const currentTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n let liquidity\n if (currentTick < lowerTick) {\n if (!iscoinA) {\n throw new ClmmpoolsError('lower tick cannot calculate liquidity by coinB', MathErrorCode.NotSupportedThisCoin)\n }\n liquidity = estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, coinAmount)\n } else if (currentTick > upperTick) {\n if (iscoinA) {\n throw new ClmmpoolsError('upper tick cannot calculate liquidity by coinA', MathErrorCode.NotSupportedThisCoin)\n }\n liquidity = estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, coinAmount)\n } else if (iscoinA) {\n liquidity = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, coinAmount)\n } else {\n liquidity = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, coinAmount)\n }\n const coinAmounts = ClmmPoolUtil.getCoinAmountFromLiquidity(liquidity, curSqrtPrice, lowerSqrtPrice, upperSqrtPrice, roundUp)\n const tokenLimitA = roundUp\n ? d(coinAmounts.coinA.toString())\n .mul(1 + slippage)\n .toString()\n : d(coinAmounts.coinA.toString())\n .mul(1 - slippage)\n .toString()\n\n const tokenLimitB = roundUp\n ? d(coinAmounts.coinB.toString())\n .mul(1 + slippage)\n .toString()\n : d(coinAmounts.coinB.toString())\n .mul(1 - slippage)\n .toString()\n\n return {\n coinAmountA: coinAmounts.coinA,\n coinAmountB: coinAmounts.coinB,\n tokenMaxA: roundUp ? new BN(Decimal.ceil(tokenLimitA).toString()) : new BN(Decimal.floor(tokenLimitA).toString()),\n tokenMaxB: roundUp ? new BN(Decimal.ceil(tokenLimitB).toString()) : new BN(Decimal.floor(tokenLimitB).toString()),\n liquidityAmount: liquidity,\n fix_amount_a: iscoinA,\n }\n }\n\n /**\n * Estimate liquidity from token amounts\n * @param curSqrtPrice - current sqrt price.\n * @param lowerTick - lower tick\n * @param upperTick - upper tick\n * @param tokenAmount - token amount\n * @return\n */\n static estimateLiquidityFromcoinAmounts(curSqrtPrice: BN, lowerTick: number, upperTick: number, tokenAmount: CoinAmounts): BN {\n if (lowerTick > upperTick) {\n throw new ClmmpoolsError('lower tick cannot be greater than lower tick', MathErrorCode.InvalidTwoTickIndex)\n }\n const currTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n if (currTick < lowerTick) {\n return estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, tokenAmount.coinA)\n }\n if (currTick >= upperTick) {\n return estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, tokenAmount.coinB)\n }\n const estimateLiquidityAmountA = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, tokenAmount.coinA)\n const estimateLiquidityAmountB = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, tokenAmount.coinB)\n return BN.min(estimateLiquidityAmountA, estimateLiquidityAmountB)\n }\n\n /**\n * Estimate coin amounts from total amount\n * @param lowerTick\n * @param upperTick\n * @param decimalsA\n * @param decimalsB\n * @param curSqrtPrice\n * @param totalAmount\n * @param tokenPriceA\n * @param tokenPriceB\n * @returns\n */\n static estCoinAmountsFromTotalAmount(\n lowerTick: number,\n upperTick: number,\n curSqrtPrice: BN,\n totalAmount: string,\n tokenPriceA: string,\n tokenPriceB: string\n ) {\n const { ratioA, ratioB } = ClmmPoolUtil.calculateDepositRatioFixTokenA(lowerTick, upperTick, curSqrtPrice)\n\n const amountA = d(totalAmount).mul(ratioA).div(tokenPriceA)\n const amountB = d(totalAmount).mul(ratioB).div(tokenPriceB)\n\n return { amountA, amountB }\n }\n\n static calculateDepositRatioFixTokenA(lowerTick: number, upperTick: number, curSqrtPrice: BN) {\n const coinAmountA = new BN(100000000)\n const { coinAmountB } = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(\n lowerTick,\n upperTick,\n coinAmountA,\n true,\n true,\n 0,\n curSqrtPrice\n )\n const currPrice = TickMath.sqrtPriceX64ToPrice(curSqrtPrice, 0, 0)\n const transformAmountB = d(coinAmountA.toString()).mul(currPrice)\n const totalAmount = transformAmountB.add(coinAmountB.toString())\n const ratioA = transformAmountB.div(totalAmount)\n const ratioB = d(coinAmountB.toString()).div(totalAmount)\n\n return { ratioA, ratioB }\n }\n}\n","import BN from 'bn.js'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport { MathUtil, U64_MAX, ZERO } from './utils'\n\nexport class SwapUtils {\n /**\n * Get the default sqrt price limit for a swap.\n *\n * @param a2b - true if the swap is A to B, false if the swap is B to A.\n * @returns The default sqrt price limit for the swap.\n */\n static getDefaultSqrtPriceLimit(a2b: boolean): BN {\n return new BN(a2b ? MIN_SQRT_PRICE : MAX_SQRT_PRICE)\n }\n\n /**\n * Get the default values for the otherAmountThreshold in a swap.\n *\n * @param amountSpecifiedIsInput - The direction of a swap\n * @returns The default values for the otherAmountThreshold parameter in a swap.\n */\n static getDefaultOtherAmountThreshold(amountSpecifiedIsInput: boolean): BN {\n return amountSpecifiedIsInput ? ZERO : U64_MAX\n }\n}\n\n/**\n * Get lower sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n const numerator = liquidity.mul(sqrtPriceX64).shln(64)\n const denominator = liquidity.shln(64).add(amount.mul(sqrtPriceX64))\n\n // always round up\n return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get upper sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n const numerator = liquidity.mul(sqrtPriceX64).shln(64)\n const denominator = liquidity.shln(64).sub(amount.mul(sqrtPriceX64))\n\n // always round up\n return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get lower sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n // always round down(rounding up a negative number)\n return sqrtPriceX64.sub(MathUtil.divRoundUp(amount.shln(64), liquidity))\n}\n\n/**\n * Get upper sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n // always round down (rounding up a negative number)\n return sqrtPriceX64.add(amount.shln(64).div(liquidity))\n}\n","import { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { SuiAddressType, SuiStructTag } from '../types/sui'\nimport { CoinAssist, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG } from '../math/CoinAssist'\nimport { removeHexPrefix } from './hex'\n\nconst EQUAL = 0\nconst LESS_THAN = 1\nconst GREATER_THAN = 2\n\nfunction cmp(a: number, b: number) {\n if (a === b) {\n return EQUAL\n }\n if (a < b) {\n return LESS_THAN\n }\n return GREATER_THAN\n}\n\nfunction compare(symbolX: string, symbolY: string) {\n let i = 0\n\n const len = symbolX.length <= symbolY.length ? symbolX.length : symbolY.length\n\n const lenCmp = cmp(symbolX.length, symbolY.length)\n while (i < len) {\n const elemCmp = cmp(symbolX.charCodeAt(i), symbolY.charCodeAt(i))\n i += 1\n if (elemCmp !== 0) {\n return elemCmp\n }\n }\n\n return lenCmp\n}\n\nexport function isSortedSymbols(symbolX: string, symbolY: string) {\n return compare(symbolX, symbolY) === LESS_THAN\n}\n\nexport function composeType(address: string, generics: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, module: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, ...args: unknown[]): SuiAddressType {\n const generics: string[] = Array.isArray(args[args.length - 1]) ? (args.pop() as string[]) : []\n const chains = [address, ...args].filter(Boolean)\n\n let result: string = chains.join('::')\n\n if (generics && generics.length) {\n result += `<${generics.join(', ')}>`\n }\n\n return result\n}\n\nexport function extractAddressFromType(type: string) {\n return type.split('::')[0]\n}\n\nexport function extractStructTagFromType(type: string): SuiStructTag {\n try {\n let _type = type.replace(/\\s/g, '')\n\n const genericsString = _type.match(/(<.+>)$/)\n const generics = genericsString?.[0]?.match(/(\\w+::\\w+::\\w+)(?:<.*?>(?!>))?/g)\n if (generics) {\n _type = _type.slice(0, _type.indexOf('<'))\n const tag = extractStructTagFromType(_type)\n const structTag: SuiStructTag = {\n ...tag,\n type_arguments: generics.map((item) => extractStructTagFromType(item).source_address),\n }\n structTag.type_arguments = structTag.type_arguments.map((item) => {\n return CoinAssist.isSuiCoin(item) ? item : extractStructTagFromType(item).source_address\n })\n structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n return structTag\n }\n const parts = _type.split('::')\n\n const isSuiCoin = _type === GAS_TYPE_ARG || _type === GAS_TYPE_ARG_LONG\n\n const structTag: SuiStructTag = {\n full_address: _type,\n address: isSuiCoin ? '0x2' : normalizeSuiObjectId(parts[0]),\n module: parts[1],\n name: parts[2],\n type_arguments: [],\n source_address: '',\n }\n structTag.full_address = `${structTag.address}::${structTag.module}::${structTag.name}`\n structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n return structTag\n } catch (error) {\n return {\n full_address: type,\n address: '',\n module: '',\n name: '',\n type_arguments: [],\n source_address: type,\n }\n }\n}\n\nexport function normalizeCoinType(coinType: string): string {\n return extractStructTagFromType(coinType).source_address\n}\n\nexport function fixSuiObjectId(value: string): string {\n if (value.toLowerCase().startsWith('0x')) {\n return normalizeSuiObjectId(value)\n }\n return value\n}\n\n/**\n * Fixes and normalizes a coin type by removing or keeping the prefix.\n *\n * @param {string} coinType - The coin type to be fixed.\n * @param {boolean} removePrefix - Whether to remove the prefix or not (default: true).\n * @returns {string} - The fixed and normalized coin type.\n */\nexport const fixCoinType = (coinType: string, removePrefix = true) => {\n const arr = coinType.split('::')\n const address = arr.shift() as string\n let normalizeAddress = normalizeSuiObjectId(address)\n if (removePrefix) {\n normalizeAddress = removeHexPrefix(normalizeAddress)\n }\n return `${normalizeAddress}::${arr.join('::')}`\n}\n\n/**\n * Recursively traverses the given data object and patches any string values that represent Sui object IDs.\n *\n * @param {any} data - The data object to be patched.\n */\nexport function patchFixSuiObjectId(data: any) {\n for (const key in data) {\n const type = typeof data[key]\n if (type === 'object') {\n patchFixSuiObjectId(data[key])\n } else if (type === 'string') {\n const value = data[key]\n if (value && !value.includes('::')) {\n data[key] = fixSuiObjectId(value)\n }\n }\n }\n}\n","// eslint-disable-next-line import/no-import-module-exports\nimport { ClmmpoolsError, TypesErrorCode } from '../errors/errors'\n\nconst HEX_REGEXP = /^[-+]?[0-9A-Fa-f]+\\.?[0-9A-Fa-f]*?$/\n\nexport function addHexPrefix(hex: string): string {\n return !hex.startsWith('0x') ? `0x${hex}` : hex\n}\n\nexport function removeHexPrefix(hex: string): string {\n return hex.startsWith('0x') ? `${hex.slice(2)}` : hex\n}\n\nexport function shortString(str: string, start = 4, end = 4) {\n const slen = Math.max(start, 1)\n const elen = Math.max(end, 1)\n\n return `${str.slice(0, slen + 2)} ... ${str.slice(-elen)}`\n}\n\nexport function shortAddress(address: string, start = 4, end = 4) {\n return shortString(addHexPrefix(address), start, end)\n}\n\nexport function checkAddress(address: any, options: { leadingZero: boolean } = { leadingZero: true }): boolean {\n if (typeof address !== 'string') {\n return false\n }\n let str = address\n\n if (options.leadingZero) {\n if (!address.startsWith('0x')) {\n return false\n }\n str = str.substring(2)\n }\n\n return HEX_REGEXP.test(str)\n}\n\n/**\n * Attempts to turn a value into a `Buffer`. As input it supports `Buffer`, `String`, `Number`, null/undefined, `BN` and other objects with a `toArray()` method.\n * @param v the value\n */\nexport function toBuffer(v: any): Buffer {\n if (!Buffer.isBuffer(v)) {\n if (Array.isArray(v)) {\n v = Buffer.from(v)\n } else if (typeof v === 'string') {\n if (exports.isHexString(v)) {\n v = Buffer.from(exports.padToEven(exports.stripHexPrefix(v)), 'hex')\n } else {\n v = Buffer.from(v)\n }\n } else if (typeof v === 'number') {\n v = exports.intToBuffer(v)\n } else if (v === null || v === undefined) {\n v = Buffer.allocUnsafe(0)\n } else if (v.toArray) {\n // converts a BN to a Buffer\n v = Buffer.from(v.toArray())\n } else {\n throw new ClmmpoolsError(`Invalid type`, TypesErrorCode.InvalidType)\n }\n }\n return v\n}\n\nexport function bufferToHex(buffer: Buffer): string {\n return addHexPrefix(toBuffer(buffer).toString('hex'))\n}\n/**\n * '\\x02\\x00\\x00\\x00' to 2\n * @param binaryData\n */\nexport function hexToNumber(binaryData: string) {\n const buffer = new ArrayBuffer(4)\n const view = new DataView(buffer)\n\n for (let i = 0; i < binaryData.length; i++) {\n view.setUint8(i, binaryData.charCodeAt(i))\n }\n\n const number = view.getUint32(0, true) //\n\n return number\n}\n\nexport function utf8to16(str: string) {\n let out\n let i\n let c\n let char2\n let char3\n out = ''\n const len = str.length\n i = 0\n while (i < len) {\n c = str.charCodeAt(i++)\n switch (c >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n out += str.charAt(i - 1)\n break\n case 12:\n case 13:\n char2 = str.charCodeAt(i++)\n out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))\n break\n case 14:\n char2 = str.charCodeAt(i++)\n char3 = str.charCodeAt(i++)\n out += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0))\n break\n }\n }\n return out\n}\n\nexport function hexToString(str: string) {\n let val = ''\n const newStr = removeHexPrefix(str)\n\n const len = newStr.length / 2\n for (let i = 0; i < len; i++) {\n val += String.fromCharCode(parseInt(newStr.substr(i * 2, 2), 16))\n }\n return utf8to16(val)\n}\n","import { SuiMoveObject, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport { CoinAsset, FaucetCoin } from '../types'\nimport { extractStructTagFromType, normalizeCoinType } from '../utils/contracts'\nimport { SuiAddressType } from '../types/sui'\n\nconst COIN_TYPE = '0x2::coin::Coin'\nconst COIN_TYPE_ARG_REGEX = /^0x2::coin::Coin<(.+)>$/\nexport const DEFAULT_GAS_BUDGET_FOR_SPLIT = 1000\nexport const DEFAULT_GAS_BUDGET_FOR_MERGE = 500\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER = 100\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI = 100\nexport const DEFAULT_GAS_BUDGET_FOR_STAKE = 1000\nexport const GAS_TYPE_ARG = '0x2::sui::SUI'\nexport const GAS_TYPE_ARG_LONG = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI'\nexport const GAS_SYMBOL = 'SUI'\nexport const DEFAULT_NFT_TRANSFER_GAS_FEE = 450\nexport const SUI_SYSTEM_STATE_OBJECT_ID = '0x0000000000000000000000000000000000000005'\n/**\n * This class provides helper methods for working with coins.\n */\nexport class CoinAssist {\n /**\n * Get the coin type argument from a SuiMoveObject.\n *\n * @param obj The SuiMoveObject to get the coin type argument from.\n * @returns The coin type argument, or null if it is not found.\n */\n public static getCoinTypeArg(obj: SuiMoveObject) {\n const res = obj.type.match(COIN_TYPE_ARG_REGEX)\n return res ? res[1] : null\n }\n\n /**\n * Get whether a SuiMoveObject is a SUI coin.\n *\n * @param obj The SuiMoveObject to check.\n * @returns Whether the SuiMoveObject is a SUI coin.\n */\n public static isSUI(obj: SuiMoveObject) {\n const arg = CoinAssist.getCoinTypeArg(obj)\n return arg ? CoinAssist.getCoinSymbol(arg) === 'SUI' : false\n }\n\n /**\n * Get the coin symbol from a coin type argument.\n *\n * @param coinTypeArg The coin type argument to get the symbol from.\n * @returns The coin symbol.\n */\n public static getCoinSymbol(coinTypeArg: string) {\n return coinTypeArg.substring(coinTypeArg.lastIndexOf(':') + 1)\n }\n\n /**\n * Get the balance of a SuiMoveObject.\n *\n * @param obj The SuiMoveObject to get the balance from.\n * @returns The balance of the SuiMoveObject.\n */\n public static getBalance(obj: SuiMoveObject): bigint {\n return BigInt((obj.fields as any).balance)\n }\n\n /**\n * Get the total balance of a list of CoinAsset objects for a given coin address.\n *\n * @param objs The list of CoinAsset objects to get the total balance for.\n * @param coinAddress The coin address to get the total balance for.\n * @returns The total balance of the CoinAsset objects for the given coin address.\n */\n public static totalBalance(objs: CoinAsset[], coinAddress: SuiAddressType): bigint {\n let balanceTotal = BigInt(0)\n objs.forEach((obj) => {\n if (coinAddress === obj.coinAddress) {\n balanceTotal += BigInt(obj.balance)\n }\n })\n return balanceTotal\n }\n\n /**\n * Get the ID of a SuiMoveObject.\n *\n * @param obj The SuiMoveObject to get the ID from.\n * @returns The ID of the SuiMoveObject.\n */\n public static getID(obj: SuiMoveObject): string {\n return (obj.fields as any).id.id\n }\n\n /**\n * Get the coin type from a coin type argument.\n *\n * @param coinTypeArg The coin type argument to get the coin type from.\n * @returns The coin type.\n */\n public static getCoinTypeFromArg(coinTypeArg: string) {\n return `${COIN_TYPE}<${coinTypeArg}>`\n }\n\n /**\n * Get the FaucetCoin objects from a SuiTransactionBlockResponse.\n *\n * @param suiTransactionResponse The SuiTransactionBlockResponse to get the FaucetCoin objects from.\n * @returns The FaucetCoin objects.\n */\n public static getFaucetCoins(suiTransactionResponse: SuiTransactionBlockResponse): FaucetCoin[] {\n const { events } = suiTransactionResponse\n const faucetCoin: FaucetCoin[] = []\n\n events?.forEach((item: any) => {\n const { type } = item\n if (extractStructTagFromType(type).name === 'InitEvent') {\n const fields = item.parsedJson as any\n faucetCoin.push({\n transactionModule: item.transactionModule,\n suplyID: fields.suplyID,\n decimals: fields.decimals,\n })\n }\n })\n return faucetCoin\n }\n\n /**\n * Get the CoinAsset objects for a given coin type.\n *\n * @param coinType The coin type to get the CoinAsset objects for.\n * @param allSuiObjects The list of all SuiMoveObjects.\n * @returns The CoinAsset objects for the given coin type.\n */\n public static getCoinAssets(coinType: string, allSuiObjects: CoinAsset[]): CoinAsset[] {\n const coins: CoinAsset[] = []\n allSuiObjects.forEach((anObj) => {\n if (normalizeCoinType(anObj.coinAddress) === normalizeCoinType(coinType)) {\n coins.push(anObj)\n }\n })\n return coins\n }\n\n /**\n * Get whether a coin address is a SUI coin.\n *\n * @param coinAddress The coin address to check.\n * @returns Whether the coin address is a SUI coin.\n */\n public static isSuiCoin(coinAddress: SuiAddressType) {\n return extractStructTagFromType(coinAddress).full_address === GAS_TYPE_ARG\n }\n\n /**\n * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n *\n * @param coins The list of CoinAsset objects to select from.\n * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n * @param exclude A list of CoinAsset objects to exclude from the selection.\n * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n */\n static selectCoinObjectIdGreaterThanOrEqual(\n coins: CoinAsset[],\n amount: bigint,\n exclude: string[] = []\n ): { objectArray: string[]; remainCoins: CoinAsset[]; amountArray: string[] } {\n const selectedResult = CoinAssist.selectCoinAssetGreaterThanOrEqual(coins, amount, exclude)\n const objectArray = selectedResult.selectedCoins.map((item) => item.coinObjectId)\n const remainCoins = selectedResult.remainingCoins\n const amountArray = selectedResult.selectedCoins.map((item) => item.balance.toString())\n return { objectArray, remainCoins, amountArray }\n }\n\n /**\n * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n *\n * @param coins The list of CoinAsset objects to select from.\n * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n * @param exclude A list of CoinAsset objects to exclude from the selection.\n * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n */\n static selectCoinAssetGreaterThanOrEqual(\n coins: CoinAsset[],\n amount: bigint,\n exclude: string[] = []\n ): { selectedCoins: CoinAsset[]; remainingCoins: CoinAsset[] } {\n const sortedCoins = CoinAssist.sortByBalance(coins.filter((c) => !exclude.includes(c.coinObjectId)))\n\n const total = CoinAssist.calculateTotalBalance(sortedCoins)\n\n if (total < amount) {\n return { selectedCoins: [], remainingCoins: sortedCoins }\n }\n if (total === amount) {\n return { selectedCoins: sortedCoins, remainingCoins: [] }\n }\n\n let sum = BigInt(0)\n const selectedCoins = []\n const remainingCoins = [...sortedCoins]\n while (sum < total) {\n const target = amount - sum\n const coinWithSmallestSufficientBalanceIndex = remainingCoins.findIndex((c) => c.balance >= target)\n if (coinWithSmallestSufficientBalanceIndex !== -1) {\n selectedCoins.push(remainingCoins[coinWithSmallestSufficientBalanceIndex])\n remainingCoins.splice(coinWithSmallestSufficientBalanceIndex, 1)\n break\n }\n\n const coinWithLargestBalance = remainingCoins.pop()!\n if (coinWithLargestBalance.balance > 0) {\n selectedCoins.push(coinWithLargestBalance)\n sum += coinWithLargestBalance.balance\n }\n }\n return { selectedCoins: CoinAssist.sortByBalance(selectedCoins), remainingCoins: CoinAssist.sortByBalance(remainingCoins) }\n }\n\n /**\n * Sort the CoinAsset objects by their balance.\n *\n * @param coins The CoinAsset objects to sort.\n * @returns The sorted CoinAsset objects.\n */\n static sortByBalance(coins: CoinAsset[]): CoinAsset[] {\n return coins.sort((a, b) => (a.balance < b.balance ? -1 : a.balance > b.balance ? 1 : 0))\n }\n\n static sortByBalanceDes(coins: CoinAsset[]): CoinAsset[] {\n return coins.sort((a, b) => (a.balance > b.balance ? -1 : a.balance < b.balance ? 0 : 1))\n }\n\n /**\n * Calculate the total balance of a list of CoinAsset objects.\n *\n * @param coins The list of CoinAsset objects to calculate the total balance for.\n * @returns The total balance of the CoinAsset objects.\n */\n static calculateTotalBalance(coins: CoinAsset[]): bigint {\n return coins.reduce((partialSum, c) => partialSum + c.balance, BigInt(0))\n }\n}\n","import BN from 'bn.js'\nimport { Pool, Position } from '../types'\nimport { TickData } from '../types/clmmpool'\nimport { MathUtil } from './utils'\n\n/**\n * @category CollectFeesQuoteParam\n */\nexport type CollectFeesQuoteParam = {\n clmmpool: Pool\n position: Position\n tickLower: TickData\n tickUpper: TickData\n}\n\n/**\n * @category CollectFeesQuote\n */\nexport type CollectFeesQuote = {\n position_id: string\n feeOwedA: BN\n feeOwedB: BN\n}\n/**\n * Get the fee growth in the given tick range.\n *\n * @param clmmpool The CLMM pool.\n * @param tickLower The lower tick.\n * @param tickUpper The upper tick.\n * @returns The fee growth in the given tick range.\n */\nfunction getFeeInTickRange(clmmpool: Pool, tickLower: TickData, tickUpper: TickData): { fee_growth_inside_a: BN; fee_growth_inside_b: BN } {\n let fee_growth_below_a = new BN(0)\n let fee_growth_below_b = new BN(0)\n\n if (clmmpool.current_tick_index < tickLower.index) {\n fee_growth_below_a = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), new BN(tickLower.feeGrowthOutsideA))\n fee_growth_below_b = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), new BN(tickLower.feeGrowthOutsideB))\n } else {\n fee_growth_below_a = new BN(tickLower.feeGrowthOutsideA)\n fee_growth_below_b = new BN(tickLower.feeGrowthOutsideB)\n }\n\n let fee_growth_above_a = new BN(0)\n let fee_growth_above_b = new BN(0)\n\n if (clmmpool.current_tick_index < tickUpper.index) {\n fee_growth_above_a = new BN(tickUpper.feeGrowthOutsideA)\n fee_growth_above_b = new BN(tickUpper.feeGrowthOutsideB)\n } else {\n fee_growth_above_a = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), new BN(tickUpper.feeGrowthOutsideA))\n fee_growth_above_b = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), new BN(tickUpper.feeGrowthOutsideB))\n }\n const fee_growth_inside_a = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), fee_growth_below_a),\n fee_growth_above_a\n )\n const fee_growth_inside_b = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), fee_growth_below_b),\n fee_growth_above_b\n )\n\n return { fee_growth_inside_a, fee_growth_inside_b }\n}\n\nfunction updateFees(position: Position, fee_growth_inside_a: BN, fee_growth_inside_b: BN): CollectFeesQuote {\n const growth_delta_a = MathUtil.subUnderflowU128(fee_growth_inside_a, new BN(position.fee_growth_inside_a))\n const fee_delta_a = new BN(position.liquidity).mul(growth_delta_a).shrn(64)\n const growth_delta_b = MathUtil.subUnderflowU128(fee_growth_inside_b, new BN(position.fee_growth_inside_b))\n const fee_delta_b = new BN(position.liquidity).mul(growth_delta_b).shrn(64)\n\n const fee_owed_a = new BN(position.fee_owed_a).add(fee_delta_a)\n const fee_owed_b = new BN(position.fee_owed_b).add(fee_delta_b)\n\n return {\n position_id: position.pos_object_id,\n feeOwedA: fee_owed_a,\n feeOwedB: fee_owed_b,\n }\n}\n/**\n * Get a fee quote on the outstanding fees owed to a position.\n *\n * @category CollectFeesQuoteParam\n * @param param A collection of fetched Clmmpool accounts to faciliate the quote.\n * @returns A quote object containing the fees owed for each token in the pool.\n */\nexport function collectFeesQuote(param: CollectFeesQuoteParam): CollectFeesQuote {\n // Calculate the fee growths inside the position\n const { fee_growth_inside_a, fee_growth_inside_b } = getFeeInTickRange(param.clmmpool, param.tickLower, param.tickUpper)\n // Calculate the updated fees owed\n return updateFees(param.position, fee_growth_inside_a, fee_growth_inside_b)\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { get_price_x128_from_real_id } from '@magmaprotocol/calc_dlmm'\n\nexport function getPriceOfBinByBinId(binId: number, binStep: number): Decimal {\n const twoDec = new Decimal(2)\n const price = new Decimal(get_price_x128_from_real_id(binId, binStep))\n return price.div(twoDec.pow(128))\n}\n\nexport function autoFillYByWeight(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]\n): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId\n })\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep)\n let wx0 = new Decimal(0)\n let wy0 = new Decimal(0)\n const activeBin = activeBins[0]\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n const amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString())\n const amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString())\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec)))\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)))\n }\n }\n\n let totalWeightX = wx0\n let totalWeightY = wy0\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX)\n const amountY = kx.mul(totalWeightY)\n return new BN(amountY.floor().toString())\n }\n\n let totalWeightX = new Decimal(0)\n let totalWeightY = new Decimal(0)\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX)\n const amountY = kx.mul(totalWeightY)\n return new BN(amountY.floor().toString())\n}\n\nexport function autoFillXByWeight(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]\n): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId\n })\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep)\n let wx0 = new Decimal(0)\n let wy0 = new Decimal(0)\n const activeBin = activeBins[0]\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n const amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString())\n const amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString())\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec)))\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)))\n }\n }\n\n let totalWeightX = wx0\n let totalWeightY = wy0\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY)\n const amountX = ky.mul(totalWeightX)\n return new BN(amountX.floor().toString())\n }\n let totalWeightX = new Decimal(0)\n let totalWeightY = new Decimal(0)\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY)\n const amountX = ky.mul(totalWeightX)\n return new BN(amountX.floor().toString())\n}\n\n/**\n * Distribute totalAmount to all bid side bins according to given distributions.\n * @param activeId active bin id\n * @param totalAmount total amount of token Y to be distributed\n * @param distributions weight distribution of each bin\n * @param mintY mint of token Y, get from DLMM instance\n * @param clock clock of the program, for calculating transfer fee, get from DLMM instance\n * @returns array of {binId, amount} where amount is the amount of token Y in each bin\n */\nexport function toAmountBidSide(\n activeId: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[]\n): {\n binId: number\n amount: BN\n}[] {\n // get sum of weight\n const totalWeight = distributions.reduce((sum, el) => {\n return el.binId > activeId ? sum : sum.add(el.weight) // skip all ask side\n }, new Decimal(0))\n\n if (totalWeight.cmp(new Decimal(0)) !== 1) {\n throw Error('Invalid parameteres')\n }\n return distributions.map((bin) => {\n if (bin.binId > activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n }\n }\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString()).mul(new Decimal(bin.weight).div(totalWeight)).floor().toString()),\n }\n })\n}\n\n/**\n * Distribute totalAmount to all ask side bins according to given distributions.\n * @param activeId active bin id\n * @param totalAmount total amount of token Y to be distributed\n * @param distributions weight distribution of each bin\n * @param mintX mint of token X, get from DLMM instance\n * @param clock clock of the program, for calculating transfer fee, get from DLMM instance\n * @returns array of {binId, amount} where amount is the amount of token X in each bin\n */\nexport function toAmountAskSide(\n activeId: number,\n binStep: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[]\n): {\n binId: number\n amount: BN\n}[] {\n // get sum of weight\n const totalWeight: Decimal = distributions.reduce((sum, el) => {\n if (el.binId < activeId) {\n return sum\n }\n const price = getPriceOfBinByBinId(el.binId, binStep)\n const weightPerPrice = new Decimal(el.weight).div(price)\n return sum.add(weightPerPrice)\n }, new Decimal(0))\n\n if (totalWeight.cmp(new Decimal(0)) !== 1) {\n throw Error('Invalid parameteres')\n }\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n }\n }\n const price = getPriceOfBinByBinId(bin.binId, binStep)\n const weightPerPrice = new Decimal(bin.weight).div(price)\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString()).mul(weightPerPrice).div(totalWeight).floor().toString()),\n }\n })\n}\n\n/**\n * Distributes the given amounts of tokens X and Y to both bid and ask side bins\n * based on the provided weight distributions.\n *\n * @param activeId - The id of the active bin.\n * @param binStep - The step interval between bin ids.\n * @param amountX - Total amount of token X to distribute.\n * @param amountY - Total amount of token Y to distribute.\n * @param amountXInActiveBin - Amount of token X already in the active bin.\n * @param amountYInActiveBin - Amount of token Y already in the active bin.\n * @param distributions - Array of bins with their respective weight distributions.\n * @param mintX - Mint information for token X. Get from DLMM instance.\n * @param mintY - Mint information for token Y. Get from DLMM instance.\n * @param clock - Clock instance. Get from DLMM instance.\n * @returns An array of objects containing binId, amountX, and amountY for each bin.\n */\n\nexport function toAmountBothSide(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]\n): {\n binId: number\n amountX: BN\n amountY: BN\n}[] {\n // only bid side\n if (activeId > distributions[distributions.length - 1].binId || amountX.isZero()) {\n const amounts = toAmountBidSide(activeId, amountY, distributions)\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n }\n })\n }\n // only ask side\n if (activeId < distributions[0].binId || amountY.isZero()) {\n const amounts = toAmountAskSide(activeId, binStep, amountX, distributions)\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n }\n })\n }\n\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId\n })\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep)\n let wx0 = new Decimal(0)\n let wy0 = new Decimal(0)\n const activeBin = activeBins[0]\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n const amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString())\n const amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString())\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec)))\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)))\n }\n }\n\n let totalWeightX = wx0\n let totalWeightY = wy0\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const kx = new Decimal(amountX.toString()).div(totalWeightX)\n const ky = new Decimal(amountY.toString()).div(totalWeightY)\n const k = kx.lessThan(ky) ? kx : ky\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight))\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n }\n }\n if (bin.binId > activeId) {\n const price = getPriceOfBinByBinId(bin.binId, binStep)\n const weighPerPrice = new Decimal(bin.weight).div(price)\n const amount = k.mul(weighPerPrice)\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n }\n }\n\n const amountXActiveBin = k.mul(wx0)\n const amountYActiveBin = k.mul(wy0)\n return {\n binId: bin.binId,\n amountX: new BN(amountXActiveBin.floor().toString()),\n amountY: new BN(amountYActiveBin.floor().toString()),\n }\n })\n }\n let totalWeightX = new Decimal(0)\n let totalWeightY = new Decimal(0)\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n\n const kx = new Decimal(amountX.toString()).div(totalWeightX)\n const ky = new Decimal(amountY.toString()).div(totalWeightY)\n const k = kx.lessThan(ky) ? kx : ky\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight))\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n }\n }\n const price = getPriceOfBinByBinId(bin.binId, binStep)\n const weighPerPrice = new Decimal(bin.weight).div(price)\n const amount = k.mul(weighPerPrice)\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n }\n })\n}\n","import BN from 'bn.js'\nimport { ClmmpoolsError, DlmmStrategyCode } from '../errors/errors'\nimport { autoFillXByWeight, autoFillYByWeight, toAmountAskSide, toAmountBidSide, toAmountBothSide } from './dlmmWeightToAmounts'\nimport { BinDisplay } from '../types'\n\nexport enum StrategyType {\n Spot = 1,\n Curve = 2,\n BidAsk = 3,\n}\n\nexport type BinLiquidity = {\n ActiveId: number\n StorageId: number\n Price: number\n CoinAType: number\n CoinBType: number\n CoinAAmount: number\n CoinBAmount: number\n}\n\nfunction toWeightDecendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number\n weight: number\n}[] {\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: maxBinId - i + 1,\n })\n }\n return distributions\n}\n\nfunction toWeightAscendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number\n weight: number\n}[] {\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: i - minBinId + 1,\n })\n }\n return distributions\n}\n\nfunction toWeightSpotBalanced(\n minBinId: number,\n maxBinId: number\n): {\n binId: number\n weight: number\n}[] {\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: 1,\n })\n }\n return distributions\n}\n\nconst DEFAULT_MAX_WEIGHT = 2000\nconst DEFAULT_MIN_WEIGHT = 200\n\nfunction toWeightCurve(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number\n weight: number\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw new ClmmpoolsError('Invalid strategy params', DlmmStrategyCode.InvalidParams)\n }\n const maxWeight = DEFAULT_MAX_WEIGHT\n const minWeight = DEFAULT_MIN_WEIGHT\n\n const diffWeight = maxWeight - minWeight\n const diffMinWeight = activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0\n const diffMaxWeight = maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0\n\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (activeId - i) * diffMinWeight,\n })\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (i - activeId) * diffMaxWeight,\n })\n } else {\n distributions.push({\n binId: i,\n weight: maxWeight,\n })\n }\n }\n return distributions\n}\n\nfunction toWeightBidAsk(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number\n weight: number\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw new ClmmpoolsError('Invalid strategy params', DlmmStrategyCode.InvalidParams)\n }\n const maxWeight = DEFAULT_MAX_WEIGHT\n const minWeight = DEFAULT_MIN_WEIGHT\n\n const diffWeight = maxWeight - minWeight\n const diffMinWeight = activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0\n const diffMaxWeight = maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0\n\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (activeId - i) * diffMinWeight,\n })\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (i - activeId) * diffMaxWeight,\n })\n } else {\n distributions.push({\n binId: i,\n weight: minWeight,\n })\n }\n }\n return distributions\n}\n\n// only apply for balanced deposit\nexport function autoFillYByStrategy(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n const weights = toWeightSpotBalanced(minBinId, maxBinId)\n return autoFillYByWeight(activeId, binStep, amountX, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.Curve: {\n const weights = toWeightCurve(minBinId, maxBinId, activeId)\n return autoFillYByWeight(activeId, binStep, amountX, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.BidAsk: {\n const weights = toWeightBidAsk(minBinId, maxBinId, activeId)\n return autoFillYByWeight(activeId, binStep, amountX, amountXInActiveBin, amountYInActiveBin, weights)\n }\n default:\n throw new Error(`Unsupported strategy type: ${strategyType}`)\n }\n}\n\n// only apply for balanced deposit\nexport function autoFillXByStrategy(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n const weights = toWeightSpotBalanced(minBinId, maxBinId)\n return autoFillXByWeight(activeId, binStep, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.Curve: {\n const weights = toWeightCurve(minBinId, maxBinId, activeId)\n return autoFillXByWeight(activeId, binStep, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.BidAsk: {\n const weights = toWeightBidAsk(minBinId, maxBinId, activeId)\n return autoFillXByWeight(activeId, binStep, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n default:\n throw new Error(`Unsupported strategy type: ${strategyType}`)\n }\n}\n\n/**\n * Given a strategy type and amounts of X and Y, returns the distribution of liquidity.\n * @param activeId The bin id of the active bin.\n * @param binStep The step size of each bin.\n * @param minBinId The min bin id.\n * @param maxBinId The max bin id.\n * @param amountX The amount of X token to deposit.\n * @param amountY The amount of Y token to deposit.\n * @param amountXInActiveBin The amount of X token in the active bin.\n * @param amountYInActiveBin The amount of Y token in the active bin.\n * @param strategyType The strategy type.\n * @param mintX The mint info of X token. Get from DLMM instance.\n * @param mintY The mint info of Y token. Get from DLMM instance.\n * @param clock The clock info. Get from DLMM instance.\n * @returns The distribution of liquidity.\n */\nexport function toAmountsBothSideByStrategy(\n activeId: number,\n binStep: number,\n minBinId: number,\n maxBinId: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n strategyType: StrategyType\n): BinDisplay[] {\n const isSingleSideX = amountY.isZero()\n switch (strategyType) {\n // case StrategyType.Spot: {\n // if (activeId < minBinId || activeId > maxBinId) {\n // const weights = toWeightSpotBalanced(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // const amountsInBin = []\n // if (!isSingleSideX) {\n // if (minBinId <= activeId) {\n // const weights = toWeightSpotBalanced(minBinId, activeId)\n // const amounts = toAmountBidSide(activeId, amountY, weights)\n\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId < maxBinId) {\n // const weights = toWeightSpotBalanced(activeId + 1, maxBinId)\n // const amounts = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // } else {\n // if (minBinId < activeId) {\n // const weights = toWeightSpotBalanced(minBinId, activeId - 1)\n // const amountsIntoBidSide = toAmountBidSide(activeId, amountY, weights)\n // for (const bin of amountsIntoBidSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId <= maxBinId) {\n // const weights = toWeightSpotBalanced(activeId, maxBinId)\n // const amountsIntoAskSide = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amountsIntoAskSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // }\n // return amountsInBin\n // }\n // case StrategyType.Curve: {\n // // ask side\n // if (activeId < minBinId) {\n // const weights = toWeightDecendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // // bid side\n // if (activeId > maxBinId) {\n // const weights = toWeightAscendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // const amountsInBin = []\n // if (!isSingleSideX) {\n // if (minBinId <= activeId) {\n // const weights = toWeightAscendingOrder(minBinId, activeId)\n // const amounts = toAmountBidSide(activeId, amountY, weights)\n\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId < maxBinId) {\n // const weights = toWeightDecendingOrder(activeId + 1, maxBinId)\n // const amounts = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // } else {\n // if (minBinId < activeId) {\n // const weights = toWeightAscendingOrder(minBinId, activeId - 1)\n // const amountsIntoBidSide = toAmountBidSide(activeId, amountY, weights)\n // for (const bin of amountsIntoBidSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId <= maxBinId) {\n // const weights = toWeightDecendingOrder(activeId, maxBinId)\n // const amountsIntoAskSide = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amountsIntoAskSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // }\n // return amountsInBin\n // }\n // case StrategyType.BidAsk: {\n // // ask side\n // if (activeId < minBinId) {\n // const weights = toWeightAscendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // // bid side\n // if (activeId > maxBinId) {\n // const weights = toWeightDecendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // const amountsInBin = []\n // if (!isSingleSideX) {\n // if (minBinId <= activeId) {\n // const weights = toWeightDecendingOrder(minBinId, activeId)\n // const amounts = toAmountBidSide(activeId, amountY, weights)\n\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId < maxBinId) {\n // const weights = toWeightAscendingOrder(activeId + 1, maxBinId)\n // const amounts = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // } else {\n // if (minBinId < activeId) {\n // const weights = toWeightDecendingOrder(minBinId, activeId - 1)\n // const amountsIntoBidSide = toAmountBidSide(activeId, amountY, weights)\n // for (const bin of amountsIntoBidSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId <= maxBinId) {\n // const weights = toWeightAscendingOrder(activeId, maxBinId)\n // const amountsIntoAskSide = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amountsIntoAskSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // }\n // return amountsInBin\n // }\n case StrategyType.Spot: {\n const weights = toWeightSpotBalanced(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.Curve: {\n if (activeId < minBinId) {\n const weights = toWeightDecendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n if (activeId > maxBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n\n const weights = toWeightCurve(minBinId, maxBinId, activeId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.BidAsk: {\n if (activeId < minBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n if (activeId > maxBinId) {\n const weights = toWeightDecendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n\n const weights = toWeightBidAsk(minBinId, maxBinId, activeId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n\n default:\n throw new Error(`Unsupported strategy type: ${strategyType}`)\n }\n}\n","import Decimal from 'decimal.js'\nimport { d } from '../utils/numbers'\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nexport function withLiquiditySlippage(value: Decimal.Instance, slippage: Decimal.Instance, mode: 'plus' | 'minus') {\n return d(value)[mode](d(value).mul(slippage)).toDP(0)\n}\n\nexport type POOL_NO_LIQUIDITY = -1\n\nexport type LiquidityAndCoinYResult = {\n coinYAmount: Decimal\n lpAmount: Decimal\n}\n\nexport function getLiquidityAndCoinYByCoinX(\n coinInVal: Decimal.Instance,\n reserveInSize: Decimal.Instance,\n reserveOutSize: Decimal.Instance,\n lpSupply: Decimal.Instance\n): LiquidityAndCoinYResult | POOL_NO_LIQUIDITY {\n if (coinInVal.lessThanOrEqualTo(0)) {\n throw new ClmmpoolsError('coinInVal is less than zero', MathErrorCode.InvalidCoinAmount)\n }\n\n if (reserveInSize.lessThanOrEqualTo(0) || reserveOutSize.lessThanOrEqualTo(0)) {\n return -1\n }\n\n const coinYAmount = coinInVal.mul(reserveOutSize).div(reserveInSize)\n // const sqrtSupply = reserveInSize.mul(reserveOutSize).sqrt()\n const sqrtSupply = lpSupply\n\n const lpX = coinInVal.div(reserveInSize).mul(sqrtSupply)\n const lpY = coinYAmount.div(reserveOutSize).mul(sqrtSupply)\n const lpAmount = Decimal.min(lpX, lpY)\n return {\n coinYAmount,\n lpAmount,\n }\n}\n\nexport function getCoinXYForLiquidity(\n liquidity: Decimal.Instance,\n reserveInSize: Decimal.Instance,\n reserveOutSize: Decimal.Instance,\n lpSuply: Decimal.Instance\n) {\n if (liquidity.lessThanOrEqualTo(0)) {\n throw new ClmmpoolsError(\"liquidity can't be equal or less than zero\", MathErrorCode.InvalidLiquidityAmount)\n }\n\n if (reserveInSize.lessThanOrEqualTo(0) || reserveOutSize.lessThanOrEqualTo(0)) {\n throw new ClmmpoolsError('reserveInSize or reserveOutSize can not be equal or less than zero', MathErrorCode.InvalidReserveAmount)\n }\n\n // const sqrtSupply = reserveInSize.mul(reserveOutSize).sqrt()\n const sqrtSupply = lpSuply\n const coinXAmount = liquidity.div(sqrtSupply).mul(reserveInSize)\n const coinYAmount = liquidity.div(sqrtSupply).mul(reserveOutSize)\n\n return {\n coinXAmount,\n coinYAmount,\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","import BN from 'bn.js'\nimport type { Decimal } from 'decimal.js'\n\n/**\n * Percentage - the util set for percentage struct.\n */\nexport class Percentage {\n readonly numerator: BN\n\n readonly denominator: BN\n\n constructor(numerator: BN, denominator: BN) {\n this.toString = () => {\n return `${this.numerator.toString()}/${this.denominator.toString()}`\n }\n this.numerator = numerator\n this.denominator = denominator\n }\n\n /**\n * Get the percentage of a number.\n *\n * @param number\n * @returns\n */\n static fromDecimal(number: Decimal): Percentage {\n return Percentage.fromFraction(number.toDecimalPlaces(1).mul(10).toNumber(), 1000)\n }\n\n /**\n * Get the percentage of a fraction.\n *\n * @param numerator\n * @param denominator\n * @returns\n */\n static fromFraction(numerator: BN | number, denominator: BN | number): Percentage {\n const num = typeof numerator === 'number' ? new BN(numerator.toString()) : numerator\n const denom = typeof denominator === 'number' ? new BN(denominator.toString()) : denominator\n return new Percentage(num, denom)\n }\n}\n","import BN from 'bn.js'\nimport { SwapDirection } from '../types/liquidity'\nimport { CoinAmounts } from './clmm'\nimport { Percentage } from './percentage'\nimport { MathUtil } from './utils'\n\nexport enum AmountSpecified {\n Input = 'Specified input amount',\n Output = 'Specified output amount',\n}\n\nexport enum PositionStatus {\n BelowRange,\n InRange,\n AboveRange,\n}\n/**\n * This class provides utility methods for working with positions.\n */\nexport class PositionUtil {\n /**\n * Get the position status for the given tick indices.\n *\n * @param currentTickIndex The current tick index.\n * @param lowerTickIndex The lower tick index.\n * @param upperTickIndex The upper tick index.\n * @returns The position status.\n */\n static getPositionStatus(currentTickIndex: number, lowerTickIndex: number, upperTickIndex: number): PositionStatus {\n if (currentTickIndex < lowerTickIndex) {\n return PositionStatus.BelowRange\n }\n if (currentTickIndex < upperTickIndex) {\n return PositionStatus.InRange\n }\n return PositionStatus.AboveRange\n }\n}\n\n/**\n * Order sqrt price.\n * @param liquidity - liqudity.\n * @param sqrtPrice0X64 - Current sqrt price of coin 0.\n * @param sqrtPrice1X64 - Current sqrt price of coin 1.\n *\n * @returns\n */\nfunction orderSqrtPrice(sqrtPrice0X64: BN, sqrtPrice1X64: BN): [BN, BN] {\n if (sqrtPrice0X64.lt(sqrtPrice1X64)) {\n return [sqrtPrice0X64, sqrtPrice1X64]\n }\n return [sqrtPrice1X64, sqrtPrice0X64]\n}\n\n/**\n * Get token A from liquidity.\n * @param liquidity - liquidity.\n * @param sqrtPrice0X64 - Current sqrt price of coin 0.\n * @param sqrtPrice1X64 - Current sqrt price of coin 1.\n * @param roundUp - If round up.\n *\n * @returns\n */\nexport function getCoinAFromLiquidity(liquidity: BN, sqrtPrice0X64: BN, sqrtPrice1X64: BN, roundUp: boolean) {\n const [sqrtPriceLowerX64, sqrtPriceUpperX64] = orderSqrtPrice(sqrtPrice0X64, sqrtPrice1X64)\n\n const numerator = liquidity.mul(sqrtPriceUpperX64.sub(sqrtPriceLowerX64)).shln(64)\n const denominator = sqrtPriceUpperX64.mul(sqrtPriceLowerX64)\n if (roundUp) {\n return MathUtil.divRoundUp(numerator, denominator)\n }\n return numerator.div(denominator)\n}\n\n/**\n * Get token B from liquidity.\n * @param liquidity - liqudity.\n * @param sqrtPrice0X64 - Current sqrt price of token 0.\n * @param sqrtPrice1X64 - Current sqrt price of token 1.\n * @param roundUp - If round up.\n *\n * @returns\n */\nexport function getCoinBFromLiquidity(liquidity: BN, sqrtPrice0X64: BN, sqrtPrice1X64: BN, roundUp: boolean) {\n const [sqrtPriceLowerX64, sqrtPriceUpperX64] = orderSqrtPrice(sqrtPrice0X64, sqrtPrice1X64)\n\n const result = liquidity.mul(sqrtPriceUpperX64.sub(sqrtPriceLowerX64))\n if (roundUp) {\n return MathUtil.shiftRightRoundUp(result)\n }\n return result.shrn(64)\n}\n\n/**\n * Get liquidity from token A.\n *\n * @param amount - The amount of token A.\n * @param sqrtPriceLowerX64 - The lower sqrt price.\n * @param sqrtPriceUpperX64 - The upper sqrt price.\n * @param roundUp - If round up.\n * @returns liquidity.\n */\nexport function getLiquidityFromCoinA(amount: BN, sqrtPriceLowerX64: BN, sqrtPriceUpperX64: BN, roundUp: boolean) {\n const result = amount.mul(sqrtPriceLowerX64).mul(sqrtPriceUpperX64).div(sqrtPriceUpperX64.sub(sqrtPriceLowerX64))\n if (roundUp) {\n return MathUtil.shiftRightRoundUp(result)\n }\n return result.shrn(64)\n}\n\n/**\n * Get liquidity from token B.\n * @param amount - The amount of token B.\n * @param sqrtPriceLowerX64 - The lower sqrt price.\n * @param sqrtPriceUpperX64 - The upper sqrt price.\n * @param roundUp - If round up.\n *\n * @returns liquidity.\n */\nexport function getLiquidityFromCoinB(amount: BN, sqrtPriceLowerX64: BN, sqrtPriceUpperX64: BN, roundUp: boolean) {\n const numerator = amount.shln(64)\n const denominator = sqrtPriceUpperX64.sub(sqrtPriceLowerX64)\n if (roundUp) {\n return MathUtil.divRoundUp(numerator, denominator)\n }\n return numerator.div(denominator)\n}\n\n/**\n * Get amount of fixed delta.\n * @param currentSqrtPriceX64 - Current sqrt price.\n * @param targetSqrtPriceX64 - Target sqrt price.\n * @param liquidity - liqudity.\n * @param amountSpecified - The amount specified in the swap.\n * @param swapDirection - The swap direction.\n *\n * @returns\n */\nexport function getAmountFixedDelta(\n currentSqrtPriceX64: BN,\n targetSqrtPriceX64: BN,\n liquidity: BN,\n amountSpecified: AmountSpecified,\n swapDirection: SwapDirection\n) {\n if ((amountSpecified === AmountSpecified.Input) === (swapDirection === SwapDirection.A2B)) {\n return getCoinAFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Input)\n }\n return getCoinBFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Input)\n}\n\n/**\n * Get amount of unfixed delta.\n * @param currentSqrtPriceX64 - Current sqrt price.\n * @param targetSqrtPriceX64 - Target sqrt price.\n * @param liquidity - liqudity.\n * @param amountSpecified - The amount specified in the swap.\n * @param swapDirection - The swap direction.\n *\n * @returns\n */\nexport function getAmountUnfixedDelta(\n currentSqrtPriceX64: BN,\n targetSqrtPriceX64: BN,\n liquidity: BN,\n amountSpecified: AmountSpecified,\n swapDirection: SwapDirection\n) {\n if ((amountSpecified === AmountSpecified.Input) === (swapDirection === SwapDirection.A2B)) {\n return getCoinBFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Output)\n }\n return getCoinAFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Output)\n}\n\nexport function adjustForSlippage(n: BN, { numerator, denominator }: Percentage, adjustUp: boolean): BN {\n if (adjustUp) {\n return n.mul(denominator.add(numerator)).div(denominator)\n }\n return n.mul(denominator).div(denominator.add(numerator))\n}\n\nexport function adjustForCoinSlippage(tokenAmount: CoinAmounts, slippage: Percentage, adjustUp: boolean) {\n return {\n tokenMaxA: adjustForSlippage(tokenAmount.coinA, slippage, adjustUp),\n tokenMaxB: adjustForSlippage(tokenAmount.coinB, slippage, adjustUp),\n }\n}\n","import BN from 'bn.js'\nimport { Pool } from '../types/clmm_type'\nimport { ClmmpoolData, TickData, transClmmpoolDataWithoutTicks } from '../types/clmmpool'\nimport { computeSwapStep, SwapStepResult } from './clmm'\nimport { SwapUtils } from './swap'\nimport { ZERO } from './utils'\n\nexport enum SplitUnit {\n FIVE = 5,\n TEN = 10,\n TWENTY = 20,\n TWENTY_FIVE = 25,\n FIVETY = 50,\n HUNDRED = 100,\n}\n\nexport function createSplitArray(minSplitUnit: SplitUnit): number[] {\n let unit\n switch (minSplitUnit) {\n case SplitUnit.FIVE:\n unit = 5\n break\n case SplitUnit.TEN:\n unit = 10\n break\n case SplitUnit.TWENTY:\n unit = 20\n break\n case SplitUnit.TWENTY_FIVE:\n unit = 25\n break\n case SplitUnit.FIVETY:\n unit = 50\n break\n case SplitUnit.HUNDRED:\n unit = 100\n break\n default:\n unit = 1\n }\n const length = 100 / unit + 1\n const splitArray = new Array<number>(length)\n for (let i = 0; i < length; i += 1) {\n splitArray[i] = i * unit\n }\n return splitArray\n}\n\nexport function createSplitAmountArray(amount: BN, minSplitUnit: SplitUnit): BN[] {\n const splitArray = createSplitArray(minSplitUnit)\n const splitAmountArray = new Array<BN>(splitArray.length)\n\n for (let i = 0; i < splitArray.length; i += 1) {\n splitAmountArray[i] = amount.muln(splitArray[i]).divn(100)\n }\n\n return splitAmountArray\n}\n\nexport type SplitSwapResult = {\n amountInArray: BN[]\n amountOutArray: BN[]\n feeAmountArray: BN[]\n nextSqrtPriceArray: BN[]\n isExceed: boolean[]\n}\n\nfunction updateSplitSwapResult(\n maxIndex: number,\n currentIndex: number,\n splitSwapResult: SplitSwapResult,\n stepResult: SwapStepResult\n): SplitSwapResult {\n for (let index = currentIndex; index < maxIndex; index += 1) {\n splitSwapResult.amountInArray[index] = splitSwapResult.amountInArray[index].add(stepResult.amountIn)\n splitSwapResult.amountOutArray[index] = splitSwapResult.amountOutArray[index].add(stepResult.amountOut)\n splitSwapResult.feeAmountArray[index] = splitSwapResult.feeAmountArray[index].add(stepResult.feeAmount)\n }\n return splitSwapResult\n}\n\nfunction computeSplitSwap(\n a2b: boolean,\n byAmountIn: boolean,\n amounts: BN[],\n poolData: ClmmpoolData,\n swapTicks: TickData[]\n): SplitSwapResult {\n let currentLiquidity = new BN(poolData.liquidity)\n let { currentSqrtPrice } = poolData\n\n let splitSwapResult: SplitSwapResult = {\n amountInArray: [],\n amountOutArray: [],\n feeAmountArray: [],\n nextSqrtPriceArray: [],\n isExceed: [],\n }\n\n amounts.forEach(() => {\n splitSwapResult.amountInArray.push(ZERO)\n splitSwapResult.amountOutArray.push(ZERO)\n splitSwapResult.feeAmountArray.push(ZERO)\n splitSwapResult.nextSqrtPriceArray.push(ZERO)\n })\n\n let targetSqrtPrice\n let signedLiquidityChange\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b)\n\n const maxIndex = amounts.length\n let remainerAmount = amounts[1]\n let currentIndex = 1\n\n let ticks\n if (a2b) {\n ticks = swapTicks.sort((a, b) => {\n return b.index - a.index\n })\n } else {\n ticks = swapTicks.sort((a, b) => {\n return a.index - b.index\n })\n }\n\n for (const tick of ticks) {\n if (a2b) {\n if (poolData.currentTickIndex < tick.index) {\n continue\n }\n } else if (poolData.currentTickIndex > tick.index) {\n continue\n }\n if (tick === null) {\n continue\n }\n if ((a2b && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!a2b && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n targetSqrtPrice = sqrtPriceLimit\n } else {\n targetSqrtPrice = tick.sqrtPrice\n }\n\n let tempStepResult: SwapStepResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n nextSqrtPrice: ZERO,\n feeAmount: ZERO,\n }\n\n const tempSqrtPrice = currentSqrtPrice\n const tempLiquidity = currentLiquidity\n let tempRemainerAmount = remainerAmount\n let currentTempIndex = currentIndex\n\n for (let i = currentIndex; i < maxIndex; i += 1) {\n const stepResult = computeSwapStep(\n currentSqrtPrice,\n targetSqrtPrice,\n currentLiquidity,\n remainerAmount,\n new BN(poolData.feeRate),\n byAmountIn\n )\n tempStepResult = stepResult\n\n if (!stepResult.amountIn.eq(ZERO)) {\n remainerAmount = byAmountIn\n ? remainerAmount.sub(stepResult.amountIn.add(stepResult.feeAmount))\n : remainerAmount.sub(stepResult.amountOut)\n }\n\n // splitSwapResult = updateSplitSwapResult(maxIndex, currentIndex, splitSwapResult, stepResult)\n if (remainerAmount.eq(ZERO)) {\n splitSwapResult.amountInArray[i] = splitSwapResult.amountInArray[i].add(stepResult.amountIn)\n splitSwapResult.amountOutArray[i] = splitSwapResult.amountOutArray[i].add(stepResult.amountOut)\n splitSwapResult.feeAmountArray[i] = splitSwapResult.feeAmountArray[i].add(stepResult.feeAmount)\n\n // When current index remainerAmount run out, we need to update the swapResult of current index amountIn\n if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n signedLiquidityChange = a2b ? tick.liquidityNet.mul(new BN(-1)) : tick.liquidityNet\n currentLiquidity = signedLiquidityChange.gt(ZERO)\n ? currentLiquidity.add(signedLiquidityChange)\n : currentLiquidity.sub(signedLiquidityChange.abs())\n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice\n }\n splitSwapResult.amountInArray[i] = splitSwapResult.amountInArray[i].add(splitSwapResult.feeAmountArray[i])\n splitSwapResult.nextSqrtPriceArray[i] = currentSqrtPrice\n currentLiquidity = tempLiquidity\n currentSqrtPrice = tempSqrtPrice\n // remainerAmount = tempRemainerAmount.add(amounts[1].muln(i - currentTempIndex + 1))\n if (i !== maxIndex - 1) {\n remainerAmount = tempRemainerAmount.add(amounts[i + 1].sub(amounts[currentTempIndex]))\n }\n currentIndex += 1\n } else {\n splitSwapResult = updateSplitSwapResult(maxIndex, i, splitSwapResult, stepResult)\n tempRemainerAmount = remainerAmount\n currentTempIndex = currentIndex\n break\n }\n }\n\n if (currentIndex === maxIndex) {\n break\n }\n\n if (tempStepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n signedLiquidityChange = a2b ? tick.liquidityNet.mul(new BN(-1)) : tick.liquidityNet\n currentLiquidity = signedLiquidityChange.gt(ZERO)\n ? currentLiquidity.add(signedLiquidityChange)\n : currentLiquidity.sub(signedLiquidityChange.abs())\n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = tempStepResult.nextSqrtPrice\n }\n }\n\n if (byAmountIn) {\n amounts.forEach((a, i) => {\n splitSwapResult.isExceed.push(splitSwapResult.amountInArray[i].lt(a))\n })\n } else {\n amounts.forEach((a, i) => {\n splitSwapResult.isExceed.push(splitSwapResult.amountOutArray[i].lt(a))\n })\n }\n\n return splitSwapResult\n}\n\nexport class SplitSwap {\n readonly minSplitUnit: number\n\n amountArray: BN[]\n\n private byAmountIn: boolean\n\n private a2b: boolean\n\n private clmmpool: Pool\n\n private ticks: TickData[]\n\n private splitSwapResult: SplitSwapResult\n\n constructor(amount: BN, unit: SplitUnit, clmmpool: Pool, a2b: boolean, byAmountIn: boolean, tickData: TickData[]) {\n this.minSplitUnit = unit\n this.a2b = a2b\n this.byAmountIn = byAmountIn\n this.clmmpool = clmmpool\n this.ticks = tickData\n this.amountArray = []\n this.createSplitSwapParams = this.createSplitSwapParams.bind(this)\n this.createSplitSwapParams(amount, unit)\n this.splitSwapResult = {\n amountInArray: [],\n amountOutArray: [],\n feeAmountArray: [],\n nextSqrtPriceArray: [],\n isExceed: [],\n }\n this.computeSwap = this.computeSwap.bind(this)\n }\n\n createSplitSwapParams(amount: BN, unit: SplitUnit) {\n const amountArray = createSplitAmountArray(amount, unit)\n this.amountArray = amountArray\n }\n\n computeSwap(): SplitSwapResult {\n const pool = transClmmpoolDataWithoutTicks(this.clmmpool)\n this.splitSwapResult = computeSplitSwap(this.a2b, this.byAmountIn, this.amountArray, pool, this.ticks)\n return this.splitSwapResult\n }\n}\n","import Decimal from 'decimal.js'\nimport { get_price_x128_from_real_id, get_real_id_from_price_x128 } from '@magmaprotocol/calc_dlmm'\n\n\nexport class BinMath {\n static getPriceOfBinByBinId(binId: number, binStep: number, decimalsA: number, decimalsB: number): Decimal {\n const twoDec = new Decimal(2)\n const price = new Decimal(get_price_x128_from_real_id(binId, binStep))\n return price.div(twoDec.pow(128)).mul(Decimal.pow(10, decimalsA - decimalsB))\n }\n static getBinIdFromPrice(price: string, binStep: number, decimalsA: number, decimalsB: number) {\n const twoDec = new Decimal(2);\n const tenDec = new Decimal(10)\n const realid = get_real_id_from_price_x128(new Decimal(price).mul(tenDec.pow(decimalsB - decimalsA)).mul(twoDec.pow(128)).toDecimalPlaces(0).toString(), binStep);\n return realid\n }\n\n}\n","/* -------------------------------------------------------------------------- */\n/* Helper functions */\n/* -------------------------------------------------------------------------- */\n\nimport {\n SuiObjectData,\n SuiObjectRef,\n SuiObjectResponse,\n OwnedObjectRef,\n ObjectOwner,\n DisplayFieldsResponse,\n SuiMoveObject,\n SuiParsedData,\n} from '@mysten/sui/client'\n\n/* -------------------------- SuiObjectResponse ------------------------- */\n\nexport function getSuiObjectData(resp: SuiObjectResponse): SuiObjectData | null | undefined {\n return resp.data\n}\n\nexport function getObjectDeletedResponse(resp: SuiObjectResponse): SuiObjectRef | undefined {\n if (resp.error && 'object_id' in resp.error && 'version' in resp.error && 'digest' in resp.error) {\n const { error } = resp\n return {\n objectId: error.object_id,\n version: error.version,\n digest: error.digest,\n } as SuiObjectRef\n }\n\n return undefined\n}\n\nexport function getObjectNotExistsResponse(resp: SuiObjectResponse): string | undefined {\n if (resp.error && 'object_id' in resp.error && !('version' in resp.error) && !('digest' in resp.error)) {\n return resp.error.object_id as string\n }\n\n return undefined\n}\n\nexport function getObjectReference(resp: SuiObjectResponse | OwnedObjectRef): SuiObjectRef | undefined {\n if ('reference' in resp) {\n return resp.reference\n }\n const exists = getSuiObjectData(resp)\n if (exists) {\n return {\n objectId: exists.objectId,\n version: exists.version,\n digest: exists.digest,\n }\n }\n return getObjectDeletedResponse(resp)\n}\n\n/* ------------------------------ SuiObjectRef ------------------------------ */\n\nexport function getObjectId(data: SuiObjectResponse | SuiObjectRef | OwnedObjectRef): string {\n if ('objectId' in data) {\n return data.objectId\n }\n return getObjectReference(data)?.objectId ?? getObjectNotExistsResponse(data as SuiObjectResponse)!\n}\n\nexport function getObjectVersion(data: SuiObjectResponse | SuiObjectRef | SuiObjectData): string | number | undefined {\n if ('version' in data) {\n return data.version\n }\n return getObjectReference(data)?.version\n}\n\n/* -------------------------------- SuiObject ------------------------------- */\n\nexport function isSuiObjectResponse(resp: SuiObjectResponse | SuiObjectData): resp is SuiObjectResponse {\n return (resp as SuiObjectResponse).data !== undefined\n}\n\nfunction isSuiObjectDataWithContent(data: SuiObjectData): data is SuiObjectDataWithContent {\n return data.content !== undefined\n}\n\nexport function getMovePackageContent(data: SuiObjectResponse): any | undefined {\n const suiObject = getSuiObjectData(data)\n if (suiObject?.content?.dataType !== 'package') {\n return undefined\n }\n return suiObject.content.disassembled\n}\nexport function getMoveObject(data: SuiObjectResponse | SuiObjectData): SuiMoveObject | undefined {\n const suiObject = 'data' in data ? getSuiObjectData(data) : (data as SuiObjectData)\n\n if (!suiObject || !isSuiObjectDataWithContent(suiObject) || suiObject.content.dataType !== 'moveObject') {\n return undefined\n }\n\n return suiObject.content as SuiMoveObject\n}\n\nexport function getMoveObjectType(resp: SuiObjectResponse): string | undefined {\n return getMoveObject(resp)?.type\n}\n\n/**\n * Deriving the object type from the object response\n * @returns 'package' if the object is a package, move object type(e.g., 0x2::coin::Coin<0x2::sui::SUI>)\n * if the object is a move object\n */\nexport function getObjectType(resp: SuiObjectResponse | SuiObjectData): string | null | undefined {\n const data = isSuiObjectResponse(resp) ? resp.data : resp\n\n if (!data?.type && 'data' in resp) {\n if (data?.content?.dataType === 'package') {\n return 'package'\n }\n return getMoveObjectType(resp)\n }\n return data?.type\n}\n\nexport function getObjectPreviousTransactionDigest(resp: SuiObjectResponse): string | null | undefined {\n return getSuiObjectData(resp)?.previousTransaction\n}\n\nexport function getObjectOwner(resp: SuiObjectResponse): ObjectOwner | null | undefined {\n return getSuiObjectData(resp)?.owner\n}\n\nexport function getObjectDisplay(resp: SuiObjectResponse): DisplayFieldsResponse {\n const display = getSuiObjectData(resp)?.display\n if (!display) {\n return { data: null, error: null }\n }\n return display\n}\n\n/**\n * Get the fields of a sui object response or data. The dataType of the object must be moveObject.\n * @param {SuiObjectResponse | SuiObjectData}object The object to get the fields from.\n * @returns {any} The fields of the object.\n */\nexport function getObjectFields(object: SuiObjectResponse | SuiObjectData): any {\n const fields = getMoveObject(object)?.fields\n if (fields) {\n if ('fields' in fields) {\n return fields.fields\n }\n return fields\n }\n return undefined\n}\n\nexport interface SuiObjectDataWithContent extends SuiObjectData {\n content: SuiParsedData\n}\n\n/**\n * Return hasPublicTransfer of a move object.\n * @param {SuiObjectResponse | SuiObjectData}data\n * @returns\n */\nexport function hasPublicTransfer(data: SuiObjectResponse | SuiObjectData): boolean {\n return getMoveObject(data)?.hasPublicTransfer ?? false\n}\n","import BN from 'bn.js'\nimport { Pool } from '../types'\nimport { MathUtil } from '../math/utils'\nimport { TickData } from '../types/clmmpool'\nimport { MIN_TICK_INDEX, MAX_TICK_INDEX } from '../types/constants'\n\nexport class TickUtil {\n /**\n * Get min tick index.\n * @param tick_spacing tick spacing\n * @retruns min tick index\n */\n static getMinIndex(tickSpacing: number): number {\n return MIN_TICK_INDEX + (Math.abs(MIN_TICK_INDEX) % tickSpacing)\n }\n\n /**\n * Get max tick index.\n * @param tick_spacing - tick spacing\n * @retruns max tick index\n */\n // eslint-disable-next-line camelcase\n static getMaxIndex(tickSpacing: number): number {\n return MAX_TICK_INDEX - (MAX_TICK_INDEX % tickSpacing)\n }\n}\n\n/**\n * Get nearest tick by current tick.\n *\n * @param tickIndex\n * @param tickSpacing\n * @returns\n */\nexport function getNearestTickByTick(tickIndex: number, tickSpacing: number): number {\n const mod = Math.abs(tickIndex) % tickSpacing\n if (tickIndex > 0) {\n if (mod > tickSpacing / 2) {\n return tickIndex + tickSpacing - mod\n }\n return tickIndex - mod\n }\n if (mod > tickSpacing / 2) {\n return tickIndex - tickSpacing + mod\n }\n return tickIndex + mod\n}\n\n/**\n * Calculate reward amount in tick range.\n * @param {Pool}pool Pool object.\n * @param {TickData}tickLower Tick lower data.\n * @param {TickData}tickUpper Tick upper data.\n * @param {number}tickLowerIndex Tick lower index.\n * @param {number}tickUpperIndex Tick upper index.\n * @param {BN[]}growthGlobal\n * @returns\n */\nexport function getRewardInTickRange(\n pool: Pool,\n tickLower: TickData,\n tickUpper: TickData,\n tickLowerIndex: number,\n tickUpperIndex: number,\n growthGlobal: BN[]\n) {\n const rewarderInfos: any = pool.rewarder_infos\n const rewarderGrowthInside: BN[] = []\n\n for (let i = 0; i < rewarderInfos.length; i += 1) {\n let rewarder_growth_below = growthGlobal[i]\n if (tickLower !== null) {\n if (pool.current_tick_index < tickLowerIndex) {\n rewarder_growth_below = growthGlobal[i].sub(new BN(tickLower.rewardersGrowthOutside[i]))\n } else {\n rewarder_growth_below = tickLower.rewardersGrowthOutside[i]\n }\n }\n let rewarder_growth_above = new BN(0)\n if (tickUpper !== null) {\n if (pool.current_tick_index >= tickUpperIndex) {\n rewarder_growth_above = growthGlobal[i].sub(new BN(tickUpper.rewardersGrowthOutside[i]))\n } else {\n rewarder_growth_above = tickUpper.rewardersGrowthOutside[i]\n }\n }\n const rewGrowthInside = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(growthGlobal[i]), new BN(rewarder_growth_below)),\n new BN(rewarder_growth_above)\n )\n\n rewarderGrowthInside.push(rewGrowthInside)\n }\n return rewarderGrowthInside\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { bcs } from '@mysten/bcs'\nimport { CoinAssist } from '../math/CoinAssist'\nimport { OnePath, SwapWithRouterParams } from '../modules/routerModule'\nimport { TickData } from '../types/clmmpool'\nimport {\n ClaimAndLockParams,\n ClaimFeesParams,\n ClaimFeesPoolsParams,\n CreateLockParams,\n IncreaseLockAmountParams,\n IncreaseUnlockTimeParams,\n LockPermanentParams,\n MergeLockParams,\n PokeParams,\n TransferLockParams,\n VoteParams,\n} from '../types/lock_type'\nimport {\n ClmmIntegrateRouterWithPartnerModule,\n ClmmIntegratePoolV2Module,\n ClmmIntegrateRouterModule,\n ClmmIntegrateUtilsModule,\n CLOCK_ADDRESS,\n VotingEscrow,\n Voter,\n RewardDistributor,\n} from '../types/sui'\nimport SDK, {\n AddLiquidityFixTokenParams,\n adjustForSlippage,\n asUintN,\n ClmmPoolUtil,\n CoinAsset,\n CoinPairType,\n CollectRewarderParams,\n d,\n DeepbookUtils,\n getPackagerConfigs,\n normalizeCoinType,\n Percentage,\n Pool,\n SdkOptions,\n SwapParams,\n SwapUtils,\n ZERO,\n} from '../index'\nimport { AggregatorResult, BasePath } from '../modules/routerModuleV2'\nimport { ClmmpoolsError, UtilsErrorCode } from '../errors/errors'\n\nexport type AdjustResult = {\n isAdjustCoinA: boolean\n isAdjustCoinB: boolean\n}\n\n/**\n * Adjust coinpair is sui\n * @param {CoinPairType} coinPair\n * @returns\n */\nexport function findAdjustCoin(coinPair: CoinPairType): AdjustResult {\n const isAdjustCoinA = CoinAssist.isSuiCoin(coinPair.coinTypeA)\n const isAdjustCoinB = CoinAssist.isSuiCoin(coinPair.coinTypeB)\n return { isAdjustCoinA, isAdjustCoinB }\n}\n\nexport type BuildCoinResult = {\n targetCoin: TransactionObjectArgument\n remainCoins: CoinAsset[]\n isMintZeroCoin: boolean\n tragetCoinAmount: string\n originalSplitedCoin?: TransactionObjectArgument\n}\n\ntype CoinInputInterval = {\n amountSecond: bigint\n amountFirst: bigint\n}\n\n/**\n *\n * @param {number} slippageAmount\n * @param slippage\n * @returns\n */\nfunction reverSlippageAmount(slippageAmount: number | string, slippage: number): string {\n return Decimal.ceil(d(slippageAmount).div(1 + slippage)).toString()\n}\n\nexport async function printTransaction(tx: Transaction, isPrint = true) {\n console.log(`inputs`, tx.blockData.inputs)\n tx.blockData.transactions.forEach((item, index) => {\n if (isPrint) {\n console.log(`transaction ${index}: `, item)\n }\n })\n}\n\ninterface TransferedCoin {\n coinType: string\n coin: TransactionObjectArgument\n}\n\nexport class TransactionUtil {\n static createCollectRewarderAndFeeParams(\n sdk: SDK,\n tx: Transaction,\n params: CollectRewarderParams,\n allCoinAsset: CoinAsset[],\n allCoinAssetA?: CoinAsset[],\n allCoinAssetB?: CoinAsset[]\n ) {\n if (allCoinAssetA === undefined) {\n allCoinAssetA = [...allCoinAsset]\n }\n if (allCoinAssetB === undefined) {\n allCoinAssetB = [...allCoinAsset]\n }\n const coinTypeA = normalizeCoinType(params.coinTypeA)\n const coinTypeB = normalizeCoinType(params.coinTypeB)\n if (params.collect_fee) {\n const primaryCoinAInput = TransactionUtil.buildCoinForAmount(tx, allCoinAssetA, BigInt(0), coinTypeA, false)\n allCoinAssetA = primaryCoinAInput.remainCoins\n\n const primaryCoinBInput = TransactionUtil.buildCoinForAmount(tx, allCoinAssetB, BigInt(0), coinTypeB, false)\n allCoinAssetB = primaryCoinBInput.remainCoins\n\n tx = sdk.Position.createCollectFeePaylod(\n {\n pool_id: params.pool_id,\n pos_id: params.pos_id,\n coinTypeA: params.coinTypeA,\n coinTypeB: params.coinTypeB,\n },\n tx,\n primaryCoinAInput.targetCoin,\n primaryCoinBInput.targetCoin\n )\n }\n const primaryCoinInputs: TransactionObjectArgument[] = []\n params.rewarder_coin_types.forEach((type) => {\n switch (normalizeCoinType(type)) {\n case coinTypeA:\n primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAssetA!, BigInt(0), type, false).targetCoin)\n break\n case coinTypeB:\n primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAssetB!, BigInt(0), type, false).targetCoin)\n break\n default:\n primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(0), type, false).targetCoin)\n break\n }\n })\n tx = sdk.Rewarder.createCollectRewarderPaylod(params, tx, primaryCoinInputs)\n return tx\n }\n\n /**\n * adjust transaction for gas\n * @param sdk\n * @param amount\n * @param tx\n * @returns\n */\n static async adjustTransactionForGas(\n sdk: SDK,\n allCoins: CoinAsset[],\n amount: bigint,\n tx: Transaction\n ): Promise<{ fixAmount: bigint; newTx?: Transaction }> {\n tx.setSender(sdk.senderAddress)\n // amount coins\n const amountCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(allCoins, amount).selectedCoins\n if (amountCoins.length === 0) {\n throw new ClmmpoolsError(`Insufficient balance`, UtilsErrorCode.InsufficientBalance)\n }\n const totalAmount = CoinAssist.calculateTotalBalance(allCoins)\n // If the remaining coin balance is greater than 1000000000, no gas fee correction will be done\n if (totalAmount - amount > 1000000000) {\n return { fixAmount: amount }\n }\n\n // payload Estimated gas consumption\n const estimateGas = await sdk.fullClient.calculationTxGas(tx)\n\n // Find estimateGas objectIds\n const gasCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(\n allCoins,\n BigInt(estimateGas),\n amountCoins.map((item) => item.coinObjectId)\n ).selectedCoins\n\n // There is not enough gas and the amount needs to be adjusted\n if (gasCoins.length === 0) {\n // Readjust the amount , Reserve 500 gas for the spit\n const newGas = BigInt(estimateGas) + BigInt(500)\n if (totalAmount - amount < newGas) {\n amount -= newGas\n if (amount < 0) {\n throw new ClmmpoolsError(`gas Insufficient balance`, UtilsErrorCode.InsufficientBalance)\n }\n\n const newTx = new Transaction()\n return { fixAmount: amount, newTx }\n }\n }\n return { fixAmount: amount }\n }\n\n // -----------------------------------------liquidity-----------------------------------------------//\n /**\n * build add liquidity transaction\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildAddLiquidityFixTokenForGas(\n sdk: SDK,\n allCoins: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n gasEstimateArg: {\n slippage: number\n curSqrtPrice: BN\n },\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n tx = await TransactionUtil.buildAddLiquidityFixToken(sdk, allCoins, params, tx, inputCoinA, inputCoinB)\n\n const { isAdjustCoinA } = findAdjustCoin(params)\n\n const suiAmount = isAdjustCoinA ? params.amount_a : params.amount_b\n\n const newResult = await TransactionUtil.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(isAdjustCoinA ? params.coinTypeA : params.coinTypeB, allCoins),\n BigInt(suiAmount),\n tx\n )\n\n const { fixAmount } = newResult\n const { newTx } = newResult\n\n if (newTx != null) {\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n\n if (isAdjustCoinA) {\n params.amount_a = Number(fixAmount)\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n !params.fix_amount_a,\n fixAmount.toString(),\n params.slippage,\n params.coinTypeA,\n allCoins,\n false,\n true\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coinTypeB,\n allCoins,\n false,\n true\n )\n } else {\n params.amount_b = Number(fixAmount)\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coinTypeA,\n allCoins,\n false,\n true\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n params.fix_amount_a,\n fixAmount.toString(),\n params.slippage,\n params.coinTypeB,\n allCoins,\n false,\n true\n )\n params = TransactionUtil.fixAddLiquidityFixTokenParams(params, gasEstimateArg.slippage, gasEstimateArg.curSqrtPrice)\n\n tx = TransactionUtil.buildAddLiquidityFixTokenArgs(newTx, sdk, allCoins, params, primaryCoinAInputs, primaryCoinBInputs)\n return tx\n }\n }\n return tx\n }\n\n /**\n * build add liquidity transaction\n * @param params\n * @param packageId\n * @returns\n */\n static async buildAddLiquidityFixToken(\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n tx = tx || new Transaction()\n\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n if (inputCoinA == null || inputCoinB == null) {\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coinTypeA,\n allCoinAsset,\n false,\n true\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coinTypeB,\n allCoinAsset,\n false,\n true\n )\n } else {\n primaryCoinAInputs = {\n targetCoin: inputCoinA,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n primaryCoinBInputs = {\n targetCoin: inputCoinB,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n }\n\n tx = TransactionUtil.buildAddLiquidityFixTokenArgs(\n tx,\n sdk,\n allCoinAsset,\n params as AddLiquidityFixTokenParams,\n primaryCoinAInputs,\n primaryCoinBInputs\n )\n return tx\n }\n\n /**\n * build add liquidity with protection transaction\n * @param params\n * @param packageId\n * @returns\n */\n static async buildAddLiquidityWithProtectionFixToken(\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n tx = tx || new Transaction()\n\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n if (inputCoinA == null || inputCoinB == null) {\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coinTypeA,\n allCoinAsset,\n false\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coinTypeB,\n allCoinAsset,\n false\n )\n } else {\n primaryCoinAInputs = {\n targetCoin: inputCoinA,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n primaryCoinBInputs = {\n targetCoin: inputCoinB,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n }\n\n tx = TransactionUtil.buildAddLiquidityWithProtectionFixTokenArgs(\n tx,\n sdk,\n allCoinAsset,\n params as AddLiquidityFixTokenParams,\n primaryCoinAInputs,\n primaryCoinBInputs\n )\n return tx\n }\n\n public static buildAddLiquidityFixTokenCoinInput(\n tx: Transaction,\n need_interval_amount: boolean,\n amount: number | string,\n slippage: number,\n coinType: string,\n allCoinAsset: CoinAsset[],\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n return need_interval_amount\n ? TransactionUtil.buildCoinForAmountInterval(\n tx,\n allCoinAsset,\n { amountSecond: BigInt(reverSlippageAmount(amount, slippage)), amountFirst: BigInt(amount) },\n coinType,\n buildVector,\n fixAmount\n )\n : TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(amount), coinType, buildVector, fixAmount)\n }\n\n /**\n * fix add liquidity fix token for coin amount\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static fixAddLiquidityFixTokenParams(params: AddLiquidityFixTokenParams, slippage: number, curSqrtPrice: BN): AddLiquidityFixTokenParams {\n const coinAmount = params.fix_amount_a ? params.amount_a : params.amount_b\n const liquidityInput = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(\n Number(params.tick_lower),\n Number(params.tick_upper),\n new BN(coinAmount),\n params.fix_amount_a,\n true,\n slippage,\n curSqrtPrice\n )\n\n params.amount_a = params.fix_amount_a ? params.amount_a : liquidityInput.tokenMaxA.toNumber()\n params.amount_b = params.fix_amount_a ? liquidityInput.tokenMaxB.toNumber() : params.amount_b\n\n return params\n }\n\n private static buildAddLiquidityFixTokenArgs(\n tx: Transaction,\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n primaryCoinAInputs: BuildCoinResult,\n primaryCoinBInputs: BuildCoinResult\n ) {\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const functionName = params.is_open ? 'open_position_with_liquidity_by_fix_coin' : 'add_liquidity_by_fix_coin'\n const { clmm_pool, integrate } = sdk.sdkOptions\n\n if (!params.is_open) {\n tx = TransactionUtil.createCollectRewarderAndFeeParams(\n sdk,\n tx,\n params,\n allCoinAsset,\n primaryCoinAInputs.remainCoins,\n primaryCoinBInputs.remainCoins\n )\n }\n\n const clmmConfig = getPackagerConfigs(clmm_pool)\n const args = params.is_open\n ? [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.amount_a),\n tx.pure.u64(params.amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.amount_a),\n tx.pure.u64(params.amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n private static buildAddLiquidityWithProtectionFixTokenArgs(\n tx: Transaction,\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n primaryCoinAInputs: BuildCoinResult,\n primaryCoinBInputs: BuildCoinResult\n ) {\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const functionName = params.is_open\n ? 'open_position_with_liquidity_by_fix_coin_with_protection'\n : 'add_liquidity_by_fix_coin_with_protection'\n const { clmm_pool, integrate } = sdk.sdkOptions\n\n if (!params.is_open) {\n tx = TransactionUtil.createCollectRewarderAndFeeParams(\n sdk,\n tx,\n params,\n allCoinAsset,\n primaryCoinAInputs.remainCoins,\n primaryCoinBInputs.remainCoins\n )\n }\n\n const clmmConfig = getPackagerConfigs(clmm_pool)\n let min_amount_a, max_amount_a, min_amount_b, max_amount_b\n if (params.fix_amount_a) {\n max_amount_a = params.amount_a\n min_amount_a = params.amount_a\n max_amount_b = params.amount_b\n min_amount_b = new Decimal(params.amount_b)\n .div(new Decimal(1).plus(new Decimal(params.slippage)))\n .mul(new Decimal(1).minus(new Decimal(params.slippage)))\n .toDecimalPlaces(0)\n .toNumber()\n } else {\n max_amount_b = params.amount_b\n min_amount_b = params.amount_b\n max_amount_a = params.amount_a\n min_amount_a = new Decimal(params.amount_a)\n .div(new Decimal(1).plus(new Decimal(params.slippage)))\n .mul(new Decimal(1).minus(new Decimal(params.slippage)))\n .toDecimalPlaces(0)\n .toNumber()\n }\n\n const args = params.is_open\n ? [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(max_amount_a),\n tx.pure.u64(max_amount_b),\n tx.pure.u64(min_amount_a),\n tx.pure.u64(min_amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(max_amount_a),\n tx.pure.u64(max_amount_b),\n tx.pure.u64(min_amount_a),\n tx.pure.u64(min_amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n // const args = params.is_open\n // ? [\n // tx.object(clmmConfig.global_config_id),\n // tx.object(params.pool_id),\n // tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n // tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n // primaryCoinAInputs.targetCoin,\n // primaryCoinBInputs.targetCoin,\n // tx.pure.u64(params.amount_a),\n // tx.pure.u64(params.amount_b),\n // tx.pure.bool(params.fix_amount_a),\n // tx.object(CLOCK_ADDRESS),\n // ]\n // : [\n // tx.object(clmmConfig.global_config_id),\n // tx.object(params.pool_id),\n // tx.object(params.pos_id),\n // primaryCoinAInputs.targetCoin,\n // primaryCoinBInputs.targetCoin,\n // tx.pure.u64(params.amount_a),\n // tx.pure.u64(params.amount_b),\n // tx.pure.bool(params.fix_amount_a),\n // tx.object(CLOCK_ADDRESS),\n // ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // -------------------------------------------swap--------------------------------------------------//\n /**\n * build add liquidity transaction\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildSwapTransactionForGas(\n sdk: SDK,\n params: SwapParams,\n allCoinAsset: CoinAsset[],\n gasEstimateArg: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<Transaction> {\n let tx = TransactionUtil.buildSwapTransaction(sdk, params, allCoinAsset)\n tx.setSender(sdk.senderAddress)\n const newResult = await TransactionUtil.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(params.a2b ? params.coinTypeA : params.coinTypeB, allCoinAsset),\n BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n tx\n )\n\n const { fixAmount, newTx } = newResult\n\n if (newTx !== undefined) {\n newTx.setSender(sdk.senderAddress)\n if (params.by_amount_in) {\n params.amount = fixAmount.toString()\n } else {\n params.amount_limit = fixAmount.toString()\n }\n params = await TransactionUtil.fixSwapParams(sdk, params, gasEstimateArg)\n\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB\n )\n\n tx = TransactionUtil.buildSwapTransactionArgs(newTx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n }\n\n return tx\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransaction(sdk: SDK, params: SwapParams, allCoinAsset: CoinAsset[]): Transaction {\n let tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA,\n false\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB,\n false\n )\n\n tx = TransactionUtil.buildSwapTransactionArgs(tx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n return tx\n }\n\n static buildCreateLockTransaction(sdk: SDK, params: CreateLockParams, allCoinAsset: CoinAsset[]): Transaction {\n let tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { magma_token } = getPackagerConfigs(sdk.sdkOptions.ve33)\n const lockCoinInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount), magma_token, false, true)\n tx = TransactionUtil.buildCreateTransactionArgs(tx, params, sdk.sdkOptions, lockCoinInput)\n return tx\n }\n\n static buildCreateTransactionArgs(\n tx: Transaction,\n params: CreateLockParams,\n sdkOptions: SdkOptions,\n lockCoinInput: BuildCoinResult\n ): Transaction {\n const { integrate, ve33 } = sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'create_lock'\n const coins = tx.makeMoveVec({ elements: [lockCoinInput.targetCoin] })\n const args = [\n tx.object(voting_escrow_id),\n coins,\n tx.pure.u64(params.lockDurationDays),\n tx.pure.bool(params.permanent),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildIncreaseLockAmountTransaction(sdk: SDK, params: IncreaseLockAmountParams, allCoinAsset: CoinAsset[]): Transaction {\n const { magma_token } = getPackagerConfigs(sdk.sdkOptions.ve33)\n\n let tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n const lockCoinInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount), magma_token, false, true)\n\n tx = TransactionUtil.buildIncreaseLockAmountTransactionArgs(tx, params, sdk.sdkOptions, lockCoinInput)\n return tx\n }\n\n static buildIncreaseLockAmountTransactionArgs(\n tx: Transaction,\n params: IncreaseLockAmountParams,\n sdkOptions: SdkOptions,\n increaseCoinInput: BuildCoinResult\n ): Transaction {\n const { integrate, ve33 } = sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'increase_amount_single_coin'\n\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), increaseCoinInput.targetCoin, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun merge<T>(self: &mut VotingEscrow<T>, from_lock: Lock, to_lock: &mut Lock, clock: &Clock, ctx: &mut TxContext) {\n static buildMergeLockTransaction(sdk: SDK, params: MergeLockParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voter_id, voting_escrow_id, magma_token, distribution_cfg } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'merge_locks'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(params.fromLockId),\n tx.object(params.toLockId),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun transfer<T>(lock: Lock, ve: &mut VotingEscrow<T>, to: address, clock: &Clock, ctx: &mut TxContext) {\n static buildTransferLockTransaction(sdk: SDK, params: TransferLockParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'transfer'\n\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), tx.object(params.to), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun increase_unlock_time<T>(self: &mut VotingEscrow<T>, lock: &mut Lock, lock_duration: u64, clock: &Clock, ctx: &mut TxContext) {\n static buildIncreaseUnlockTimeTransaction(sdk: SDK, params: IncreaseUnlockTimeParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const oneDay = 24 * 60 * 60\n const newLockDuration = Math.ceil((params.newLockEndAt - Date.now() / 1000) / oneDay)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'increase_unlock_time'\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), tx.pure.u64(newLockDuration), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun lock_permanent<T>(self: &mut VotingEscrow<T>, lock: &mut Lock, clock: &Clock, ctx: &mut TxContext) {\n static buildLockPermanentTransaction(sdk: SDK, params: LockPermanentParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'lock_permanent'\n\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildUnlockPermanentTransaction(sdk: SDK, params: LockPermanentParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, distribution_cfg, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'unlock_permanent'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(params.lockId),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildBurnLockTransaction(sdk: SDK, lockId: string) {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, distribution_cfg, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'burn_lock'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(lockId),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildSplitLockTransaction(sdk: SDK, lockId: string, splitAmount: bigint | number | string) {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, distribution_cfg, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'split_lock'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(lockId),\n tx.pure.u64(splitAmount),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildVoteTransaction(sdk: SDK, params: VoteParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { distribution_cfg, voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'vote'\n\n const pools = tx.pure.vector('id', params.pools)\n const weights = tx.makeMoveVec({\n elements: params.weights.map((weight) => tx.pure.u64(weight)),\n type: 'u64',\n })\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(params.lockId),\n pools,\n weights,\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimVotingRewardsTransaction(sdk: SDK, params: ClaimFeesParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n\n const typeArguments = [magma_token, params.coinAType, params.coinBType]\n const functionName = 'claim_voting_fee_rewards_single'\n\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), tx.object(params.locks), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimVotingRewardsPoolsTransaction(sdk: SDK, params: ClaimFeesPoolsParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, distribution, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n\n const typeArguments = [magma_token, params.coinAType, params.coinBType]\n const functionName = 'claim_voting_fee_rewards'\n\n const locks = tx.makeMoveVec({\n elements: params.locks.map((lock) => tx.object(lock)),\n type: `${distribution.package_id}::voting_escrow::Lock`,\n })\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), locks, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimAndLockRebases(sdk: SDK, params: ClaimAndLockParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, reward_distributor_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'claim_and_lock'\n\n const args = [tx.object(reward_distributor_id), tx.object(voting_escrow_id), tx.object(params.lockId), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${RewardDistributor}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildPoke(sdk: SDK, params: PokeParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { distribution_cfg, voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'poke'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(params.lockId),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimVotingBribe(sdk: SDK, locks: string[], incentive_tokens: string[]): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, distribution, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...incentive_tokens]\n\n let targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes_${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes`\n }\n\n const locksParams = tx.makeMoveVec({\n elements: locks.map((lock) => tx.object(lock)),\n type: `${distribution.package_id}::voting_escrow::Lock`,\n })\n\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), locksParams, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: targetFunc,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionArgs(\n tx: Transaction,\n params: SwapParams,\n sdkOptions: SdkOptions,\n primaryCoinInputA: BuildCoinResult,\n primaryCoinInputB: BuildCoinResult\n ): Transaction {\n const { clmm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n if (global_config_id === undefined) {\n throw Error('clmm.config.global_config_id is undefined')\n }\n\n const hasSwapPartner = params.swap_partner !== undefined\n\n const functionName = hasSwapPartner\n ? params.a2b\n ? 'swap_a2b_with_partner'\n : 'swap_b2a_with_partner'\n : params.a2b\n ? 'swap_a2b'\n : 'swap_b2a'\n\n const args = hasSwapPartner\n ? [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n tx.object(params.swap_partner!),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u64(params.amount_limit),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u64(params.amount_limit),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // -------------------------------------swap-with-out-transfer-coin-----------------------------------------//\n /**\n * build add liquidity transaction with out transfer coins\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildSwapTransactionWithoutTransferCoinsForGas(\n sdk: SDK,\n params: SwapParams,\n allCoinAsset: CoinAsset[],\n gasEstimateArg: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<{ tx: Transaction; coinABs: TransactionObjectArgument[] }> {\n let { tx, coinABs } = TransactionUtil.buildSwapTransactionWithoutTransferCoins(sdk, params, allCoinAsset)\n tx.setSender(sdk.senderAddress)\n const newResult = await TransactionUtil.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(params.a2b ? params.coinTypeA : params.coinTypeB, allCoinAsset),\n BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n tx\n )\n\n const { fixAmount, newTx } = newResult\n\n if (newTx !== undefined) {\n newTx.setSender(sdk.senderAddress)\n if (params.by_amount_in) {\n params.amount = fixAmount.toString()\n } else {\n params.amount_limit = fixAmount.toString()\n }\n params = await TransactionUtil.fixSwapParams(sdk, params, gasEstimateArg)\n\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA,\n false,\n true\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB,\n false,\n true\n )\n\n const res = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n sdk,\n newTx,\n params,\n sdk.sdkOptions,\n primaryCoinInputA,\n primaryCoinInputB\n )\n tx = res.tx\n coinABs = res.txRes\n }\n\n return { tx, coinABs }\n }\n\n /**\n * build swap transaction and return swaped coin\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionWithoutTransferCoins(\n sdk: SDK,\n params: SwapParams,\n allCoinAsset: CoinAsset[]\n ): { tx: Transaction; coinABs: TransactionObjectArgument[] } {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n // Fix amount must set true, to support amount limit.\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA,\n false,\n true\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB,\n false,\n true\n )\n\n const res = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n sdk,\n tx,\n params,\n sdk.sdkOptions,\n primaryCoinInputA,\n primaryCoinInputB\n )\n return { tx: res.tx, coinABs: res.txRes }\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionWithoutTransferCoinArgs(\n sdk: SDK,\n tx: Transaction,\n params: SwapParams,\n sdkOptions: SdkOptions,\n primaryCoinInputA: BuildCoinResult,\n primaryCoinInputB: BuildCoinResult\n ): { tx: Transaction; txRes: TransactionObjectArgument[] } {\n const { clmm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n if (global_config_id === undefined) {\n throw Error('clmm.config.global_config_id is undefined')\n }\n\n const hasSwapPartner = params.swap_partner !== undefined\n\n const functionName = hasSwapPartner ? 'swap_with_partner' : 'swap'\n\n const moduleName = hasSwapPartner ? ClmmIntegrateRouterWithPartnerModule : ClmmIntegrateRouterModule\n\n const args = hasSwapPartner\n ? [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n tx.object(params.swap_partner!),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(false), // use coin value always set false.\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(false), // use coin value always set false.\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const coinABs: TransactionObjectArgument[] = tx.moveCall({\n target: `${integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n if (params.by_amount_in) {\n const toCoinType = params.a2b ? params.coinTypeB : params.coinTypeA\n const toCoin = params.a2b ? coinABs[1] : coinABs[0]\n const totalAmount = Number(params.amount_limit)\n this.checkCoinThreshold(sdk, params.by_amount_in, tx, toCoin, totalAmount, toCoinType)\n }\n\n return { tx, txRes: coinABs }\n }\n\n static async fixSwapParams(\n sdk: SDK,\n params: SwapParams,\n gasEstimateArg: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<SwapParams> {\n const { currentPool } = gasEstimateArg\n try {\n const res: any = await sdk.Swap.preswap({\n decimalsA: gasEstimateArg.decimalsA,\n decimalsB: gasEstimateArg.decimalsB,\n a2b: params.a2b,\n byAmountIn: params.by_amount_in,\n amount: params.amount,\n pool: currentPool,\n currentSqrtPrice: currentPool.current_sqrt_price,\n coinTypeA: currentPool.coinTypeA,\n coinTypeB: currentPool.coinTypeB,\n })\n\n const toAmount = gasEstimateArg.byAmountIn ? res.estimatedAmountOut : res.estimatedAmountIn\n\n const amountLimit = adjustForSlippage(toAmount, gasEstimateArg.slippage, !gasEstimateArg.byAmountIn)\n params.amount_limit = amountLimit.toString()\n } catch (error) {\n console.log('fixSwapParams', error)\n }\n\n return params\n }\n\n public static async syncBuildCoinInputForAmount(\n sdk: SDK,\n tx: Transaction,\n amount: bigint,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): Promise<TransactionObjectArgument | undefined> {\n if (sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n const allCoins = await sdk.getOwnerCoinAssets(sdk.senderAddress, coinType)\n const primaryCoinInput: any = TransactionUtil.buildCoinForAmount(tx, allCoins, amount, coinType, buildVector, fixAmount)!.targetCoin\n\n return primaryCoinInput\n }\n\n public static buildCoinForAmount(\n tx: Transaction,\n allCoins: CoinAsset[],\n amount: bigint,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n // mint zero coin\n if (amount === BigInt(0)) {\n return TransactionUtil.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n }\n const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n if (amountTotal < amount) {\n throw new ClmmpoolsError(\n `The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amount} `,\n UtilsErrorCode.InsufficientBalance\n )\n }\n\n return TransactionUtil.buildCoin(tx, allCoins, coinAssets, amount, coinType, buildVector, fixAmount)\n }\n\n private static buildVectorCoin(\n tx: Transaction,\n allCoins: CoinAsset[],\n coinAssets: CoinAsset[],\n amount: bigint,\n coinType: string,\n fixAmount = true\n ) {\n if (CoinAssist.isSuiCoin(coinType)) {\n const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n return {\n targetCoin: tx.makeMoveVec({ elements: [amountCoin] }),\n remainCoins: allCoins,\n tragetCoinAmount: amount.toString(),\n isMintZeroCoin: false,\n originalSplitedCoin: tx.gas,\n }\n }\n\n const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult, coinObjectIds } = this.buildSpitTargeCoin(\n tx,\n amount,\n coinAssets,\n fixAmount\n )\n\n if (fixAmount) {\n return {\n targetCoin: tx.makeMoveVec({ elements: [targetCoin] }),\n remainCoins: selectedCoinsResult.remainCoins,\n originalSplitedCoin,\n tragetCoinAmount,\n isMintZeroCoin: false,\n }\n }\n\n return {\n targetCoin: tx.makeMoveVec({ elements: coinObjectIds.map((id) => tx.object(id)) }),\n remainCoins: selectedCoinsResult.remainCoins,\n tragetCoinAmount: selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString(),\n isMintZeroCoin: false,\n }\n }\n\n private static buildOneCoin(tx: Transaction, coinAssets: CoinAsset[], amount: bigint, coinType: string, fixAmount = true) {\n if (CoinAssist.isSuiCoin(coinType)) {\n if (amount === 0n && coinAssets.length > 1) {\n const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n return {\n targetCoin: tx.object(selectedCoinsResult.objectArray[0]),\n remainCoins: selectedCoinsResult.remainCoins,\n tragetCoinAmount: selectedCoinsResult.amountArray[0],\n isMintZeroCoin: false,\n }\n }\n const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n return {\n targetCoin: amountCoin,\n remainCoins: selectedCoinsResult.remainCoins,\n tragetCoinAmount: amount.toString(),\n isMintZeroCoin: false,\n originalSplitedCoin: tx.gas,\n }\n }\n\n const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult } = this.buildSpitTargeCoin(\n tx,\n amount,\n coinAssets,\n fixAmount\n )\n\n return {\n targetCoin,\n remainCoins: selectedCoinsResult.remainCoins,\n originalSplitedCoin,\n tragetCoinAmount,\n isMintZeroCoin: false,\n }\n }\n\n private static buildSpitTargeCoin(tx: Transaction, amount: bigint, coinAssets: CoinAsset[], fixAmount: boolean) {\n const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n const totalSelectedCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n const coinObjectIds = selectedCoinsResult.objectArray\n\n const [primaryCoinA, ...mergeCoinAs] = coinObjectIds\n const primaryCoinAObject = tx.object(primaryCoinA)\n\n let targetCoin: any = primaryCoinAObject\n const tragetCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n let originalSplitedCoin\n if (mergeCoinAs.length > 0) {\n tx.mergeCoins(\n primaryCoinAObject,\n mergeCoinAs.map((coin) => tx.object(coin))\n )\n }\n\n if (fixAmount && Number(totalSelectedCoinAmount) > Number(amount)) {\n targetCoin = tx.splitCoins(primaryCoinAObject, [tx.pure.u64(amount)])\n originalSplitedCoin = primaryCoinAObject\n }\n\n return {\n originalSplitedCoin,\n targetCoin,\n tragetCoinAmount,\n selectedCoinsResult,\n coinObjectIds,\n }\n }\n\n private static buildCoin(\n tx: Transaction,\n allCoins: CoinAsset[],\n coinAssets: CoinAsset[],\n amount: bigint,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n if (buildVector) {\n return this.buildVectorCoin(tx, allCoins, coinAssets, amount, coinType, fixAmount)\n }\n\n return this.buildOneCoin(tx, coinAssets, amount, coinType, fixAmount)\n }\n\n private static buildZeroValueCoin(allCoins: CoinAsset[], tx: Transaction, coinType: string, buildVector = true): BuildCoinResult {\n const zeroCoin = TransactionUtil.callMintZeroValueCoin(tx, coinType)\n let targetCoin: any\n if (buildVector) {\n targetCoin = tx.makeMoveVec({ elements: [zeroCoin] })\n } else {\n targetCoin = zeroCoin\n }\n\n return {\n targetCoin,\n remainCoins: allCoins,\n isMintZeroCoin: true,\n tragetCoinAmount: '0',\n }\n }\n\n public static buildCoinForAmountInterval(\n tx: Transaction,\n allCoins: CoinAsset[],\n amounts: CoinInputInterval,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n if (amounts.amountFirst === BigInt(0)) {\n if (coinAssets.length > 0) {\n return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n }\n return TransactionUtil.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n }\n\n const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n\n if (amountTotal >= amounts.amountFirst) {\n return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n }\n\n if (amountTotal < amounts.amountSecond) {\n throw new ClmmpoolsError(\n `The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amounts.amountSecond} `,\n UtilsErrorCode.InsufficientBalance\n )\n }\n\n return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountSecond, coinType, buildVector, fixAmount)\n }\n\n static callMintZeroValueCoin = (txb: Transaction, coinType: string) => {\n return txb.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [coinType],\n })\n }\n\n // ------------------------------------------router-v1-------------------------------------------------//\n public static async buildRouterSwapTransaction(\n sdk: SDK,\n params: SwapWithRouterParams,\n byAmountIn: boolean,\n allCoinAsset: CoinAsset[],\n // If recipient not set, transfer objects move call will use ctx sender.\n recipient?: string\n ): Promise<Transaction> {\n let tx = new Transaction()\n\n // When the router's split path length exceeds 1, router cannot support partner.\n // now router v1 just return one best path.\n // when use router v2, must set allow split to false.\n if (params.paths.length > 1) {\n params.partner = ''\n }\n\n tx = await this.buildRouterBasePathTx(sdk, params, byAmountIn, allCoinAsset, tx, recipient)\n return tx\n }\n\n static async buildRouterBasePathTx(\n sdk: SDK,\n params: SwapWithRouterParams,\n byAmountIn: boolean,\n allCoinAsset: CoinAsset[],\n tx: Transaction,\n // If recipient not set, transfer objects move call will use ctx sender.\n recipient?: string\n ) {\n const validPaths = params.paths.filter((path) => path && path.poolAddress)\n const inputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n const outputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n const totalAmountLimit = byAmountIn\n ? Math.round(Number(outputAmount.toString()) * (1 - params.priceSlippagePoint))\n : Math.round(Number(inputAmount.toString()) * (1 + params.priceSlippagePoint))\n\n const fromCoinType = params.paths[0].coinType[0]\n const toCoinType = params.paths[0].coinType[params.paths[0].coinType.length - 1]\n\n // When fix amount out, the amount of fromCoin must set to amountLimit to support limit amount slippage point.\n const fromCoinBuildResult = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n byAmountIn ? BigInt(inputAmount) : BigInt(totalAmountLimit),\n fromCoinType,\n false,\n true\n )\n const isSplited = fromCoinBuildResult.originalSplitedCoin !== undefined\n const toCoinBuildResult = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, 0n, toCoinType, false)\n\n const buildRouterBasePathReturnCoin = await this.buildRouterBasePathReturnCoins(\n sdk,\n params,\n byAmountIn,\n fromCoinBuildResult,\n toCoinBuildResult,\n tx\n )\n\n const transferedCoins: TransferedCoin[] = []\n const { toCoin, fromCoin } = buildRouterBasePathReturnCoin\n tx = buildRouterBasePathReturnCoin.tx\n\n if (toCoinBuildResult.isMintZeroCoin) {\n transferedCoins.push({\n coinType: toCoinType,\n coin: toCoin,\n })\n } else if (toCoinBuildResult.originalSplitedCoin !== undefined) {\n tx.mergeCoins(toCoinBuildResult.originalSplitedCoin!, [toCoin])\n } else {\n tx.mergeCoins(toCoinBuildResult.targetCoin, [toCoin])\n }\n\n if (isSplited) {\n const originalSplitedFromCoin = fromCoinBuildResult?.originalSplitedCoin as TransactionObjectArgument\n tx.mergeCoins(originalSplitedFromCoin, [fromCoin])\n } else {\n transferedCoins.push({\n coinType: fromCoinType,\n coin: fromCoin,\n })\n }\n\n for (let i = 0; i < transferedCoins.length; i++) {\n this.buildTransferCoin(sdk, tx, transferedCoins[i].coin, transferedCoins[i].coinType, recipient)\n }\n\n return tx\n }\n\n static async buildRouterBasePathReturnCoins(\n sdk: SDK,\n params: SwapWithRouterParams,\n byAmountIn: boolean,\n fromCoinBuildRes: BuildCoinResult,\n toCoinBuildRes: BuildCoinResult,\n tx: Transaction\n ) {\n const { clmm_pool, integrate } = sdk.sdkOptions\n const globalConfigID = getPackagerConfigs(clmm_pool).global_config_id\n\n const validPaths = params.paths.filter((path) => path && path.poolAddress)\n\n const inputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n const outputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n const totalAmountLimit = byAmountIn\n ? Math.round(Number(outputAmount.toString()) * (1 - params.priceSlippagePoint))\n : Math.round(Number(inputAmount.toString()) * (1 + params.priceSlippagePoint))\n\n const fromCoinType = params.paths[0].coinType[0]\n const toCoinType = params.paths[0].coinType[params.paths[0].coinType.length - 1]\n\n let fromCoin = fromCoinBuildRes.targetCoin as TransactionObjectArgument\n let toCoin\n if (toCoinBuildRes.isMintZeroCoin || toCoinBuildRes.originalSplitedCoin !== undefined) {\n toCoin = toCoinBuildRes.targetCoin as TransactionObjectArgument\n } else {\n toCoin = TransactionUtil.callMintZeroValueCoin(tx, toCoinType)\n }\n\n const noPartner = params.partner === ''\n\n const moduleName = noPartner ? ClmmIntegrateRouterModule : ClmmIntegrateRouterWithPartnerModule\n\n for (const path of validPaths) {\n if (path.poolAddress.length === 1) {\n const a2b = path.a2b[0]\n const swapParams = {\n amount: Number(path.amountIn.toString()),\n amountLimit: totalAmountLimit,\n poolCoinA: path.a2b[0] ? fromCoinType : toCoinType,\n poolCoinB: path.a2b[0] ? toCoinType : fromCoinType,\n }\n\n const functionName = noPartner ? 'swap' : 'swap_with_partner'\n\n const poolCoinA = a2b ? fromCoin : toCoin\n const poolCoinB = a2b ? toCoin : fromCoin\n const amount = byAmountIn ? path.amountIn.toString() : path.amountOut.toString()\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b).toString()\n const args: any = noPartner\n ? [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n poolCoinA,\n poolCoinB,\n tx.pure.bool(a2b),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit),\n tx.pure.bool(false),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n tx.object(params.partner),\n poolCoinA,\n poolCoinB,\n tx.pure.bool(a2b),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit),\n tx.pure.bool(false),\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = [swapParams.poolCoinA, swapParams.poolCoinB]\n\n const coinABs: TransactionObjectArgument[] = tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n fromCoin = a2b ? coinABs[0] : coinABs[1]\n toCoin = a2b ? coinABs[1] : coinABs[0]\n } else {\n const amount0 = byAmountIn ? path.amountIn : path.rawAmountLimit[0]\n const amount1 = byAmountIn ? 0 : path.amountOut\n\n let functionName = ''\n if (path.a2b[0]) {\n if (path.a2b[1]) {\n functionName = 'swap_ab_bc'\n } else {\n functionName = 'swap_ab_cb'\n }\n } else if (path.a2b[1]) {\n functionName = 'swap_ba_bc'\n } else {\n functionName = 'swap_ba_cb'\n }\n\n if (!noPartner) {\n functionName = `${functionName}_with_partner`\n }\n\n const sqrtPriceLimit0 = SwapUtils.getDefaultSqrtPriceLimit(path.a2b[0])\n const sqrtPriceLimit1 = SwapUtils.getDefaultSqrtPriceLimit(path.a2b[1])\n const args: any = noPartner\n ? [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n tx.object(path.poolAddress[1]),\n fromCoin,\n toCoin,\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount0.toString()),\n tx.pure.u64(amount1.toString()),\n tx.pure.u128(sqrtPriceLimit0.toString()),\n tx.pure.u128(sqrtPriceLimit1.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n tx.object(path.poolAddress[1]),\n tx.object(params.partner),\n fromCoin,\n toCoin,\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount0.toString()),\n tx.pure.u64(amount1.toString()),\n tx.pure.u128(sqrtPriceLimit0.toString()),\n tx.pure.u128(sqrtPriceLimit1.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n const typeArguments = [path.coinType[0], path.coinType[1], path.coinType[2]]\n const fromToCoins = tx.moveCall({\n target: `${integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n fromCoin = fromToCoins[0] as TransactionObjectArgument\n toCoin = fromToCoins[1] as TransactionObjectArgument\n }\n }\n\n this.checkCoinThreshold(sdk, byAmountIn, tx, toCoin, totalAmountLimit, toCoinType)\n return { fromCoin, toCoin, tx }\n }\n\n // ------------------------------------------router-v2-------------------------------------------------//\n public static async buildAggregatorSwapReturnCoins(\n sdk: SDK,\n param: AggregatorResult,\n fromCoinBuildRes: BuildCoinResult,\n toCoinBuildRes: BuildCoinResult,\n partner: string,\n priceSplitPoint: number,\n tx: Transaction,\n // If recipient not set, transfer objects move call will use sdk.senderAddress\n recipient?: string\n ) {\n if (recipient == null) {\n if (sdk.senderAddress.length === 0) {\n throw Error('recipient and this config sdk senderAddress all not set')\n }\n recipient = sdk.senderAddress\n }\n\n // When the router's split path length exceeds 1, router cannot support partner.\n // now router v1 just return one best path.\n // when use router v2, must set allow split to false.\n if (param.splitPaths.length > 1) {\n partner = ''\n }\n\n let fromCoin\n let toCoin\n\n const hasExternalPool = param.splitPaths.some((splitPath) => splitPath.basePaths.some((basePath) => basePath.label === 'Deepbook'))\n\n if ((!param.byAmountIn || param.splitPaths.length === 1) && !hasExternalPool) {\n const onePaths: OnePath[] = []\n for (const splitPath of param.splitPaths) {\n const a2b = []\n const poolAddress = []\n const rawAmountLimit: BN[] = []\n const coinType = []\n\n for (let i = 0; i < splitPath.basePaths.length; i += 1) {\n const basePath = splitPath.basePaths[i]\n a2b.push(basePath.direction)\n poolAddress.push(basePath.poolAddress)\n rawAmountLimit.push(new BN(basePath.inputAmount.toString()))\n if (i === 0) {\n coinType.push(basePath.fromCoin, basePath.toCoin)\n } else {\n coinType.push(basePath.toCoin)\n }\n }\n\n const onePath: OnePath = {\n amountIn: new BN(splitPath.inputAmount.toString()),\n amountOut: new BN(splitPath.outputAmount.toString()),\n poolAddress,\n a2b,\n rawAmountLimit,\n isExceed: false,\n coinType,\n }\n onePaths.push(onePath)\n }\n const params: SwapWithRouterParams = {\n paths: onePaths,\n partner,\n priceSlippagePoint: priceSplitPoint,\n }\n\n const buildRouterBasePathReturnCoinRes = await this.buildRouterBasePathReturnCoins(\n sdk,\n params,\n param.byAmountIn,\n fromCoinBuildRes,\n toCoinBuildRes,\n tx\n )\n fromCoin = buildRouterBasePathReturnCoinRes.fromCoin\n toCoin = buildRouterBasePathReturnCoinRes.toCoin\n tx = buildRouterBasePathReturnCoinRes.tx\n } else {\n const amountLimit = Math.round(param.outputAmount * (1 - priceSplitPoint))\n\n fromCoin = fromCoinBuildRes.targetCoin as TransactionObjectArgument\n if (toCoinBuildRes.isMintZeroCoin || toCoinBuildRes.originalSplitedCoin !== undefined) {\n toCoin = toCoinBuildRes.targetCoin as TransactionObjectArgument\n } else {\n toCoin = TransactionUtil.callMintZeroValueCoin(tx, param.toCoin)\n }\n\n let isCreateAccountCap = false\n\n let accountCap\n if (hasExternalPool) {\n const [cap, createAccountCapTX] = DeepbookUtils.createAccountCap(recipient, sdk.sdkOptions, tx)\n tx = createAccountCapTX as Transaction\n accountCap = cap as TransactionObjectArgument\n isCreateAccountCap = true\n }\n\n for (let i = 0; i < param.splitPaths.length; i += 1) {\n const splitPath = param.splitPaths[i]\n\n let middleCoin: any\n for (let i = 0; i < splitPath.basePaths.length; i += 1) {\n const basePath = splitPath.basePaths[i]\n if (basePath.label === 'Deepbook') {\n if (i === 0) {\n if (splitPath.basePaths.length === 1) {\n const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, fromCoin, toCoin, false)\n\n fromCoin = deepbookTxBuild.from as TransactionObjectArgument\n toCoin = deepbookTxBuild.to as TransactionObjectArgument\n } else {\n middleCoin = TransactionUtil.callMintZeroValueCoin(tx, basePath.toCoin)\n const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, fromCoin, middleCoin, false)\n fromCoin = deepbookTxBuild.from as TransactionObjectArgument\n middleCoin = deepbookTxBuild.to as TransactionObjectArgument\n }\n } else {\n const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, middleCoin, toCoin, true)\n\n middleCoin = deepbookTxBuild.from as TransactionObjectArgument\n toCoin = deepbookTxBuild.to as TransactionObjectArgument\n }\n }\n if (basePath.label === 'Magma') {\n if (i === 0) {\n if (splitPath.basePaths.length === 1) {\n const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, fromCoin, toCoin, false, partner)\n fromCoin = clmmTxBuild.from as TransactionObjectArgument\n toCoin = clmmTxBuild.to as TransactionObjectArgument\n } else {\n middleCoin = TransactionUtil.callMintZeroValueCoin(tx, basePath.toCoin)\n const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, fromCoin, middleCoin, false, partner)\n fromCoin = clmmTxBuild.from as TransactionObjectArgument\n middleCoin = clmmTxBuild.to as TransactionObjectArgument\n }\n } else {\n const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, middleCoin, toCoin, true, partner)\n middleCoin = clmmTxBuild.from as TransactionObjectArgument\n toCoin = clmmTxBuild.to as TransactionObjectArgument\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::send_coin`,\n typeArguments: [basePath.fromCoin],\n arguments: [middleCoin, tx.pure.address(recipient)],\n })\n }\n }\n }\n }\n\n this.checkCoinThreshold(sdk, param.byAmountIn, tx, toCoin, amountLimit, param.toCoin)\n\n if (isCreateAccountCap) {\n tx = DeepbookUtils.deleteAccountCapByObject(accountCap as TransactionObjectArgument, sdk.sdkOptions, tx)\n }\n }\n return { fromCoin, toCoin, tx }\n }\n\n public static async buildAggregatorSwapTransaction(\n sdk: SDK,\n param: AggregatorResult,\n allCoinAsset: CoinAsset[],\n partner: string,\n priceSlippagePoint: number,\n recipient?: string\n ) {\n let tx = new Transaction()\n\n const amountLimit = param.byAmountIn\n ? Math.round(param.outputAmount * (1 - priceSlippagePoint))\n : Math.round(param.inputAmount * (1 + priceSlippagePoint))\n const fromCoinBuildResult = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n param.byAmountIn ? BigInt(param.inputAmount) : BigInt(amountLimit),\n param.fromCoin,\n false,\n true\n )\n const isSplited = fromCoinBuildResult.originalSplitedCoin != null\n const toCoinBuildResult = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, 0n, param.toCoin, false)\n\n const buildAggregatorSwapReturnCoinsRes = await this.buildAggregatorSwapReturnCoins(\n sdk,\n param,\n fromCoinBuildResult,\n toCoinBuildResult,\n partner,\n priceSlippagePoint,\n tx,\n recipient\n )\n const { fromCoin, toCoin } = buildAggregatorSwapReturnCoinsRes\n tx = buildAggregatorSwapReturnCoinsRes.tx\n\n const transferedCoins: TransferedCoin[] = []\n if (toCoinBuildResult.isMintZeroCoin) {\n transferedCoins.push({\n coinType: param.toCoin,\n coin: toCoin,\n })\n } else if (toCoinBuildResult.originalSplitedCoin != null) {\n tx.mergeCoins(toCoinBuildResult.originalSplitedCoin!, [toCoin])\n } else {\n tx.mergeCoins(toCoinBuildResult.targetCoin, [toCoin])\n }\n\n if (isSplited) {\n const originalSplitedFromCoin = fromCoinBuildResult.originalSplitedCoin as TransactionObjectArgument\n tx.mergeCoins(originalSplitedFromCoin, [fromCoin])\n } else {\n transferedCoins.push({\n coinType: param.fromCoin,\n coin: fromCoin,\n })\n }\n\n for (let i = 0; i < transferedCoins.length; i++) {\n this.buildTransferCoin(sdk, tx, transferedCoins[i].coin, transferedCoins[i].coinType, recipient)\n }\n return tx\n }\n\n static checkCoinThreshold(\n sdk: SDK,\n byAmountIn: boolean,\n tx: Transaction,\n coin: TransactionObjectArgument,\n amountLimit: number,\n coinType: string\n ) {\n if (byAmountIn) {\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateRouterModule}::check_coin_threshold`,\n typeArguments: [coinType],\n arguments: [coin, tx.pure.u64(amountLimit)],\n })\n }\n }\n\n static buildDeepbookBasePathTx(\n sdk: SDK,\n basePath: BasePath,\n tx: Transaction,\n accountCap: any,\n from: TransactionObjectArgument,\n to: TransactionObjectArgument,\n middleStep: boolean\n ) {\n const base = basePath.direction ? from : to\n const quote = basePath.direction ? to : from\n\n const args: any = [\n tx.object(basePath.poolAddress),\n accountCap,\n tx.pure.u64(basePath.inputAmount),\n tx.pure.u64(0),\n tx.pure.bool(basePath.direction),\n base,\n quote,\n tx.pure.bool(middleStep),\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = basePath.direction ? [basePath.fromCoin, basePath.toCoin] : [basePath.toCoin, basePath.fromCoin]\n\n const coinAB: TransactionObjectArgument[] = tx.moveCall({\n target: `${sdk.sdkOptions.deepbook_endpoint_v2.published_at}::endpoints_v2::swap`,\n typeArguments,\n arguments: args,\n })\n\n from = basePath.direction ? coinAB[0] : coinAB[1]\n to = basePath.direction ? coinAB[1] : coinAB[0]\n\n return {\n from,\n to,\n tx,\n }\n }\n\n private static buildClmmBasePathTx(\n sdk: SDK,\n basePath: BasePath,\n tx: Transaction,\n byAmountIn: boolean,\n from: TransactionObjectArgument,\n to: TransactionObjectArgument,\n middleStep: boolean,\n partner: string\n ) {\n const { clmm_pool, integrate } = sdk.sdkOptions\n const globalConfigID = getPackagerConfigs(clmm_pool).global_config_id\n let coinA = basePath.direction ? from : to\n let coinB = basePath.direction ? to : from\n const noPartner = partner === ''\n const moduleName = noPartner ? ClmmIntegrateRouterModule : ClmmIntegrateRouterWithPartnerModule\n const functionName = noPartner ? 'swap' : 'swap_with_partner'\n const amount = byAmountIn ? basePath.inputAmount.toString() : basePath.outputAmount.toString()\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(basePath.direction)\n const args: any = noPartner\n ? [\n tx.object(globalConfigID),\n tx.object(basePath.poolAddress),\n coinA,\n coinB,\n tx.pure.bool(basePath.direction),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(middleStep),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(globalConfigID),\n tx.object(basePath.poolAddress),\n tx.object(partner),\n coinA,\n coinB,\n tx.pure.bool(basePath.direction),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(middleStep),\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = basePath.direction ? [basePath.fromCoin, basePath.toCoin] : [basePath.toCoin, basePath.fromCoin]\n\n const coinAB: TransactionObjectArgument[] = tx.moveCall({\n target: `${integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n coinA = coinAB[0] as any\n coinB = coinAB[1] as any\n\n from = basePath.direction ? coinA : coinB\n to = basePath.direction ? coinB : coinA\n\n return {\n from,\n to,\n tx,\n }\n }\n\n static buildCoinTypePair(coinTypes: string[], partitionQuantities: number[]): string[][] {\n const coinTypePair: string[][] = []\n if (coinTypes.length === 2) {\n const pair: string[] = []\n pair.push(coinTypes[0], coinTypes[1])\n coinTypePair.push(pair)\n } else {\n const directPair: string[] = []\n directPair.push(coinTypes[0], coinTypes[coinTypes.length - 1])\n coinTypePair.push(directPair)\n for (let i = 1; i < coinTypes.length - 1; i += 1) {\n if (partitionQuantities[i - 1] === 0) {\n continue\n }\n const pair: string[] = []\n pair.push(coinTypes[0], coinTypes[i], coinTypes[coinTypes.length - 1])\n coinTypePair.push(pair)\n }\n }\n return coinTypePair\n }\n\n // ------------------------------------------utils-------------------------------------------------//\n static buildTransferCoinToSender(sdk: SDK, tx: Transaction, coin: TransactionObjectArgument, coinType: string) {\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::transfer_coin_to_sender`,\n typeArguments: [coinType],\n arguments: [coin],\n })\n }\n\n // If recipient not set, transfer objects move call will use ctx sender\n static buildTransferCoin(sdk: SDK, tx: Transaction, coin: TransactionObjectArgument, coinType: string, recipient?: string) {\n if (recipient != null) {\n tx.transferObjects([coin], tx.pure.address(recipient))\n } else {\n TransactionUtil.buildTransferCoinToSender(sdk, tx, coin, coinType)\n }\n }\n}\n","import { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { TransactionArgument, Transaction, TransactionObjectArgument, TransactionResult } from '@mysten/sui/transactions'\nimport { getDefaultSuiInputType, SuiInputTypes, SuiTxArg } from '../types/sui'\nimport { ClmmpoolsError, UtilsErrorCode } from '../errors/errors'\n\n/**\n * Check if the address is a valid sui address.\n * @param {string}address\n * @returns\n */\nexport function checkInvalidSuiAddress(address: string): boolean {\n if (!address.startsWith('0x') || address.length !== 66) {\n return false\n }\n return true\n}\nexport class TxBlock {\n public txBlock: Transaction\n\n constructor() {\n this.txBlock = new Transaction()\n }\n\n /**\n * Transfer sui to many recipoents.\n * @param {string[]}recipients The recipient addresses.\n * @param {number[]}amounts The amounts of sui coins to be transferred.\n * @returns this\n */\n transferSuiToMany(recipients: string[], amounts: number[]) {\n if (recipients.length !== amounts.length) {\n throw new ClmmpoolsError('The length of recipients and amounts must be the same', UtilsErrorCode.InvalidRecipientAndAmountLength)\n }\n\n for (const recipient of recipients) {\n if (!checkInvalidSuiAddress(recipient) === false) {\n throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n }\n }\n\n const tx = this.txBlock\n const coins = tx.splitCoins(\n tx.gas,\n amounts.map((amount) => tx.pure.u64(amount))\n )\n recipients.forEach((recipient, index) => {\n tx.transferObjects([coins[index]], tx.pure.address(recipient))\n })\n return this\n }\n\n /**\n * Transfer sui to one recipient.\n * @param {string}recipient recipient cannot be empty or invalid sui address.\n * @param {number}amount\n * @returns this\n */\n transferSui(recipient: string, amount: number) {\n if (!checkInvalidSuiAddress(recipient) === false) {\n throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n }\n\n return this.transferSuiToMany([recipient], [amount])\n }\n\n /**\n * Transfer coin to many recipients.\n * @param {string}recipient recipient cannot be empty or invalid sui address.\n * @param {number}amount amount cannot be empty or invalid sui address.\n * @param {string[]}coinObjectIds object ids of coins to be transferred.\n * @returns this\n * @deprecated use transferAndDestoryZeroCoin instead\n */\n transferCoin(recipient: string, amount: number, coinObjectIds: string[]) {\n if (!checkInvalidSuiAddress(recipient) === false) {\n throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n }\n\n const tx = this.txBlock\n const [primaryCoinA, ...mergeCoinAs] = coinObjectIds\n const primaryCoinAInput = tx.object(primaryCoinA)\n\n if (mergeCoinAs.length > 0) {\n tx.mergeCoins(\n primaryCoinAInput,\n mergeCoinAs.map((coin) => tx.object(coin))\n )\n }\n\n const spitAmount = tx.splitCoins(primaryCoinAInput, [tx.pure.u64(amount)])\n tx.transferObjects([spitAmount], tx.pure.address(recipient))\n return this\n }\n}\n","import BN from 'bn.js'\nimport { TransactionArgument, Transaction } from '@mysten/sui/transactions'\nimport { SdkOptions } from '../sdk'\nimport { CLOCK_ADDRESS, DeepbookClobV2Moudle, DeepbookCustodianV2Moudle, DeepbookEndpointsV2Moudle } from '../types'\nimport SDK from '../main'\nimport { extractStructTagFromType } from './contracts'\nimport { TransactionUtil } from './transaction-util'\nimport { ZERO } from '../math'\n\nconst FLOAT_SCALING = new BN(1000000000)\n\nexport type Order = {\n quantity: number\n price: number\n}\n\nexport type DeepbookPool = {\n poolID: string\n tickSize: number\n lotSize: number\n baseAsset: string\n quoteAsset: string\n takerFeeRate: number\n makerRebateRate: number\n}\n\nexport class DeepbookUtils {\n static createAccountCap(senderAddress: string, sdkOptions: SdkOptions, tx: Transaction, isTransfer = false) {\n if (senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n const { deepbook } = sdkOptions\n\n const [cap] = tx.moveCall({\n target: `${deepbook.published_at}::${DeepbookClobV2Moudle}::create_account`,\n typeArguments: [],\n arguments: [],\n })\n\n if (isTransfer) {\n tx.transferObjects([cap], tx.pure.address(senderAddress))\n }\n\n return [cap, tx]\n }\n\n static deleteAccountCap(accountCap: string, sdkOptions: SdkOptions, tx: Transaction): Transaction {\n const { deepbook } = sdkOptions\n\n const args = [tx.object(accountCap)]\n\n tx.moveCall({\n target: `${deepbook.published_at}::${DeepbookCustodianV2Moudle}::delete_account_cap`,\n typeArguments: [],\n arguments: args,\n })\n return tx\n }\n\n static deleteAccountCapByObject(accountCap: TransactionArgument, sdkOptions: SdkOptions, tx: Transaction): Transaction {\n const { deepbook } = sdkOptions\n\n const args = [accountCap]\n\n tx.moveCall({\n target: `${deepbook.published_at}::${DeepbookCustodianV2Moudle}::delete_account_cap`,\n typeArguments: [],\n arguments: args,\n })\n return tx\n }\n\n static async getAccountCap(sdk: SDK, showDisplay = true): Promise<string> {\n const ownerRes: any = await sdk.fullClient.getOwnedObjectsByPage(sdk.senderAddress, {\n options: { showType: true, showContent: true, showDisplay, showOwner: true },\n filter: {\n MoveModule: {\n package: sdk.sdkOptions.deepbook.package_id,\n module: DeepbookCustodianV2Moudle,\n },\n },\n })\n\n if (ownerRes.data.length === 0) {\n return ''\n }\n\n const accountCap = ownerRes.data[0].data.objectId\n\n return accountCap\n }\n\n static async getPools(sdk: SDK): Promise<DeepbookPool[]> {\n const deepbook = sdk.sdkOptions.deepbook.package_id\n\n const allPools: DeepbookPool[] = []\n\n try {\n const objects = await sdk.fullClient.queryEventsByPage({ MoveEventType: `${deepbook}::clob_v2::PoolCreated` })\n\n objects.data.forEach((object: any) => {\n const fields = object.parsedJson\n if (fields) {\n allPools.push({\n poolID: fields.pool_id,\n tickSize: Number(fields.tick_size),\n lotSize: Number(fields.lot_size),\n takerFeeRate: Number(fields.taker_fee_rate),\n makerRebateRate: Number(fields.maker_rebate_rate),\n baseAsset: fields.base_asset.name,\n quoteAsset: fields.quote_asset.name,\n })\n }\n })\n } catch (error) {\n console.log('getPoolImmutables', error)\n }\n\n // console.log('allPools', allPools)\n return allPools\n }\n\n static async getPoolAsks(sdk: SDK, poolAddress: string, baseCoin: string, quoteCoin: string): Promise<Order[]> {\n const { simulationAccount } = sdk.sdkOptions\n const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n const tx = new Transaction()\n\n const asks: Order[] = []\n\n const typeArguments = [baseCoin, quoteCoin]\n const args = [tx.object(poolAddress), tx.pure.u64('0'), tx.pure.u64('999999999999'), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${deepbook_endpoint_v2.published_at}::endpoints_v2::get_level2_book_status_ask_side`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `BookStatus`\n })\n if (valueData.length === 0) {\n return asks\n }\n\n for (let i = 0; i < valueData[0].parsedJson.depths.length; i++) {\n const price = valueData[0].parsedJson.price[i]\n const depth = valueData[0].parsedJson.depths[i]\n const ask: Order = {\n price: parseInt(price, 10),\n quantity: parseInt(depth, 10),\n }\n asks.push(ask)\n }\n\n return asks\n }\n\n static async getPoolBids(sdk: SDK, poolAddress: string, baseCoin: string, quoteCoin: string): Promise<Order[]> {\n const { simulationAccount } = sdk.sdkOptions\n const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n const tx = new Transaction()\n\n const bids: Order[] = []\n\n const typeArguments = [baseCoin, quoteCoin]\n const args = [tx.object(poolAddress), tx.pure.u64('0'), tx.pure.u64('999999999999'), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${deepbook_endpoint_v2.published_at}::endpoints_v2::get_level2_book_status_bid_side`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `BookStatus`\n })\n if (valueData.length === 0) {\n return bids\n }\n\n for (let i = 0; i < valueData[0].parsedJson.depths.length; i++) {\n const price = valueData[0].parsedJson.price[i]\n const depth = valueData[0].parsedJson.depths[i]\n const bid: Order = {\n price: parseInt(price, 10),\n quantity: parseInt(depth, 10),\n }\n bids.push(bid)\n }\n\n return bids\n }\n\n static async preSwap(sdk: SDK, pool: DeepbookPool, a2b: boolean, amountIn: number) {\n let isExceed = false\n let amountOut = ZERO\n let remainAmount = new BN(amountIn)\n let feeAmount = ZERO\n const initAmountIn = new BN(amountIn)\n\n if (a2b) {\n let bids = await this.getPoolBids(sdk, pool.poolID, pool.baseAsset, pool.quoteAsset)\n if (bids === null) {\n isExceed = true\n }\n bids = bids.sort((a, b) => {\n return b.price - a.price\n })\n\n for (let i = 0; i < bids.length; i += 1) {\n const curBidAmount = new BN(bids[i].quantity)\n const curBidPrice = new BN(bids[i].price)\n const fee = curBidAmount.mul(new BN(curBidPrice)).mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING).div(FLOAT_SCALING)\n if (remainAmount.gt(curBidAmount)) {\n remainAmount = remainAmount.sub(curBidAmount)\n amountOut = amountOut.add(curBidAmount.mul(curBidPrice).div(FLOAT_SCALING).sub(fee))\n feeAmount = feeAmount.add(fee)\n } else {\n const curOut = remainAmount.mul(new BN(bids[i].price)).div(FLOAT_SCALING)\n const curFee = curOut.mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING)\n amountOut = amountOut.add(curOut.sub(curFee))\n remainAmount = remainAmount.sub(remainAmount)\n feeAmount = feeAmount.add(curFee)\n }\n if (remainAmount.eq(ZERO)) {\n break\n }\n }\n } else {\n const asks = await this.getPoolAsks(sdk, pool.poolID, pool.baseAsset, pool.quoteAsset)\n if (asks === null) {\n isExceed = true\n }\n\n for (let i = 0; i < asks.length; i += 1) {\n const curAskAmount = new BN(asks[i].price).mul(new BN(asks[i].quantity)).div(new BN(1000000000))\n const fee = curAskAmount.mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING)\n const curAskAmountWithFee = curAskAmount.add(fee)\n if (remainAmount.gt(curAskAmount)) {\n amountOut = amountOut.add(new BN(asks[i].quantity))\n remainAmount = remainAmount.sub(curAskAmountWithFee)\n feeAmount = feeAmount.add(fee)\n } else {\n const splitNums = new BN(asks[i].quantity).div(new BN(pool.lotSize))\n const splitAmount = curAskAmountWithFee.div(splitNums)\n const swapSplitNum = remainAmount.div(splitAmount)\n amountOut = amountOut.add(swapSplitNum.muln(pool.lotSize))\n remainAmount = remainAmount.sub(swapSplitNum.mul(splitAmount))\n feeAmount = feeAmount.add(swapSplitNum.div(splitNums).mul(fee))\n }\n if (remainAmount.eq(ZERO)) {\n break\n }\n }\n }\n\n return {\n poolAddress: pool.poolID,\n // currentSqrtPrice: current_sqrt_price,\n estimatedAmountIn: initAmountIn.sub(remainAmount).toNumber(),\n estimatedAmountOut: amountOut.toNumber(),\n // estimatedEndSqrtPrice: target_sqrt_price,\n estimatedFeeAmount: feeAmount,\n isExceed,\n amount: Number(amountIn),\n aToB: a2b,\n byAmountIn: true,\n }\n }\n\n static async simulateSwap(sdk: SDK, poolID: string, baseCoin: string, quoteCoin: string, a2b: boolean, amount: number) {\n const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n let tx = new Transaction()\n\n const accountCapStr = await this.getAccountCap(sdk)\n\n let accountCap\n if (accountCapStr === '') {\n const getAccoutCapResult = this.createAccountCap(sdk.senderAddress, sdk.sdkOptions, tx)\n const cap = getAccoutCapResult[0] as TransactionArgument\n tx = getAccoutCapResult[1] as Transaction\n accountCap = cap\n } else {\n accountCap = tx.object(accountCapStr)\n }\n\n const allCoins = await sdk.getOwnerCoinAssets(sdk.senderAddress)\n const primaryBaseInput = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount), baseCoin, false)\n const baseAsset = primaryBaseInput?.targetCoin\n\n const primaryQuoteInput = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount), quoteCoin, false)\n const quoteAsset = primaryQuoteInput?.targetCoin\n\n const typeArguments = [baseCoin, quoteCoin]\n const args: any = [\n tx.object(poolID),\n accountCap,\n tx.pure.u64(amount),\n tx.pure.u64(0),\n tx.pure.bool(a2b),\n baseAsset,\n quoteAsset,\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${deepbook_endpoint_v2.published_at}::${DeepbookEndpointsV2Moudle}::swap`,\n arguments: args,\n typeArguments,\n })\n\n const { simulationAccount } = sdk.sdkOptions\n const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `DeepbookSwapEvent`\n })\n if (valueData.length === 0) {\n return null\n }\n const params: any = valueData[0].parsedJson\n return {\n poolAddress: params.pool,\n estimatedAmountIn: params.amount_in,\n estimatedAmountOut: params.amount_out,\n aToB: params.atob,\n }\n }\n}\n","import BN from 'bn.js'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { isValidSuiObjectId } from '@mysten/sui/utils'\nimport {\n AddLiquidityFixTokenParams,\n AddLiquidityParams,\n ClosePositionParams,\n CollectFeeParams,\n OpenPositionParams,\n Position,\n PositionReward,\n RemoveLiquidityParams,\n getPackagerConfigs,\n AddLiquidityWithProtectionParams,\n OpenPositionAddLiquidityWithProtectionParams,\n} from '../types'\nimport {\n CachedContent,\n asUintN,\n buildPosition,\n buildPositionReward,\n cacheTime24h,\n cacheTime5min,\n checkInvalidSuiAddress,\n extractStructTagFromType,\n getFutureTime,\n} from '../utils'\nimport { BuildCoinResult, findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport {\n ClmmFetcherModule,\n ClmmIntegratePoolModule,\n ClmmIntegratePoolV2Module,\n ClmmIntegratePoolV3Module,\n CLOCK_ADDRESS,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectFields } from '../utils/objects'\nimport { CollectFeesQuote } from '../math'\nimport { FetchPosFeeParams } from './rewarderModule'\nimport { ClmmpoolsError, ConfigErrorCode, PoolErrorCode, UtilsErrorCode } from '../errors/errors'\n\n/**\n * Helper class to help interact with clmm position with a position router interface.\n */\nexport class PositionModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Builds the full address of the Position type.\n * @returns The full address of the Position type.\n */\n buildPositionType() {\n const magmaClmm = this._sdk.sdkOptions.clmm_pool.package_id\n return `${magmaClmm}::position::Position`\n }\n\n /**\n * Gets a list of positions for the given account address.\n * @param accountAddress The account address to get positions for.\n * @param assignPoolIds An array of pool IDs to filter the positions by.\n * @returns array of Position objects.\n */\n async getPositionList(accountAddress: string, assignPoolIds: string[] = [], showDisplay = true): Promise<Position[]> {\n const allPosition: Position[] = []\n\n const ownerRes: any = await this._sdk.fullClient.getOwnedObjectsByPage(accountAddress, {\n options: { showType: true, showContent: true, showDisplay, showOwner: true },\n filter: { Package: this._sdk.sdkOptions.clmm_pool.package_id },\n })\n\n const hasAssignPoolIds = assignPoolIds.length > 0\n for (const item of ownerRes.data as any[]) {\n const type = extractStructTagFromType(item.data.type)\n\n if (type.full_address === this.buildPositionType()) {\n const position = buildPosition(item)\n const cacheKey = `${position.pos_object_id}_getPositionList`\n this.updateCache(cacheKey, position, cacheTime24h)\n if (hasAssignPoolIds) {\n if (assignPoolIds.includes(position.pool)) {\n allPosition.push(position)\n }\n } else {\n allPosition.push(position)\n }\n }\n }\n\n return allPosition\n }\n\n /**\n * Gets a position by its handle and ID. But it needs pool info, so it is not recommended to use this method.\n * if you want to get a position, you can use getPositionById method directly.\n * @param {string} positionHandle The handle of the position to get.\n * @param {string} positionID The ID of the position to get.\n * @param {boolean} calculateRewarder Whether to calculate the rewarder of the position.\n * @returns {Promise<Position>} Position object.\n */\n async getPosition(positionHandle: string, positionID: string, calculateRewarder = true, showDisplay = true): Promise<Position> {\n let position = await this.getSimplePosition(positionID, showDisplay)\n if (calculateRewarder) {\n position = await this.updatePositionRewarders(positionHandle, position)\n }\n return position\n }\n\n /**\n * Gets a position by its ID.\n * @param {string} positionID The ID of the position to get.\n * @param {boolean} calculateRewarder Whether to calculate the rewarder of the position.\n * @returns {Promise<Position>} Position object.\n */\n async getPositionById(positionID: string, calculateRewarder = true, showDisplay = true): Promise<Position> {\n const position = await this.getSimplePosition(positionID, showDisplay)\n if (calculateRewarder) {\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n const result = await this.updatePositionRewarders(pool.position_manager.positions_handle, position)\n return result\n }\n return position\n }\n\n /**\n * Gets a simple position for the given position ID.\n * @param {string} positionID The ID of the position to get.\n * @returns {Promise<Position>} Position object.\n */\n async getSimplePosition(positionID: string, showDisplay = true): Promise<Position> {\n const cacheKey = `${positionID}_getPositionList`\n\n let position = this.getSimplePositionByCache(positionID)\n\n if (position === undefined) {\n const objectDataResponses = await this.sdk.fullClient.getObject({\n id: positionID,\n options: { showContent: true, showType: true, showDisplay, showOwner: true },\n })\n position = buildPosition(objectDataResponses)\n\n this.updateCache(cacheKey, position, cacheTime24h)\n }\n return position\n }\n\n /**\n * Gets a simple position for the given position ID.\n * @param {string} positionID Position object id\n * @returns {Position | undefined} Position object\n */\n private getSimplePositionByCache(positionID: string): Position | undefined {\n const cacheKey = `${positionID}_getPositionList`\n return this.getCache<Position>(cacheKey)\n }\n\n /**\n * Gets a list of simple positions for the given position IDs.\n * @param {SuiObjectIdType[]} positionIDs The IDs of the positions to get.\n * @returns {Promise<Position[]>} A promise that resolves to an array of Position objects.\n */\n async getSipmlePositionList(positionIDs: SuiObjectIdType[], showDisplay = true): Promise<Position[]> {\n const positionList: Position[] = []\n const notFoundIds: SuiObjectIdType[] = []\n\n positionIDs.forEach((id) => {\n const position = this.getSimplePositionByCache(id)\n if (position) {\n positionList.push(position)\n } else {\n notFoundIds.push(id)\n }\n })\n\n if (notFoundIds.length > 0) {\n const objectDataResponses = await this._sdk.fullClient.batchGetObjects(notFoundIds, {\n showOwner: true,\n showContent: true,\n showDisplay,\n showType: true,\n })\n\n objectDataResponses.forEach((info) => {\n if (info.error == null) {\n const position = buildPosition(info)\n positionList.push(position)\n const cacheKey = `${position.pos_object_id}_getPositionList`\n this.updateCache(cacheKey, position, cacheTime24h)\n }\n })\n }\n\n return positionList\n }\n\n /**\n * Updates the rewarders of position\n * @param {string} positionHandle Position handle\n * @param {Position} position Position object\n * @returns {Promise<Position>} A promise that resolves to an array of Position objects.\n */\n private async updatePositionRewarders(positionHandle: string, position: Position): Promise<Position> {\n const positionReward = await this.getPositionRewarders(positionHandle, position.pos_object_id)\n return {\n ...position,\n ...positionReward,\n }\n }\n\n /**\n * Gets the position rewarders for the given position handle and position object ID.\n * @param {string} positionHandle The handle of the position.\n * @param {string} positionID The ID of the position object.\n * @returns {Promise<PositionReward | undefined>} PositionReward object.\n */\n async getPositionRewarders(positionHandle: string, positionID: string): Promise<PositionReward | undefined> {\n try {\n const dynamicFieldObject = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: positionHandle,\n name: {\n type: '0x2::object::ID',\n value: positionID,\n },\n })\n\n const objectFields = getObjectFields(dynamicFieldObject.data as any) as any\n const fields = objectFields.value.fields.value\n const positionReward = buildPositionReward(fields)\n return positionReward\n } catch (error) {\n console.log(error)\n return undefined\n }\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param {FetchPosFeeParams[]} params An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n * @returns {Promise<CollectFeesQuote[]>} A Promise that resolves with the fetched position fee amount for the specified addresses.\n */\n public async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n for (const paramItem of params) {\n const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_fees`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `fetch position fee error code: ${simulateRes.error ?? 'unknown error'}, please check config and postion and pool object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `FetchPositionFeesEvent`\n })\n if (valueData.length === 0) {\n return []\n }\n\n const result: CollectFeesQuote[] = []\n\n for (let i = 0; i < valueData.length; i += 1) {\n const { parsedJson } = valueData[i]\n const posRrewarderResult: CollectFeesQuote = {\n feeOwedA: new BN(parsedJson.fee_owned_a),\n feeOwedB: new BN(parsedJson.fee_owned_b),\n position_id: parsedJson.position_id,\n }\n result.push(posRrewarderResult)\n }\n\n return result\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param positionIDs An array of position object ids.\n * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n */\n async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n const posFeeParamsList: FetchPosFeeParams[] = []\n for (const id of positionIDs) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n posFeeParamsList.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n })\n }\n\n const positionMap: Record<string, CollectFeesQuote> = {}\n\n if (posFeeParamsList.length > 0) {\n const result: CollectFeesQuote[] = await this.fetchPosFeeAmount(posFeeParamsList)\n for (const posRewarderInfo of result) {\n positionMap[posRewarderInfo.position_id] = posRewarderInfo\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * create add liquidity transaction payload with fix token\n * @param {AddLiquidityFixTokenParams} params\n * @param gasEstimateArg : When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityFixTokenPayload(\n params: AddLiquidityFixTokenParams,\n gasEstimateArg?: {\n slippage: number\n curSqrtPrice: BN\n },\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n params = params as AddLiquidityFixTokenParams\n if ((params.fix_amount_a && isAdjustCoinA) || (!params.fix_amount_a && isAdjustCoinB)) {\n tx = await TransactionUtil.buildAddLiquidityFixTokenForGas(\n this._sdk,\n allCoinAsset,\n params,\n gasEstimateArg,\n tx,\n inputCoinA,\n inputCoinB\n )\n return tx\n }\n }\n\n return TransactionUtil.buildAddLiquidityFixToken(this._sdk, allCoinAsset, params, tx, inputCoinA, inputCoinB)\n }\n\n /**\n * create add liquidity transaction payload with fix token\n * @param {AddLiquidityFixTokenParams} params\n * @param gasEstimateArg : When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityFixTokenWithProtectionPayload(\n params: AddLiquidityWithProtectionParams,\n gasEstimateArg?: {\n slippage: number\n curSqrtPrice: BN\n },\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n params = params as AddLiquidityWithProtectionParams\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.buildAddLiquidityWithProtectionFixToken(this._sdk, allCoinAsset, params, tx, inputCoinA, inputCoinB)\n }\n\n /**\n * create add liquidity transaction payload\n * @param {AddLiquidityParams} params\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityPayload(\n params: AddLiquidityParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n const { integrate, clmm_pool } = this._sdk.sdkOptions\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n tx = tx || new Transaction()\n\n const needOpenPosition = !isValidSuiObjectId(params.pos_id)\n const max_amount_a = BigInt(params.max_amount_a)\n const max_amount_b = BigInt(params.max_amount_b)\n\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n if (inputCoinA == null || inputCoinB == null) {\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, max_amount_a, params.coinTypeA, false, true)\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, max_amount_b, params.coinTypeB, false, true)\n } else {\n primaryCoinAInputs = {\n targetCoin: inputCoinA,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n primaryCoinBInputs = {\n targetCoin: inputCoinB,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n }\n\n if (needOpenPosition) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::open_position_with_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.max_amount_a),\n tx.pure.u64(params.max_amount_b),\n tx.pure.u128(params.delta_liquidity),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n } else {\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n tx = TransactionUtil.createCollectRewarderAndFeeParams(\n this._sdk,\n tx,\n params,\n allCoinAsset,\n primaryCoinAInputs.remainCoins,\n primaryCoinBInputs.remainCoins\n )\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::add_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.max_amount_a),\n tx.pure.u64(params.max_amount_b),\n tx.pure.u128(params.delta_liquidity),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n return tx\n }\n\n /**\n * Remove liquidity from a position.\n * @param {RemoveLiquidityParams} params\n * @returns {TransactionBlock}\n */\n async removeLiquidityTransactionPayload(params: RemoveLiquidityParams, tx?: Transaction): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n const functionName = 'remove_liquidity'\n\n tx = tx || new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.pure.u128(params.delta_liquidity),\n tx.pure.u64(params.min_amount_a),\n tx.pure.u64(params.min_amount_b),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Close position and remove all liquidity and collect_reward\n * @param {ClosePositionParams} params\n * @returns {TransactionBlock}\n */\n async closePositionTransactionPayload(params: ClosePositionParams, tx?: Transaction): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n tx = tx || new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::close_position`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.pure.u64(params.min_amount_a),\n tx.pure.u64(params.min_amount_b),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n\n return tx\n }\n\n /**\n * Open position in clmmpool.\n * @param {OpenPositionParams} params\n * @returns {TransactionBlock}\n */\n openPositionTransactionPayload(params: OpenPositionParams, tx?: Transaction): Transaction {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n tx = tx || new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::open_position`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Collect LP fee from Position.\n * @param {CollectFeeParams} params\n * @param {TransactionBlock} tx\n * @returns {TransactionBlock}\n */\n async collectFeeTransactionPayload(\n params: CollectFeeParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress, null, true)\n tx = tx || new Transaction()\n\n const primaryCoinAInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(0), params.coinTypeA, false)\n const primaryCoinBInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(0), params.coinTypeB, false)\n\n const coinA = inputCoinA ?? primaryCoinAInput.targetCoin\n const coinB = inputCoinB ?? primaryCoinBInput.targetCoin\n\n this.createCollectFeePaylod(params, tx, coinA, coinB)\n return tx\n }\n\n createCollectFeePaylod(\n params: CollectFeeParams,\n tx: Transaction,\n primaryCoinAInput: TransactionObjectArgument,\n primaryCoinBInput: TransactionObjectArgument\n ) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInput,\n primaryCoinBInput,\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n createCollectFeeNoSendPaylod(\n params: CollectFeeParams,\n tx: Transaction,\n primaryCoinAInput: TransactionObjectArgument,\n primaryCoinBInput: TransactionObjectArgument\n ) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInput,\n primaryCoinBInput,\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * calculate fee\n * @param {CollectFeeParams} params\n * @returns\n */\n async calculateFee(params: CollectFeeParams) {\n const paylod = await this.collectFeeTransactionPayload(params)\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const res = await this._sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: paylod,\n sender: this._sdk.senderAddress,\n })\n for (const event of res.events) {\n if (extractStructTagFromType(event.type).name === 'CollectFeeEvent') {\n const json = event.parsedJson as any\n return {\n feeOwedA: json.amount_a,\n feeOwedB: json.amount_b,\n }\n }\n }\n\n return {\n feeOwedA: '0',\n feeOwedB: '0',\n }\n }\n\n /**\n * Updates the cache for the given key.\n * @param {string} key The key of the cache entry to update.\n * @param {SuiResource} data The data to store in the cache.\n * @param {cacheTime5min} time The time in minutes after which the cache entry should expire.\n */\n private updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n * @param {string} key The key of the cache entry to get.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n private getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport BN from 'bn.js'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { BuildCoinResult, checkInvalidSuiAddress, extractStructTagFromType, normalizeCoinType, TransactionUtil } from '../utils'\nimport { ClmmFetcherModule, ClmmIntegratePoolV2Module, ClmmIntegratePoolV3Module, CLOCK_ADDRESS } from '../types/sui'\nimport { getRewardInTickRange } from '../utils/tick'\nimport { MathUtil, ONE, ZERO } from '../math/utils'\nimport { TickData } from '../types/clmmpool'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { CollectRewarderParams, getPackagerConfigs, Pool, Position, PositionReward, Rewarder, RewarderAmountOwed } from '../types'\nimport { CollectFeesQuote } from '../math'\nimport { ClmmpoolsError, ConfigErrorCode, UtilsErrorCode } from '../errors/errors'\n\nexport type FetchPosRewardParams = {\n poolAddress: string\n positionId: string\n coinTypeA: string\n coinTypeB: string\n rewarderInfo: Rewarder[]\n}\n\nexport type FetchPosFeeParams = {\n poolAddress: string\n positionId: string\n coinTypeA: string\n coinTypeB: string\n}\n\nexport type PosRewarderResult = {\n poolAddress: string\n positionId: string\n rewarderAmountOwed: RewarderAmountOwed[]\n}\n\n/**\n * Helper class to help interact with clmm position rewaeder with a rewaeder router interface.\n */\nexport class RewarderModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private growthGlobal: BN[]\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n this.growthGlobal = [ZERO, ZERO, ZERO]\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Gets the emissions for the given pool every day.\n *\n * @param {string} poolID The object ID of the pool.\n * @returns {Promise<Array<{emissions: number, coinAddress: string}>>} A promise that resolves to an array of objects with the emissions and coin address for each rewarder.\n */\n async emissionsEveryDay(poolID: string) {\n const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n const rewarderInfos = currentPool.rewarder_infos\n if (!rewarderInfos) {\n return null\n }\n\n const emissionsEveryDay = []\n for (const rewarderInfo of rewarderInfos) {\n const emissionSeconds = MathUtil.fromX64(new BN(rewarderInfo.emissions_per_second))\n emissionsEveryDay.push({\n emissions: Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24),\n coin_address: rewarderInfo.coinAddress,\n })\n }\n\n return emissionsEveryDay\n }\n\n /**\n * Updates the rewarder for the given pool.\n *\n * @param {string} poolID The object ID of the pool.\n * @param {BN} currentTime The current time in seconds since the Unix epoch.\n * @returns {Promise<Pool>} A promise that resolves to the updated pool.\n */\n private async updatePoolRewarder(poolID: string, currentTime: BN): Promise<Pool> {\n // refresh pool rewarder\n const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n const lastTime = currentPool.rewarder_last_updated_time\n currentPool.rewarder_last_updated_time = currentTime.toString()\n\n if (Number(currentPool.liquidity) === 0 || currentTime.eq(new BN(lastTime))) {\n return currentPool\n }\n const timeDelta = currentTime.div(new BN(1000)).sub(new BN(lastTime)).add(new BN(15))\n const rewarderInfos: any = currentPool.rewarder_infos\n\n for (let i = 0; i < rewarderInfos.length; i += 1) {\n const rewarderInfo = rewarderInfos[i]\n const rewarderGrowthDelta = MathUtil.checkMulDivFloor(\n timeDelta,\n new BN(rewarderInfo.emissions_per_second),\n new BN(currentPool.liquidity),\n 128\n )\n this.growthGlobal[i] = new BN(rewarderInfo.growth_global).add(new BN(rewarderGrowthDelta))\n }\n\n return currentPool\n }\n\n /**\n * Gets the amount owed to the rewarders for the given position.\n *\n * @param {string} poolID The object ID of the pool.\n * @param {string} positionHandle The handle of the position.\n * @param {string} positionID The ID of the position.\n * @returns {Promise<Array<{amountOwed: number}>>} A promise that resolves to an array of objects with the amount owed to each rewarder.\n * @deprecated This method is deprecated and may be removed in future versions. Use `sdk.Rewarder.fetchPosRewardersAmount()` instead.\n */\n async posRewardersAmount(poolID: string, positionHandle: string, positionID: string) {\n const currentTime = Date.parse(new Date().toString())\n const pool: Pool = await this.updatePoolRewarder(poolID, new BN(currentTime))\n const position = await this.sdk.Position.getPositionRewarders(positionHandle, positionID)\n\n if (position === undefined) {\n return []\n }\n\n const ticksHandle = pool.ticks_handle\n const tickLower = await this.sdk.Pool.getTickDataByIndex(ticksHandle, position.tick_lower_index)\n const tickUpper = await this.sdk.Pool.getTickDataByIndex(ticksHandle, position.tick_upper_index)\n\n const amountOwed = this.posRewardersAmountInternal(pool, position, tickLower!, tickUpper!)\n return amountOwed\n }\n\n /**\n * Gets the amount owed to the rewarders for the given account and pool.\n *\n * @param {string} accountAddress The account address.\n * @param {string} poolID The object ID of the pool.\n * @returns {Promise<Array<{amountOwed: number}>>} A promise that resolves to an array of objects with the amount owed to each rewarder.\n * @deprecated This method is deprecated and may be removed in future versions. Use `sdk.Rewarder.fetchPosRewardersAmount()` instead.\n */\n async poolRewardersAmount(accountAddress: string, poolID: string) {\n const currentTime = Date.parse(new Date().toString())\n const pool: Pool = await this.updatePoolRewarder(poolID, new BN(currentTime))\n\n const positions = await this.sdk.Position.getPositionList(accountAddress, [poolID])\n const tickDatas = await this.getPoolLowerAndUpperTicks(pool.ticks_handle, positions)\n\n const rewarderAmount = [ZERO, ZERO, ZERO]\n\n for (let i = 0; i < positions.length; i += 1) {\n // eslint-disable-next-line no-await-in-loop\n const posRewarderInfo: any = await this.posRewardersAmountInternal(pool, positions[i], tickDatas[0][i], tickDatas[1][i])\n for (let j = 0; j < 3; j += 1) {\n rewarderAmount[j] = rewarderAmount[j].add(posRewarderInfo[j].amount_owed)\n }\n }\n\n return rewarderAmount\n }\n\n /**\n * Gets the amount owed to the rewarders for the given account and pool.\n * @param {Pool} pool Pool object\n * @param {PositionReward} position Position object\n * @param {TickData} tickLower Lower tick data\n * @param {TickData} tickUpper Upper tick data\n * @returns {RewarderAmountOwed[]}\n */\n private posRewardersAmountInternal(pool: Pool, position: PositionReward, tickLower: TickData, tickUpper: TickData): RewarderAmountOwed[] {\n const tickLowerIndex = position.tick_lower_index\n const tickUpperIndex = position.tick_upper_index\n const rewardersInside = getRewardInTickRange(pool, tickLower, tickUpper, tickLowerIndex, tickUpperIndex, this.growthGlobal)\n\n const growthInside = []\n const AmountOwed = []\n\n if (rewardersInside.length > 0) {\n let growthDelta0 = MathUtil.subUnderflowU128(rewardersInside[0], new BN(position.reward_growth_inside_0))\n\n if (growthDelta0.gt(new BN('3402823669209384634633745948738404'))) {\n growthDelta0 = ONE\n }\n\n const amountOwed_0 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta0, 64, 128)\n growthInside.push(rewardersInside[0])\n AmountOwed.push({\n amount_owed: new BN(position.reward_amount_owed_0).add(amountOwed_0),\n\n coin_address: pool.rewarder_infos[0].coinAddress,\n })\n }\n\n if (rewardersInside.length > 1) {\n let growthDelta_1 = MathUtil.subUnderflowU128(rewardersInside[1], new BN(position.reward_growth_inside_1))\n if (growthDelta_1.gt(new BN('3402823669209384634633745948738404'))) {\n growthDelta_1 = ONE\n }\n\n const amountOwed_1 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta_1, 64, 128)\n growthInside.push(rewardersInside[1])\n\n AmountOwed.push({\n amount_owed: new BN(position.reward_amount_owed_1).add(amountOwed_1),\n coin_address: pool.rewarder_infos[1].coinAddress,\n })\n }\n\n if (rewardersInside.length > 2) {\n let growthDelta_2 = MathUtil.subUnderflowU128(rewardersInside[2], new BN(position.reward_growth_inside_2))\n if (growthDelta_2.gt(new BN('3402823669209384634633745948738404'))) {\n growthDelta_2 = ONE\n }\n\n const amountOwed_2 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta_2, 64, 128)\n growthInside.push(rewardersInside[2])\n\n AmountOwed.push({\n amount_owed: new BN(position.reward_amount_owed_2).add(amountOwed_2),\n coin_address: pool.rewarder_infos[2].coinAddress,\n })\n }\n return AmountOwed\n }\n\n /**\n * Fetches the Position reward amount for a given list of addresses.\n * @param {string[]}positionIDs An array of position object ids.\n * @returns {Promise<Record<string, RewarderAmountOwed[]>>} A Promise that resolves with the fetched position reward amount for the specified position object ids.\n */\n async batchFetchPositionRewarders(positionIDs: string[]): Promise<Record<string, RewarderAmountOwed[]>> {\n const posRewardParamsList: FetchPosRewardParams[] = []\n for (const id of positionIDs) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n posRewardParamsList.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n rewarderInfo: pool.rewarder_infos,\n })\n }\n\n const positionMap: Record<string, RewarderAmountOwed[]> = {}\n\n if (posRewardParamsList.length > 0) {\n const result: PosRewarderResult[] = await this.fetchPosRewardersAmount(posRewardParamsList)\n for (const posRewarderInfo of result) {\n positionMap[posRewarderInfo.positionId] = posRewarderInfo.rewarderAmountOwed\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * Fetch the position rewards for a given pool.\n * @param {Pool}pool Pool object\n * @param {string}positionId Position object id\n * @returns {Promise<RewarderAmountOwed[]>} A Promise that resolves with the fetched position reward amount for the specified position object id.\n */\n async fetchPositionRewarders(pool: Pool, positionId: string): Promise<RewarderAmountOwed[]> {\n const param = {\n poolAddress: pool.poolAddress,\n positionId,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n rewarderInfo: pool.rewarder_infos,\n }\n\n const result = await this.fetchPosRewardersAmount([param])\n\n return result[0].rewarderAmountOwed\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param positionIDs An array of position object ids.\n * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n * @deprecated This method is deprecated and may be removed in future versions. Use alternative methods if available.\n */\n async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n const posFeeParamsList: FetchPosFeeParams[] = []\n for (const id of positionIDs) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n posFeeParamsList.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n })\n }\n\n const positionMap: Record<string, CollectFeesQuote> = {}\n\n if (posFeeParamsList.length > 0) {\n const result: CollectFeesQuote[] = await this.fetchPosFeeAmount(posFeeParamsList)\n for (const posRewarderInfo of result) {\n positionMap[posRewarderInfo.position_id] = posRewarderInfo\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param params An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n * @returns\n */\n async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n for (const paramItem of params) {\n const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_fees`,\n arguments: args,\n typeArguments,\n })\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `FetchPositionFeesEvent`\n })\n if (valueData.length === 0) {\n return []\n }\n\n const result: CollectFeesQuote[] = []\n\n for (let i = 0; i < valueData.length; i += 1) {\n const { parsedJson } = valueData[i]\n const posRrewarderResult: CollectFeesQuote = {\n feeOwedA: new BN(parsedJson.fee_owned_a),\n feeOwedB: new BN(parsedJson.fee_owned_b),\n position_id: parsedJson.position_id,\n }\n result.push(posRrewarderResult)\n }\n\n return result\n }\n\n /**\n * Fetches the Position reward amount for a given list of addresses.\n * @param params An array of FetchPosRewardParams objects containing the target addresses and their corresponding amounts.\n * @returns\n */\n async fetchPosRewardersAmount(params: FetchPosRewardParams[]) {\n const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n for (const paramItem of params) {\n const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_rewards`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError(\n `this config simulationAccount: ${simulationAccount.address} is not set right`,\n ConfigErrorCode.InvalidSimulateAccount\n )\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `fetch position rewards error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `FetchPositionRewardsEvent`\n })\n if (valueData.length === 0) {\n return []\n }\n\n if (valueData.length !== params.length) {\n throw new ClmmpoolsError('valueData.length !== params.pools.length')\n }\n\n const result: PosRewarderResult[] = []\n\n for (let i = 0; i < valueData.length; i += 1) {\n const posRrewarderResult: PosRewarderResult = {\n poolAddress: params[i].poolAddress,\n positionId: params[i].positionId,\n rewarderAmountOwed: [],\n }\n\n for (let j = 0; j < params[i].rewarderInfo.length; j += 1) {\n posRrewarderResult.rewarderAmountOwed.push({\n amount_owed: new BN(valueData[i].parsedJson.data[j]),\n coin_address: params[i].rewarderInfo[j].coinAddress,\n })\n }\n\n result.push(posRrewarderResult)\n }\n\n return result\n }\n\n /**\n * Fetches the pool reward amount for a given account and pool object id.\n * @param {string} account - The target account.\n * @param {string} poolObjectId - The target pool object id.\n * @returns {Promise<number|null>} - A Promise that resolves with the fetched pool reward amount for the specified account and pool, or null if the fetch is unsuccessful.\n */\n async fetchPoolRewardersAmount(account: string, poolObjectId: string) {\n const pool: Pool = await this.sdk.Pool.getPool(poolObjectId)\n const positions = await this.sdk.Position.getPositionList(account, [poolObjectId])\n\n const params: FetchPosRewardParams[] = []\n\n for (const position of positions) {\n params.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n rewarderInfo: pool.rewarder_infos,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n })\n }\n\n const result = await this.fetchPosRewardersAmount(params)\n\n const rewarderAmount = [ZERO, ZERO, ZERO]\n\n if (result != null) {\n for (const posRewarderInfo of result) {\n for (let j = 0; j < posRewarderInfo.rewarderAmountOwed.length; j += 1) {\n rewarderAmount[j] = rewarderAmount[j].add(posRewarderInfo.rewarderAmountOwed[j].amount_owed)\n }\n }\n }\n return rewarderAmount\n }\n\n private async getPoolLowerAndUpperTicks(ticksHandle: string, positions: Position[]): Promise<TickData[][]> {\n const lowerTicks: TickData[] = []\n const upperTicks: TickData[] = []\n\n for (const pos of positions) {\n const tickLower = await this.sdk.Pool.getTickDataByIndex(ticksHandle, pos.tick_lower_index)\n const tickUpper = await this.sdk.Pool.getTickDataByIndex(ticksHandle, pos.tick_upper_index)\n lowerTicks.push(tickLower!)\n upperTicks.push(tickUpper!)\n }\n\n return [lowerTicks, upperTicks]\n }\n\n /**\n * Collect rewards from Position.\n * @param params\n * @param gasBudget\n * @returns\n */\n async collectRewarderTransactionPayload(params: CollectRewarderParams): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress, null)\n let tx = new Transaction()\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n return tx\n }\n\n /**\n * batech Collect rewards from Position.\n * @param params\n * @param published_at\n * @param tx\n * @returns\n */\n async batchCollectRewardePayload(params: CollectRewarderParams[], tx?: Transaction) {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress, null)\n tx = tx || new Transaction()\n const coinIdList: { coin: BuildCoinResult; coin_addr: string }[] = []\n params.forEach((item) => {\n const coinTypeA = normalizeCoinType(item.coinTypeA)\n const coinTypeB = normalizeCoinType(item.coinTypeB)\n\n if (item.collect_fee) {\n const coinAInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinTypeA, false, true)\n const coinBInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinTypeB, false, true)\n\n coinIdList.push({ coin: coinAInput, coin_addr: coinTypeA })\n coinIdList.push({ coin: coinBInput, coin_addr: coinTypeB })\n\n tx = this._sdk.Position.createCollectFeeNoSendPaylod(\n {\n pool_id: item.pool_id,\n pos_id: item.pos_id,\n coinTypeA: item.coinTypeA,\n coinTypeB: item.coinTypeB,\n },\n tx!,\n coinAInput.targetCoin,\n coinBInput.targetCoin\n )\n }\n const primaryCoinInputs: TransactionObjectArgument[] = []\n item.rewarder_coin_types.forEach((type) => {\n const coinType = normalizeCoinType(type)\n const coinInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinType, false, true)\n primaryCoinInputs.push(coinInput.targetCoin)\n\n coinIdList.push({ coin: coinInput, coin_addr: coinType })\n })\n\n tx = this.createCollectRewarderNoSendPaylod(item, tx!, primaryCoinInputs)\n })\n\n coinIdList.forEach((item) => {\n TransactionUtil.buildTransferCoin(this._sdk, tx!, item.coin.targetCoin, item.coin_addr, this._sdk.senderAddress)\n })\n\n return tx\n }\n\n createCollectRewarderPaylod(params: CollectRewarderParams, tx: Transaction, primaryCoinInputs: TransactionArgument[]) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n params.rewarder_coin_types.forEach((type, index) => {\n if (tx) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(clmmConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(clmmConfigs.global_vault_id),\n primaryCoinInputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n\n createCollectRewarderNoSendPaylod(params: CollectRewarderParams, tx: Transaction, primaryCoinInputs: TransactionArgument[]) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n params.rewarder_coin_types.forEach((type, index) => {\n if (tx) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(clmmConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(clmmConfigs.global_vault_id),\n primaryCoinInputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n}\n","import BN from 'bn.js'\nimport { Graph, GraphEdge, GraphVertex } from '@syntsugar/cc-graph'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { PreSwapWithMultiPoolParams } from '../types'\nimport { checkInvalidSuiAddress, extractStructTagFromType } from '../utils'\nimport { ClmmExpectSwapModule, ClmmIntegrateRouterModule, SuiAddressType } from '../types/sui'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { U64_MAX, ZERO } from '../math'\nimport { ClmmpoolsError, ConfigErrorCode, RouterErrorCode } from '../errors/errors'\n\n// coin node in coin map\nexport interface CoinNode {\n address: string\n decimals: number\n}\n\n// pass coin node to coin map\nexport interface CoinProvider {\n coins: CoinNode[]\n}\n\n// path link to coin map\nexport interface PathLink {\n base: string\n quote: string\n addressMap: Map<number, string>\n}\n\n// pass path link to coin map\nexport interface PathProvider {\n paths: PathLink[]\n}\n\n// simple path in router path\nexport type OnePath = {\n amountIn: BN\n amountOut: BN\n poolAddress: string[]\n a2b: boolean[]\n rawAmountLimit: BN[]\n isExceed: boolean\n coinType: string[]\n}\n\n// label address map with direction\nexport type AddressAndDirection = {\n addressMap: Map<number, string>\n direction: boolean\n}\n\n// use to build router swap transaction\nexport type SwapWithRouterParams = {\n paths: OnePath[]\n partner: string\n priceSlippagePoint: number\n}\n\n// use to do pre router swap param by sdk\nexport type PreRouterSwapParams = {\n stepNums: number\n poolAB: string\n poolBC: string | undefined\n a2b: boolean\n b2c: boolean | undefined\n byAmountIn: boolean\n amount: BN\n coinTypeA: SuiAddressType\n coinTypeB: SuiAddressType\n coinTypeC: SuiAddressType | undefined\n}\n\n// return the best path in pre swap result\nexport type PreSwapResult = {\n index: number\n amountIn: BN\n amountMedium: BN\n amountOut: BN\n targetSqrtPrice: BN[]\n currentSqrtPrice: BN[]\n isExceed: boolean\n stepNum: number\n}\n\n// return the\nexport type PriceResult = {\n amountIn: BN\n amountOut: BN\n paths: OnePath[]\n a2b: boolean\n b2c: boolean | undefined\n byAmountIn: boolean\n isExceed: boolean\n targetSqrtPrice: BN[]\n currentSqrtPrice: BN[]\n coinTypeA: SuiAddressType\n coinTypeB: SuiAddressType\n coinTypeC: SuiAddressType | undefined\n createTxParams: SwapWithRouterParams | undefined\n}\n\n// return the pool with tvl info by statistics API\ntype PoolWithTvl = {\n poolAddress: string\n tvl: number\n}\n\n/**\n * build pair symbol\n * @param base base coin\n * @param quote quote coin\n * @returns pair symbol\n */\nfunction _pairSymbol(\n base: string,\n quote: string\n): {\n pair: string\n reversePair: string\n} {\n return {\n pair: `${base}-${quote}`,\n reversePair: `${quote}-${base}`,\n }\n}\n\nexport class RouterModule implements IModule {\n readonly graph: Graph\n\n readonly pathProviders: PathProvider[]\n\n private coinProviders: CoinProvider\n\n private _coinAddressMap: Map<string, CoinNode>\n\n private poolAddressMap: Map<string, Map<number, string>>\n\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this.pathProviders = []\n this.coinProviders = {\n coins: [],\n }\n this.graph = new Graph(false)\n this._coinAddressMap = new Map()\n this.poolAddressMap = new Map()\n this._sdk = sdk\n\n this.getPoolAddressMapAndDirection = this.getPoolAddressMapAndDirection.bind(this)\n this.setCoinList = this.setCoinList.bind(this)\n this.loadGraph = this.loadGraph.bind(this)\n this.addCoinProvider = this.addCoinProvider.bind(this)\n this.addPathProvider = this.addPathProvider.bind(this)\n this.preRouterSwapA2B2C = this.preRouterSwapA2B2C.bind(this)\n this.price = this.price.bind(this)\n this.getPoolWithTVL = this.getPoolWithTVL.bind(this)\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Get pool address map with direction\n * @param {string} base base coin\n * @param {string} quote quote coin\n * @returns {AddressAndDirection} address with direction\n */\n getPoolAddressMapAndDirection(base: string, quote: string): AddressAndDirection | undefined {\n const { pair, reversePair } = _pairSymbol(base, quote)\n let addressMap: any = this.poolAddressMap.get(pair)\n\n if (addressMap != null) {\n return {\n addressMap,\n direction: true,\n }\n }\n\n addressMap = this.poolAddressMap.get(reversePair)\n if (addressMap != null) {\n return {\n addressMap,\n direction: false,\n }\n }\n return undefined\n }\n\n /**\n * set coin list in coin address map\n */\n private setCoinList() {\n this.coinProviders.coins.forEach((coin) => {\n this._coinAddressMap.set(coin.address, coin)\n })\n }\n\n /**\n * Find best router must load graph first\n * @param {CoinProvider} coins all coins\n * @param {PathProvider} paths all paths\n */\n loadGraph(coins: CoinProvider, paths: PathProvider) {\n this.addCoinProvider(coins)\n this.addPathProvider(paths)\n this.setCoinList()\n\n this.pathProviders.forEach((provider) => {\n const { paths } = provider\n paths.forEach((path) => {\n const vertexA = this.graph.getVertexByKey(path.base) ?? new GraphVertex(path.base)\n const vertexB = this.graph.getVertexByKey(path.quote) ?? new GraphVertex(path.quote)\n\n this.graph.addEdge(new GraphEdge(vertexA, vertexB))\n\n const coinA: any = this._coinAddressMap.get(path.base)\n const coinB: any = this._coinAddressMap.get(path.quote)\n\n if (coinA != null && coinB != null) {\n const poolSymbol = _pairSymbol(path.base, path.quote).pair\n this.poolAddressMap.set(poolSymbol, path.addressMap)\n }\n })\n })\n }\n\n /**\n * Add path provider to router graph\n * @param {PathProvider} provider path provider\n * @returns {RouterModule} module of router\n */\n private addPathProvider(provider: PathProvider): RouterModule {\n // fix all order about base and quote in paths\n for (let i = 0; i < provider.paths.length; i += 1) {\n const { base, quote } = provider.paths[i]\n const compareResult = base.localeCompare(quote)\n if (compareResult < 0) {\n provider.paths[i].base = quote\n provider.paths[i].quote = base\n }\n\n if (base === '0x2::sui::SUI') {\n provider.paths[i].base = quote\n provider.paths[i].quote = base\n }\n\n if (quote === '0x2::sui::SUI') {\n provider.paths[i].base = base\n provider.paths[i].quote = quote\n }\n }\n\n this.pathProviders.push(provider)\n return this\n }\n\n /**\n * Add coin provider to router graph\n * @param {CoinProvider} provider coin provider\n * @returns {RouterModule} module of router\n */\n private addCoinProvider(provider: CoinProvider): RouterModule {\n this.coinProviders = provider\n return this\n }\n\n /**\n * Get token info from coin address map\n * @param {string} key coin type\n * @returns {CoinNode | undefined}\n */\n tokenInfo(key: string): CoinNode | undefined {\n return this._coinAddressMap.get(key)\n }\n\n /**\n * Get fee rate info from pool address map\n * @param from from coin type\n * @param to to coin type\n * @param address pool address\n * @returns fee rate of pool\n */\n getFeeRate(from: string, to: string, address: string): number {\n const poolSymbol = _pairSymbol(from, to).pair\n const addressMap = this.poolAddressMap.get(poolSymbol)\n if (addressMap != null) {\n // get value by key from map\n for (const [key, value] of addressMap.entries()) {\n if (value === address) {\n return key * 100\n }\n }\n }\n const poolSymbolRev = _pairSymbol(from, to).reversePair\n const addressMapRev = this.poolAddressMap.get(poolSymbolRev)\n if (addressMapRev != null) {\n // get value by key from map\n for (const [key, value] of addressMapRev.entries()) {\n if (value === address) {\n return key * 100\n }\n }\n }\n return 0\n }\n\n /**\n * Get the best price from router graph.\n *\n * @param {string} from from coin type\n * @param {string} to to coin type\n * @param {BN} amount coin amount\n * @param {boolean} byAmountIn weather fixed inoput amount\n * @param {number} priceSlippagePoint price splippage point\n * @param {string} partner partner object id\n * @param {PreSwapWithMultiPoolParams} swapWithMultiPoolParams use to downgrade\n * @returns {Promise<PriceResult | undefined>} best swap router\n */\n async price(\n from: string,\n to: string,\n amount: BN,\n byAmountIn: boolean,\n priceSlippagePoint: number,\n partner: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n ): Promise<PriceResult | undefined> {\n const fromCoin = this.tokenInfo(from)\n const toCoin = this.tokenInfo(to)\n\n if (fromCoin === undefined || toCoin === undefined) {\n throw new ClmmpoolsError('From/To coin is undefined', RouterErrorCode.InvalidCoin)\n }\n\n const fromVertex = this.graph.getVertexByKey(fromCoin.address)\n const toVertex = this.graph.getVertexByKey(toCoin.address)\n\n const pathIters = this.graph.findAllPath(fromVertex, toVertex)\n const allPaths = Array.from(pathIters)\n\n if (allPaths.length === 0) {\n throw new ClmmpoolsError('No find valid path in coin graph', RouterErrorCode.NotFoundPath)\n }\n\n let preRouterSwapParams: PreRouterSwapParams[] = []\n\n for (let i = 0; i < allPaths.length; i += 1) {\n const path = allPaths[i]\n\n // only consider one and two pair path\n if (path.length > 3) {\n continue\n }\n const fromAndTo = []\n const swapDirection = []\n\n const poolsAB: string[] = []\n const poolsBC: string[] = []\n\n for (let j = 0; j < path.length - 1; j += 1) {\n const subFrom = path[j].value.toString()\n const subTo = path[j + 1].value.toString()\n const addressMapAndDirection = this.getPoolAddressMapAndDirection(subFrom, subTo)\n const addressMap = addressMapAndDirection?.addressMap\n const direction = addressMapAndDirection?.direction\n\n if (addressMap != null && direction != null) {\n swapDirection.push(direction)\n fromAndTo.push(subFrom)\n fromAndTo.push(subTo)\n addressMap.forEach((address) => {\n if (j === 0) {\n poolsAB.push(address)\n } else {\n poolsBC.push(address)\n }\n })\n }\n }\n\n for (const poolAB of poolsAB) {\n if (poolsBC.length > 0) {\n for (const poolBC of poolsBC) {\n const param: PreRouterSwapParams = {\n stepNums: 2,\n poolAB,\n poolBC,\n a2b: swapDirection[0],\n b2c: swapDirection[1],\n amount,\n byAmountIn,\n coinTypeA: fromAndTo[0],\n coinTypeB: fromAndTo[1],\n coinTypeC: fromAndTo[3],\n }\n preRouterSwapParams.push(param)\n }\n } else {\n const param: PreRouterSwapParams = {\n stepNums: 1,\n poolAB,\n poolBC: undefined,\n a2b: swapDirection[0],\n b2c: undefined,\n amount,\n byAmountIn,\n coinTypeA: fromAndTo[0],\n coinTypeB: fromAndTo[1],\n coinTypeC: undefined,\n }\n preRouterSwapParams.push(param)\n }\n }\n }\n\n // add one limit, must calculated two steps path.\n const stepNumsOne = preRouterSwapParams.filter((item) => item.stepNums === 1)\n const notStepNumsOne = preRouterSwapParams.filter((item) => item.stepNums !== 1)\n\n let poolWithTvls: PoolWithTvl[] = []\n try {\n poolWithTvls = await this.getPoolWithTVL()\n } catch (err) {\n poolWithTvls = []\n }\n\n if (poolWithTvls.length > 0) {\n const poolWithTvlsMap = new Map(poolWithTvls.map((item) => [item.poolAddress, item]))\n\n // sort notStepNumbsOne by tvl\n notStepNumsOne.sort((a, b) => {\n let aTvlMinimum = 0\n let bTvlMinimum = 0\n\n if (poolWithTvlsMap.has(a.poolAB) && poolWithTvlsMap.has(a.poolBC!)) {\n const aPoolAB = poolWithTvlsMap.get(a.poolAB)!\n const aPoolBC = poolWithTvlsMap.get(a.poolBC!)!\n aTvlMinimum = Math.min(aPoolAB.tvl, aPoolBC.tvl)\n }\n\n if (poolWithTvlsMap.has(b.poolAB) && poolWithTvlsMap.has(b.poolBC!)) {\n const bPoolAB = poolWithTvlsMap.get(b.poolAB)!\n const bPoolBC = poolWithTvlsMap.get(b.poolBC!)!\n bTvlMinimum = Math.min(bPoolAB.tvl, bPoolBC.tvl)\n }\n return bTvlMinimum - aTvlMinimum\n })\n }\n\n preRouterSwapParams = [...stepNumsOne, ...notStepNumsOne]\n\n if (preRouterSwapParams.length === 0) {\n if (swapWithMultiPoolParams != null) {\n const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n const onePath: OnePath = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n poolAddress: [preSwapResult!.poolAddress],\n a2b: [preSwapResult!.aToB],\n rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n isExceed: preSwapResult!.isExceed,\n coinType: [from, to],\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n paths: [onePath],\n a2b: preSwapResult!.aToB,\n b2c: undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n coinTypeA: from,\n coinTypeB: to,\n coinTypeC: undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n throw new ClmmpoolsError('No parameters available for service downgrade', RouterErrorCode.NoDowngradeNeedParams)\n }\n\n const preSwapResult = await this.preRouterSwapA2B2C(preRouterSwapParams.slice(0, 16))\n if (preSwapResult == null) {\n if (swapWithMultiPoolParams != null) {\n const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n const onePath: OnePath = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n poolAddress: [preSwapResult!.poolAddress],\n a2b: [preSwapResult!.aToB],\n rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n isExceed: preSwapResult!.isExceed,\n coinType: [from, to],\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n paths: [onePath],\n a2b: preSwapResult!.aToB,\n b2c: undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n coinTypeA: from,\n coinTypeB: to,\n coinTypeC: undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n const result: PriceResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n paths: [],\n a2b: false,\n b2c: false,\n byAmountIn,\n isExceed: true,\n targetSqrtPrice: [],\n currentSqrtPrice: [],\n coinTypeA: '',\n coinTypeB: '',\n coinTypeC: undefined,\n createTxParams: undefined,\n }\n\n return result\n }\n\n const bestIndex = preSwapResult!.index\n\n const poolAddress =\n preRouterSwapParams[bestIndex].poolBC != null\n ? [preRouterSwapParams[bestIndex].poolAB, preRouterSwapParams[bestIndex].poolBC!]\n : [preRouterSwapParams[bestIndex].poolAB]\n\n const rawAmountLimit = byAmountIn\n ? [preSwapResult!.amountMedium, preSwapResult!.amountOut]\n : [preSwapResult!.amountIn, preSwapResult!.amountMedium]\n\n const a2bs = []\n a2bs.push(preRouterSwapParams[bestIndex].a2b)\n if (preSwapResult!.stepNum! > 1) {\n a2bs.push(preRouterSwapParams[bestIndex].b2c!)\n }\n\n const coinTypes = []\n coinTypes.push(preRouterSwapParams[bestIndex].coinTypeA)\n coinTypes.push(preRouterSwapParams[bestIndex].coinTypeB)\n if (preSwapResult!.stepNum! > 1) {\n coinTypes.push(preRouterSwapParams[bestIndex].coinTypeC!)\n }\n\n const onePath: OnePath = {\n amountIn: preSwapResult!.amountIn,\n amountOut: preSwapResult!.amountOut,\n poolAddress,\n a2b: a2bs,\n rawAmountLimit,\n isExceed: preSwapResult!.isExceed,\n coinType: coinTypes,\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: preSwapResult!.amountIn,\n amountOut: preSwapResult!.amountOut,\n paths: [onePath],\n a2b: preRouterSwapParams[bestIndex].a2b,\n b2c: preSwapResult!.stepNum! > 1 ? preRouterSwapParams[bestIndex].b2c! : undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: preSwapResult!.targetSqrtPrice,\n currentSqrtPrice: preSwapResult!.currentSqrtPrice,\n coinTypeA: preRouterSwapParams[bestIndex].coinTypeA,\n coinTypeB: preRouterSwapParams[bestIndex].coinTypeB,\n coinTypeC: preSwapResult!.stepNum! > 1 ? preRouterSwapParams[bestIndex].coinTypeC! : undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n\n async priceUseV1(\n from: string,\n to: string,\n _amount: BN,\n byAmountIn: boolean,\n priceSlippagePoint: number,\n partner: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n ) {\n if (swapWithMultiPoolParams != null) {\n const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n const onePath: OnePath = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n poolAddress: [preSwapResult!.poolAddress],\n a2b: [preSwapResult!.aToB],\n rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n isExceed: preSwapResult!.isExceed,\n coinType: [from, to],\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n paths: [onePath],\n a2b: preSwapResult!.aToB,\n b2c: undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n coinTypeA: from,\n coinTypeB: to,\n coinTypeC: undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n throw new ClmmpoolsError('No parameters available for service downgrade', RouterErrorCode.NoDowngradeNeedParams)\n }\n\n async preRouterSwapA2B2C(params: PreRouterSwapParams[]) {\n if (params.length === 0) {\n return null\n }\n\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const tx = new Transaction()\n for (const param of params) {\n if (param.stepNums > 1) {\n const args = [\n tx.object(param.poolAB),\n tx.object(param.poolBC!),\n tx.pure.bool(param.a2b),\n tx.pure.bool(param.b2c!),\n tx.pure.bool(param.byAmountIn),\n tx.pure.u64(param.amount.toString()),\n ]\n const typeArguments = []\n if (param.a2b) {\n typeArguments.push(param.coinTypeA, param.coinTypeB)\n } else {\n typeArguments.push(param.coinTypeB, param.coinTypeA)\n }\n\n if (param.b2c) {\n typeArguments.push(param.coinTypeB, param.coinTypeC!)\n } else {\n typeArguments.push(param.coinTypeC!, param.coinTypeB)\n }\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegrateRouterModule}::calculate_router_swap_result`,\n typeArguments,\n arguments: args,\n })\n } else {\n const args = [\n tx.object(param.poolAB),\n tx.pure.bool(param.a2b),\n tx.pure.bool(param.byAmountIn),\n tx.pure.u64(param.amount.toString()),\n ]\n const typeArguments = param.a2b ? [param.coinTypeA, param.coinTypeB] : [param.coinTypeB, param.coinTypeA]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmExpectSwapModule}::get_expect_swap_result`,\n arguments: args,\n typeArguments,\n })\n }\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return (\n extractStructTagFromType(item.type).name === `CalculatedRouterSwapResultEvent` ||\n extractStructTagFromType(item.type).name === `ExpectSwapResultEvent`\n )\n })\n if (valueData.length === 0) {\n return null\n }\n\n let tempMaxAmount = params[0].byAmountIn ? ZERO : U64_MAX\n let tempIndex = 0\n\n for (let i = 0; i < valueData.length; i += 1) {\n if (valueData[i].parsedJson.data.is_exceed) {\n continue\n }\n\n if (params[0].byAmountIn) {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.gt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n } else {\n const amount =\n params[i].stepNums > 1\n ? new BN(valueData[i].parsedJson.data.amount_in)\n : new BN(valueData[i].parsedJson.data.amount_in).add(new BN(valueData[i].parsedJson.data.fee_amount))\n if (amount.lt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n }\n }\n\n const currentSqrtPrice = []\n const targetSqrtPrice = []\n if (params[tempIndex].stepNums > 1) {\n targetSqrtPrice.push(\n valueData[tempIndex].parsedJson.data.target_sqrt_price_ab,\n valueData[tempIndex].parsedJson.data.target_sqrt_price_cd\n )\n currentSqrtPrice.push(\n valueData[tempIndex].parsedJson.data.current_sqrt_price_ab,\n valueData[tempIndex].parsedJson.data.current_sqrt_price_cd\n )\n } else {\n targetSqrtPrice.push(valueData[tempIndex].parsedJson.data.after_sqrt_price)\n currentSqrtPrice.push(valueData[tempIndex].parsedJson.current_sqrt_price)\n }\n\n const result: PreSwapResult = {\n index: tempIndex,\n amountIn: params[0].byAmountIn ? params[tempIndex].amount : tempMaxAmount,\n amountMedium: valueData[tempIndex].parsedJson.data.amount_medium,\n amountOut: params[0].byAmountIn ? tempMaxAmount : params[tempIndex].amount,\n targetSqrtPrice,\n currentSqrtPrice,\n isExceed: valueData[tempIndex].parsedJson.data.is_exceed,\n stepNum: params[tempIndex].stepNums,\n }\n return result\n }\n\n async getPoolWithTVL(): Promise<PoolWithTvl[]> {\n const result: PoolWithTvl[] = []\n\n const { swapCountUrl } = this._sdk.sdkOptions\n if (!swapCountUrl) {\n return result\n }\n\n let response\n try {\n response = await fetch(swapCountUrl)\n } catch (e) {\n throw new ClmmpoolsError(`Failed to get pool list with liquidity from ${swapCountUrl}.`, RouterErrorCode.InvalidSwapCountUrl)\n }\n\n let json\n try {\n json = await response.json()\n } catch (e) {\n throw new ClmmpoolsError(`Failed tp [arse response from ${swapCountUrl}].`, RouterErrorCode.InvalidSwapCountUrl)\n }\n\n if (json.code !== 200) {\n throw new ClmmpoolsError(\n `Failed to get pool list from ${swapCountUrl}. Statu code is ${json.code}.`,\n RouterErrorCode.InvalidSwapCountUrl\n )\n }\n\n const { pools } = json.data\n\n for (const pool of pools) {\n result.push({\n poolAddress: pool.swap_account,\n tvl: Number(pool.tvl_in_usd),\n })\n }\n\n return result\n }\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport {\n CalculateRatesParams,\n CalculateRatesResult,\n getPackagerConfigs,\n Pool,\n PreSwapParams,\n PreSwapWithMultiPoolParams,\n SwapParams,\n TransPreSwapWithMultiPoolParams,\n} from '../types'\nimport { Percentage, U64_MAX, ZERO } from '../math'\nimport { findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport { extractStructTagFromType } from '../utils/contracts'\nimport { ClmmFetcherModule } from '../types/sui'\nimport { TickData, transClmmpoolDataWithoutTicks } from '../types/clmmpool'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { SwapUtils } from '../math/swap'\nimport { computeSwap } from '../math/clmm'\nimport { TickMath } from '../math/tick'\nimport { checkInvalidSuiAddress, d } from '../utils'\nimport { SplitPath } from './routerModuleV2'\nimport { ClmmpoolsError, ConfigErrorCode, SwapErrorCode } from '../errors/errors'\n\nexport const AMM_SWAP_MODULE = 'amm_swap'\nexport const POOL_STRUCT = 'Pool'\n\n/**\n * Helper class to help interact with clmm pool swap with a swap router interface.\n */\nexport class SwapModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n calculateSwapFee(paths: SplitPath[]) {\n let fee = d(0)\n paths.forEach((item) => {\n const pathCount = item.basePaths.length\n if (pathCount > 0) {\n const path = item.basePaths[0]\n const feeRate = path.label === 'Magma' ? new Decimal(path.feeRate).div(10 ** 6) : new Decimal(path.feeRate).div(10 ** 9)\n const feeAmount = d(path.inputAmount)\n .div(10 ** path.fromDecimal)\n .mul(feeRate)\n fee = fee.add(feeAmount)\n if (pathCount > 1) {\n const path2 = item.basePaths[1]\n const price1 = path.direction ? path.currentPrice : new Decimal(1).div(path.currentPrice)\n const price2 = path2.direction ? path2.currentPrice : new Decimal(1).div(path2.currentPrice)\n const feeRate2 = path2.label === 'Magma' ? new Decimal(path2.feeRate).div(10 ** 6) : new Decimal(path2.feeRate).div(10 ** 9)\n\n const feeAmount2 = d(path2.outputAmount)\n .div(10 ** path2.toDecimal)\n .mul(feeRate2)\n const fee2 = feeAmount2.div(price1.mul(price2))\n fee = fee.add(fee2)\n }\n }\n })\n\n return fee.toString()\n }\n\n calculateSwapPriceImpact(paths: SplitPath[]) {\n let impactValue = d(0)\n paths.forEach((item) => {\n const pathCount = item.basePaths.length\n if (pathCount === 1) {\n const path = item.basePaths[0]\n const outputAmount = d(path.outputAmount).div(10 ** path.toDecimal)\n const inputAmount = d(path.inputAmount).div(10 ** path.fromDecimal)\n const rate = outputAmount.div(inputAmount)\n const cprice = path.direction ? new Decimal(path.currentPrice) : new Decimal(1).div(path.currentPrice)\n impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n }\n if (pathCount === 2) {\n const path = item.basePaths[0]\n const path2 = item.basePaths[1]\n const cprice1 = path.direction ? new Decimal(path.currentPrice) : new Decimal(1).div(path.currentPrice)\n const cprice2 = path2.direction ? new Decimal(path2.currentPrice) : new Decimal(1).div(path2.currentPrice)\n const cprice = cprice1.mul(cprice2)\n const outputAmount = new Decimal(path2.outputAmount).div(10 ** path2.toDecimal)\n const inputAmount = new Decimal(path.inputAmount).div(10 ** path.fromDecimal)\n const rate = outputAmount.div(inputAmount)\n impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n }\n })\n\n return impactValue.toString()\n }\n\n private calculateSingleImpact = (rate: Decimal, cprice: Decimal) => {\n // ((cprice - rate)/cprice)*100\n return cprice.minus(rate).div(cprice).mul(100)\n }\n\n /**\n * Performs a pre-swap with multiple pools.\n *\n * @param {PreSwapWithMultiPoolParams} params The parameters for the pre-swap.\n * @returns {Promise<SwapWithMultiPoolData>} A promise that resolves to the swap data.\n */\n async preSwapWithMultiPool(params: PreSwapWithMultiPoolParams) {\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n for (let i = 0; i < params.poolAddresses.length; i += 1) {\n const args = [\n tx.object(params.poolAddresses[i]),\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.byAmountIn),\n tx.pure.u64(params.amount),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `pre swap with multi pools error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n })\n if (valueData.length === 0) {\n return null\n }\n\n if (valueData.length !== params.poolAddresses.length) {\n throw new ClmmpoolsError('valueData.length !== params.pools.length', SwapErrorCode.ParamsLengthNotEqual)\n }\n\n let tempMaxAmount = params.byAmountIn ? ZERO : U64_MAX\n let tempIndex = 0\n for (let i = 0; i < valueData.length; i += 1) {\n if (valueData[i].parsedJson.data.is_exceed) {\n continue\n }\n\n if (params.byAmountIn) {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.gt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n } else {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.lt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n }\n }\n\n return this.transformSwapWithMultiPoolData(\n {\n poolAddress: params.poolAddresses[tempIndex],\n a2b: params.a2b,\n byAmountIn: params.byAmountIn,\n amount: params.amount,\n coinTypeA: params.coinTypeA,\n coinTypeB: params.coinTypeB,\n },\n valueData[tempIndex].parsedJson\n )\n }\n\n /**\n * Performs a pre-swap.\n *\n * @param {PreSwapParams} params The parameters for the pre-swap.\n * @returns {Promise<PreSwapParams>} A promise that resolves to the swap data.\n */\n async preswap(params: PreSwapParams) {\n const { integrate, simulationAccount, clmm_pool } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n const tx = new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const args = [\n tx.object(global_config_id),\n tx.object(params.pool.poolAddress),\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.byAmountIn),\n tx.pure.u64(params.amount),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `preswap error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n })\n if (valueData.length === 0) {\n return null\n }\n return this.transformSwapData(params, valueData[0].parsedJson.data)\n }\n\n private transformSwapData(params: PreSwapParams, data: any) {\n const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n return {\n poolAddress: params.pool.poolAddress,\n currentSqrtPrice: params.currentSqrtPrice,\n estimatedAmountIn,\n estimatedAmountOut: data.amount_out,\n estimatedEndSqrtPrice: data.after_sqrt_price,\n estimatedFeeAmount: data.fee_amount,\n isExceed: data.is_exceed,\n amount: params.amount,\n aToB: params.a2b,\n byAmountIn: params.byAmountIn,\n }\n }\n\n private transformSwapWithMultiPoolData(params: TransPreSwapWithMultiPoolParams, jsonData: any) {\n const { data } = jsonData\n\n console.log('json data. ', data)\n\n const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n return {\n poolAddress: params.poolAddress,\n estimatedAmountIn,\n estimatedAmountOut: data.amount_out,\n estimatedEndSqrtPrice: data.after_sqrt_price,\n estimatedStartSqrtPrice: data.step_results[0].current_sqrt_price,\n estimatedFeeAmount: data.fee_amount,\n isExceed: data.is_exceed,\n amount: params.amount,\n aToB: params.a2b,\n byAmountIn: params.byAmountIn,\n }\n }\n\n /**\n * Calculates the rates for a swap.\n * @param {CalculateRatesParams} params The parameters for the calculation.\n * @returns {CalculateRatesResult} The results of the calculation.\n */\n calculateRates(params: CalculateRatesParams): CalculateRatesResult {\n const { currentPool } = params\n const poolData = transClmmpoolDataWithoutTicks(currentPool)\n\n let ticks\n if (params.a2b) {\n ticks = params.swapTicks.sort((a, b) => {\n return b.index - a.index\n })\n } else {\n ticks = params.swapTicks.sort((a, b) => {\n return a.index - b.index\n })\n }\n\n const swapResult = computeSwap(params.a2b, params.byAmountIn, params.amount, poolData, ticks)\n\n let isExceed = false\n if (params.byAmountIn) {\n isExceed = swapResult.amountIn.lt(params.amount)\n } else {\n isExceed = swapResult.amountOut.lt(params.amount)\n }\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n if (params.a2b && swapResult.nextSqrtPrice.lt(sqrtPriceLimit)) {\n isExceed = true\n }\n\n if (!params.a2b && swapResult.nextSqrtPrice.gt(sqrtPriceLimit)) {\n isExceed = true\n }\n\n let extraComputeLimit = 0\n if (swapResult.crossTickNum > 6 && swapResult.crossTickNum < 40) {\n extraComputeLimit = 22000 * (swapResult.crossTickNum - 6)\n }\n\n if (swapResult.crossTickNum > 40) {\n isExceed = true\n }\n\n const prePrice = TickMath.sqrtPriceX64ToPrice(poolData.currentSqrtPrice, params.decimalsA, params.decimalsB).toNumber()\n const afterPrice = TickMath.sqrtPriceX64ToPrice(swapResult.nextSqrtPrice, params.decimalsA, params.decimalsB).toNumber()\n\n const priceImpactPct = (Math.abs(prePrice - afterPrice) / prePrice) * 100\n\n return {\n estimatedAmountIn: swapResult.amountIn,\n estimatedAmountOut: swapResult.amountOut,\n estimatedEndSqrtPrice: swapResult.nextSqrtPrice,\n estimatedFeeAmount: swapResult.feeAmount,\n isExceed,\n extraComputeLimit,\n amount: params.amount,\n aToB: params.a2b,\n byAmountIn: params.byAmountIn,\n priceImpactPct,\n }\n }\n\n /**\n * create swap transaction payload\n * @param params\n * @param gasEstimateArg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns\n */\n async createSwapTransactionPayload(\n params: SwapParams,\n gasEstimateArg?: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n\n if ((params.a2b && isAdjustCoinA) || (!params.a2b && isAdjustCoinB)) {\n const tx = await TransactionUtil.buildSwapTransactionForGas(this._sdk, params, allCoinAsset, gasEstimateArg)\n return tx\n }\n }\n\n return TransactionUtil.buildSwapTransaction(this.sdk, params, allCoinAsset)\n }\n\n /**\n * create swap transaction without transfer coins payload\n * @param params\n * @param gasEstimateArg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns tx and coin ABs\n */\n async createSwapTransactionWithoutTransferCoinsPayload(\n params: SwapParams,\n gasEstimateArg?: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<{ tx: Transaction; coinABs: TransactionObjectArgument[] }> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n\n if ((params.a2b && isAdjustCoinA) || (!params.a2b && isAdjustCoinB)) {\n const res = await TransactionUtil.buildSwapTransactionWithoutTransferCoinsForGas(this._sdk, params, allCoinAsset, gasEstimateArg)\n return res\n }\n }\n\n return TransactionUtil.buildSwapTransactionWithoutTransferCoins(this.sdk, params, allCoinAsset)\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { ClmmpoolsError, LockErrorCode } from '../errors/errors'\nimport {\n CreateLockParams,\n IncreaseLockAmountParams,\n MergeLockParams,\n TransferLockParams,\n IncreaseUnlockTimeParams,\n LockPermanentParams,\n VoteParams,\n ClaimFeesParams as ClaimVotingRewardsParams,\n ClaimFeesPoolsParams as ClaimVotingRewardsPoolsParams,\n ClaimAndLockParams,\n PokeParams,\n VotingEscrow,\n CLOCK_ADDRESS,\n getPackagerConfigs,\n Voter,\n} from '../types'\nimport { checkInvalidSuiAddress, extractStructTagFromType, getObjectFields } from '../utils'\nimport { IModule } from '../interfaces/IModule'\nimport { MagmaClmmSDK } from '../sdk'\nimport { TransactionUtil } from '../utils/transaction-util'\n\ntype LockID = string\ntype PoolID = string\n\ntype LocksInfo = {\n owner: string\n lockInfo: LockInfo[]\n}\n\ntype AllLockSummary = {\n current_epoch_end: number\n current_epoch_vote_end: number\n rebase_apr: number\n team_emission_rate: number\n total_locked: number\n total_voted_power: number\n total_voting_power: number\n}\n\ntype LockInfo = {\n lock_id: string\n amount: string\n start: string\n end: string\n permanent: boolean\n\n rebase_amount: Coin\n voting_power: string\n voting_rewards: Map<string, Coin[]> // pool => incentiveTokenAmount / feeTokenAmount\n}\n\ntype Coin = {\n kind?: CoinType\n token_addr: string\n amount: string\n}\n\nenum CoinType {\n RebaseCoin = 'rebaseCoin',\n Fee = 'fee',\n Incentive = 'incentiveCoin',\n}\n\ntype PoolWeight = {\n poolId: string\n weight: string\n}\n\ntype ALockSummary = {\n fee_incentive_total: string\n reward_distributor_claimable: string\n voting_power: string\n}\n\nexport type AddBribeReward = {\n poolId: string\n amount: string\n coinType: string\n}\n\nexport type LockVoteEvent = {\n lock_id: string\n last_voted_at: string\n pools: string[]\n votes: string[]\n}\n\nexport class LockModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async createLockTransactionPayload(params: CreateLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n return TransactionUtil.buildCreateLockTransaction(this.sdk, params, allCoinAsset)\n }\n\n async increaseLockAmountTransactionPayload(params: IncreaseLockAmountParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n return TransactionUtil.buildIncreaseLockAmountTransaction(this.sdk, params, allCoinAsset)\n }\n\n async mergeLockTransactionPayload(params: MergeLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildMergeLockTransaction(this.sdk, params)\n }\n\n // public fun transfer<T>(lock: Lock, ve: &mut VotingEscrow<T>, to: address, clock: &Clock, ctx: &mut TxContext) {\n async transferLockTransactionPayload(params: TransferLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildTransferLockTransaction(this.sdk, params)\n }\n\n async increaseUnlockTimePayload(params: IncreaseUnlockTimeParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildIncreaseUnlockTimeTransaction(this.sdk, params)\n }\n\n // public fun lock_permanent<T>(self: &mut VotingEscrow<T>, lock: &mut Lock, clock: &Clock, ctx: &mut TxContext) {\n async lockPermanentPayload(params: LockPermanentParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildLockPermanentTransaction(this.sdk, params)\n }\n\n async unlockPermanentPayload(params: LockPermanentParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildUnlockPermanentTransaction(this.sdk, params)\n }\n\n async votePayload(params: VoteParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildVoteTransaction(this.sdk, params)\n }\n\n // public fun claim_fees<T, B>(self: &mut Voter<T>, ve: &mut VotingEscrow<T>, mut locks: vector<Lock>, clock: &Clock, ctx: &mut TxContext) {\n async claimVotingRewardsPayload(params: ClaimVotingRewardsParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildClaimVotingRewardsTransaction(this.sdk, params)\n }\n\n // public fun claim_fees<T, B>(self: &mut Voter<T>, ve: &mut VotingEscrow<T>, mut locks: vector<Lock>, clock: &Clock, ctx: &mut TxContext) {\n async claimVotingRewardsPoolsPayload(params: ClaimVotingRewardsPoolsParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildClaimVotingRewardsPoolsTransaction(this.sdk, params)\n }\n\n async claimAndLockRebasesPayload(params: ClaimAndLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildClaimAndLockRebases(this.sdk, params)\n }\n\n async burnLockTransactionPayload(lockId: string): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildBurnLockTransaction(this.sdk, lockId)\n }\n\n async pokePayload(params: PokeParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildPoke(this.sdk, params)\n }\n\n async addBribeReward(params: AddBribeReward): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, params.coinType]\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const coinInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount), params.coinType, false, true)\n\n const args = [tx.object(voter_id), tx.object(params.poolId), coinInput.targetCoin, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::add_bribe_reward`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async claimVotingBribe(locks: string[], incentive_tokens: string[]): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildClaimVotingBribe(this.sdk, locks, incentive_tokens)\n }\n\n async claimVotingFeeAndBribeForPool(\n lockId: string,\n poolId: string,\n feeTokens: string[],\n incentiveTokens: string[]\n ): Promise<Transaction> {\n if (feeTokens.length !== 2) {\n throw Error('feeTokens length must be 2')\n }\n if (incentiveTokens.length < 1 || incentiveTokens.length > 3) {\n throw Error('incentiveTokens length must be between 1 and 3')\n }\n\n const { integrate, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...feeTokens, ...incentiveTokens]\n\n let targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes_for_single_pool${incentiveTokens.length}`\n if (incentiveTokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes_for_single_pool`\n }\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), tx.object(lockId), tx.object(poolId), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: targetFunc,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async fastLocksOfUser(user: string): Promise<LocksInfo> {\n const locksInfo: LocksInfo = { owner: user, lockInfo: [] }\n const { distribution, ve33 } = this._sdk.sdkOptions // getPackagerConfigs(this._sdk.sdkOptions.magma_config)\n const { magma_token } = getPackagerConfigs(ve33)\n\n // all objects\n const ownerRes = await this._sdk.fullClient.getOwnedObjectsByPage(user, {\n options: { showType: true, showContent: true, showDisplay: true, showOwner: true },\n filter: {\n MatchAll: [{ Package: distribution.package_id }, { StructType: `${distribution.package_id}::voting_escrow::Lock` }],\n },\n })\n\n for (const item of ownerRes.data as any[]) {\n try {\n const { fields } = item.data.content\n const aLockSummary = await this.aLockSummary(fields.id.id)\n const lockInfo: LockInfo = {\n lock_id: fields.id.id,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: aLockSummary.reward_distributor_claimable,\n },\n voting_power: aLockSummary.voting_power,\n voting_rewards: new Map<string, Coin[]>(),\n }\n\n locksInfo.lockInfo.push(lockInfo)\n } catch (error) {\n console.error('fastLocksOfUser error', error)\n }\n }\n return locksInfo\n }\n\n async locksOfUserV2(user: string): Promise<LocksInfo> {\n const locksInfo: LocksInfo = { owner: user, lockInfo: [] }\n const { distribution, ve33 } = this._sdk.sdkOptions // getPackagerConfigs(this._sdk.sdkOptions.magma_config)\n const { magma_token } = getPackagerConfigs(ve33)\n\n // all objects\n const ownerRes = await this._sdk.fullClient.getOwnedObjectsByPage(user, {\n options: { showType: true, showContent: true, showDisplay: true, showOwner: true },\n filter: {\n MatchAll: [{ Package: distribution.package_id }, { StructType: `${distribution.package_id}::voting_escrow::Lock` }],\n },\n })\n\n // const lockSummary = new Map<string, ALockSummary>()\n const ids = ownerRes.data.map((item) => item.data.content.id.id)\n const lockSummary = await this.getAllLockSummary(ids)\n const lockIncentiveTokens = await this.getAllBribeRewardTokensOfLock(ids) // all IncentiveTokens of LockId\n const lockFeeTokens = await this.getAllVotingFeeRewardTokens(ids) // all FeeTokens of LockId\n\n const poolIncentiveRewards = await this.getAllIncentiveRewards(lockIncentiveTokens)\n const poolFeeRewards = await this.getAllFeeRewards(lockFeeTokens)\n\n for (const item of ownerRes.data as any[]) {\n const { fields } = item.data.content\n const lock_id = fields.id.id\n\n // pool => coin...\n const votingRewards = new Map<string, Coin[]>() // pool => rewardTokens\n poolIncentiveRewards.get(lock_id)?.forEach((value, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push(...value)\n })\n poolFeeRewards.get(lock_id)?.forEach((value, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push(...value)\n })\n\n const lockInfo: LockInfo = {\n lock_id,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: lockSummary.get(lock_id)?.reward_distributor_claimable || '0',\n },\n voting_power: lockSummary.get(lock_id)?.voting_power || '0',\n // pool => incentive/fee => amount\n voting_rewards: votingRewards,\n }\n\n locksInfo.lockInfo.push(lockInfo)\n }\n return locksInfo\n }\n\n async locksOfUser(user: string): Promise<LocksInfo> {\n const locksInfo: LocksInfo = { owner: user, lockInfo: [] }\n const { distribution, ve33 } = this._sdk.sdkOptions // getPackagerConfigs(this._sdk.sdkOptions.magma_config)\n const { magma_token } = getPackagerConfigs(ve33)\n\n // all objects\n const ownerRes = await this._sdk.fullClient.getOwnedObjectsByPage(user, {\n options: { showType: true, showContent: true, showDisplay: true, showOwner: true },\n filter: {\n MatchAll: [{ Package: distribution.package_id }, { StructType: `${distribution.package_id}::voting_escrow::Lock` }],\n },\n })\n\n for (const item of ownerRes.data as any[]) {\n try {\n const { fields } = item.data.content\n\n const aLockSummary = await this.aLockSummary(fields.id.id)\n const poolIncentiveTokens = await this.getVotingBribeRewardTokens(fields.id.id)\n const poolFeeTokens = await this.getVotingFeeRewardTokens(fields.id.id)\n\n const incentiveTokens: string[] = []\n poolIncentiveTokens.forEach((value, key) => {\n incentiveTokens.push(...value)\n })\n\n const feeTokens: string[] = []\n poolFeeTokens.forEach((value, key) => {\n feeTokens.push(...value)\n })\n\n // coin => pool => amount\n const poolIncentiveRewards = await this.getPoolIncentiveRewards(fields.id.id, incentiveTokens)\n const votingRewards = new Map<string, Coin[]>() // pool => rewardTokens\n poolIncentiveRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Incentive,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const poolFeeRewards = await this.getPoolFeeRewards(fields.id.id, feeTokens)\n // const feeRewards = new Map<string, Coin[]>()\n poolFeeRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Fee,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const lockInfo: LockInfo = {\n lock_id: fields.id.id,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: aLockSummary.reward_distributor_claimable,\n },\n voting_power: aLockSummary.voting_power,\n // pool => incentive/fee => amount\n voting_rewards: votingRewards,\n }\n\n locksInfo.lockInfo.push(lockInfo)\n } catch (error) {\n console.error('locksOfUser error', error)\n }\n }\n return locksInfo\n }\n\n async aLockInfo(lockId: string): Promise<LockInfo> {\n const lockObj = await this._sdk.fullClient.getObject({\n id: lockId,\n options: {\n showContent: true,\n showDisplay: true,\n showOwner: true,\n showPreviousTransaction: true,\n showStorageRebate: true,\n showType: true,\n },\n })\n if (lockObj.error != null || lockObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPool error code: ${lockObj.error?.code ?? 'unknown error'}, please check config and object id`,\n LockErrorCode.InvalidLockObject\n )\n }\n\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const aLockSummary = await this.aLockSummary(lockId)\n const poolIncentiveTokens = await this.getVotingBribeRewardTokens(lockId)\n const poolFeeTokens = await this.getVotingFeeRewardTokens(lockId)\n\n const incentiveTokens: string[] = []\n poolIncentiveTokens.forEach((value, key) => {\n incentiveTokens.push(...value)\n })\n\n const feeTokens: string[] = []\n poolFeeTokens.forEach((value, key) => {\n feeTokens.push(...value)\n })\n\n const poolIncentiveRewards = await this.getPoolIncentiveRewards(lockId, incentiveTokens)\n const votingRewards = new Map<string, Coin[]>() // pool => rewardTokens\n poolIncentiveRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Incentive,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const poolFeeRewards = await this.getPoolFeeRewards(lockId, feeTokens)\n // const feeRewards = new Map<string, Coin[]>()\n poolFeeRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Fee,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const fields = getObjectFields(lockObj)\n\n const lockInfo: LockInfo = {\n lock_id: lockId,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: aLockSummary.reward_distributor_claimable,\n },\n voting_power: aLockSummary.voting_power,\n voting_rewards: votingRewards,\n }\n return lockInfo\n }\n\n async aLockSummary(lock_id: string): Promise<ALockSummary> {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id, reward_distributor_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(reward_distributor_id),\n tx.object(lock_id),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::lock_summary`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: ALockSummary = {\n // reward_distributor_claimable + incentive magma\n fee_incentive_total: '',\n // How much Magma can be claimed\n reward_distributor_claimable: '',\n\n voting_power: '',\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `LockSummary`) {\n res = {\n fee_incentive_total: item.parsedJson.fee_incentive_total,\n reward_distributor_claimable: item.parsedJson.reward_distributor_claimable,\n voting_power: item.parsedJson.voting_power,\n }\n }\n })\n return res\n }\n\n // Return: lock_id => ALockSummary\n async getAllLockSummary(lock_ids: string[]): Promise<Map<LockID, ALockSummary>> {\n let tx = new Transaction()\n for (const lock_id of lock_ids) {\n tx = await this._aLockSummary(lock_id, tx)\n }\n return this._parseLockSummary(tx)\n }\n\n async _aLockSummary(lock_id: string, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id, reward_distributor_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const args = [\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(reward_distributor_id),\n tx.object(lock_id),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::lock_summary`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseLockSummary(tx: Transaction): Promise<Map<LockID, ALockSummary>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n // const res: ALockSummary[] = []\n const res = new Map<LockID, ALockSummary>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `LockSummary`) {\n res.set(item.parsedJson.lock_id, {\n fee_incentive_total: item.parsedJson.fee_incentive_total,\n reward_distributor_claimable: item.parsedJson.reward_distributor_claimable,\n voting_power: item.parsedJson.voting_power,\n })\n }\n })\n return res\n }\n\n async allLockSummary(): Promise<AllLockSummary> {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id, minter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(minter_id), tx.object(voter_id), tx.object(voting_escrow_id), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::summary`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let summary: AllLockSummary = {\n current_epoch_end: 0,\n current_epoch_vote_end: 0,\n rebase_apr: 0,\n team_emission_rate: 0,\n total_locked: 0,\n total_voted_power: 0,\n total_voting_power: 0,\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `Summary`) {\n summary = {\n current_epoch_end: Number(item.parsedJson.current_epoch_end),\n current_epoch_vote_end: Number(item.parsedJson.current_epoch_vote_end),\n rebase_apr: Number(item.parsedJson.rebase_apr),\n team_emission_rate: Number(item.parsedJson.team_emission_rate),\n total_locked: Number(item.parsedJson.total_locked),\n total_voted_power: Number(item.parsedJson.total_voted_power),\n total_voting_power: Number(item.parsedJson.total_voting_power),\n }\n }\n })\n return summary\n }\n\n async poolWeights(pools: string[]): Promise<PoolWeight[]> {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const poolsParams = tx.pure.vector('id', pools)\n const args = [tx.object(voter_id), poolsParams]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::pools_tally`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolWeights: PoolWeight[] = []\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `PoolsTally`) {\n item.parsedJson.list.forEach((item: any) => {\n poolWeights.push({\n poolId: item.id,\n weight: item.weight,\n })\n })\n }\n })\n return poolWeights\n }\n\n async getAllVotingFeeRewardTokens(lock_ids: string[]): Promise<Map<LockID, string[]>> {\n let tx = new Transaction()\n for (const lock_id of lock_ids) {\n tx = await this._getVotingFeeRewardTokens(lock_id, tx)\n }\n return this._parseVotingFeeRewardTokens(tx)\n }\n\n async _getVotingFeeRewardTokens(lock_id: string, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_fee_reward_tokens`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseVotingFeeRewardTokens(tx: Transaction): Promise<Map<LockID, string[]>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolFeeRewardTokens = new Map<LockID, string[]>()\n // const poolRewardTokens: string[] = []\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `EventFeeRewardTokens`) {\n const { lock_id } = event.parsedJson\n if (!poolFeeRewardTokens.has(lock_id)) {\n poolFeeRewardTokens.set(lock_id, [])\n }\n\n event.parsedJson.list.contents.forEach((poolTokens: any) => {\n poolTokens.value.forEach((token: any) => {\n poolFeeRewardTokens.get(lock_id)?.push(token.name)\n })\n })\n }\n })\n return poolFeeRewardTokens\n }\n\n async getVotingFeeRewardTokens(lock_id: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_fee_reward_tokens`,\n arguments: args,\n typeArguments,\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolRewardTokens = new Map<string, string[]>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventFeeRewardTokens`) {\n item.parsedJson.list.contents.forEach((poolTokens: any) => {\n if (!poolRewardTokens.has(poolTokens.key)) {\n poolRewardTokens.set(poolTokens.key, [])\n }\n\n poolTokens.value.forEach((token: any) => {\n poolRewardTokens.get(poolTokens.key)?.push(token.name)\n })\n })\n }\n })\n return poolRewardTokens\n }\n\n // tokens\n async getAllBribeRewardTokensOfLock(lock_ids: string[]): Promise<Map<LockID, string[]>> {\n let tx = new Transaction()\n for (const lock_id of lock_ids) {\n tx = await this._getVotingBribeRewardTokens(lock_id, tx)\n }\n return this._parseVotingBribeRewardTokens(tx)\n }\n\n async _getVotingBribeRewardTokens(lock_id: string, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_bribe_reward_tokens`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseVotingBribeRewardTokens(tx: Transaction): Promise<Map<LockID, string[]>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBirbeRewardTokens = new Map<LockID, string[]>()\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `EventBribeRewardTokens`) {\n const { lock_id } = event.parsedJson\n if (!poolBirbeRewardTokens.has(lock_id)) {\n poolBirbeRewardTokens.set(lock_id, [])\n }\n\n event.parsedJson.list.contents.forEach((poolTokens: any) => {\n poolTokens.value.forEach((token: any) => {\n poolBirbeRewardTokens.get(lock_id)?.push(token.name)\n })\n })\n }\n })\n return poolBirbeRewardTokens\n }\n\n // Return PoolId => tokens\n async getVotingBribeRewardTokens(lock_id: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_bribe_reward_tokens`,\n arguments: args,\n typeArguments,\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBirbeRewardTokens = new Map<string, string[]>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventBribeRewardTokens`) {\n item.parsedJson.list.contents.forEach((poolTokens: any) => {\n if (!poolBirbeRewardTokens.has(poolTokens.key)) {\n poolBirbeRewardTokens.set(poolTokens.key, [])\n }\n\n poolTokens.value.forEach((token: any) => {\n poolBirbeRewardTokens.get(poolTokens.key)?.push(token.name)\n })\n })\n }\n })\n return poolBirbeRewardTokens\n }\n\n async getAllFeeRewards(fee_tokens: Map<LockID, string[]>): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n let tx = new Transaction()\n fee_tokens.forEach((tokens, lock_id) => {\n tx = this._getFeeRewards(lock_id, tokens, tx)\n })\n\n return await this._parseFeeRewards(tx)\n }\n\n _getFeeRewards(lock_id: string, fee_tokens: string[], tx: Transaction): Transaction {\n if (fee_tokens.length % 2 !== 0) {\n fee_tokens.push(fee_tokens[0])\n }\n\n for (let i = 0; i + 1 < fee_tokens.length; i += 2) {\n tx = this._getFeeRewardsInner(lock_id, fee_tokens[i], fee_tokens[i + 1], tx)\n }\n\n return tx\n }\n\n _getFeeRewardsInner(lock_id: LockID, token_a: string, token_b: string, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { integrate, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, token_a, token_b]\n\n const args = [tx.object(voter_id), tx.object(lock_id), tx.object(CLOCK_ADDRESS)]\n const targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_fee_rewards`\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseFeeRewards(tx: Transaction): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`getPoolIncentiveRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolFeeRewardTokens = new Map<LockID, Map<PoolID, Coin[]>>()\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `ClaimableVotingFee`) {\n const { lock_id } = event.parsedJson\n\n if (!poolFeeRewardTokens.has(lock_id)) {\n poolFeeRewardTokens.set(lock_id, new Map<PoolID, Coin[]>())\n }\n\n event.parsedJson.list.contents.forEach((rewardTokens: any) => {\n rewardTokens.value.contents.forEach((token: any) => {\n if (!poolFeeRewardTokens.get(lock_id)?.has(rewardTokens.key.name)) {\n poolFeeRewardTokens.get(lock_id)?.set(rewardTokens.key.name, [])\n }\n poolFeeRewardTokens.get(lock_id)?.get(rewardTokens.key.name)?.push({\n kind: CoinType.Incentive,\n token_addr: token.key,\n amount: token.value,\n })\n })\n })\n }\n })\n return poolFeeRewardTokens\n }\n\n async getPoolFeeRewards(lock_id: LockID, tokens: string[]) {\n const poolFeeRewardTokens = new Map<string, Map<string, string>>()\n\n if (tokens.length === 0) {\n return poolFeeRewardTokens\n }\n if (tokens.length % 2 !== 0) {\n tokens.push(tokens[0])\n }\n for (let i = 0; i + 1 < tokens.length; i += 2) {\n await this._getPoolFeeRewards(lock_id, tokens[i], tokens[i + 1], poolFeeRewardTokens)\n }\n return poolFeeRewardTokens\n }\n\n // if you have many tokens, call this function multi times\n async _getPoolFeeRewards(lock_id: string, token_a: string, token_b: string, poolFeeRewardTokens: Map<string, Map<string, string>>) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, token_a, token_b]\n\n const args = [tx.object(voter_id), tx.object(lock_id), tx.object(CLOCK_ADDRESS)]\n const targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_fee_rewards`\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n throw new Error(`getPoolFeeRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `ClaimableVotingFee`) {\n item.parsedJson.data.contents.forEach((rewardTokens: any) => {\n if (!poolFeeRewardTokens.has(rewardTokens.key.name)) {\n poolFeeRewardTokens.set(rewardTokens.key.name, new Map<string, string>())\n }\n\n rewardTokens.value.contents.forEach((token: any) => {\n poolFeeRewardTokens.get(rewardTokens.key.name)?.set(token.key, token.value)\n })\n })\n }\n })\n return poolFeeRewardTokens\n }\n\n // params: lock_id => incentive_tokens\n // lock_id => Pool => rewardTokens\n async getAllIncentiveRewards(lock_incentive_tokens: Map<LockID, string[]>): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n let tx = new Transaction()\n lock_incentive_tokens.forEach((tokens, lock_id) => {\n tx = this._getIncentiveRewards(lock_id, tokens, tx)\n })\n\n return await this._parseIncentiveRewards(tx)\n }\n\n _getIncentiveRewards(lock_id: string, incentive_tokens: string[], tx?: Transaction): Transaction {\n let i = 0\n for (; i + 3 < incentive_tokens.length; i += 3) {\n this._getIncentiveRewardsInner(lock_id, incentive_tokens.slice(i, i + 3), tx)\n }\n return this._getIncentiveRewardsInner(lock_id, incentive_tokens.slice(i), tx)\n }\n\n _getIncentiveRewardsInner(locksId: string, incentive_tokens: string[], tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n // tokenId => pool => incentive_tokens\n if (incentive_tokens.length > 3) {\n throw Error('Too many tokens')\n }\n\n // const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...incentive_tokens]\n\n const args = [tx.object(voter_id), tx.object(locksId), tx.object(CLOCK_ADDRESS)]\n let targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes_${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes`\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\n })\n\n return tx\n }\n\n async _parseIncentiveRewards(tx: Transaction): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`getPoolIncentiveRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBribeRewardTokens = new Map<LockID, Map<PoolID, Coin[]>>()\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `ClaimableVotingBribes`) {\n const { lock_id } = event.parsedJson\n\n if (!poolBribeRewardTokens.has(lock_id)) {\n poolBribeRewardTokens.set(lock_id, new Map<PoolID, Coin[]>())\n }\n\n event.parsedJson.list.contents.forEach((rewardTokens: any) => {\n rewardTokens.value.contents.forEach((token: any) => {\n if (!poolBribeRewardTokens.get(lock_id)?.has(rewardTokens.key.name)) {\n poolBribeRewardTokens.get(lock_id)?.set(rewardTokens.key.name, [])\n }\n poolBribeRewardTokens.get(lock_id)?.get(rewardTokens.key.name)?.push({\n kind: CoinType.Incentive,\n token_addr: token.key,\n amount: token.value,\n })\n })\n })\n }\n })\n return poolBribeRewardTokens\n }\n\n // coin => pool => amount\n async getPoolIncentiveRewards(lock_id: string, incentive_tokens: string[]) {\n const poolBribeRewardTokens = new Map<string, Map<string, string>>()\n if (incentive_tokens.length === 0) {\n return poolBribeRewardTokens\n }\n let i = 0\n for (; i + 3 < incentive_tokens.length; i += 3) {\n await this._getPoolIncentiveRewards(lock_id, incentive_tokens.slice(i, i + 3), poolBribeRewardTokens)\n }\n await this._getPoolIncentiveRewards(lock_id, incentive_tokens.slice(i), poolBribeRewardTokens)\n\n return poolBribeRewardTokens\n }\n\n // tokenId => pool => incentive_tokens\n async _getPoolIncentiveRewards(locksId: string, incentive_tokens: string[], poolBribeRewardTokens: Map<string, Map<string, string>>) {\n // tokenId => pool => incentive_tokens\n if (incentive_tokens.length > 3) {\n throw Error('Too many tokens')\n }\n\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...incentive_tokens]\n\n const args = [tx.object(voter_id), tx.object(locksId), tx.object(CLOCK_ADDRESS)]\n let targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes_${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes`\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\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 Error(`getPoolIncentiveRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `ClaimableVotingBribes`) {\n item.parsedJson.data.contents.forEach((rewardTokens: any) => {\n if (!poolBribeRewardTokens.has(rewardTokens.key.name)) {\n poolBribeRewardTokens.set(rewardTokens.key.name, new Map<string, string>())\n }\n\n rewardTokens.value.contents.forEach((token: any) => {\n poolBribeRewardTokens.get(rewardTokens.key.name)?.set(token.key, token.value)\n })\n })\n }\n })\n return poolBribeRewardTokens\n }\n\n async getPoolBribeRewardTokens(pool_id: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(voter_id), tx.object(pool_id)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_bribe_reward_tokens_by_pool`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`getPoolBribeRewardTokens error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBirbeRewardTokens = new Map<string, string[]>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventRewardTokens`) {\n item.parsedJson.list.contents.forEach((poolTokens: any) => {\n if (!poolBirbeRewardTokens.has(poolTokens.key)) {\n poolBirbeRewardTokens.set(poolTokens.key, [])\n }\n\n poolTokens.value.forEach((token: any) => {\n poolBirbeRewardTokens.get(poolTokens.key)?.push(token.name)\n })\n })\n }\n })\n return poolBirbeRewardTokens\n }\n\n async getLockVotingStats(lockId: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n\n const args = [tx.object(voter_id), tx.object(lockId), tx.object(CLOCK_ADDRESS)]\n const typeArguments = [magma_token]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::lock_voting_stats`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n console.log(`error code: ${simulateRes.error ?? 'unknown error'}`)\n return null\n }\n\n let res: LockVoteEvent = {\n lock_id: lockId,\n last_voted_at: '',\n pools: [],\n votes: [],\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventLockVotingStats`) {\n res = {\n lock_id: item.parsedJson.lock_id,\n last_voted_at: item.parsedJson.last_voted_at,\n pools: item.parsedJson.pools,\n votes: item.parsedJson.votes,\n }\n }\n })\n return res\n }\n}\n","import { Base64 } from 'js-base64'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { getPackagerConfigs, PoolInfo, TokenConfigEvent, TokenInfo } from '../types'\nimport { SuiResource, SuiAddressType } from '../types/sui'\nimport { CachedContent, cacheTime24h, cacheTime5min, getFutureTime } from '../utils/cachedContent'\nimport { extractStructTagFromType, normalizeCoinType } from '../utils/contracts'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport { checkInvalidSuiAddress } from '../utils'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\n\n/**\n * Helper class to help interact with pool and token config\n * @deprecated TokenModule is no longer maintained. Please use ConfigModule instead\n */\nexport class TokenModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Get all registered token list.\n * @param forceRefresh\n * @returns\n */\n async getAllRegisteredTokenList(forceRefresh = false): Promise<TokenInfo[]> {\n const list = await this.factchTokenList('', forceRefresh)\n return list\n }\n\n /**\n * Get token list by owner address.\n * @param listOwnerAddr\n * @param forceRefresh\n * @returns\n */\n async getOwnerTokenList(listOwnerAddr = '', forceRefresh = false): Promise<TokenInfo[]> {\n const list = await this.factchTokenList(listOwnerAddr, forceRefresh)\n return list\n }\n\n /**\n * Get all registered pool list\n * @param forceRefresh\n * @returns\n */\n async getAllRegisteredPoolList(forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchPoolList('', forceRefresh)\n return list\n }\n\n /**\n * Get pool list by owner address.\n * @param listOwnerAddr\n * @param forceRefresh\n * @returns\n */\n async getOwnerPoolList(listOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchPoolList(listOwnerAddr, forceRefresh)\n return list\n }\n\n /**\n * Get warp pool list.\n * @param forceRefresh\n * @returns\n */\n async getWarpPoolList(forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchWarpPoolList('', '', forceRefresh)\n return list\n }\n\n /**\n * Get warp pool list by pool owner address and coin owner address.\n * @param poolOwnerAddr\n * @param coinOwnerAddr\n * @param forceRefresh\n * @returns\n */\n async getOwnerWarpPoolList(poolOwnerAddr = '', coinOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchWarpPoolList(poolOwnerAddr, coinOwnerAddr, forceRefresh)\n return list\n }\n\n /**\n * Get token list by coin types.\n * @param coinTypes\n * @returns\n */\n async getTokenListByCoinTypes(coinTypes: SuiAddressType[]): Promise<Record<string, TokenInfo>> {\n const tokenMap: Record<string, TokenInfo> = {}\n const cacheKey = `getAllRegisteredTokenList`\n const cacheData = this.getCache<TokenInfo[]>(cacheKey)\n\n if (cacheData !== undefined) {\n const tokenList = cacheData\n for (const coinType of coinTypes) {\n for (const token of tokenList) {\n if (normalizeCoinType(coinType) === normalizeCoinType(token.address)) {\n tokenMap[coinType] = token\n continue\n }\n }\n }\n }\n\n const unFindArray = coinTypes.filter((coinType: string) => {\n return tokenMap[coinType] === undefined\n })\n\n for (const coinType of unFindArray) {\n const metadataKey = `${coinType}_metadata`\n const metadata = this.getCache<TokenInfo>(metadataKey)\n if (metadata !== undefined) {\n tokenMap[coinType] = metadata as TokenInfo\n } else {\n const data = await this._sdk.fullClient.getCoinMetadata({\n coinType,\n })\n if (data) {\n const token = {\n id: data.id,\n name: data.name,\n symbol: data.symbol,\n official_symbol: data.symbol,\n coingecko_id: '',\n decimals: data.decimals,\n project_url: '',\n logo_url: data.iconUrl as string,\n address: coinType,\n }\n tokenMap[coinType] = token\n\n this.updateCache(metadataKey, token, cacheTime24h)\n }\n }\n }\n\n return tokenMap\n }\n\n private async factchTokenList(listOwnerAddr = '', forceRefresh = false): Promise<TokenInfo[]> {\n const { simulationAccount, token } = this.sdk.sdkOptions\n\n const cacheKey = `getAllRegisteredTokenList`\n const cacheData = this.getCache<TokenInfo[]>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const isOwnerRequest = listOwnerAddr.length > 0\n const limit = 512\n let index = 0\n let allTokenList: TokenInfo[] = []\n\n if (token === undefined) {\n throw Error('please config token ofsdkOptions')\n }\n const tokenConfig = getPackagerConfigs(token)\n while (true) {\n const tx = new Transaction()\n tx.moveCall({\n target: `${token.published_at}::coin_list::${\n isOwnerRequest ? 'fetch_full_list_with_limit' : 'fetch_all_registered_coin_info_with_limit'\n }`,\n arguments: isOwnerRequest\n ? [tx.pure.address(tokenConfig.coin_registry_id), tx.pure.address(listOwnerAddr), tx.pure.u64(index), tx.pure.u64(limit)]\n : [tx.pure.address(tokenConfig.coin_registry_id), tx.pure.u64(index), tx.pure.u64(limit)],\n })\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const tokenList: TokenInfo[] = []\n\n simulateRes.events?.forEach((item: any) => {\n const formatType = extractStructTagFromType(item.type)\n if (formatType.full_address === `${token.published_at}::coin_list::FetchCoinListEvent`) {\n item.parsedJson.full_list.value_list.forEach((item: any) => {\n tokenList.push(this.transformData(item, false))\n })\n }\n })\n allTokenList = [...allTokenList, ...tokenList]\n if (tokenList.length < limit) {\n break\n } else {\n index = allTokenList.length\n }\n }\n\n return allTokenList\n }\n\n private async factchPoolList(listOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n const { simulationAccount, token } = this.sdk.sdkOptions\n const cacheKey = `getAllRegisteredPoolList`\n const cacheData = this.getCache<PoolInfo[]>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n let allPoolList: PoolInfo[] = []\n const limit = 512\n let index = 0\n const isOwnerRequest = listOwnerAddr.length > 0\n\n if (token === undefined) {\n throw Error('please config token ofsdkOptions')\n }\n const tokenConfig = getPackagerConfigs(token)\n while (true) {\n const tx = new Transaction()\n tx.moveCall({\n target: `${token.published_at}::lp_list::${\n isOwnerRequest ? 'fetch_full_list_with_limit' : 'fetch_all_registered_coin_info_with_limit'\n }`,\n arguments: isOwnerRequest\n ? [tx.pure.address(tokenConfig.pool_registry_id), tx.pure.address(listOwnerAddr), tx.pure.u64(index), tx.pure.u64(limit)]\n : [tx.pure.address(tokenConfig.pool_registry_id), tx.pure.u64(index), tx.pure.u64(limit)],\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const poolList: PoolInfo[] = []\n simulateRes.events?.forEach((item: any) => {\n const formatType = extractStructTagFromType(item.type)\n if (formatType.full_address === `${token.published_at}::lp_list::FetchPoolListEvent`) {\n item.parsedJson.full_list.value_list.forEach((item: any) => {\n poolList.push(this.transformData(item, true))\n })\n }\n })\n\n allPoolList = [...allPoolList, ...poolList]\n if (poolList.length < limit) {\n break\n } else {\n index = allPoolList.length\n }\n }\n\n return allPoolList\n }\n\n private async factchWarpPoolList(poolOwnerAddr = '', coinOwnerAddr = '', forceRefresh = false): Promise<any[]> {\n const poolList = await this.factchPoolList(poolOwnerAddr, forceRefresh)\n if (poolList.length === 0) {\n return []\n }\n const tokenList = await this.factchTokenList(coinOwnerAddr, forceRefresh)\n\n const lpPoolArray: any[] = []\n for (const pool of poolList) {\n for (const token of tokenList) {\n if (token.address === pool.coin_a_address) {\n pool.coinA = token\n }\n if (token.address === pool.coin_b_address) {\n pool.coinB = token\n }\n continue\n }\n lpPoolArray.push(pool)\n }\n return lpPoolArray\n }\n\n /**\n * Get the token config event.\n *\n * @param forceRefresh Whether to force a refresh of the event.\n * @returns The token config event.\n */\n async getTokenConfigEvent(forceRefresh = false): Promise<TokenConfigEvent> {\n const packageObjectId = this._sdk.sdkOptions.token!.package_id\n const cacheKey = `${packageObjectId}_getTokenConfigEvent`\n\n const cacheData = this.getCache<TokenConfigEvent>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const packageObject = await this._sdk.fullClient.getObject({\n id: packageObjectId,\n options: {\n showPreviousTransaction: true,\n },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n const objects = await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })\n const tokenConfigEvent: TokenConfigEvent = {\n coin_registry_id: '',\n pool_registry_id: '',\n coin_list_owner: '',\n pool_list_owner: '',\n }\n\n if (objects.data.length > 0) {\n objects.data.forEach((item: any) => {\n const formatType = extractStructTagFromType(item.type)\n if (item.transactionModule === 'coin_list') {\n switch (formatType.name) {\n case `InitListEvent`:\n tokenConfigEvent.coin_list_owner = item.parsedJson.list_id\n break\n case `InitRegistryEvent`:\n tokenConfigEvent.coin_registry_id = item.parsedJson.registry_id\n break\n default:\n break\n }\n } else if (item.transactionModule === 'lp_list') {\n switch (formatType.name) {\n case `InitListEvent<address>`:\n tokenConfigEvent.pool_list_owner = item.parsedJson.list_id\n break\n case `InitRegistryEvent<address>`:\n tokenConfigEvent.pool_registry_id = item.parsedJson.registry_id\n break\n default:\n break\n }\n }\n })\n }\n if (tokenConfigEvent.coin_registry_id.length > 0) {\n this.updateCache(cacheKey, tokenConfigEvent, cacheTime24h)\n }\n return tokenConfigEvent\n }\n\n private transformData(item: any, isPoolData: boolean): any {\n const token = { ...item }\n if (isPoolData) {\n try {\n token.coin_a_address = extractStructTagFromType(token.coin_a_address).full_address\n token.coin_b_address = extractStructTagFromType(token.coin_b_address).full_address\n } catch (error) {\n //\n }\n } else {\n token.address = extractStructTagFromType(token.address).full_address\n }\n if (item.extensions) {\n const extensionsDataArray = item.extensions.contents\n\n for (const item of extensionsDataArray) {\n const { key } = item\n let { value } = item\n if (key === 'labels') {\n try {\n value = JSON.parse(decodeURIComponent(Base64.decode(value)))\n } catch (error) {}\n }\n if (key === 'pyth_id') {\n value = normalizeSuiObjectId(value)\n }\n token[key] = value\n }\n delete token.extensions\n }\n return token\n }\n\n /**\n * Updates the cache for the given key.\n *\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n *\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { v4 as uuidv4 } from 'uuid'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { PreSwapLpChangeParams, PreSwapWithMultiPoolParams } from '../types'\nimport { TickMath, ZERO } from '../math'\nimport axios, { AxiosRequestConfig } from 'axios'\nimport { ClmmpoolsError, MathErrorCode, RouterErrorCode } from '../errors/errors'\n\nexport type BasePath = {\n direction: boolean\n label: string\n poolAddress: string\n fromCoin: string\n toCoin: string\n feeRate: number\n outputAmount: number\n inputAmount: number\n currentSqrtPrice: BN\n fromDecimal: number\n toDecimal: number\n currentPrice: Decimal\n}\n\nexport type SplitPath = {\n percent: number\n inputAmount: number\n outputAmount: number\n pathIndex: number\n lastQuoteOutput: number\n basePaths: BasePath[]\n}\n\nexport type AggregatorResult = {\n isExceed: boolean\n isTimeout: boolean\n inputAmount: number\n outputAmount: number\n fromCoin: string\n toCoin: string\n byAmountIn: boolean\n splitPaths: SplitPath[]\n}\n\nexport class RouterModuleV2 implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n private calculatePrice(currentSqrtPrice: BN, fromDecimals: number, toDecimals: number, a2b: boolean, label: string): Decimal {\n const decimalA = a2b ? fromDecimals : toDecimals\n const decimalB = a2b ? toDecimals : fromDecimals\n if (label === 'Magma') {\n return TickMath.sqrtPriceX64ToPrice(currentSqrtPrice, decimalA, decimalB)\n }\n\n return new Decimal(currentSqrtPrice.toString()).div(new Decimal(10).pow(new Decimal(decimalB + 9 - decimalA)))\n }\n\n private parseJsonResult(data: any): AggregatorResult {\n const result: AggregatorResult = {\n isExceed: data.is_exceed,\n isTimeout: data.is_timeout,\n inputAmount: data.input_amount,\n outputAmount: data.output_amount,\n fromCoin: data.from_coin,\n toCoin: data.to_coin,\n byAmountIn: data.by_amount_in,\n splitPaths: data.split_paths.map((path: any) => {\n const splitPath: SplitPath = {\n pathIndex: path.path_index,\n lastQuoteOutput: path.last_quote_output,\n percent: path.percent,\n basePaths: path.best_path.map((basePath: any) => {\n return {\n direction: basePath.direction,\n label: basePath.label,\n poolAddress: basePath.provider,\n fromCoin: basePath.from_coin,\n toCoin: basePath.to_coin,\n outputAmount: basePath.output_amount,\n inputAmount: basePath.input_amount,\n feeRate: basePath.fee_rate,\n currentSqrtPrice: new BN(basePath.current_sqrt_price.toString()),\n afterSqrtPrice: basePath.label === 'Magma' ? new BN(basePath.after_sqrt_price.toString()) : ZERO,\n fromDecimal: basePath.from_decimal,\n toDecimal: basePath.to_decimal,\n currentPrice: this.calculatePrice(\n new BN(basePath.current_sqrt_price.toString()),\n basePath.from_decimal,\n basePath.to_decimal,\n basePath.direction,\n basePath.label\n ),\n }\n }),\n inputAmount: path.input_amount,\n outputAmount: path.output_amount,\n }\n return splitPath\n }),\n }\n return result\n }\n\n async fetchDataWithAxios(apiUrl: string, _options: AxiosRequestConfig, timeoutDuration: number) {\n try {\n const config: AxiosRequestConfig = {\n ..._options,\n timeout: timeoutDuration,\n }\n\n const response = await axios(apiUrl, config)\n\n if (response.status === 200) {\n return this.parseJsonResult(response.data)\n }\n\n return null\n } catch (error) {\n console.error(error)\n return null\n }\n }\n\n /**\n * Optimal routing method with fallback functionality.\n * This method first attempts to find the optimal route using the routing backend. If the optimal route is available, it will return this route.\n * If the optimal route is not available (for example, due to network issues or API errors), this method will activate a fallback mechanism,\n * and try to find a suboptimal route using the routing algorithm built into the SDK, which only includes clmm pool. This way, even if the optimal route is not available, this method can still provide a usable route.\n * This method uses a fallback strategy to ensure that it can provide the best available route when facing problems, rather than failing completely.\n *\n * @param {string} from Sold `from` coin\n * @param {string} from: get `to` coin\n * @param {number} from: the amount of sold coin\n * @param {boolena} byAmountIn:\n */\n async getBestRouter(\n from: string,\n to: string,\n amount: number,\n byAmountIn: boolean,\n priceSplitPoint: number,\n partner: string,\n /**\n * @deprecated don't need to pass, just use empty string.\n */\n _senderAddress?: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams,\n orderSplit = false,\n externalRouter = false,\n lpChanges: PreSwapLpChangeParams[] = []\n ) {\n let result = null\n let version = 'v2'\n let options: AxiosRequestConfig = {}\n let apiUrl = this.sdk.sdkOptions.aggregatorUrl\n if (lpChanges.length > 0) {\n const url = new URL(apiUrl)\n apiUrl = `${url.protocol}//${url.hostname}/router_with_lp_changes`\n options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n data: JSON.stringify({\n from,\n to,\n amount,\n by_amount_in: byAmountIn,\n order_split: orderSplit,\n external_router: externalRouter,\n sender_address: 'None',\n request_id: encodeURIComponent(uuidv4()),\n lp_changes: lpChanges,\n }),\n }\n } else {\n apiUrl = `\n ${apiUrl}?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}&amount=${encodeURIComponent(\n amount\n )}&by_amount_in=${encodeURIComponent(byAmountIn)}&order_split=${encodeURIComponent(orderSplit)}&external_router=${encodeURIComponent(\n externalRouter\n )}&sender_address=''&request_id=${encodeURIComponent(uuidv4())}\n `\n }\n\n result = await this.fetchDataWithAxios(apiUrl, options, 6000)\n\n if (result == null) {\n const priceResult: any = await this.sdk.Router.priceUseV1(\n from,\n to,\n new BN(amount),\n byAmountIn,\n priceSplitPoint,\n partner,\n swapWithMultiPoolParams\n )\n\n const splitPaths: SplitPath[] = []\n\n for (const path of priceResult.paths) {\n const basePaths: BasePath[] = []\n if (path.poolAddress.length > 1) {\n const fromDecimal0 = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal0 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal0, toDecimal0)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal0, fromDecimal0)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal: fromDecimal0,\n toDecimal: toDecimal0,\n }\n\n const fromDecimal1 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const toDecimal1 = this.sdk.Router.tokenInfo(path.coinType[2])!.decimals\n const currentPrice1 = path.a2b[1]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), fromDecimal1, toDecimal1)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), toDecimal1, fromDecimal1)\n\n const path1: BasePath = {\n direction: path.a2b[1],\n label: 'Magma',\n poolAddress: path.poolAddress[1],\n fromCoin: path.coinType[1],\n toCoin: path.coinType[2],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[1], path.coinType[2], path.poolAddress[1]),\n outputAmount: path.amountOut.toString(),\n inputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[1],\n currentPrice: currentPrice1,\n fromDecimal: fromDecimal1,\n toDecimal: toDecimal1,\n }\n\n basePaths.push(path0, path1)\n } else {\n const fromDecimal = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal, toDecimal)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal, fromDecimal)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: path.amountOut.toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal,\n toDecimal,\n }\n basePaths.push(path0)\n }\n const splitPath: SplitPath = {\n percent: (Number(path.amountIn) / Number(priceResult.amountIn)) * 100,\n inputAmount: Number(path.amountIn.toString()),\n outputAmount: Number(path.amountOut.toString()),\n pathIndex: 0,\n lastQuoteOutput: 0,\n basePaths,\n }\n splitPaths.push(splitPath)\n }\n\n const aggregatorResult: AggregatorResult = {\n isExceed: priceResult.isExceed,\n isTimeout: true,\n inputAmount: Number(priceResult.amountIn.toString()),\n outputAmount: Number(priceResult.amountOut.toString()),\n fromCoin: priceResult.coinTypeA,\n toCoin: priceResult.coinTypeC != null ? priceResult.coinTypeC : priceResult.coinTypeB,\n byAmountIn: priceResult.byAmountIn,\n splitPaths,\n }\n version = 'v1'\n result = aggregatorResult\n }\n\n return { result, version }\n }\n\n async getBestRouterByServer(\n from: string,\n to: string,\n amount: number,\n byAmountIn: boolean,\n /**\n * @deprecated don't need to pass, just use empty string.\n */\n _senderAddress?: string,\n orderSplit = false,\n externalRouter = false,\n lpChanges: PreSwapLpChangeParams[] = []\n ): Promise<AggregatorResult> {\n let result = null\n let options: AxiosRequestConfig = {}\n let apiUrl = this.sdk.sdkOptions.aggregatorUrl\n if (lpChanges.length > 0) {\n const url = new URL(apiUrl)\n apiUrl = `${url.protocol}//${url.hostname}/router_with_lp_changes`\n options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n data: JSON.stringify({\n from,\n to,\n amount,\n by_amount_in: byAmountIn,\n order_split: orderSplit,\n external_router: externalRouter,\n sender_address: 'None',\n request_id: encodeURIComponent(uuidv4()),\n lp_changes: lpChanges,\n }),\n }\n } else {\n apiUrl = `\n ${apiUrl}?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}&amount=${encodeURIComponent(\n amount\n )}&by_amount_in=${encodeURIComponent(byAmountIn)}&order_split=${encodeURIComponent(orderSplit)}&external_router=${encodeURIComponent(\n externalRouter\n )}&sender_address=''&request_id=${encodeURIComponent(uuidv4())}\n `\n }\n\n result = await this.fetchDataWithAxios(apiUrl, options, 6000)\n\n if (result == null) {\n throw new ClmmpoolsError('Invalid server response', RouterErrorCode.InvalidServerResponse)\n }\n\n return result\n }\n\n async getBestRouterByRpc(\n from: string,\n to: string,\n amount: number,\n byAmountIn: boolean,\n priceSplitPoint: number,\n partner: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n ): Promise<AggregatorResult> {\n const priceResult: any = await this.sdk.Router.priceUseV1(\n from,\n to,\n new BN(amount),\n byAmountIn,\n priceSplitPoint,\n partner,\n swapWithMultiPoolParams\n )\n\n const splitPaths: SplitPath[] = []\n\n for (const path of priceResult.paths) {\n const basePaths: BasePath[] = []\n if (path.poolAddress.length > 1) {\n const fromDecimal0 = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal0 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal0, toDecimal0)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal0, fromDecimal0)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal: fromDecimal0,\n toDecimal: toDecimal0,\n }\n\n const fromDecimal1 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const toDecimal1 = this.sdk.Router.tokenInfo(path.coinType[2])!.decimals\n const currentPrice1 = path.a2b[1]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), fromDecimal1, toDecimal1)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), toDecimal1, fromDecimal1)\n\n const path1: BasePath = {\n direction: path.a2b[1],\n label: 'Magma',\n poolAddress: path.poolAddress[1],\n fromCoin: path.coinType[1],\n toCoin: path.coinType[2],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[1], path.coinType[2], path.poolAddress[1]),\n outputAmount: path.amountOut.toString(),\n inputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[1],\n currentPrice: currentPrice1,\n fromDecimal: fromDecimal1,\n toDecimal: toDecimal1,\n }\n\n basePaths.push(path0, path1)\n } else {\n const fromDecimal = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal, toDecimal)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal, fromDecimal)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: path.amountOut.toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal,\n toDecimal,\n }\n basePaths.push(path0)\n }\n const splitPath: SplitPath = {\n percent: (Number(path.amountIn) / Number(priceResult.amountIn)) * 100,\n inputAmount: Number(path.amountIn.toString()),\n outputAmount: Number(path.amountOut.toString()),\n pathIndex: 0,\n lastQuoteOutput: 0,\n basePaths,\n }\n splitPaths.push(splitPath)\n }\n\n const aggregatorResult: AggregatorResult = {\n isExceed: priceResult.isExceed,\n isTimeout: true,\n inputAmount: Number(priceResult.amountIn.toString()),\n outputAmount: Number(priceResult.amountOut.toString()),\n fromCoin: priceResult.coinTypeA,\n toCoin: priceResult.coinTypeC != null ? priceResult.coinTypeC : priceResult.coinTypeB,\n byAmountIn: priceResult.byAmountIn,\n splitPaths,\n }\n\n return aggregatorResult\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui/client'\nimport { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { Base64 } from 'js-base64'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\nimport { IModule } from '../interfaces/IModule'\nimport { MagmaClmmSDK } from '../sdk'\nimport { MagmaConfigs, ClmmPoolConfig, CoinConfig, LaunchpadPoolConfig, getPackagerConfigs } from '../types'\nimport { SuiAddressType, SuiResource } from '../types/sui'\nimport { CachedContent, cacheTime24h, cacheTime5min, getFutureTime } from '../utils/cachedContent'\nimport { extractStructTagFromType, fixCoinType, normalizeCoinType } from '../utils/contracts'\nimport { getObjectFields, getObjectId, getObjectPreviousTransactionDigest, getObjectType } from '../utils/objects'\n\n/**\n * Helper class to help interact with clmm pool and coin and launchpad pool config.\n */\nexport class ConfigModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Set default token list cache.\n * @param {CoinConfig[]}coinList\n */\n setTokenListCache(coinList: CoinConfig[]) {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n const updatedCacheData = cacheData ? [...cacheData, ...coinList] : coinList\n this.updateCache(cacheKey, updatedCacheData, cacheTime24h)\n }\n\n /**\n * Get token config list by coin type list.\n * @param {SuiAddressType[]} coinTypes Coin type list.\n * @returns {Promise<Record<string, CoinConfig>>} Token config map.\n */\n async getTokenListByCoinTypes(coinTypes: SuiAddressType[]): Promise<Record<string, CoinConfig>> {\n const tokenMap: Record<string, CoinConfig> = {}\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n\n if (cacheData !== undefined) {\n const tokenList = cacheData\n for (const coinType of coinTypes) {\n for (const token of tokenList) {\n if (normalizeCoinType(coinType) === normalizeCoinType(token.address)) {\n tokenMap[coinType] = token\n continue\n }\n }\n }\n }\n\n const unFoundArray = coinTypes.filter((coinType: string) => {\n return tokenMap[coinType] === undefined\n })\n\n for (const coinType of unFoundArray) {\n const metadataKey = `${coinType}_metadata`\n const metadata = this.getCache<CoinConfig>(metadataKey)\n if (metadata !== undefined) {\n tokenMap[coinType] = metadata as CoinConfig\n } else {\n const data = await this._sdk.fullClient.getCoinMetadata({\n coinType,\n })\n if (data) {\n const token: CoinConfig = {\n id: data.id as string,\n pyth_id: '',\n name: data.name,\n symbol: data.symbol,\n official_symbol: data.symbol,\n coingecko_id: '',\n decimals: data.decimals,\n project_url: '',\n logo_url: data.iconUrl as string,\n address: coinType,\n }\n tokenMap[coinType] = token\n\n this.updateCache(metadataKey, token, cacheTime24h)\n } else {\n console.log(`not found ${coinType}`)\n }\n }\n }\n\n return tokenMap\n }\n\n /**\n * Get coin config list.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n * @param {boolean} transformExtensions Whether to transform extensions.\n * @returns {Promise<CoinConfig[]>} Coin config list.\n */\n async getCoinConfigs(forceRefresh = false, transformExtensions = true): Promise<CoinConfig[]> {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.fullClient.getDynamicFieldsByPage(coin_list_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n const coinList: CoinConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const coin = this.buildCoinConfig(object, transformExtensions)\n this.updateCache(`${coin_list_handle}_${coin.address}_getCoinConfig`, coin, cacheTime24h)\n coinList.push({ ...coin })\n })\n this.updateCache(cacheKey, coinList, cacheTime24h)\n return coinList\n }\n\n /**\n * Get coin config by coin type.\n * @param {string} coinType Coin type.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n * @param {boolean} transformExtensions Whether to transform extensions.\n * @returns {Promise<CoinConfig>} Coin config.\n */\n async getCoinConfig(coinType: string, forceRefresh = false, transformExtensions = true): Promise<CoinConfig> {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_${coinType}_getCoinConfig`\n const cacheData = this.getCache<CoinConfig>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: coin_list_handle,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: fixCoinType(coinType),\n },\n },\n })\n\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getCoinConfig get object error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const coin = this.buildCoinConfig(object, transformExtensions)\n this.updateCache(cacheKey, coin, cacheTime24h)\n return coin\n }\n\n /**\n * Build coin config.\n * @param {SuiObjectResponse} object Coin object.\n * @param {boolean} transformExtensions Whether to transform extensions.\n * @returns {CoinConfig} Coin config.\n */\n private buildCoinConfig(object: SuiObjectResponse, transformExtensions = true) {\n let fields = getObjectFields(object)\n\n fields = fields.value.fields\n const coin: any = { ...fields }\n\n coin.id = getObjectId(object)\n coin.address = extractStructTagFromType(fields.coin_type.fields.name).full_address\n if (fields.pyth_id) {\n coin.pyth_id = normalizeSuiObjectId(fields.pyth_id)\n }\n\n this.transformExtensions(coin, fields.extension_fields.fields.contents, transformExtensions)\n\n delete coin.coin_type\n return coin\n }\n\n /**\n * Get clmm pool config list.\n * @param forceRefresh\n * @returns\n */\n async getClmmPoolConfigs(forceRefresh = false, transformExtensions = true): Promise<ClmmPoolConfig[]> {\n const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${clmm_pools_handle}_getClmmPoolConfigs`\n const cacheData = this.getCache<ClmmPoolConfig[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.fullClient.getDynamicFieldsByPage(clmm_pools_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n const poolList: ClmmPoolConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getClmmPoolsConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const pool = this.buildClmmPoolConfig(object, transformExtensions)\n this.updateCache(`${pool.pool_address}_getClmmPoolConfig`, pool, cacheTime24h)\n poolList.push({ ...pool })\n })\n this.updateCache(cacheKey, poolList, cacheTime24h)\n return poolList\n }\n\n async getClmmPoolConfig(poolAddress: string, forceRefresh = false, transformExtensions = true): Promise<ClmmPoolConfig> {\n const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${poolAddress}_getClmmPoolConfig`\n const cacheData = this.getCache<ClmmPoolConfig>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: clmm_pools_handle,\n name: {\n type: 'address',\n value: poolAddress,\n },\n })\n const pool = this.buildClmmPoolConfig(object, transformExtensions)\n this.updateCache(cacheKey, pool, cacheTime24h)\n return pool\n }\n\n private buildClmmPoolConfig(object: SuiObjectResponse, transformExtensions = true) {\n let fields = getObjectFields(object)\n fields = fields.value.fields\n const pool: any = { ...fields }\n\n pool.id = getObjectId(object)\n pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n this.transformExtensions(pool, fields.extension_fields.fields.contents, transformExtensions)\n return pool\n }\n\n /**\n * Get launchpad pool config list.\n * @param forceRefresh\n * @returns\n */\n async getLaunchpadPoolConfigs(forceRefresh = false, transformExtensions = true): Promise<LaunchpadPoolConfig[]> {\n const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${launchpad_pools_handle}_getLaunchpadPoolConfigs`\n const cacheData = this.getCache<LaunchpadPoolConfig[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.fullClient.getDynamicFieldsByPage(launchpad_pools_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n const poolList: LaunchpadPoolConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const pool = this.buildLaunchpadPoolConfig(object, transformExtensions)\n this.updateCache(`${pool.pool_address}_getLaunchpadPoolConfig`, pool, cacheTime24h)\n poolList.push({ ...pool })\n })\n this.updateCache(cacheKey, poolList, cacheTime24h)\n return poolList\n }\n\n async getLaunchpadPoolConfig(poolAddress: string, forceRefresh = false, transformExtensions = true): Promise<LaunchpadPoolConfig> {\n const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${poolAddress}_getLaunchpadPoolConfig`\n const cacheData = this.getCache<LaunchpadPoolConfig>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: launchpad_pools_handle,\n name: {\n type: 'address',\n value: poolAddress,\n },\n })\n const pool = this.buildLaunchpadPoolConfig(object, transformExtensions)\n this.updateCache(cacheKey, pool, cacheTime24h)\n return pool\n }\n\n private buildLaunchpadPoolConfig(object: SuiObjectResponse, transformExtensions = true) {\n let fields = getObjectFields(object)\n fields = fields.value.fields\n const pool: any = { ...fields }\n\n pool.id = getObjectId(object)\n pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n this.transformExtensions(pool, fields.extension_fields.fields.contents, transformExtensions)\n const social_medias: {\n name: string\n link: string\n }[] = []\n fields.social_media.fields.contents.forEach((item: any) => {\n social_medias.push({\n name: item.fields.value.fields.name,\n link: item.fields.value.fields.link,\n })\n })\n pool.social_media = social_medias\n try {\n pool.regulation = decodeURIComponent(Base64.decode(pool.regulation).replace(/%/g, '%25'))\n } catch (error) {\n pool.regulation = Base64.decode(pool.regulation)\n }\n\n return pool\n }\n\n private transformExtensions(coin: any, dataArray: any[], transformExtensions = true) {\n const extensions: any[] = []\n for (const item of dataArray) {\n const { key } = item.fields\n let { value } = item.fields\n if (key === 'labels') {\n try {\n const decodedValue = decodeURIComponent(Base64.decode(value))\n try {\n value = JSON.parse(decodedValue)\n } catch {\n value = decodedValue\n }\n } catch (error) {}\n }\n if (transformExtensions) {\n coin[key] = value\n }\n extensions.push({\n key,\n value,\n })\n }\n delete coin.extension_fields\n\n if (!transformExtensions) {\n coin.extensions = extensions\n }\n }\n\n /**\n * Get the token config event.\n *\n * @param forceRefresh Whether to force a refresh of the event.\n * @returns The token config event.\n */\n async getMagmaConfig(forceRefresh = false): Promise<MagmaConfigs> {\n const packageObjectId = this._sdk.sdkOptions.magma_config.package_id\n const cacheKey = `${packageObjectId}_getMagmaConfig`\n\n const cacheData = this.getCache<MagmaConfigs>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const packageObject = await this._sdk.fullClient.getObject({\n id: packageObjectId,\n options: {\n showPreviousTransaction: true,\n },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n const objects = await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })\n let tokenConfig: MagmaConfigs = {\n coin_list_id: '',\n launchpad_pools_id: '',\n clmm_pools_id: '',\n admin_cap_id: '',\n coin_list_handle: '',\n launchpad_pools_handle: '',\n clmm_pools_handle: '',\n }\n\n if (objects.data.length > 0) {\n for (const item of objects.data) {\n const formatType = extractStructTagFromType(item.type)\n switch (formatType.name) {\n case `InitCoinListEvent`:\n tokenConfig.coin_list_id = item.parsedJson.coin_list_id\n break\n case `InitLaunchpadPoolsEvent`:\n tokenConfig.launchpad_pools_id = item.parsedJson.launchpad_pools_id\n break\n case `InitClmmPoolsEvent`:\n tokenConfig.clmm_pools_id = item.parsedJson.pools_id\n break\n case `InitConfigEvent`:\n tokenConfig.admin_cap_id = item.parsedJson.admin_cap_id\n break\n default:\n break\n }\n }\n }\n tokenConfig = await this.getMagmaConfigHandle(tokenConfig)\n if (tokenConfig.clmm_pools_id.length > 0) {\n this.updateCache(cacheKey, tokenConfig, cacheTime24h)\n }\n return tokenConfig\n }\n\n private async getMagmaConfigHandle(tokenConfig: MagmaConfigs): Promise<MagmaConfigs> {\n const warpIds = [tokenConfig.clmm_pools_id, tokenConfig.coin_list_id, tokenConfig.launchpad_pools_id]\n\n const res = await this._sdk.fullClient.multiGetObjects({ ids: warpIds, options: { showContent: true } })\n\n res.forEach((item) => {\n if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getMagmaConfigHandle get objects error: ${item.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfigHandle\n )\n }\n\n const fields = getObjectFields(item)\n const type = getObjectType(item) as string\n switch (extractStructTagFromType(type).name) {\n case 'ClmmPools':\n tokenConfig.clmm_pools_handle = fields.pools.fields.id.id\n break\n case 'CoinList':\n tokenConfig.coin_list_handle = fields.coins.fields.id.id\n break\n case 'LaunchpadPools':\n tokenConfig.launchpad_pools_handle = fields.pools.fields.id.id\n break\n default:\n break\n }\n })\n\n return tokenConfig\n }\n\n /**\n * Updates the cache for the given key.\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n try {\n const cacheData = this._cache[key]\n if (!cacheData) {\n return undefined // No cache data available\n }\n\n if (forceRefresh || !cacheData.isValid()) {\n delete this._cache[key]\n return undefined\n }\n\n return cacheData.value as T\n } catch (error) {\n console.error(`Error accessing cache for key ${key}:`, error)\n return undefined\n }\n }\n}\n","import { Inputs, Transaction } from '@mysten/sui/transactions'\nimport {\n DevInspectResults,\n DynamicFieldPage,\n PaginatedEvents,\n PaginatedObjectsResponse,\n SuiClient,\n SuiEventFilter,\n SuiObjectDataOptions,\n SuiObjectResponse,\n SuiObjectResponseQuery,\n SuiTransactionBlockResponse,\n} from '@mysten/sui/client'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\n\nimport { bcs } from '@mysten/sui/bcs'\nimport { toB64 } from '@mysten/bcs'\nimport { DataPage, PaginationArgs, SuiObjectIdType } from '../types'\n\n/**\n * Represents a module for making RPC (Remote Procedure Call) requests.\n */\nexport class RpcModule extends SuiClient {\n /**\n * Get events for a given query criteria\n * @param query\n * @param paginationArgs\n * @returns\n */\n async queryEventsByPage(query: SuiEventFilter, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n\n do {\n const res: PaginatedEvents = await this.queryEvents({\n query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Get all objects owned by an address\n * @param owner\n * @param query\n * @param paginationArgs\n * @returns\n */\n async getOwnedObjectsByPage(\n owner: string,\n query: SuiObjectResponseQuery,\n paginationArgs: PaginationArgs = 'all'\n ): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: PaginatedObjectsResponse = await this.getOwnedObjects({\n owner,\n ...query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Return the list of dynamic field objects owned by an object\n * @param parentId\n * @param paginationArgs\n * @returns\n */\n async getDynamicFieldsByPage(parentId: SuiObjectIdType, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: DynamicFieldPage = await this.getDynamicFields({\n parentId,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Batch get details about a list of objects. If any of the object ids are duplicates the call will fail\n * @param ids\n * @param options\n * @param limit\n * @returns\n */\n async batchGetObjects(ids: SuiObjectIdType[], options?: SuiObjectDataOptions, limit = 50): Promise<SuiObjectResponse[]> {\n let objectDataResponses: SuiObjectResponse[] = []\n\n try {\n for (let i = 0; i < Math.ceil(ids.length / limit); i++) {\n const res = await this.multiGetObjects({\n ids: ids.slice(i * limit, limit * (i + 1)),\n options,\n })\n objectDataResponses = [...objectDataResponses, ...res]\n }\n } catch (error) {\n console.log(error)\n }\n\n return objectDataResponses\n }\n\n /**\n * Calculates the gas cost of a transaction block.\n * @param {Transaction} tx - The transaction block to calculate gas for.\n * @returns {Promise<number>} - The estimated gas cost of the transaction block.\n * @throws {Error} - Throws an error if the sender is empty.\n */\n async calculationTxGas(tx: Transaction): Promise<number> {\n const { sender } = tx.blockData\n\n if (sender === undefined) {\n throw Error('sdk sender is empty')\n }\n\n const devResult = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender,\n })\n const { gasUsed } = devResult.effects\n\n const estimateGas = Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate)\n return estimateGas\n }\n\n /**\n * Sends a transaction block after signing it with the provided keypair.\n *\n * @param {Ed25519Keypair | Secp256k1Keypair} keypair - The keypair used for signing the transaction.\n * @param {Transaction} tx - The transaction block to send.\n * @returns {Promise<SuiTransactionBlockResponse | undefined>} - The response of the sent transaction block.\n */\n async sendTransaction(keypair: Ed25519Keypair | Secp256k1Keypair, tx: Transaction): Promise<SuiTransactionBlockResponse | undefined> {\n try {\n const resultTxn: any = await this.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showEvents: true,\n },\n })\n return resultTxn\n } catch (error) {\n console.log('error: ', error)\n }\n return undefined\n }\n\n /**\n * Send a simulation transaction.\n * @param tx - The transaction block.\n * @param simulationAccount - The simulation account.\n * @param useDevInspect - A flag indicating whether to use DevInspect. Defaults to true.\n * @returns A promise that resolves to DevInspectResults or undefined.\n */\n async sendSimulationTransaction(\n tx: Transaction,\n simulationAccount: string,\n useDevInspect = true\n ): Promise<DevInspectResults | undefined> {\n try {\n if (useDevInspect) {\n const simulateRes = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount,\n })\n return simulateRes\n }\n\n // If useDevInspect is false, manually construct the transaction for simulation.\n // const inputs = tx.inputs.map((input) => {\n // const { type, value } = input\n // if (type === 'object') {\n // return Inputs.SharedObjectRef({\n // objectId: value,\n // initialSharedVersion: 0,\n // mutable: true,\n // })\n // }\n // return value\n // })\n\n // const kind = {\n // ProgrammableTransaction: {\n // inputs,\n // transactions: tx,\n // },\n // }\n // // Serialize the transaction using BCS.\n // const serialize = bcs.TransactionKind.serialize(kind, {\n // maxSize: 131072,\n // }).toBytes()\n\n // const devInspectTxBytes = toB64(serialize)\n // // Send the request to DevInspect.\n // const res = await this.transport.request<DevInspectResults>({\n // method: 'sui_devInspectTransactionBlock',\n // params: [simulationAccount, devInspectTxBytes, null, null],\n // })\n // return res\n } catch (error) {\n console.log('devInspectTransactionBlock error', error)\n }\n\n return undefined\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport {\n CLOCK_ADDRESS,\n DepositPosition,\n EpochEmission,\n Gauge,\n getPackagerConfigs,\n GetRewardByPosition,\n Minter,\n StakedPositionOfPool,\n Voter,\n WithdrawPosition,\n} from '../types'\nimport { IModule } from '../interfaces/IModule'\nimport { MagmaClmmSDK } from '../sdk'\nimport { asIntN, extractStructTagFromType, getObjectType } from '../utils'\n\nexport class GaugeModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async depositPosition(params: DepositPosition): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const poolGauge = await this.getPoolGaguers()\n const gauge = poolGauge.get(params.poolId)\n if (gauge === undefined) {\n throw Error(`Fetch gauge of pool ${params.poolId} failed`)\n }\n\n const { distribution_cfg, magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmmConfig = getPackagerConfigs(clmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [\n tx.object(clmmConfig.global_config_id),\n tx.object(distribution_cfg),\n tx.object(gauge),\n tx.object(params.poolId),\n tx.object(params.positionId),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::deposit_position`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async withdrawPosition(params: WithdrawPosition): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const poolGauge = await this.sdk.Gauge.getPoolGaguers()\n const gauge = poolGauge.get(params.poolId)\n if (gauge === undefined) {\n throw Error(`Fetch gauge of pool ${params.poolId} failed`)\n }\n\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n const { integrate } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [tx.object(gauge), tx.object(params.poolId), tx.object(params.positionId), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::withdraw_position`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async getUserStakedPositionInfo(userAddr: string): Promise<StakedPositionOfPool[]> {\n const poolGauger = await this.getPoolGaguers()\n const poolCoins = await this.getPoolCoins([...poolGauger.keys()])\n\n const res: StakedPositionOfPool[] = []\n for (const [pool, gauger] of poolGauger) {\n const coins = poolCoins.get(pool)\n if (coins === undefined) {\n console.log(`Failed to get coins of pool: ${pool}`)\n continue\n }\n\n const stakedPositionOfPool = await this.getUserStakedPositionInfoOfPool(userAddr, pool, gauger, coins[0], coins[1])\n console.log('stakedPositionOfPool', stakedPositionOfPool)\n stakedPositionOfPool.forEach((value) => {\n ;(value.infos as any[]).forEach((info) => {\n if (info.info) {\n if (res.findIndex((position) => position.pos_object_id === info.info.fields.position_id) === -1) {\n res.push({\n coin_type_a: coins[0],\n coin_type_b: coins[1],\n liquidity: info.info.fields.liquidity,\n tick_lower_index: asIntN(BigInt(info.info.fields.tick_lower_index.fields.bits)),\n tick_upper_index: asIntN(BigInt(info.info.fields.tick_upper_index.fields.bits)),\n pos_object_id: info.info.fields.position_id,\n magma_distribution_staked: info.info.fields.magma_distribution_staked,\n pool: info.pool_id,\n earned: info.earned,\n name: info.name,\n })\n }\n }\n })\n })\n }\n\n return res\n }\n\n async getUserStakedPositionInfoOfPool(userAddr: string, pool: string, gauger: string, poolCoinA: string, poolCoinB: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [poolCoinA, poolCoinB, magma_token]\n\n const args = [tx.object(voter_id), tx.object(gauger), tx.object(pool), tx.pure.address(userAddr), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::user_staked_position_infos`,\n arguments: args,\n typeArguments,\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 Error(`user_staked_position_infos error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const res: any[] = []\n\n simulateRes.events?.forEach((item: any) => {\n res.push(item.parsedJson)\n })\n\n return res\n }\n\n async getPoolGaguers() {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [magma_token]\n const args = [tx.object(voter_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::pools_gauges`,\n arguments: args,\n typeArguments,\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 Error(`getPoolGaguers error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolGauger = new Map<string, string>()\n simulateRes.events?.forEach((item: any) => {\n const { gauges } = item.parsedJson\n item.parsedJson.pools.map((pool: string, index: string) => {\n poolGauger.set(pool, gauges[index])\n })\n })\n\n // console.log('##### ', poolGauger)\n return poolGauger\n }\n\n async getPoolCoins(pools: string[]) {\n const res = await this._sdk.fullClient.multiGetObjects({ ids: pools, options: { showContent: true } })\n\n const poolCoins = new Map<string, string[]>()\n\n res.forEach((item) => {\n if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n throw new Error(`Failed to get poolCoins with err: ${item.error}`)\n }\n\n const type = getObjectType(item) as string\n const poolTypeFields = extractStructTagFromType(type)\n\n poolCoins.set(item.data.objectId, poolTypeFields.type_arguments)\n })\n return poolCoins\n }\n\n async getEmissions() {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, minter_id, voting_escrow_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [magma_token]\n\n const args = [tx.object(minter_id), tx.object(voting_escrow_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Minter}::emissions`,\n arguments: args,\n typeArguments,\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: EpochEmission = {\n emission: 0,\n rebase: 0,\n total_supply: 0,\n total_locked: 0,\n }\n simulateRes.events?.forEach((item: any) => {\n res = {\n emission: item.parsedJson.emission,\n rebase: item.parsedJson.rebase,\n total_supply: item.parsedJson.total_supply,\n total_locked: item.parsedJson.total_locked,\n }\n })\n\n return res\n }\n\n async getRewardByPosition(params: GetRewardByPosition): Promise<Transaction> {\n const tx = new Transaction()\n const { integrate } = this.sdk.sdkOptions\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [tx.object(params.gaugeId), tx.object(params.poolId), tx.object(params.positionId), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::get_reward_by_position`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async getAllRewardByPositions(paramsList: GetRewardByPosition[]): Promise<Transaction> {\n const tx = new Transaction()\n const { integrate } = this.sdk.sdkOptions\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n paramsList.forEach((params) => {\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [tx.object(params.gaugeId), tx.object(params.poolId), tx.object(params.positionId), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::get_reward_by_position`,\n arguments: args,\n typeArguments,\n })\n })\n\n return tx\n }\n\n async getEpochRewardByPool(pool: string, incentive_tokens: string[]): Promise<Map<string, string>> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [magma_token, ...incentive_tokens]\n\n const args = [tx.object(voter_id), tx.object(pool), tx.object(CLOCK_ADDRESS)]\n\n let targetFunc = `${integrate.published_at}::${Voter}::epoch_reward_by_pool${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::epoch_reward_by_pool`\n }\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\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 Error(`getEpochRewardByPool error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const res = new Map<string, string>()\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPoolIncentivesAmount`) {\n res.set(item.parsedJson.token, item.parsedJson.amount)\n }\n })\n\n return res\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { SuiObjectResponse } from '@mysten/sui/client'\nimport {\n get_price_x128_from_real_id,\n get_real_id,\n get_real_id_from_price_x128,\n get_storage_id_from_real_id,\n} from '@magmaprotocol/calc_dlmm'\nimport Decimal from 'decimal.js'\nimport { BinMath } from '../math'\nimport {\n EventBin,\n CreatePairParams,\n FetchBinsParams,\n MintAmountParams,\n MintPercentParams,\n DLMMSwapParams,\n EventPositionLiquidity,\n GetPositionLiquidityParams,\n EventPairLiquidity,\n GetPairLiquidityParams,\n FetchPairParams,\n EventPairParams,\n DlmmPoolInfo,\n DlmmAddLiquidityParams,\n DlmmBurnPositionParams,\n DlmmShrinkPosition,\n DlmmCollectRewardParams,\n DlmmCollectFeeParams,\n DlmmEventEarnedFees,\n DlmmRewardsParams,\n DlmmEventEarnedRewards,\n GetPairRewarderParams,\n DlmmEventPairRewardTypes,\n DlmmCreatePairAddLiquidityParams,\n DlmmPosition,\n DlmmPositionInfo,\n MintByStrategyParams,\n} from '../types/dlmm'\nimport {\n CachedContent,\n cacheTime24h,\n cacheTime5min,\n extractStructTagFromType,\n getFutureTime,\n getObjectFields,\n getObjectOwner,\n getObjectType,\n TransactionUtil,\n} from '../utils'\nimport { CLOCK_ADDRESS, DlmmScript, getPackagerConfigs, SuiResource } from '../types'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { ClmmpoolsError, PositionErrorCode, TypesErrorCode } from '../errors/errors'\n\nexport class DlmmModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async getPoolInfo(pools: string[]): Promise<DlmmPoolInfo[]> {\n const objects = await this._sdk.fullClient.batchGetObjects(pools, { showContent: true })\n\n const poolList: DlmmPoolInfo[] = []\n objects.forEach((obj) => {\n if (obj.error != null || obj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Invalid objects. error: ${obj.error}`, TypesErrorCode.InvalidType)\n }\n\n const fields = getObjectFields(obj)\n poolList.push({\n pool_id: fields.id.id,\n bin_step: fields.bin_step,\n coin_a: fields.x.fields.name,\n coin_b: fields.y.fields.name,\n base_factor: fields.params.fields.base_factor,\n base_fee: (fields.params.fields.base_factor / 10000) * (fields.bin_step / 10000),\n active_index: fields.params.fields.active_index,\n real_bin_id: get_real_id(fields.params.fields.active_index),\n coinAmountA: fields.reserve_x,\n coinAmountB: fields.reserve_y\n })\n })\n\n return poolList\n }\n\n // eg: fetch pool active_index\n async fetchPairParams(params: FetchPairParams): Promise<EventPairParams> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::fetch_pair_params`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: EventPairParams = {\n base_factor: 0,\n filter_period: 0,\n decay_period: 0,\n reduction_factor: 0,\n variable_fee_control: 0,\n protocol_share: 0,\n max_volatility_accumulator: 0,\n volatility_accumulator: 0,\n volatility_reference: 0,\n index_reference: 0,\n time_of_last_update: 0,\n oracle_index: 0,\n active_index: 0,\n }\n simulateRes.events?.forEach((item: any) => {\n console.log(extractStructTagFromType(item.type).name)\n if (extractStructTagFromType(item.type).name === `EventPairParams`) {\n res = item.parsedJson.params\n }\n })\n\n return res\n }\n\n // NOTE: x, y should be sorted\n async createPairPayload(params: CreatePairParams): Promise<Transaction> {\n const storage_id = get_storage_id_from_real_id(\n BinMath.getBinIdFromPrice(params.priceTokenBPerTokenA, params.bin_step, params.coinADecimal, params.coinBDecimal)\n )\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { clmm_pool, dlmm_pool, integrate } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(dlmmConfig.factory),\n tx.object(global_config_id),\n tx.pure.u64(params.base_fee),\n tx.pure.u16(params.bin_step),\n tx.pure.u32(storage_id),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::create_pair`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async mintByStrategy(params: MintByStrategyParams): Promise<Transaction> {\n if (params.fixCoinA && params.fixCoinB) {\n if (params.amountATotal === 0 || params.amountBTotal === 0) {\n if (params.active_bin < params.max_bin && params.active_bin > params.min_bin) {\n if (params.amountATotal > 0) {\n params.min_bin = params.active_bin\n } else if (params.amountBTotal > 0) {\n params.max_bin = params.active_bin\n }\n }\n }\n }\n\n const tx = new Transaction()\n const slippage = new Decimal(params.slippage)\n const lower_slippage = new Decimal(1).sub(slippage.div(new Decimal(10000)))\n const upper_slippage = new Decimal(1).plus(slippage.div(new Decimal(10000)))\n\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const price = get_price_x128_from_real_id(params.active_bin, params.bin_step)\n const min_price = new Decimal(price).mul(lower_slippage)\n const max_price = new Decimal(price).mul(upper_slippage)\n\n const active_min = get_storage_id_from_real_id(get_real_id_from_price_x128(min_price.toDecimalPlaces(0).toString(), params.bin_step))\n const active_max = get_storage_id_from_real_id(get_real_id_from_price_x128(max_price.toDecimalPlaces(0).toString(), params.bin_step))\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n let amount_min = 0\n let amount_max = 0\n let primaryCoinAInputs\n let primaryCoinBInputs\n if (params.fixCoinA && params.fixCoinB) {\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n } else if (params.fixCoinA) {\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n amount_min = new Decimal(params.amountBTotal).mul(lower_slippage).toDecimalPlaces(0).toNumber()\n amount_max = new Decimal(params.amountBTotal).mul(upper_slippage).toDecimalPlaces(0).toNumber()\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount_max), params.coinTypeB, false, true)\n } else if (params.fixCoinB) {\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n amount_min = new Decimal(params.amountATotal).mul(lower_slippage).toDecimalPlaces(0).toNumber()\n amount_max = new Decimal(params.amountATotal).mul(upper_slippage).toDecimalPlaces(0).toNumber()\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount_max), params.coinTypeA, false, true)\n }\n\n if (params.fixCoinA && params.fixCoinB) {\n } else if (params.fixCoinA) {\n params.amountBTotal = 0\n } else if (params.fixCoinB) {\n params.amountATotal = 0\n }\n\n const args = [\n tx.object(params.pair),\n tx.object(dlmmConfig.factory),\n primaryCoinAInputs!.targetCoin,\n primaryCoinBInputs!.targetCoin,\n tx.pure.bool(params.fixCoinA),\n tx.pure.u64(params.amountATotal),\n tx.pure.bool(params.fixCoinB),\n tx.pure.u64(params.amountBTotal),\n tx.pure.u8(params.strategy),\n tx.pure.u32(get_storage_id_from_real_id(params.min_bin)),\n tx.pure.u32(get_storage_id_from_real_id(params.max_bin)),\n tx.pure.u32(active_min),\n tx.pure.u32(active_max),\n tx.pure.u64(amount_min),\n tx.pure.u64(amount_max),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::mint_by_strategy`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // Create a position by percent\n async mintPercent(params: MintPercentParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n\n const args = [\n tx.object(params.pair),\n tx.object(dlmmConfig.factory),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.amountATotal),\n tx.pure.u64(params.amountBTotal),\n tx.pure.vector('u32', params.storageIds),\n tx.pure.vector('u64', params.binsAPercent),\n tx.pure.vector('u64', params.binsBPercent),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::mint_percent`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // Create a position by amount\n async createPositionByAmount(params: MintAmountParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n\n const args = [\n tx.object(params.pair),\n tx.object(dlmmConfig.factory),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u32', params.storageIds),\n tx.pure.vector('u64', params.amountsA),\n tx.pure.vector('u64', params.amountsB),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::mint_amounts`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async addLiquidity(params: DlmmAddLiquidityParams): Promise<Transaction> {\n if (params.rewards_token.length === 0) {\n return this._raisePositionByAmounts(params)\n }\n return this._raisePositionByAmountsReward(params)\n }\n\n private async _raisePositionByAmounts(params: DlmmAddLiquidityParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coin_a, params.coin_b]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n const amountATotal = params.amounts_a.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n const amountBTotal = params.amounts_b.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountATotal), params.coin_a, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountBTotal), params.coin_b, false, true)\n\n const args = [\n tx.object(params.pool_id),\n tx.object(dlmmConfig.factory),\n tx.object(params.position_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u64', params.amounts_a),\n tx.pure.vector('u64', params.amounts_b),\n tx.pure.address(params.receiver),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::raise_position_by_amounts`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n private async _raisePositionByAmountsReward(params: DlmmAddLiquidityParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate, clmm_pool } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n const amountATotal = params.amounts_a.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n const amountBTotal = params.amounts_b.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountATotal), params.coin_a, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountBTotal), params.coin_b, false, true)\n\n const args = [\n tx.object(params.pool_id),\n tx.object(dlmmConfig.factory),\n tx.object(clmmConfigs.global_vault_id),\n tx.object(params.position_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u64', params.amounts_a),\n tx.pure.vector('u64', params.amounts_b),\n tx.pure.address(params.receiver),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::raise_position_by_amounts_reward${params.rewards_token.length}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async burnPosition(params: DlmmBurnPositionParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n let args = [tx.object(params.pool_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n let target = `${integrate.published_at}::${DlmmScript}::burn_position`\n\n if (params.rewards_token.length > 0) {\n args = [tx.object(params.pool_id), tx.object(clmmConfigs.global_vault_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n target = `${integrate.published_at}::${DlmmScript}::burn_position_reward${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async shrinkPosition(params: DlmmShrinkPosition): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n let args = [tx.object(params.pool_id), tx.object(params.position_id), tx.pure.u64(params.delta_percentage), tx.object(CLOCK_ADDRESS)]\n let target = `${integrate.published_at}::${DlmmScript}::shrink_position`\n\n if (params.rewards_token.length > 0) {\n args = [\n tx.object(params.pool_id),\n tx.object(clmmConfigs.global_vault_id),\n tx.object(params.position_id),\n tx.pure.u64(params.delta_percentage),\n tx.object(CLOCK_ADDRESS),\n ]\n target = `${integrate.published_at}::${DlmmScript}::shrink_position_reward${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async collectFeeAndReward(params: DlmmCollectRewardParams & DlmmCollectFeeParams): Promise<Transaction> {\n let tx = new Transaction()\n tx = await this.collectFees(params)\n if (params.rewards_token.length > 0) {\n tx = await this.collectReward(params)\n }\n return tx\n }\n\n async collectReward(params: DlmmCollectRewardParams, transaction?: Transaction): Promise<Transaction> {\n const tx = transaction || new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n const args = [\n tx.object(params.pool_id),\n tx.object(clmmConfigs.global_vault_id),\n tx.object(params.position_id),\n tx.object(CLOCK_ADDRESS),\n ]\n let target = `${integrate.published_at}::${DlmmScript}::collect_reward`\n\n if (params.rewards_token.length > 1) {\n target = `${integrate.published_at}::${DlmmScript}::collect_reward${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async collectFees(params: DlmmCollectFeeParams, transaction?: Transaction): Promise<Transaction> {\n const tx = transaction || new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coin_a, params.coin_b]\n const args = [tx.object(params.pool_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n const target = `${integrate.published_at}::${DlmmScript}::collect_fees`\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async createPairAddLiquidity(params: DlmmCreatePairAddLiquidityParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { clmm_pool, dlmm_pool, integrate } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n const amountATotal = params.amountsX.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n const amountBTotal = params.amountsY.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountATotal), params.coinTypeA, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountBTotal), params.coinTypeB, false, true)\n\n const storageIds: number[] = []\n params.realIds.forEach((i) => {\n storageIds.push(get_storage_id_from_real_id(i))\n })\n const args = [\n tx.object(dlmmConfig.factory),\n tx.object(global_config_id),\n tx.pure.u64(params.baseFee),\n tx.pure.u16(params.binStep),\n tx.pure.u32(get_storage_id_from_real_id(params.activeId)),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u32', storageIds),\n tx.pure.vector('u64', params.amountsX),\n tx.pure.vector('u64', params.amountsY),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n const target = `${integrate.published_at}::${DlmmScript}::create_pair_add_liquidity`\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async swap(params: DLMMSwapParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.swapForY ? BigInt(params.amountIn) : BigInt(0),\n params.coinTypeA,\n false,\n true\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.swapForY ? BigInt(0) : BigInt(params.amountIn),\n params.coinTypeB,\n false,\n true\n )\n\n const args = [\n tx.object(params.pair),\n tx.object(global_config_id),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.u64(params.amountIn),\n tx.pure.u64(params.minAmountOut),\n tx.pure.bool(params.swapForY),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::swap`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async fetchBins(params: FetchBinsParams): Promise<EventBin[]> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair), tx.pure.u64(params.offset), tx.pure.u64(params.limit)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::fetch_bins`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: EventBin[] = []\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventFetchBins`) {\n const { bins } = item.parsedJson\n res = bins\n }\n })\n\n return res\n }\n\n /**\n * Gets a list of positions for the given account address.\n * @param accountAddress The account address to get positions for.\n * @param assignPoolIds An array of pool IDs to filter the positions by.\n * @returns array of Position objects.\n */\n async getUserPositionById(positionId: string, showDisplay = true): Promise<DlmmPositionInfo> {\n let position\n const ownerRes: any = await this._sdk.fullClient.getObject({\n id: positionId,\n options: { showContent: true, showType: true, showDisplay, showOwner: true },\n })\n\n const type = extractStructTagFromType(ownerRes.data.type)\n if (type.full_address === this.buildPositionType()) {\n position = this.buildPosition(ownerRes)\n } else {\n throw new ClmmpoolsError(`Dlmm Position not exists. Get Position error:${ownerRes.error}`, PositionErrorCode.InvalidPositionObject)\n }\n const poolMap = new Set<string>()\n poolMap.add(position.pool)\n const pool = (await this.getPoolInfo(Array.from(poolMap)))[0]\n const _params: GetPairRewarderParams[] = []\n _params.push({\n pool_id: pool.pool_id,\n coin_a: pool.coin_a,\n coin_b: pool.coin_b,\n })\n\n const pool_reward_coins = await this.getPairRewarders(_params)\n // 1. Get Liquidity\n // 2. Get rewards\n // 3. Get fees\n const positionLiquidity = await this.getPositionLiquidity({\n pair: position.pool,\n positionId: position.pos_object_id,\n coinTypeA: pool!.coin_a,\n coinTypeB: pool!.coin_b,\n })\n const rewards_token = pool_reward_coins.get(position.pool) || []\n let positionRewards: DlmmEventEarnedRewards = { position_id: position.pos_object_id, reward: [], amount: [] }\n if (rewards_token.length > 0) {\n positionRewards = await this.getEarnedRewards({\n pool_id: position.pool,\n position_id: position.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n rewards_token: pool_reward_coins.get(position.pool) || [],\n })\n }\n\n const positionFees = await this.getEarnedFees({\n pool_id: position.pool,\n position_id: position.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n })\n\n return {\n position,\n liquidity: positionLiquidity,\n rewards: positionRewards,\n fees: positionFees,\n contractPool: pool,\n }\n }\n\n /**\n * Gets a list of positions for the given account address.\n * @param accountAddress The account address to get positions for.\n * @param assignPoolIds An array of pool IDs to filter the positions by.\n * @returns array of Position objects.\n */\n async getUserPositions(accountAddress: string, assignPoolIds: string[] = [], showDisplay = true): Promise<DlmmPositionInfo[]> {\n const allPosition = []\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.dlmm_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 = this.buildPosition(item)\n const cacheKey = `${position.pos_object_id}_getPositionList`\n this.updateCache(cacheKey, position, cacheTime24h)\n if (hasAssignPoolIds) {\n if (assignPoolIds.includes(position.pool)) {\n allPosition.push(position)\n }\n } else {\n allPosition.push(position)\n }\n }\n }\n\n const poolMap = new Set<string>()\n for (const item of allPosition) {\n poolMap.add(item.pool)\n }\n const poolList = await this.getPoolInfo(Array.from(poolMap))\n this.updateCache(`${DlmmScript}_positionList_poolList`, poolList, cacheTime24h)\n const _params: GetPairRewarderParams[] = []\n\n for (const pool of poolList) {\n _params.push({\n pool_id: pool.pool_id,\n coin_a: pool.coin_a,\n coin_b: pool.coin_b,\n })\n }\n\n const pool_reward_coins = await this.getPairRewarders(_params)\n\n const out = []\n\n // 1. Get Liquidity\n // 2. Get rewards\n // 3. Get fees\n for (const item of allPosition) {\n const pool = poolList.find((pool) => pool.pool_id === item.pool)\n const positionLiquidity = await this.getPositionLiquidity({\n pair: item.pool,\n positionId: item.pos_object_id,\n coinTypeA: pool!.coin_a,\n coinTypeB: pool!.coin_b,\n })\n const rewards_token = pool_reward_coins.get(item.pool) || []\n let positionRewards: DlmmEventEarnedRewards = { position_id: item.pos_object_id, reward: [], amount: [] }\n if (rewards_token.length > 0) {\n positionRewards = await this.getEarnedRewards({\n pool_id: item.pool,\n position_id: item.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n rewards_token: pool_reward_coins.get(item.pool) || [],\n })\n }\n\n const positionFees = await this.getEarnedFees({\n pool_id: item.pool,\n position_id: item.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n })\n out.push({\n position: item,\n liquidity: positionLiquidity,\n rewards: positionRewards,\n fees: positionFees,\n contractPool: pool,\n })\n }\n\n return out\n }\n\n private buildPosition(object: SuiObjectResponse): DlmmPosition {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Dlmm Position not exists. Get Position error:${object.error}`, PositionErrorCode.InvalidPositionObject)\n }\n const fields = getObjectFields(object)\n\n const ownerWarp = getObjectOwner(object) as {\n AddressOwner: string\n }\n\n return {\n pos_object_id: fields.id.id,\n owner: ownerWarp.AddressOwner,\n pool: fields.pair_id,\n bin_real_ids: (fields.bin_ids as number[]).map((id) => get_real_id(id)),\n type: '',\n }\n }\n\n // return [coin_a, coin_b]\n private async getPoolCoins(pools: string[]): Promise<Map<string, string[]>> {\n const res = await this._sdk.fullClient.multiGetObjects({ ids: pools, options: { showContent: true } })\n\n const poolCoins = new Map<string, string[]>()\n\n res.forEach((item) => {\n if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n throw new Error(`Failed to get poolCoins with err: ${item.error}`)\n }\n\n const type = getObjectType(item) as string\n const poolTypeFields = extractStructTagFromType(type)\n\n poolCoins.set(item.data.objectId, poolTypeFields.type_arguments)\n })\n return poolCoins\n }\n\n private buildPositionType(): string {\n return `${this._sdk.sdkOptions.dlmm_pool.package_id}::dlmm_position::Position`\n }\n\n async getPositionLiquidity(params: GetPositionLiquidityParams): Promise<EventPositionLiquidity> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair), tx.object(params.positionId)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::position_liquidity`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const out: EventPositionLiquidity = {\n shares: 0,\n liquidity: 0,\n x_equivalent: 0,\n y_equivalent: 0,\n bin_real_ids: [],\n bin_x_eq: [],\n bin_y_eq: [],\n bin_liquidity: [],\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPositionLiquidity`) {\n out.shares = item.parsedJson.shares\n out.liquidity = item.parsedJson.liquidity\n out.x_equivalent = item.parsedJson.x_equivalent\n out.y_equivalent = item.parsedJson.y_equivalent\n out.bin_real_ids = (item.parsedJson.bin_ids as number[]).map((id) => get_real_id(id))\n out.bin_x_eq = item.parsedJson.bin_x_eq\n out.bin_y_eq = item.parsedJson.bin_y_eq\n out.bin_liquidity = item.parsedJson.bin_liquidity\n }\n })\n return out\n }\n\n async getPairLiquidity(params: GetPairLiquidityParams): Promise<EventPairLiquidity> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::pair_liquidity`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const out: EventPairLiquidity = {\n shares: 0,\n liquidity: 0,\n x: 0,\n y: 0,\n bin_ids: [],\n bin_x: [],\n bin_y: [],\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPositionLiquidity`) {\n out.shares = item.parsedJson.shares\n out.liquidity = item.parsedJson.liquidity\n out.x = item.parsedJson.x\n out.y = item.parsedJson.y\n out.bin_ids = item.bin_ids\n out.bin_x = item.bin_x\n out.bin_y = item.bin_y\n }\n })\n return out\n }\n\n async getEarnedFees(params: DlmmCollectFeeParams): Promise<DlmmEventEarnedFees> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coin_a, params.coin_b]\n const args = [tx.object(params.pool_id), tx.object(params.position_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::earned_fees`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const out: DlmmEventEarnedFees = {\n position_id: '',\n x: '',\n y: '',\n fee_x: 0,\n fee_y: 0,\n }\n if (simulateRes.error != null) {\n throw new Error(`fetchPairRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPositionLiquidity`) {\n out.position_id = item.parsedJson.position_id\n out.x = item.parsedJson.x\n out.y = item.parsedJson.y\n out.fee_x = item.parsedJson.fee_x\n out.fee_y = item.parsedJson.fee_y\n }\n })\n return out\n }\n\n async getEarnedRewards(params: DlmmRewardsParams): Promise<DlmmEventEarnedRewards> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n\n const args = [tx.object(params.pool_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n let target = `${integrate.published_at}::${DlmmScript}::earned_rewards`\n if (params.rewards_token.length > 1) {\n target = `${integrate.published_at}::${DlmmScript}::earned_rewards${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const out: DlmmEventEarnedRewards = {\n position_id: '',\n reward: [],\n amount: [],\n }\n\n if (simulateRes.error != null) {\n throw new Error(`getEarnedRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `DlmmEventEarnedRewards`) {\n out.position_id = item.parsedJson.position_id\n out.reward = [item.parsedJson.reward]\n out.amount = [item.parsedJson.amount]\n } else if (extractStructTagFromType(item.type).name === `DlmmEventEarnedRewards2`) {\n out.position_id = item.parsedJson.position_id\n out.reward = [item.parsedJson.reward1, item.parsedJson.reward2]\n out.amount = [item.parsedJson.amount1, item.parsedJson.amount2]\n } else if (extractStructTagFromType(item.type).name === `EventEarnedRewards3`) {\n out.position_id = item.parsedJson.position_id\n out.reward = [item.parsedJson.reward1, item.parsedJson.reward2, item.parsedJson.reward3]\n out.amount = [item.parsedJson.amount1, item.parsedJson.amount2, item.parsedJson.amount3]\n }\n })\n return out\n }\n\n // return pool_id => reward_tokens\n async getPairRewarders(params: GetPairRewarderParams[]): Promise<Map<string, string[]>> {\n let tx = new Transaction()\n for (const param of params) {\n tx = await this._getPairRewarders(param, tx)\n }\n return this._parsePairRewarders(tx)\n }\n\n private async _getPairRewarders(params: GetPairRewarderParams, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n const { integrate } = this.sdk.sdkOptions\n\n const typeArguments = [params.coin_a, params.coin_b]\n const args = [tx.object(params.pool_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::get_pair_rewarders`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n private async _parsePairRewarders(tx: Transaction): Promise<Map<string, string[]>> {\n const { simulationAccount } = this.sdk.sdkOptions\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const out = new Map<string, string[]>()\n if (simulateRes.error != null) {\n throw new Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPairRewardTypes`) {\n const pairRewards: DlmmEventPairRewardTypes = {\n pair_id: '',\n tokens: [],\n }\n\n pairRewards.pair_id = item.parsedJson.pair_id\n item.parsedJson.tokens.forEach((token: any) => {\n pairRewards.tokens.push(token.name)\n })\n\n out.set(pairRewards.pair_id, pairRewards.tokens)\n }\n })\n return out\n }\n\n /**\n * Updates the cache for the given key.\n *\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n *\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import { CoinBalance } from '@mysten/sui/client'\nimport { PoolModule } from './modules/poolModule'\nimport { PositionModule } from './modules/positionModule'\nimport { RewarderModule } from './modules/rewarderModule'\nimport { RouterModule } from './modules/routerModule'\nimport { SwapModule } from './modules/swapModule'\nimport { LockModule } from './modules/lockModule'\nimport { TokenModule } from './modules/tokenModule'\nimport { RouterModuleV2 } from './modules/routerModuleV2'\nimport { CachedContent, cacheTime24h, extractStructTagFromType, getFutureTime, patchFixSuiObjectId } from './utils'\nimport { MagmaConfigs, ClmmConfig, Ve33Config, CoinAsset, Package, SuiResource, SuiAddressType, TokenConfig, DlmmConfig } from './types'\nimport { ConfigModule } from './modules'\nimport { RpcModule } from './modules/rpcModule'\nimport { GaugeModule } from './modules/gaugeModule'\nimport { DlmmModule } from './modules/dlmm'\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 Magma protocol configurations.\n */\n magma_config: Package<MagmaConfigs>\n\n ve33: Package<Ve33Config>\n\n /**\n * Package containing Cryptocurrency Liquidity Mining Module (CLMM) pool configurations.\n */\n clmm_pool: Package<ClmmConfig>\n\n dlmm_pool: Package<DlmmConfig>\n\n distribution: Package\n\n /**\n * Package containing integration-related configurations.\n */\n integrate: Package\n\n /**\n * Package containing DeepBook-related configurations.\n */\n deepbook: Package\n\n /**\n * Package containing DeepBook endpoint version 2 configurations.\n */\n deepbook_endpoint_v2: Package\n\n /**\n * The URL for the aggregator service.\n */\n aggregatorUrl: string\n\n /**\n * The URL for the swap count\n */\n swapCountUrl?: string\n}\n\n/**\n * The entry class of MagmaClmmSDK, which is almost responsible for all interactions with CLMM.\n */\nexport class MagmaClmmSDK {\n private readonly _cache: Record<string, CachedContent> = {}\n\n /**\n * RPC provider on the SUI chain\n */\n protected _rpcModule: RpcModule\n\n /**\n * Provide interact with clmm pools with a pool router interface.\n */\n protected _pool: PoolModule\n\n /**\n * Provide interact with clmm position with a position router interface.\n */\n protected _position: PositionModule\n\n /**\n * Provide interact with a pool swap router interface.\n */\n protected _swap: SwapModule\n\n /**\n * Provide interact with a lock interface.\n */\n protected _lock: LockModule\n\n protected _gauge: GaugeModule\n\n protected _dlmm: DlmmModule\n\n /**\n * Provide interact with a position rewarder interface.\n */\n protected _rewarder: RewarderModule\n\n /**\n * Provide interact with a pool router interface.\n */\n protected _router: RouterModule\n\n /**\n * Provide interact with a pool routerV2 interface.\n */\n protected _router_v2: RouterModuleV2\n\n /**\n * Provide interact with pool and token config (contain token base info for metadat).\n * @deprecated Please use MagmaConfig instead\n */\n protected _token: TokenModule\n\n /**\n * Provide interact with clmm pool and coin and launchpad pool config\n */\n protected _config: ConfigModule\n\n /**\n * Provide sdk options\n */\n protected _sdkOptions: SdkOptions\n\n /**\n * After connecting the wallet, set the current wallet address to senderAddress.\n */\n protected _senderAddress = ''\n\n constructor(options: SdkOptions) {\n this._sdkOptions = options\n this._rpcModule = new RpcModule({\n url: options.fullRpcUrl,\n })\n\n this._swap = new SwapModule(this)\n this._lock = new LockModule(this)\n this._gauge = new GaugeModule(this)\n this._dlmm = new DlmmModule(this)\n this._pool = new PoolModule(this)\n this._position = new PositionModule(this)\n this._rewarder = new RewarderModule(this)\n this._router = new RouterModule(this)\n this._router_v2 = new RouterModuleV2(this)\n this._token = new TokenModule(this)\n this._config = new ConfigModule(this)\n\n patchFixSuiObjectId(this._sdkOptions)\n }\n\n /**\n * Getter for the sender address property.\n * @returns {SuiAddressType} The sender address.\n */\n get senderAddress(): SuiAddressType {\n return this._senderAddress\n }\n\n /**\n * Setter for the sender address property.\n * @param {string} value - The new sender address value.\n */\n set senderAddress(value: string) {\n this._senderAddress = value\n }\n\n /**\n * Getter for the Swap property.\n * @returns {SwapModule} The Swap property value.\n */\n get Swap(): SwapModule {\n return this._swap\n }\n\n /* */\n get Lock(): LockModule {\n return this._lock\n }\n\n get Gauge(): GaugeModule {\n return this._gauge\n }\n\n get Dlmm(): DlmmModule {\n return this._dlmm\n }\n\n /**\n * Getter for the fullClient property.\n * @returns {RpcModule} The fullClient property value.\n */\n get fullClient(): RpcModule {\n return this._rpcModule\n }\n\n /**\n * Getter for the sdkOptions property.\n * @returns {SdkOptions} The sdkOptions property value.\n */\n get sdkOptions(): SdkOptions {\n return this._sdkOptions\n }\n\n /**\n * Getter for the Pool property.\n * @returns {PoolModule} The Pool property value.\n */\n get Pool(): PoolModule {\n return this._pool\n }\n\n /**\n * Getter for the Position property.\n * @returns {PositionModule} The Position property value.\n */\n get Position(): PositionModule {\n return this._position\n }\n\n /**\n * Getter for the Rewarder property.\n * @returns {RewarderModule} The Rewarder property value.\n */\n get Rewarder(): RewarderModule {\n return this._rewarder\n }\n\n /**\n * Getter for the Router property.\n * @returns {RouterModule} The Router property value.\n */\n get Router(): RouterModule {\n return this._router\n }\n\n /**\n * Getter for the RouterV2 property.\n * @returns {RouterModuleV2} The RouterV2 property value.\n */\n get RouterV2(): RouterModuleV2 {\n return this._router_v2\n }\n\n /**\n * Getter for the MagmaConfig property.\n * @returns {ConfigModule} The MagmaConfig property value.\n */\n get MagmaConfig(): ConfigModule {\n return this._config\n }\n\n /**\n * @deprecated Token is no longer maintained. Please use MagmaConfig instead\n */\n get Token() {\n return this._token\n }\n\n /**\n * Gets all coin assets for the given owner and coin type.\n *\n * @param suiAddress The address of the owner.\n * @param coinType The type of the coin.\n * @returns an array of coin assets.\n */\n async getOwnerCoinAssets(suiAddress: string, coinType?: string | null, forceRefresh = true): Promise<CoinAsset[]> {\n const allCoinAsset: CoinAsset[] = []\n let nextCursor: string | null | undefined = null\n\n const cacheKey = `${this.sdkOptions.fullRpcUrl}_${suiAddress}_${coinType}_getOwnerCoinAssets`\n const cacheData = this.getCache<CoinAsset[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n\n while (true) {\n const allCoinObject: any = await (coinType\n ? this.fullClient.getCoins({\n owner: suiAddress,\n coinType,\n cursor: nextCursor,\n })\n : this.fullClient.getAllCoins({\n owner: suiAddress,\n cursor: nextCursor,\n }))\n\n allCoinObject.data.forEach((coin: any) => {\n if (BigInt(coin.balance) > 0) {\n allCoinAsset.push({\n coinAddress: extractStructTagFromType(coin.coinType).source_address,\n coinObjectId: coin.coinObjectId,\n balance: BigInt(coin.balance),\n })\n }\n })\n nextCursor = allCoinObject.nextCursor\n\n if (!allCoinObject.hasNextPage) {\n break\n }\n }\n this.updateCache(cacheKey, allCoinAsset, 30 * 1000)\n return allCoinAsset\n }\n\n /**\n * Gets all coin balances for the given owner and coin type.\n *\n * @param suiAddress The address of the owner.\n * @param coinType The type of the coin.\n * @returns an array of coin balances.\n */\n async getOwnerCoinBalances(suiAddress: string, coinType?: string | null): Promise<CoinBalance[]> {\n let allCoinBalance: CoinBalance[] = []\n\n if (coinType) {\n const res = await this.fullClient.getBalance({\n owner: suiAddress,\n coinType,\n })\n allCoinBalance = [res]\n } else {\n const res = await this.fullClient.getAllBalances({\n owner: suiAddress,\n })\n allCoinBalance = [...res]\n }\n return allCoinBalance\n }\n\n /**\n * Updates the cache for the given key.\n *\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime24h) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n *\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import { getFullnodeUrl } from '@mysten/sui/client'\nimport MagmaClmmSDK, { SdkOptions } from '../main'\n\nconst SDKConfig = {\n clmmConfig: {\n pools_id: '0xfa145b9de10fe858be81edd1c6cdffcf27be9d016de02a1345eb1009a68ba8b2',\n // clmm and dlmm both use this global_config\n global_config_id: '0x4c4e1402401f72c7d8533d0ed8d5f8949da363c7a3319ccef261ffe153d32f8a',\n global_vault_id: '0xa7e1102f222b6eb81ccc8a126e7feb2353342be9df6f6646a77c4519da29c071',\n admin_cap_id: '0x89c1a321291d15ddae5a086c9abc533dff697fde3d89e0ca836c41af73e36a75',\n },\n magmaConfig: {\n coin_list_id: '0x8cbc11d9e10140db3d230f50b4d30e9b721201c0083615441707ffec1ef77b23',\n launchpad_pools_id: '0x1098fac992eab3a0ab7acf15bb654fc1cf29b5a6142c4ef1058e6c408dd15115',\n clmm_pools_id: '0x15b6a27dd9ae03eb455aba03b39e29aad74abd3757b8e18c0755651b2ae5b71e',\n admin_cap_id: '0x39d78781750e193ce35c45ff32c6c0c3f2941fa3ddaf8595c90c555589ddb113',\n coin_list_handle: '0x49136005e90e28c4695419ed4194cc240603f1ea8eb84e62275eaff088a71063',\n launchpad_pools_handle: '0x5e194a8efcf653830daf85a85b52e3ae8f65dc39481d54b2382acda25068375c',\n clmm_pools_handle: '0x37f60eb2d9d227949b95da8fea810db3c32d1e1fa8ed87434fc51664f87d83cb',\n },\n ve33Config: {\n voter_id: '0xaab0f3a90da96d29d743e09c269e1ae48ec1bae52a28cd38c49c5dc8c1bf92b8',\n voting_escrow_id: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n reward_distributor_id: '0x9f4f882245e49fd9213278dfbcb63a14fdbdd2ce7e25e9353a0cecdca30de853',\n distribution_cfg: '0xaff8d151ac29317201151f97d28c546b3c5923d8cfc5499f40dea61c4022c949',\n magma_token: '0x7161c6c6bb65f852797c8f7f5c4f8d57adaf796e1b840921f9e23fabeadfd54e::magma::MAGMA',\n minter_id: '0x4fa5766cd83b33b215b139fec27ac344040f3bbd84fcbee7b61fc671aadc51fa',\n },\n dlmmConfig: {\n factory: '',\n },\n gaugeConfig: {},\n}\n\n// mainnet\nexport const clmmMainnet: SdkOptions = {\n fullRpcUrl: getFullnodeUrl('mainnet'),\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n ve33: {\n package_id: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n published_at: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n config: SDKConfig.ve33Config,\n },\n magma_config: {\n package_id: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n published_at: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n config: SDKConfig.magmaConfig,\n },\n clmm_pool: {\n package_id: '0x4a35d3dfef55ed3631b7158544c6322a23bc434fe4fca1234cb680ce0505f82d',\n published_at: '0x4a35d3dfef55ed3631b7158544c6322a23bc434fe4fca1234cb680ce0505f82d',\n config: SDKConfig.clmmConfig,\n },\n dlmm_pool: {\n package_id: '',\n published_at: '',\n config: SDKConfig.dlmmConfig,\n },\n distribution: {\n package_id: '0xee4a1f231dc45a303389998fe26c4e39278cf68b404b32e4f0b9769129b8267b',\n published_at: '0xee4a1f231dc45a303389998fe26c4e39278cf68b404b32e4f0b9769129b8267b',\n },\n integrate: {\n package_id: '0x2e704d8afc1d6d7f154dee337cc14c153f6f9ce1708213e5dc04a32afe0e45f1',\n published_at: '0x2e704d8afc1d6d7f154dee337cc14c153f6f9ce1708213e5dc04a32afe0e45f1',\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0xac95e8a5e873cfa2544916c16fe1461b6a45542d9e65504c1794ae390b3345a7',\n published_at: '0xac95e8a5e873cfa2544916c16fe1461b6a45542d9e65504c1794ae390b3345a7',\n },\n aggregatorUrl: 'https://api.magmafinance.io/api/router',\n swapCountUrl: 'https://api.magmafinance.io/api/v2/sui/swap/count',\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 * @returns\n */\nexport function initMainnetSDK(fullNodeUrl?: string, simulationAccount?: string): MagmaClmmSDK {\n if (fullNodeUrl) {\n clmmMainnet.fullRpcUrl = fullNodeUrl\n }\n if (simulationAccount) {\n clmmMainnet.simulationAccount.address = simulationAccount\n }\n return new MagmaClmmSDK(clmmMainnet)\n}\n","import { MagmaClmmSDK, SdkOptions } from './sdk'\n\nexport { MagmaClmmSDK, SdkOptions }\n\nexport default MagmaClmmSDK\n","import { getFullnodeUrl } from '@mysten/sui/client'\nimport MagmaClmmSDK, { SdkOptions } from '../main'\n\nconst SDKConfig = {\n clmmConfig: {\n pools_id: '0xd7037b38ae757d7a69b61146b27c288600b9aefbffbf884b856881dff6a4f27b',\n global_config_id: '0x83baa8b07800029302f75ac6906240e86cf05066d37eedcabc61a0d6b6dc6eda',\n global_vault_id: '0xf78d2ee3c312f298882cb680695e5e8c81b1d441a646caccc058006c2851ddea',\n admin_cap_id: '0xa456f86a53fc31e1243f065738ff1fc93f5a62cc080ff894a0fb3747556a799b',\n },\n magmaConfig: {\n coin_list_id: '0x257eb2ba592a5480bba0a97d05338fab17cc3283f8df6998a0e12e4ab9b84478',\n launchpad_pools_id: '0xdc3a7bd66a6dcff73c77c866e87d73826e446e9171f34e1c1b656377314f94da',\n clmm_pools_id: '0x26c85500f5dd2983bf35123918a144de24e18936d0b234ef2b49fbb2d3d6307d',\n admin_cap_id: '0xd328ff427794b8ca0a69c3ebb0c0e4d2e81267ec4ba36e11487362c6508a4c0f',\n coin_list_handle: '0x3204350fc603609c91675e07b8f9ac0999b9607d83845086321fca7f469de235',\n launchpad_pools_handle: '0xae67ff87c34aceea4d28107f9c6c62e297a111e9f8e70b9abbc2f4c9f5ec20fd',\n clmm_pools_handle: '0xd28736923703342b4752f5ed8c2f2a5c0cb2336c30e1fed42b387234ce8408ec',\n },\n ve33Config: {\n // global_config_id: '0xbbe54f3c2bd06c5ab7f93950025bff6710c9a83836d7145636fea383b315774d',\n voter_id: '0x59571991a5c7041c4376d980061af5c7a6d8345006d6b5167bd1f00fc17b8ddb',\n voting_escrow_id: '0x9081c8044719135da4ff2d52907fcd40c19e2a40750cbba4c1d6a59610ae1446',\n reward_distributor_id: '0xdf213d8e0ca49c8f4a508e7d3b3a6983c4aafd639f7c99479fc75fb4451d752e',\n distribution_cfg: '0x94e23846c975e2faf89a61bfc2b10ad64decab9069eb1f9fc39752b010868c74',\n magma_token: '0x45ac2371c33ca0df8dc784d62c8ce5126d42edd8c56820396524dff2ae0619b1::magma_token::MAGMA_TOKEN',\n minter_id: '0x89435d6b2a510ba50ca23303f10e91ec058f138a88f69a43fe03cd22edb214c5',\n },\n dlmmConfig: {\n factory: '',\n },\n}\n\nexport const clmmTestnet: SdkOptions = {\n fullRpcUrl: getFullnodeUrl('testnet'),\n magma_config: {\n package_id: '',\n published_at: '',\n config: SDKConfig.magmaConfig,\n },\n ve33: {\n package_id: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n published_at: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n config: SDKConfig.ve33Config,\n },\n clmm_pool: {\n package_id: '0xca1b84a430d03e22dae08a7273c8e9dcfdb40b7f559574105f008600eeb7b4bd',\n published_at: '0xca1b84a430d03e22dae08a7273c8e9dcfdb40b7f559574105f008600eeb7b4bd',\n config: SDKConfig.clmmConfig,\n },\n dlmm_pool: {\n package_id: '',\n published_at: '',\n config: SDKConfig.dlmmConfig,\n },\n distribution: {\n package_id: '0x45ac2371c33ca0df8dc784d62c8ce5126d42edd8c56820396524dff2ae0619b1',\n published_at: '0x45ac2371c33ca0df8dc784d62c8ce5126d42edd8c56820396524dff2ae0619b1',\n },\n integrate: {\n package_id: '0x975672d26fc9ba026a35f2001951fbcf5e37e75aca41db7c762d61b4e1e64986',\n published_at: '0x975672d26fc9ba026a35f2001951fbcf5e37e75aca41db7c762d61b4e1e64986',\n },\n\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n faucet: {\n package_id: '0x26b3bc67befc214058ca78ea9a2690298d731a2d4309485ec3d40198063c4abc',\n published_at: '0x26b3bc67befc214058ca78ea9a2690298d731a2d4309485ec3d40198063c4abc',\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0x56d90d0c055edb534b11e7548270bb458fd47c69b77bf40c14d5eb00e6e6cf64',\n published_at: '0x56d90d0c055edb534b11e7548270bb458fd47c69b77bf40c14d5eb00e6e6cf64',\n },\n aggregatorUrl: 'https://testnet.magmafinance.io/api/router',\n swapCountUrl: 'https://api-sui.devmagma.com/v2/sui/swap/count',\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, simulationAccount?: string): MagmaClmmSDK {\n if (fullNodeUrl) {\n clmmTestnet.fullRpcUrl = fullNodeUrl\n }\n if (simulationAccount) {\n clmmTestnet.simulationAccount.address = simulationAccount\n }\n return new MagmaClmmSDK(clmmTestnet)\n}\n","import MagmaClmmSDK from '../main'\nimport { initMainnetSDK } from './mainnet'\nimport { initTestnetSDK } from './testnet'\n\ninterface InitMagmaSDKOptions {\n network: 'mainnet' | 'testnet'\n fullNodeUrl?: string\n simulationAccount?: string\n}\n\n/**\n * Helper function to initialize the Magma 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 simulationAccount - The simulation account address to use. If not provided,\n * the default simulation account `0x0000000000000000000000000000000000000000000000000000000000000000` will be used.\n * If you use the `preswap` method, you should set a simulation account and ensure that this address has sufficient input coins.\n * @returns The initialized Magma SDK.\n */\nexport function initMagmaSDK(options: InitMagmaSDKOptions): MagmaClmmSDK {\n const { network, fullNodeUrl, simulationAccount } = options\n return network === 'mainnet' ? initMainnetSDK(fullNodeUrl, simulationAccount) : initTestnetSDK(fullNodeUrl, simulationAccount)\n}\n","import { MagmaClmmSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './math'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport { MagmaClmmSDK, SdkOptions }\nexport default MagmaClmmSDK\n"],"mappings":"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","names":["Transaction","BN","BN","BN","BN","ClmmPositionStatus","SwapDirection","BN","Decimal","BN","BN","BN","Decimal","BN","BN","BN","BN","structTag","BN","BN","BN","Decimal","totalWeightX","totalWeightY","kx","amountY","ky","amountX","k","amount","StrategyType","weights","Decimal","Decimal","Decimal","BN","AmountSpecified","PositionStatus","BN","SplitUnit","BN","Decimal","get_price_x128_from_real_id","BN","BN","BN","BN","Decimal","Decimal","BN","selectedCoinsResult","i","Transaction","Transaction","BN","Transaction","BN","Transaction","Transaction","params","item","object","BN","Transaction","Transaction","BN","BN","Transaction","BN","Transaction","BN","Transaction","paths","preSwapResult","onePath","BN","swapWithRouterParams","result","Transaction","BN","Decimal","Transaction","Decimal","Transaction","BN","Transaction","Transaction","item","Transaction","normalizeSuiObjectId","Transaction","item","normalizeSuiObjectId","BN","Decimal","Decimal","BN","normalizeSuiObjectId","Base64","normalizeSuiObjectId","Base64","Transaction","Transaction","Transaction","get_price_x128_from_real_id","get_real_id_from_price_x128","Decimal","Transaction","Decimal","get_price_x128_from_real_id","get_real_id_from_price_x128","pool","getFullnodeUrl","SDKConfig","getFullnodeUrl"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/poolModule.ts","../src/utils/cachedContent.ts","../src/utils/common.ts","../src/types/clmmpool.ts","../src/math/utils.ts","../src/utils/decimal.ts","../src/errors/errors.ts","../src/types/constants.ts","../src/types/sui.ts","../src/types/clmm_type.ts","../src/types/liquidity.ts","../src/math/apr.ts","../src/math/tick.ts","../src/math/clmm.ts","../src/math/swap.ts","../src/utils/contracts.ts","../src/utils/hex.ts","../src/math/CoinAssist.ts","../src/math/collect-fees.ts","../src/math/dlmmWeightToAmounts.ts","../src/math/dlmmStrategy.ts","../src/math/LiquidityHelper.ts","../src/utils/numbers.ts","../src/math/percentage.ts","../src/math/position.ts","../src/math/SplitSwap.ts","../src/math/bin.ts","../src/utils/objects.ts","../src/utils/tick.ts","../src/utils/transaction-util.ts","../src/utils/tx-block.ts","../src/utils/deepbook-utils.ts","../src/modules/positionModule.ts","../src/modules/rewarderModule.ts","../src/modules/routerModule.ts","../src/modules/swapModule.ts","../src/modules/lockModule.ts","../src/modules/tokenModule.ts","../src/modules/routerModuleV2.ts","../src/modules/configModule.ts","../src/modules/rpcModule.ts","../src/modules/gaugeModule.ts","../src/modules/dlmm.ts","../src/sdk.ts","../src/config/mainnet.ts","../src/main.ts","../src/config/testnet.ts","../src/config/config.ts","../src/index.ts"],"sourcesContent":["import { DynamicFieldPage, SuiObjectResponse, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport { normalizeSuiAddress } from '@mysten/sui/utils'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { CachedContent, cacheTime24h, cacheTime5min, checkInvalidSuiAddress, getFutureTime } from '../utils'\nimport {\n CreatePoolAddLiquidityParams,\n CreatePoolParams,\n FetchParams,\n ClmmConfig,\n Pool,\n PoolImmutables,\n Position,\n PositionReward,\n getPackagerConfigs,\n CoinAsset,\n} from '../types'\nimport { TransactionUtil } from '../utils/transaction-util'\nimport { tickScore } from '../math'\nimport { asUintN, buildPool, buildPositionReward, buildTickData, buildTickDataByEvent } from '../utils/common'\nimport { extractStructTagFromType, isSortedSymbols } from '../utils/contracts'\nimport { TickData } from '../types/clmmpool'\nimport {\n ClmmFetcherModule,\n ClmmIntegratePoolModule,\n ClmmPartnerModule,\n CLOCK_ADDRESS,\n DataPage,\n PaginationArgs,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport {\n ClmmpoolsError,\n ConfigErrorCode,\n PartnerErrorCode,\n PoolErrorCode,\n PositionErrorCode,\n RouterErrorCode,\n UtilsErrorCode,\n} from '../errors/errors'\n\ntype GetTickParams = {\n start: number[]\n limit: number\n} & FetchParams\n\n/**\n * Helper class to help interact with clmm pools with a pool router interface.\n */\nexport class PoolModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Gets a list of positions for the given positionHandle.\n * @param {string} positionHandle The handle for the position.\n * @returns {DataPage<Position>} A promise that resolves to an array of Position objects.\n */\n async getPositionList(positionHandle: string, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<Position>> {\n const dataPage: DataPage<Position> = {\n data: [],\n hasNextPage: true,\n }\n const objects = await this._sdk.fullClient.getDynamicFieldsByPage(positionHandle, paginationArgs)\n\n dataPage.hasNextPage = objects.hasNextPage\n dataPage.nextCursor = objects.nextCursor\n\n const positionObjectIDs = objects.data.map((item: any) => {\n if (item.error != null) {\n throw new ClmmpoolsError(\n `when getPositionList get position objects error: ${item.error}, please check the rpc, contracts address config and position id.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n return item.name.value\n })\n\n const allPosition: Position[] = await this._sdk.Position.getSipmlePositionList(positionObjectIDs)\n dataPage.data = allPosition\n return dataPage\n }\n\n /**\n * Gets a list of pool immutables.\n * @param {string[]} assignPoolIDs An array of pool IDs to get.\n * @param {number} offset The offset to start at.\n * @param {number} limit The number of pools to get.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n * @returns {Promise<PoolImmutables[]>} array of PoolImmutable objects.\n */\n async getPoolImmutables(assignPoolIDs: string[] = [], offset = 0, limit = 100, forceRefresh = false): Promise<PoolImmutables[]> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const cacheKey = `${package_id}_getInitPoolEvent`\n const cacheData = this.getCache<PoolImmutables[]>(cacheKey, forceRefresh)\n\n const allPools: PoolImmutables[] = []\n const filterPools: PoolImmutables[] = []\n\n if (cacheData !== undefined) {\n allPools.push(...cacheData)\n }\n\n if (allPools.length === 0) {\n try {\n const objects = await this._sdk.fullClient.queryEventsByPage({ MoveEventType: `${package_id}::factory::CreatePoolEvent` })\n\n objects.data.forEach((object: any) => {\n const fields = object.parsedJson\n if (fields) {\n allPools.push({\n poolAddress: fields.pool_id,\n tickSpacing: fields.tick_spacing,\n coinTypeA: extractStructTagFromType(fields.coin_type_a).full_address,\n coinTypeB: extractStructTagFromType(fields.coin_type_b).full_address,\n })\n }\n })\n this.updateCache(cacheKey, allPools, cacheTime24h)\n } catch (error) {\n console.log('getPoolImmutables', error)\n }\n }\n\n const hasAssignPools = assignPoolIDs.length > 0\n for (let index = 0; index < allPools.length; index += 1) {\n const item = allPools[index]\n if (hasAssignPools && !assignPoolIDs.includes(item.poolAddress)) continue\n if (!hasAssignPools && (index < offset || index >= offset + limit)) continue\n filterPools.push(item)\n }\n return filterPools\n }\n\n /**\n * Gets a list of pools.\n * @param {string[]} assignPools An array of pool IDs to get.\n * @param {number} offset The offset to start at.\n * @param {number} limit The number of pools to get.\n * @returns {Promise<Pool[]>} array of Pool objects.\n */\n async getPools(assignPools: string[] = [], offset = 0, limit = 100): Promise<Pool[]> {\n const allPool: Pool[] = []\n let poolObjectIds: string[] = []\n\n if (assignPools.length > 0) {\n poolObjectIds = [...assignPools]\n } else {\n const poolImmutables = await this.getPoolImmutables([], offset, limit, false)\n poolImmutables.forEach((item) => poolObjectIds.push(item.poolAddress))\n }\n\n const objectDataResponses = await this._sdk.fullClient.batchGetObjects(poolObjectIds, {\n showContent: true,\n showType: true,\n })\n\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPools error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n\n const pool = buildPool(suiObj)\n allPool.push(pool)\n const cacheKey = `${pool.poolAddress}_getPoolObject`\n this.updateCache(cacheKey, pool, cacheTime24h)\n }\n return allPool\n }\n\n /**\n * Gets a list of pool immutables.\n * @param {PaginationArgs} paginationArgs The cursor and limit to start at.\n * @returns {Promise<DataPage<PoolImmutables>>} Array of PoolImmutable objects.\n */\n async getPoolImmutablesWithPage(paginationArgs: PaginationArgs = 'all', forceRefresh = false): Promise<DataPage<PoolImmutables>> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const allPools: PoolImmutables[] = []\n const dataPage: DataPage<PoolImmutables> = {\n data: [],\n hasNextPage: false,\n }\n\n const queryAll = paginationArgs === 'all'\n const cacheAllKey = `${package_id}_getPoolImmutables`\n if (queryAll) {\n const cacheDate = this.getCache<PoolImmutables[]>(cacheAllKey, forceRefresh)\n if (cacheDate) {\n allPools.push(...cacheDate)\n }\n }\n if (allPools.length === 0) {\n try {\n const moveEventType = `${package_id}::factory::CreatePoolEvent`\n const objects = await this._sdk.fullClient.queryEventsByPage({ MoveEventType: moveEventType }, paginationArgs)\n dataPage.hasNextPage = objects.hasNextPage\n dataPage.nextCursor = objects.nextCursor\n objects.data.forEach((object: any) => {\n const fields = object.parsedJson\n if (fields) {\n const poolImmutables = {\n poolAddress: fields.pool_id,\n tickSpacing: fields.tick_spacing,\n coinTypeA: extractStructTagFromType(fields.coin_type_a).full_address,\n coinTypeB: extractStructTagFromType(fields.coin_type_b).full_address,\n }\n allPools.push(poolImmutables)\n }\n })\n } catch (error) {\n console.log('getPoolImmutables', error)\n }\n }\n dataPage.data = allPools\n if (queryAll) {\n this.updateCache(`${package_id}_getPoolImmutables`, allPools, cacheTime24h)\n }\n return dataPage\n }\n\n /**\n * Gets a list of pools.\n * @param {string[]} assignPools An array of pool IDs to get.\n * @param {PaginationArgs} paginationArgs The cursor and limit to start at.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n * @returns {Promise<Pool[]>} An array of Pool objects.\n */\n async getPoolsWithPage(assignPools: string[] = [], paginationArgs: PaginationArgs = 'all', forceRefresh = false): Promise<Pool[]> {\n const allPool: Pool[] = []\n let poolObjectIds: string[] = []\n\n if (assignPools.length > 0) {\n poolObjectIds = [...assignPools]\n } else {\n const poolImmutables = (await this.getPoolImmutablesWithPage(paginationArgs, forceRefresh)).data\n poolImmutables.forEach((item) => poolObjectIds.push(item.poolAddress))\n }\n\n const objectDataResponses: any[] = await this._sdk.fullClient.batchGetObjects(poolObjectIds, {\n showContent: true,\n showType: true,\n })\n\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPoolWithPages error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n const pool = buildPool(suiObj)\n allPool.push(pool)\n const cacheKey = `${pool.poolAddress}_getPoolObject`\n this.updateCache(cacheKey, pool, cacheTime24h)\n }\n return allPool\n }\n\n /**\n * Gets a pool by its object ID.\n * @param {string} poolID The object ID of the pool to get.\n * @param {true} forceRefresh Whether to force a refresh of the cache.\n * @returns {Promise<Pool>} A promise that resolves to a Pool object.\n */\n async getPool(poolID: string, forceRefresh = true): Promise<Pool> {\n const cacheKey = `${poolID}_getPoolObject`\n const cacheData = this.getCache<Pool>(cacheKey, forceRefresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const object = (await this._sdk.fullClient.getObject({\n id: poolID,\n options: {\n showType: true,\n showContent: true,\n },\n })) as SuiObjectResponse\n\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPool error code: ${object.error?.code ?? 'unknown error'}, please check config and object id`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n const pool = buildPool(object)\n this.updateCache(cacheKey, pool)\n return pool\n }\n\n async getPoolByCoins(coins: string[], feeRate?: number): Promise<Pool[]> {\n if (coins.length === 0) {\n return []\n }\n\n const url = this._sdk.sdkOptions.swapCountUrl!\n const response = await fetch(url)\n let json\n try {\n json = await response.json()\n } catch (e) {\n throw new ClmmpoolsError(`Failed tp [arse response from ${url}].`, RouterErrorCode.InvalidSwapCountUrl)\n }\n const pools = json.data.pools\n if (!pools || pools.length === 0) {\n throw new ClmmpoolsError(`Failed tp [arse response from ${url}].`, PoolErrorCode.PoolsNotFound)\n }\n\n const poolAddresses = []\n for (const pool of pools) {\n if (coins.includes(pool.coin_a_address) && coins.includes(pool.coin_b_address)) {\n if (feeRate != null) {\n if (pool.object.feeRate === feeRate) {\n poolAddresses.push(pool.address)\n }\n } else {\n poolAddresses.push(pool.address)\n }\n }\n }\n\n if (poolAddresses.length > 0) {\n const poolObjects = await this.getPools(poolAddresses)\n return poolObjects\n }\n\n return []\n }\n\n /**\n * @deprecated\n * Creates a transaction payload for creating multiple pools.\n * @param {CreatePoolParams[]} paramss The parameters for the pools.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n async creatPoolsTransactionPayload(paramss: CreatePoolParams[]): Promise<Transaction> {\n for (const params of paramss) {\n if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n const swpaCoinTypeB = params.coinTypeB\n params.coinTypeB = params.coinTypeA\n params.coinTypeA = swpaCoinTypeB\n }\n }\n const payload = await this.creatPool(paramss)\n return payload\n }\n\n /**\n * @deprecated rename to createPoolTransactionPayload\n * Create a pool of clmmpool protocol. The pool is identified by (CoinTypeA, CoinTypeB, tick_spacing).\n * @param {CreatePoolParams | CreatePoolAddLiquidityParams} params\n * @returns {Promise<Transaction>}\n */\n async creatPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n const swpaCoinTypeB = params.coinTypeB\n params.coinTypeB = params.coinTypeA\n params.coinTypeA = swpaCoinTypeB\n\n const metadataB = params.metadata_b\n params.metadata_b = params.metadata_a\n params.metadata_a = metadataB\n }\n return await this.createPoolAndAddLiquidity(params)\n }\n\n /**\n * Create a pool of clmmpool protocol. The pool is identified by (CoinTypeA, CoinTypeB, tick_spacing).\n * @param {CreatePoolParams | CreatePoolAddLiquidityParams} params\n * @returns {Promise<Transaction>}\n */\n async createPoolTransactionPayload(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n if (isSortedSymbols(normalizeSuiAddress(params.coinTypeA), normalizeSuiAddress(params.coinTypeB))) {\n const swpaCoinTypeB = params.coinTypeB\n params.coinTypeB = params.coinTypeA\n params.coinTypeA = swpaCoinTypeB\n const metadataB = params.metadata_b\n params.metadata_b = params.metadata_a\n params.metadata_a = metadataB\n }\n return await this.createPoolAndAddLiquidity(params)\n }\n\n /**\n * Gets the ClmmConfig object for the given package object ID.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache.\n * @returns the ClmmConfig object.\n */\n async getClmmConfigs(forceRefresh = false): Promise<ClmmConfig> {\n const { package_id } = this._sdk.sdkOptions.clmm_pool\n const cacheKey = `${package_id}_getInitEvent`\n const cacheData = this.getCache<ClmmConfig>(cacheKey, forceRefresh)\n if (cacheData !== undefined) {\n return cacheData\n }\n const packageObject = await this._sdk.fullClient.getObject({\n id: package_id,\n options: { showPreviousTransaction: true },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n\n const objects = (await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })).data\n\n const clmmConfig: ClmmConfig = {\n pools_id: '',\n global_config_id: '',\n global_vault_id: '',\n admin_cap_id: '',\n }\n\n if (objects.length > 0) {\n objects.forEach((item: any) => {\n const fields = item.parsedJson as any\n\n if (item.type) {\n switch (extractStructTagFromType(item.type).full_address) {\n case `${package_id}::config::InitConfigEvent`:\n clmmConfig.global_config_id = fields.global_config_id\n clmmConfig.admin_cap_id = fields.admin_cap_id\n break\n case `${package_id}::factory::InitFactoryEvent`:\n clmmConfig.pools_id = fields.pools_id\n break\n case `${package_id}::rewarder::RewarderInitEvent`:\n clmmConfig.global_vault_id = fields.global_vault_id\n break\n case `${package_id}::partner::InitPartnerEvent`:\n clmmConfig.partners_id = fields.partners_id\n break\n default:\n break\n }\n }\n })\n this.updateCache(cacheKey, clmmConfig, cacheTime24h)\n return clmmConfig\n }\n\n return clmmConfig\n }\n\n /**\n * Gets the SUI transaction response for a given transaction digest.\n * @param digest - The digest of the transaction for which the SUI transaction response is requested.\n * @param forceRefresh - A boolean flag indicating whether to force a refresh of the response.\n * @returns A Promise that resolves with the SUI transaction block response or null if the response is not available.\n */\n async getSuiTransactionResponse(digest: string, forceRefresh = false): Promise<SuiTransactionBlockResponse | null> {\n const cacheKey = `${digest}_getSuiTransactionResponse`\n const cacheData = this.getCache<SuiTransactionBlockResponse>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n let objects\n try {\n objects = (await this._sdk.fullClient.getTransactionBlock({\n digest,\n options: {\n showEvents: true,\n showEffects: true,\n showBalanceChanges: true,\n showInput: true,\n showObjectChanges: true,\n },\n })) as SuiTransactionBlockResponse\n } catch (error) {\n objects = (await this._sdk.fullClient.getTransactionBlock({\n digest,\n options: {\n showEvents: true,\n showEffects: true,\n },\n })) as SuiTransactionBlockResponse\n }\n\n this.updateCache(cacheKey, objects, cacheTime24h)\n return objects\n }\n\n /**\n * @deprecated\n * Create pool internal.\n * @param {CreatePoolParams[]}params The parameters for the pools.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n private async creatPool(params: CreatePoolParams[]): Promise<Transaction> {\n const tx = new Transaction()\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const eventConfig = getPackagerConfigs(clmm_pool)\n const globalPauseStatusObjectId = eventConfig.global_config_id\n const poolsId = eventConfig.pools_id\n\n params.forEach((params) => {\n const args = [\n tx.object(globalPauseStatusObjectId),\n tx.object(poolsId),\n tx.pure.u32(params.tick_spacing),\n tx.pure.u128(params.initialize_sqrt_price),\n tx.pure.string(params.uri),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::create_pool`,\n typeArguments: [params.coinTypeA, params.coinTypeB],\n arguments: args,\n })\n })\n\n return tx\n }\n\n /**\n * Create pool and add liquidity internal. It will call create_pool_with_liquidity function.\n * @param {CreatePoolAddLiquidityParams}params The parameters for the create and liquidity.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n private async createPoolAndAddLiquidity(params: CreatePoolAddLiquidityParams): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const tx = new Transaction()\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const eventConfig = getPackagerConfigs(clmm_pool)\n const globalPauseStatusObjectId = eventConfig.global_config_id\n const poolsId = eventConfig.pools_id\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinAInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_a), params.coinTypeA, false, true)\n const primaryCoinBInputsR = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount_b), params.coinTypeB, false, true)\n\n const args = [\n tx.object(globalPauseStatusObjectId),\n tx.object(poolsId),\n tx.pure.u32(params.tick_spacing),\n tx.pure.u128(params.initialize_sqrt_price),\n tx.pure.string(params.uri),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputsR.targetCoin,\n primaryCoinBInputsR.targetCoin,\n tx.object(params.metadata_a),\n tx.object(params.metadata_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::pool_creator_v2::create_pool_v2`,\n typeArguments: [params.coinTypeA, params.coinTypeB],\n arguments: args,\n })\n\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 ticks from the exchange.\n * @param {FetchParams} params The parameters for the fetch.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n async fetchTicks(params: FetchParams): Promise<TickData[]> {\n let ticks: TickData[] = []\n let start: number[] = []\n const limit = 512\n\n while (true) {\n const data = await this.getTicks({\n pool_id: params.pool_id,\n coinTypeA: params.coinTypeA,\n coinTypeB: params.coinTypeB,\n start,\n limit,\n })\n ticks = [...ticks, ...data]\n if (data.length < limit) {\n break\n }\n start = [Number(asUintN(BigInt(data[data.length - 1].index)))]\n }\n return ticks\n }\n\n /**\n * Fetches ticks from the exchange using the simulation exec tx.\n * @param {GetTickParams} params The parameters for the fetch.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n private async getTicks(params: GetTickParams): Promise<TickData[]> {\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const ticks: TickData[] = []\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const tx = new Transaction()\n\n const start = tx.makeMoveVec({\n elements: params.start.map((index) => tx.pure.u32(index)),\n type: 'u32',\n })\n\n const args = [tx.object(params.pool_id), start, tx.pure.u64(params.limit.toString())]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_ticks`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `getTicks error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `FetchTicksResultEvent`) {\n item.parsedJson.ticks.forEach((tick: any) => {\n ticks.push(buildTickDataByEvent(tick))\n })\n }\n })\n return ticks\n }\n\n /**\n * Fetches a list of position rewards from the exchange.\n * @param {FetchParams} params The parameters for the fetch.\n * @returns {Promise<PositionReward[]>} A promise that resolves to an array of position rewards.\n */\n async fetchPositionRewardList(params: FetchParams): Promise<PositionReward[]> {\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const allPosition: PositionReward[] = []\n let start: SuiObjectIdType[] = []\n const limit = 512\n\n while (true) {\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const tx = new Transaction()\n\n const vecStart = tx.makeMoveVec({\n elements: start.map((id) => tx.pure.address(id)),\n type: undefined,\n })\n const args = [tx.object(params.pool_id), vecStart, tx.pure.u64(limit)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_positions`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `fetch position reward error code: ${simulateRes.error ?? 'unknown error'}, please check config and tick object ids`,\n PositionErrorCode.InvalidPositionRewardObject\n )\n }\n\n const positionRewards: PositionReward[] = []\n simulateRes?.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `FetchPositionsEvent`) {\n item.parsedJson.positions.forEach((item: any) => {\n const positionReward = buildPositionReward(item)\n positionRewards.push(positionReward)\n })\n }\n })\n\n allPosition.push(...positionRewards)\n\n if (positionRewards.length < limit) {\n break\n } else {\n start = [positionRewards[positionRewards.length - 1].pos_object_id]\n }\n }\n\n return allPosition\n }\n\n /**\n * Fetches ticks from the fullnode using the RPC API.\n * @param {string} tickHandle The handle for the tick. Get tick handle from `sdk.Pool.getPool()`\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n async fetchTicksByRpc(tickHandle: string): Promise<TickData[]> {\n let allTickData: TickData[] = []\n let nextCursor: string | null = null\n const limit = 50\n while (true) {\n const allTickId: SuiObjectIdType[] = []\n const idRes: DynamicFieldPage = await this.sdk.fullClient.getDynamicFields({\n parentId: tickHandle,\n cursor: nextCursor,\n limit,\n })\n nextCursor = idRes.nextCursor\n idRes.data.forEach((item) => {\n if (extractStructTagFromType(item.objectType).module === 'skip_list') {\n allTickId.push(item.objectId)\n }\n })\n\n allTickData = [...allTickData, ...(await this.getTicksByRpc(allTickId))]\n\n if (!idRes.hasNextPage) {\n break\n }\n }\n\n return allTickData\n }\n\n /**\n * Get ticks by tick object ids.\n * @param {string} tickObjectId The object ids of the ticks.\n * @returns {Promise<TickData[]>} A promise that resolves to an array of tick data.\n */\n private async getTicksByRpc(tickObjectId: string[]): Promise<TickData[]> {\n const ticks: TickData[] = []\n const objectDataResponses = await this.sdk.fullClient.batchGetObjects(tickObjectId, { showContent: true, showType: true })\n for (const suiObj of objectDataResponses) {\n if (suiObj.error != null || suiObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getTicksByRpc error code: ${suiObj.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n\n const tick = buildTickData(suiObj)\n if (tick != null) {\n ticks.push(tick)\n }\n }\n return ticks\n }\n\n /**\n * Gets the tick data for the given tick index.\n * @param {string} tickHandle The handle for the tick.\n * @param {number} tickIndex The index of the tick.\n * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n */\n async getTickDataByIndex(tickHandle: string, tickIndex: number): Promise<TickData> {\n const name = { type: 'u64', value: asUintN(BigInt(tickScore(tickIndex).toString())).toString() }\n const res = await this.sdk.fullClient.getDynamicFieldObject({\n parentId: tickHandle,\n name,\n })\n\n if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`get tick by index: ${tickIndex} error: ${res.error}`, PoolErrorCode.InvalidTickIndex)\n }\n\n return buildTickData(res)\n }\n\n /**\n * Gets the tick data for the given object ID.\n * @param {string} tickId The object ID of the tick.\n * @returns {Promise<TickData | null>} A promise that resolves to the tick data.\n */\n async getTickDataByObjectId(tickId: string): Promise<TickData | null> {\n const res = await this.sdk.fullClient.getObject({\n id: tickId,\n options: { showContent: true },\n })\n\n if (res.error != null || res.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getTicksByRpc error code: ${res.error?.code ?? 'unknown error'}, please check config and tick object ids`,\n PoolErrorCode.InvalidTickObjectId\n )\n }\n return buildTickData(res)\n }\n\n /**\n * Get partner ref fee amount\n * @param {string}partner Partner object id\n * @returns {Promise<CoinAsset[]>} A promise that resolves to an array of coin asset.\n */\n async getPartnerRefFeeAmount(partner: string, showDisplay = true): Promise<CoinAsset[]> {\n const objectDataResponses = await this._sdk.fullClient.batchGetObjects([partner], {\n showOwner: true,\n showContent: true,\n showDisplay,\n showType: true,\n })\n\n if (objectDataResponses[0].data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `get partner by object id: ${partner} error: ${objectDataResponses[0].error}`,\n PartnerErrorCode.NotFoundPartnerObject\n )\n }\n\n const balance = (objectDataResponses[0].data.content.fields as any).balances\n\n const objects = await this._sdk.fullClient.getDynamicFieldsByPage(balance.fields.id.id)\n\n const coins: string[] = []\n objects.data.forEach((object) => {\n if (object.objectId != null) {\n coins.push(object.objectId)\n }\n })\n\n const refFee: CoinAsset[] = []\n const object = await this._sdk.fullClient.batchGetObjects(coins, {\n showOwner: true,\n showContent: true,\n showDisplay,\n showType: true,\n })\n object.forEach((info: any) => {\n if (info.error != null || info.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `get coin by object id: ${info.data.objectId} error: ${info.error}`,\n PartnerErrorCode.InvalidParnterRefFeeFields\n )\n }\n\n const coinAsset: CoinAsset = {\n coinAddress: info.data.content.fields.name,\n coinObjectId: info.data.objectId,\n balance: BigInt(info.data.content.fields.value),\n }\n refFee.push(coinAsset)\n })\n\n return refFee\n }\n\n /**\n * Claim partner ref fee.\n * @param {string} partnerCap partner cap id.\n * @param {string} partner partner id.\n * @returns {Promise<Transaction>} A promise that resolves to the transaction payload.\n */\n async claimPartnerRefFeePayload(partnerCap: string, partner: string, coinType: string): Promise<Transaction> {\n const tx = new Transaction()\n const { clmm_pool } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n const typeArguments = [coinType]\n\n const args = [tx.object(global_config_id), tx.object(partnerCap), tx.object(partner)]\n\n tx.moveCall({\n target: `${clmm_pool.published_at}::${ClmmPartnerModule}::claim_ref_fee`,\n arguments: args,\n typeArguments,\n })\n\n return tx\n }\n\n /**\n * Updates the cache for the given key.\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import { SuiResource } from '../types/sui'\n\nexport const cacheTime5min = 5 * 60 * 1000\nexport const cacheTime24h = 24 * 60 * 60 * 1000\n\nexport function getFutureTime(interval: number) {\n return Date.parse(new Date().toString()) + interval\n}\n\n/**\n * Defines the structure of a CachedContent object, used for caching resources in memory.\n */\nexport class CachedContent {\n overdueTime: number\n\n value: SuiResource | null\n\n constructor(value: SuiResource | null, overdueTime = 0) {\n this.overdueTime = overdueTime\n this.value = value\n }\n\n isValid(): boolean {\n if (this.value === null) {\n return false\n }\n if (this.overdueTime === 0) {\n return true\n }\n if (Date.parse(new Date().toString()) > this.overdueTime) {\n return false\n }\n return true\n }\n}\n","import BN from 'bn.js'\nimport { fromB64, fromHEX } from '@mysten/bcs'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\nimport { SuiObjectResponse } from '@mysten/sui/client'\nimport { ClmmPositionStatus, Pool, Position, PositionReward, Rewarder } from '../types'\nimport { MathUtil } from '../math'\nimport { NFT } from '../types/sui'\nimport { extractStructTagFromType } from './contracts'\nimport { TickData } from '../types/clmmpool'\nimport { d, decimalsMultiplier } from './numbers'\nimport {\n getMoveObjectType,\n getObjectDeletedResponse,\n getObjectDisplay,\n getObjectFields,\n getObjectId,\n getObjectNotExistsResponse,\n getObjectOwner,\n} from './objects'\nimport { ClmmpoolsError, PoolErrorCode, PositionErrorCode } from '../errors/errors'\n\n/**\n * Converts an amount to a decimal value, based on the number of decimals specified.\n * @param {number | string} amount - The amount to convert to decimal.\n * @param {number | string} decimals - The number of decimals to use in the conversion.\n * @returns {number} - Returns the converted amount as a number.\n */\nexport function toDecimalsAmount(amount: number | string, decimals: number | string): number {\n const mul = decimalsMultiplier(d(decimals))\n\n return Number(d(amount).mul(mul))\n}\n\n/**\n * Converts a bigint to an unsigned integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {string} - Returns the converted unsigned integer as a string.\n */\nexport function asUintN(int: bigint, bits = 32) {\n return BigInt.asUintN(bits, BigInt(int)).toString()\n}\n\n/**\n * Converts a bigint to a signed integer of the specified number of bits.\n * @param {bigint} int - The bigint to convert.\n * @param {number} bits - The number of bits to use in the conversion. Defaults to 32 bits.\n * @returns {number} - Returns the converted signed integer as a number.\n */\nexport function asIntN(int: bigint, bits = 32) {\n return Number(BigInt.asIntN(bits, BigInt(int)))\n}\n\n/**\n * Converts an amount in decimals to its corresponding numerical value.\n * @param {number|string} amount - The amount to convert.\n * @param {number|string} decimals - The number of decimal places used in the amount.\n * @returns {number} - Returns the converted numerical value.\n */\nexport function fromDecimalsAmount(amount: number | string, decimals: number | string): number {\n const mul = decimalsMultiplier(d(decimals))\n\n return Number(d(amount).div(mul))\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to an Ed25519 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Ed25519 key pair.\n */\nexport function secretKeyToEd25519Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Ed25519Keypair {\n if (secretKey instanceof Uint8Array) {\n const key = Buffer.from(secretKey)\n return Ed25519Keypair.fromSecretKey(new Uint8Array(key))\n }\n\n const hexKey = ecode === 'hex' ? fromHEX(secretKey) : fromB64(secretKey)\n return Ed25519Keypair.fromSecretKey(hexKey)\n}\n\n/**\n * Converts a secret key in string or Uint8Array format to a Secp256k1 key pair.\n * @param {string|Uint8Array} secretKey - The secret key to convert.\n * @param {string} ecode - The encoding of the secret key ('hex' or 'base64'). Defaults to 'hex'.\n * @returns {Ed25519Keypair} - Returns the Secp256k1 key pair.\n */\nexport function secretKeyToSecp256k1Keypair(secretKey: string | Uint8Array, ecode: 'hex' | 'base64' = 'hex'): Secp256k1Keypair {\n if (secretKey instanceof Uint8Array) {\n const key = Buffer.from(secretKey)\n return Secp256k1Keypair.fromSecretKey(new Uint8Array(key))\n }\n const hexKey = ecode === 'hex' ? fromHEX(secretKey) : fromB64(secretKey)\n return Secp256k1Keypair.fromSecretKey(hexKey)\n}\n\n/**\n * Builds a pool name based on two coin types and tick spacing.\n * @param {string} coin_type_a - The type of the first coin.\n * @param {string} coin_type_b - The type of the second coin.\n * @param {string} tick_spacing - The tick spacing of the pool.\n * @returns {string} - The name of the pool.\n */\nfunction buildPoolName(coin_type_a: string, coin_type_b: string, tick_spacing: string) {\n const coinNameA = extractStructTagFromType(coin_type_a).name\n const coinNameB = extractStructTagFromType(coin_type_b).name\n return `${coinNameA}-${coinNameB}[${tick_spacing}]`\n}\n\n/**\n * Builds a Pool object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} objects - The SuiObjectResponse containing information about the pool.\n * @returns {Pool} - The built Pool object.\n */\nexport function buildPool(objects: SuiObjectResponse): Pool {\n const type = getMoveObjectType(objects) as string\n const formatType = extractStructTagFromType(type)\n const fields = getObjectFields(objects)\n if (fields == null) {\n throw new ClmmpoolsError(`Pool id ${getObjectId(objects)} not exists.`, PoolErrorCode.InvalidPoolObject)\n }\n\n const rewarders: Rewarder[] = []\n fields.rewarder_manager.fields.rewarders.forEach((item: any) => {\n const { emissions_per_second } = item.fields\n const emissionSeconds = MathUtil.fromX64(new BN(emissions_per_second))\n const emissionsEveryDay = Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24)\n\n rewarders.push({\n emissions_per_second,\n coinAddress: extractStructTagFromType(item.fields.reward_coin.fields.name).source_address,\n growth_global: item.fields.growth_global,\n emissionsEveryDay,\n })\n })\n\n const pool: Pool = {\n poolAddress: getObjectId(objects),\n poolType: type,\n coinTypeA: formatType.type_arguments[0],\n coinTypeB: formatType.type_arguments[1],\n coinAmountA: fields.coin_a,\n coinAmountB: fields.coin_b,\n current_sqrt_price: fields.current_sqrt_price,\n current_tick_index: asIntN(BigInt(fields.current_tick_index.fields.bits)),\n fee_growth_global_a: fields.fee_growth_global_a,\n fee_growth_global_b: fields.fee_growth_global_b,\n fee_protocol_coin_a: fields.fee_protocol_coin_a,\n fee_protocol_coin_b: fields.fee_protocol_coin_b,\n fee_rate: fields.fee_rate,\n is_pause: fields.is_pause,\n liquidity: fields.liquidity,\n position_manager: {\n positions_handle: fields.position_manager.fields.positions.fields.id.id,\n size: fields.position_manager.fields.positions.fields.size,\n },\n rewarder_infos: rewarders,\n rewarder_last_updated_time: fields.rewarder_manager.fields.last_updated_time,\n tickSpacing: fields.tick_spacing,\n ticks_handle: fields.tick_manager.fields.ticks.fields.id.id,\n uri: fields.url,\n index: Number(fields.index),\n name: '',\n }\n pool.name = buildPoolName(pool.coinTypeA, pool.coinTypeB, pool.tickSpacing)\n return pool\n}\n\n/**\n * Builds an NFT object based on a response containing information about the NFT.\n * @param {any} objects - The response containing information about the NFT.\n * @returns {NFT} - The built NFT object.\n */\nexport function buildNFT(objects: any): NFT {\n const fields = getObjectDisplay(objects).data\n const nft: NFT = {\n creator: '',\n description: '',\n image_url: '',\n link: '',\n name: '',\n project_url: '',\n }\n if (fields) {\n nft.creator = fields.creator\n nft.description = fields.description\n nft.image_url = fields.image_url\n nft.link = fields.link\n nft.name = fields.name\n nft.project_url = fields.project_url\n }\n return nft\n}\n\n/** Builds a Position object based on a SuiObjectResponse.\n * @param {SuiObjectResponse} object - The SuiObjectResponse containing information about the position.\n * @returns {Position} - The built Position object.\n */\nexport function buildPosition(object: SuiObjectResponse): Position {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Position not exists. Get Position error:${object.error}`, PositionErrorCode.InvalidPositionObject)\n }\n\n let nft: NFT = {\n creator: '',\n description: '',\n image_url: '',\n link: '',\n name: '',\n project_url: '',\n }\n\n let position = {\n ...nft,\n pos_object_id: '',\n owner: '',\n type: '',\n coin_type_a: '',\n coin_type_b: '',\n liquidity: '',\n tick_lower_index: 0,\n tick_upper_index: 0,\n index: 0,\n pool: '',\n reward_amount_owed_0: '0',\n reward_amount_owed_1: '0',\n reward_amount_owed_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n fee_growth_inside_a: '0',\n fee_owed_a: '0',\n fee_growth_inside_b: '0',\n fee_owed_b: '0',\n position_status: ClmmPositionStatus.Exists,\n }\n let fields = getObjectFields(object)\n if (fields) {\n const type = getMoveObjectType(object) as string\n const ownerWarp = getObjectOwner(object) as {\n AddressOwner: string\n }\n\n if ('nft' in fields) {\n fields = fields.nft.fields\n nft.description = fields.description as string\n nft.name = fields.name\n nft.link = fields.url\n } else {\n nft = buildNFT(object)\n }\n\n position = {\n ...nft,\n pos_object_id: fields.id.id,\n owner: ownerWarp.AddressOwner,\n type,\n liquidity: fields.liquidity,\n coin_type_a: fields.coin_type_a.fields.name,\n coin_type_b: fields.coin_type_b.fields.name,\n tick_lower_index: asIntN(BigInt(fields.tick_lower_index.fields.bits)),\n tick_upper_index: asIntN(BigInt(fields.tick_upper_index.fields.bits)),\n index: fields.index,\n pool: fields.pool,\n reward_amount_owed_0: '0',\n reward_amount_owed_1: '0',\n reward_amount_owed_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n fee_growth_inside_a: '0',\n fee_owed_a: '0',\n fee_growth_inside_b: '0',\n fee_owed_b: '0',\n position_status: ClmmPositionStatus.Exists,\n }\n }\n\n const deletedResponse = getObjectDeletedResponse(object)\n if (deletedResponse) {\n position.pos_object_id = deletedResponse.objectId\n position.position_status = ClmmPositionStatus.Deleted\n }\n const objectNotExistsResponse = getObjectNotExistsResponse(object)\n if (objectNotExistsResponse) {\n position.pos_object_id = objectNotExistsResponse\n position.position_status = ClmmPositionStatus.NotExists\n }\n\n return position\n}\n\n/**\n * Builds a PositionReward object based on a response containing information about the reward.\n * @param {any} fields - The response containing information about the reward.\n * @returns {PositionReward} - The built PositionReward object.\n */\nexport function buildPositionReward(fields: any): PositionReward {\n const rewarders = {\n reward_amount_owed_0: '0',\n reward_amount_owed_1: '0',\n reward_amount_owed_2: '0',\n reward_growth_inside_0: '0',\n reward_growth_inside_1: '0',\n reward_growth_inside_2: '0',\n }\n fields = 'fields' in fields ? fields.fields : fields\n\n fields.rewards.forEach((item: any, index: number) => {\n const { amount_owned, growth_inside } = 'fields' in item ? item.fields : item\n if (index === 0) {\n rewarders.reward_amount_owed_0 = amount_owned\n rewarders.reward_growth_inside_0 = growth_inside\n } else if (index === 1) {\n rewarders.reward_amount_owed_1 = amount_owned\n rewarders.reward_growth_inside_1 = growth_inside\n } else if (index === 2) {\n rewarders.reward_amount_owed_2 = amount_owned\n rewarders.reward_growth_inside_2 = growth_inside\n }\n })\n\n const tick_lower_index = 'fields' in fields.tick_lower_index ? fields.tick_lower_index.fields.bits : fields.tick_lower_index.bits\n const tick_upper_index = 'fields' in fields.tick_upper_index ? fields.tick_upper_index.fields.bits : fields.tick_upper_index.bits\n\n const possition: PositionReward = {\n liquidity: fields.liquidity,\n tick_lower_index: asIntN(BigInt(tick_lower_index)),\n tick_upper_index: asIntN(BigInt(tick_upper_index)),\n ...rewarders,\n fee_growth_inside_a: fields.fee_growth_inside_a,\n fee_owed_a: fields.fee_owned_a,\n fee_growth_inside_b: fields.fee_growth_inside_b,\n fee_owed_b: fields.fee_owned_b,\n pos_object_id: fields.position_id,\n }\n return possition\n}\n\n/**\n * Builds a TickData object based on a response containing information about tick data.\n * It must check if the response contains the required fields.\n * @param {SuiObjectResponse} objects - The response containing information about tick data.\n * @returns {TickData} - The built TickData object.\n */\nexport function buildTickData(objects: SuiObjectResponse): TickData {\n if (objects.error != null || objects.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Tick not exists. Get tick data error:${objects.error}`, PoolErrorCode.InvalidTickObject)\n }\n\n const fields = getObjectFields(objects)\n\n const valueItem = fields.value.fields.value.fields\n const possition: TickData = {\n objectId: getObjectId(objects),\n index: asIntN(BigInt(valueItem.index.fields.bits)),\n sqrtPrice: new BN(valueItem.sqrt_price),\n liquidityNet: new BN(valueItem.liquidity_net.fields.bits),\n liquidityGross: new BN(valueItem.liquidity_gross),\n feeGrowthOutsideA: new BN(valueItem.fee_growth_outside_a),\n feeGrowthOutsideB: new BN(valueItem.fee_growth_outside_b),\n rewardersGrowthOutside: valueItem.rewards_growth_outside,\n }\n\n return possition\n}\n\n/**\n * Builds a TickData object based on a given event's fields.\n * @param {any} fields - The fields of an event.\n * @returns {TickData} - The built TickData object.\n * @throws {Error} If any required field is missing.\n */\nexport function buildTickDataByEvent(fields: any): TickData {\n if (\n !fields ||\n !fields.index ||\n !fields.sqrt_price ||\n !fields.liquidity_net ||\n !fields.liquidity_gross ||\n !fields.fee_growth_outside_a ||\n !fields.fee_growth_outside_b\n ) {\n throw new ClmmpoolsError(`Invalid tick fields.`, PoolErrorCode.InvalidTickFields)\n }\n\n // It's assumed that asIntN is a function that converts a BigInt to an integer.\n const index = asIntN(BigInt(fields.index.bits))\n const sqrtPrice = new BN(fields.sqrt_price)\n const liquidityNet = new BN(fields.liquidity_net.bits)\n const liquidityGross = new BN(fields.liquidity_gross)\n const feeGrowthOutsideA = new BN(fields.fee_growth_outside_a)\n const feeGrowthOutsideB = new BN(fields.fee_growth_outside_b)\n const rewardersGrowthOutside = fields.rewards_growth_outside || []\n\n const tick: TickData = {\n objectId: '',\n index,\n sqrtPrice,\n liquidityNet,\n liquidityGross,\n feeGrowthOutsideA,\n feeGrowthOutsideB,\n rewardersGrowthOutside,\n }\n\n return tick\n}\n\nexport function buildClmmPositionName(pool_index: number, position_index: number): string {\n return `Magma LP | Pool${pool_index}-${position_index}`\n}\n","import BN from 'bn.js'\nimport { ZERO } from '../math/utils'\nimport { Pool } from './clmm_type'\n\n/**\n * Represents tick data for a liquidity pool.\n */\nexport type TickData = {\n /**\n * The object identifier of the tick data.\n */\n objectId: string\n\n /**\n * The index of the tick.\n */\n index: number\n\n /**\n * The square root price value for the tick.\n */\n sqrtPrice: BN\n\n /**\n * The net liquidity value for the tick.\n */\n liquidityNet: BN\n\n /**\n * The gross liquidity value for the tick.\n */\n liquidityGross: BN\n\n /**\n * The fee growth outside coin A for the tick.\n */\n feeGrowthOutsideA: BN\n\n /**\n * The fee growth outside coin B for the tick.\n */\n feeGrowthOutsideB: BN\n\n /**\n * An array of rewarders' growth outside values for the tick.\n */\n rewardersGrowthOutside: BN[]\n}\n\n/**\n * Represents a tick for a liquidity pool.\n */\nexport type Tick = {\n /**\n * The index of the tick.\n */\n index: Bits\n\n /**\n * The square root price value for the tick (string representation).\n */\n sqrt_price: string\n\n /**\n * The net liquidity value for the tick (Bits format).\n */\n liquidity_net: Bits\n\n /**\n * The gross liquidity value for the tick (string representation).\n */\n liquidity_gross: string\n\n /**\n * The fee growth outside coin A for the tick (string representation).\n */\n fee_growth_outside_a: string\n\n /**\n * The fee growth outside coin B for the tick (string representation).\n */\n fee_growth_outside_b: string\n\n /**\n * An array of rewarders' growth outside values for the tick (array of string representations).\n */\n rewarders_growth_outside: string[3]\n}\n\n/**\n * Represents bits information.\n */\nexport type Bits = {\n bits: string\n}\n\n/**\n * Represents data for a liquidity mining pool.\n */\nexport type ClmmpoolData = {\n coinA: string\n coinB: string\n currentSqrtPrice: BN\n currentTickIndex: number\n feeGrowthGlobalA: BN\n feeGrowthGlobalB: BN\n feeProtocolCoinA: BN\n feeProtocolCoinB: BN\n feeRate: BN\n liquidity: BN\n tickIndexes: number[]\n tickSpacing: number\n ticks: Array<TickData>\n collection_name: string\n}\n\n/**\n * Transforms a Pool object into ClmmpoolData format.\n * @param {Pool} pool - The liquidity pool object to transform.\n * @returns {ClmmpoolData} The transformed ClmmpoolData object.\n */\nexport function transClmmpoolDataWithoutTicks(pool: Pool): ClmmpoolData {\n const poolData: ClmmpoolData = {\n coinA: pool.coinTypeA, // string\n coinB: pool.coinTypeB, // string\n currentSqrtPrice: new BN(pool.current_sqrt_price), // BN\n currentTickIndex: pool.current_tick_index, // number\n feeGrowthGlobalA: new BN(pool.fee_growth_global_a), // BN\n feeGrowthGlobalB: new BN(pool.fee_growth_global_b), // BN\n feeProtocolCoinA: new BN(pool.fee_protocol_coin_a), // BN\n feeProtocolCoinB: new BN(pool.fee_protocol_coin_b), // BN\n feeRate: new BN(pool.fee_rate), // number\n liquidity: new BN(pool.liquidity), // BN\n tickIndexes: [], // number[]\n tickSpacing: Number(pool.tickSpacing), // number\n ticks: [], // Array<TickData>\n collection_name: '',\n }\n return poolData\n}\n\n/**\n * Creates a Bits object from an index.\n * @param {number | string} index - The index value.\n * @returns {Bits} The created Bits object.\n */\nexport function newBits(index: number | string): Bits {\n const index_BN = new BN(index)\n if (index_BN.lt(ZERO)) {\n return {\n bits: index_BN\n .neg()\n .xor(new BN(2).pow(new BN(64)).sub(new BN(1)))\n .add(new BN(1))\n .toString(),\n }\n }\n return {\n bits: index_BN.toString(),\n }\n}\n","import BN from 'bn.js'\nimport Decimal from '../utils/decimal'\n\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nexport const ZERO = new BN(0)\n\nexport const ONE = new BN(1)\n\nexport const TWO = new BN(2)\n\nexport const U128 = TWO.pow(new BN(128))\n\nexport const U64_MAX = TWO.pow(new BN(64)).sub(ONE)\n\nexport const U128_MAX = TWO.pow(new BN(128)).sub(ONE)\n\n/**\n * @category MathUtil\n */\nexport class MathUtil {\n static toX64_BN(num: BN): BN {\n return num.mul(new BN(2).pow(new BN(64)))\n }\n\n static toX64_Decimal(num: Decimal): Decimal {\n return num.mul(Decimal.pow(2, 64))\n }\n\n static toX64(num: Decimal): BN {\n return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed())\n }\n\n static fromX64(num: BN): Decimal {\n return new Decimal(num.toString()).mul(Decimal.pow(2, -64))\n }\n\n static fromX64_Decimal(num: Decimal): Decimal {\n return num.mul(Decimal.pow(2, -64))\n }\n\n static fromX64_BN(num: BN): BN {\n return num.div(new BN(2).pow(new BN(64)))\n }\n\n static shiftRightRoundUp(n: BN): BN {\n let result = n.shrn(64)\n\n if (n.mod(U64_MAX).gt(ZERO)) {\n result = result.add(ONE)\n }\n\n return result\n }\n\n static divRoundUp(n0: BN, n1: BN): BN {\n const hasRemainder = !n0.mod(n1).eq(ZERO)\n if (hasRemainder) {\n return n0.div(n1).add(new BN(1))\n }\n return n0.div(n1)\n }\n\n static subUnderflowU128(n0: BN, n1: BN): BN {\n if (n0.lt(n1)) {\n return n0.sub(n1).add(U128_MAX)\n }\n\n return n0.sub(n1)\n }\n\n static checkUnsignedSub(n0: BN, n1: BN): BN {\n const n = n0.sub(n1)\n if (n.isNeg()) {\n throw new ClmmpoolsError('Unsigned integer sub overflow', MathErrorCode.UnsignedIntegerOverflow)\n }\n return n\n }\n\n static checkMul(n0: BN, n1: BN, limit: number): BN {\n const n = n0.mul(n1)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication overflow', MathErrorCode.MulOverflow)\n }\n return n\n }\n\n static checkMulDivFloor(n0: BN, n1: BN, denom: BN, limit: number): BN {\n if (denom.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n }\n return n\n }\n\n static checkMulDivCeil(n0: BN, n1: BN, denom: BN, limit: number): BN {\n if (denom.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1).add(denom.sub(ONE)).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n }\n return n\n }\n\n static checkMulDivRound(n0: BN, n1: BN, denom: BN, limit: number): BN {\n if (denom.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n const n = n0.mul(n1.add(denom.shrn(1))).div(denom)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication div overflow', MathErrorCode.MulDivOverflow)\n }\n return n\n }\n\n static checkMulShiftRight(n0: BN, n1: BN, shift: number, limit: number): BN {\n const n = n0.mul(n1).div(new BN(2).pow(new BN(shift)))\n // const n = n0.mul(n1).shrn(shift)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication shift right overflow', MathErrorCode.MulShiftRightOverflow)\n }\n return n\n }\n\n static checkMulShiftRight64RoundUpIf(n0: BN, n1: BN, limit: number, roundUp: boolean): BN {\n const p = n0.mul(n1)\n const shoudRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n const result = shoudRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n if (this.isOverflow(result, limit)) {\n throw new ClmmpoolsError('Multiplication shift right overflow', MathErrorCode.MulShiftRightOverflow)\n }\n return result\n }\n\n static checkMulShiftLeft(n0: BN, n1: BN, shift: number, limit: number): BN {\n const n = n0.mul(n1).shln(shift)\n if (this.isOverflow(n, limit)) {\n throw new ClmmpoolsError('Multiplication shift left overflow', MathErrorCode.MulShiftLeftOverflow)\n }\n return n\n }\n\n static checkDivRoundUpIf(n0: BN, n1: BN, roundUp: boolean): BN {\n if (n1.eq(ZERO)) {\n throw new ClmmpoolsError('Devide by zero', MathErrorCode.DivideByZero)\n }\n if (roundUp) {\n return this.divRoundUp(n0, n1)\n }\n return n0.div(n1)\n }\n\n static isOverflow(n: BN, bit: number): boolean {\n return n.gte(TWO.pow(new BN(bit)))\n }\n\n static sign(v: BN): number {\n const signBit = v.testn(127) ? 1 : 0\n return signBit\n }\n\n static is_neg(v: BN): boolean {\n return this.sign(v) === 1\n }\n\n static abs_u128(v: BN): BN {\n if (v.gt(ZERO)) {\n return v\n }\n return this.u128_neg(v.subn(1))\n }\n\n static u128_neg(v: BN): BN {\n return v.uxor(new BN('ffffffffffffffffffffffffffffffff', 16))\n }\n\n static neg(v: BN): BN {\n if (this.is_neg(v)) {\n return v.abs()\n }\n return this.neg_from(v)\n }\n\n static abs(v: BN): BN {\n if (this.sign(v) === 0) {\n return v\n }\n return this.u128_neg(v.sub(new BN(1)))\n }\n\n static neg_from(v: BN): BN {\n if (v.eq(ZERO)) {\n return v\n }\n return this.u128_neg(v).add(new BN(1)).or(new BN(1).shln(127))\n }\n}\n","import Decimal from 'decimal.js'\n\nDecimal.config({\n precision: 64,\n rounding: Decimal.ROUND_DOWN,\n toExpNeg: -64,\n toExpPos: 64,\n})\n\nexport default Decimal\n","export enum MathErrorCode {\n IntegerDowncastOverflow = `IntegerDowncastOverflow`,\n MulOverflow = `MultiplicationOverflow`,\n MulDivOverflow = `MulDivOverflow`,\n MulShiftRightOverflow = `MulShiftRightOverflow`,\n MulShiftLeftOverflow = `MulShiftLeftOverflow`,\n DivideByZero = `DivideByZero`,\n UnsignedIntegerOverflow = `UnsignedIntegerOverflow`,\n InvalidCoinAmount = `InvalidCoinAmount`,\n InvalidLiquidityAmount = `InvalidLiquidityAmount`,\n InvalidReserveAmount = `InvalidReserveAmount`,\n InvalidSqrtPrice = `InvalidSqrtPrice`,\n NotSupportedThisCoin = `NotSupportedThisCoin`,\n InvalidTwoTickIndex = `InvalidTwoTickIndex`,\n}\n\nexport enum CoinErrorCode {\n CoinAmountMaxExceeded = `CoinAmountMaxExceeded`,\n CoinAmountMinSubceeded = `CoinAmountMinSubceeded `,\n SqrtPriceOutOfBounds = `SqrtPriceOutOfBounds`,\n}\n\nexport enum SwapErrorCode {\n InvalidSqrtPriceLimitDirection = `InvalidSqrtPriceLimitDirection`,\n ZeroTradableAmount = `ZeroTradableAmount`,\n AmountOutBelowMinimum = `AmountOutBelowMinimum`,\n AmountInAboveMaximum = `AmountInAboveMaximum`,\n NextTickNotFound = `NextTickNoutFound`,\n TickArraySequenceInvalid = `TickArraySequenceInvalid`,\n TickArrayCrossingAboveMax = `TickArrayCrossingAboveMax`,\n TickArrayIndexNotInitialized = `TickArrayIndexNotInitialized`,\n ParamsLengthNotEqual = `ParamsLengthNotEqual`,\n}\n\nexport enum PositionErrorCode {\n InvalidTickEvent = `InvalidTickEvent`,\n InvalidPositionObject = `InvalidPositionObject`,\n InvalidPositionRewardObject = `InvalidPositionRewardObject`,\n}\n\nexport enum PoolErrorCode {\n InvalidCoinTypeSequence = `InvalidCoinTypeSequence`,\n InvalidTickIndex = `InvalidTickIndex`,\n InvalidPoolObject = `InvalidPoolObject`,\n InvalidTickObjectId = `InvalidTickObjectId`,\n InvalidTickObject = `InvalidTickObject`,\n InvalidTickFields = `InvalidTickFields`,\n PoolsNotFound = `PoolsNotFound`,\n}\n\nexport enum LockErrorCode {\n InvalidLockObject = `InvalidLockObject`,\n InvalidLockFields = `InvalidLockFields`,\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 DlmmStrategyCode {\n InvalidParams = `InvalidParams`,\n}\n\nexport enum TypesErrorCode {\n InvalidType = `InvalidType`,\n}\n\nexport type ClmmpoolsErrorCode =\n | MathErrorCode\n | SwapErrorCode\n | CoinErrorCode\n | PoolErrorCode\n | PositionErrorCode\n | PartnerErrorCode\n | ConfigErrorCode\n | UtilsErrorCode\n | RouterErrorCode\n | TypesErrorCode\n | LockErrorCode\n | DlmmStrategyCode\n\nexport class ClmmpoolsError extends Error {\n override message: string\n\n errorCode?: ClmmpoolsErrorCode\n\n constructor(message: string, errorCode?: ClmmpoolsErrorCode) {\n super(message)\n this.message = message\n this.errorCode = errorCode\n }\n\n static isClmmpoolsErrorCode(e: any, code: ClmmpoolsErrorCode): boolean {\n return e instanceof ClmmpoolsError && e.errorCode === code\n }\n}\n","import BN from 'bn.js'\n\n/**\n * The maximum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_TICK_INDEX = 443636\n\n/**\n * The minimum tick index supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_TICK_INDEX = -443636\n\n/**\n * The maximum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MAX_SQRT_PRICE = '79226673515401279992447579055'\n\n/**\n * The number of initialized ticks that a tick-array account can hold.\n * @category Constants\n */\nexport const TICK_ARRAY_SIZE = 64\n\n/**\n * The minimum sqrt-price supported by the clmmpool program.\n * @category Constants\n */\nexport const MIN_SQRT_PRICE = '4295048016'\n\n/**\n * The denominator which the fee rate is divided on.\n * @category Constants\n */\nexport const FEE_RATE_DENOMINATOR = new BN(1_000_000)\n","import { TransactionArgument } from '@mysten/sui/transactions'\nimport Decimal from 'decimal.js'\nimport { ClmmpoolsError, TypesErrorCode } from '../errors/errors'\n\n/**\n * Represents a SUI address, which is a string.\n */\nexport type SuiAddressType = string\n/**\n * Represents a SUI object identifier, which is a string.\n */\nexport type SuiObjectIdType = string\n/**\n * Represents a BigNumber, which can be a Decimal.Value, number, or string.\n */\nexport type BigNumber = Decimal.Value | number | string\n/**\n * The address representing the clock in the system.\n */\nexport const CLOCK_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000006'\n\n/**\n * Constants for different modules in the CLMM (Cryptocurrency Liquidity Mining Module).\n */\nexport const ClmmPartnerModule = 'partner'\nexport const ClmmIntegratePoolModule = 'pool_script'\nexport const ClmmIntegratePoolV2Module = 'pool_script_v2'\nexport const ClmmIntegratePoolV3Module = 'pool_script_v3'\nexport const ClmmIntegrateRouterModule = 'router'\nexport const ClmmIntegrateRouterWithPartnerModule = 'router_with_partner'\nexport const ClmmFetcherModule = 'fetcher_script'\nexport const ClmmExpectSwapModule = 'expect_swap'\nexport const ClmmIntegrateUtilsModule = 'utils'\nexport const VotingEscrow = 'voting_escrow'\nexport const Voter = 'voter'\nexport const RewardDistributor = 'reward_distributor'\nexport const Gauge = 'gauge'\nexport const Minter = 'minter'\nexport const DlmmScript = 'dlmm_script'\n\n/**\n * The address for CoinInfo module.\n */\nexport const CoinInfoAddress = '0x1::coin::CoinInfo'\n/**\n * The address for CoinStore module.\n */\nexport const CoinStoreAddress = '0x1::coin::CoinStore'\n/**\n * Constants for different modules in the Deepbook system.\n */\n\nexport const DeepbookCustodianV2Moudle = 'custodian_v2'\nexport const DeepbookClobV2Moudle = 'clob_v2'\nexport const DeepbookEndpointsV2Moudle = 'endpoints_v2'\n\n/**\n * Represents a SUI resource, which can be of any type.\n */\nexport type SuiResource = any\n\n/**\n * Represents a paginated data page with optional cursor and limit.\n */\nexport type DataPage<T> = {\n data: T[]\n nextCursor?: any\n hasNextPage: boolean\n}\n\n/**\n * Represents query parameters for pagination.\n */\nexport type PageQuery = {\n cursor?: any\n limit?: number | null\n}\n\n/**\n * Represents arguments for pagination, with options for fetching all data or using PageQuery.\n */\nexport type PaginationArgs = 'all' | PageQuery\n\n/**\n * Represents a Non-Fungible Token (NFT) with associated metadata.\n */\nexport type NFT = {\n /**\n * The address or identifier of the creator of the NFT.\n */\n creator: string\n\n /**\n * A description providing additional information about the NFT.\n */\n description: string\n\n /**\n * The URL to the image representing the NFT visually.\n */\n image_url: string\n\n /**\n * A link associated with the NFT, providing more details or interactions.\n */\n link: string\n\n /**\n * The name or title of the NFT.\n */\n name: string\n\n /**\n * The URL to the project or collection associated with the NFT.\n */\n project_url: string\n}\n\n/**\n * Represents a SUI struct tag.\n */\nexport type SuiStructTag = {\n /**\n * The full address of the struct.\n */\n full_address: string\n\n /**\n * The source address of the struct.\n */\n source_address: string\n\n /**\n * The address of the struct.\n */\n address: SuiAddressType\n\n /**\n * The module to which the struct belongs.\n */\n module: string\n\n /**\n * The name of the struct.\n */\n name: string\n\n /**\n * An array of type arguments (SUI addresses) for the struct.\n */\n type_arguments: SuiAddressType[]\n}\n\n/**\n * Represents basic SUI data types.\n */\nexport type SuiBasicTypes = 'address' | 'bool' | 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'u256'\n\n/**\n * Represents a SUI transaction argument, which can be of various types.\n */\nexport type SuiTxArg = TransactionArgument | string | number | bigint | boolean\n\n/**\n * Represents input types for SUI data.\n */\nexport type SuiInputTypes = 'object' | SuiBasicTypes\n\n/**\n * Gets the default SUI input type based on the provided value.\n * @param value - The value to determine the default input type for.\n * @returns The default SUI input type.\n * @throws Error if the type of the value is unknown.\n */\nexport const getDefaultSuiInputType = (value: any): SuiInputTypes => {\n if (typeof value === 'string' && value.startsWith('0x')) {\n return 'object' // Treat value as an object if it starts with '0x'.\n }\n if (typeof value === 'number' || typeof value === 'bigint') {\n return 'u64' // Treat number or bigint values as 'u64' type.\n }\n if (typeof value === 'boolean') {\n return 'bool' // Treat boolean values as 'bool' type.\n }\n throw new ClmmpoolsError(`Unknown type for value: ${value}`, TypesErrorCode.InvalidType)\n}\n","import BN from 'bn.js'\nimport { NFT, SuiAddressType, SuiObjectIdType } from './sui'\nimport { TickData } from './clmmpool'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\n/**\n * Enumerates the possible status values of a position within a liquidity mining module.\n */\nexport enum ClmmPositionStatus {\n /**\n * The position has been deleted or removed.\n */\n 'Deleted' = 'Deleted',\n /**\n * The position exists and is active.\n */\n 'Exists' = 'Exists',\n /**\n * The position does not exist or is not active.\n */\n 'NotExists' = 'NotExists',\n}\n/**\n * Represents a package containing specific configuration or data.\n * @template T - The type of configuration or data contained in the package.\n */\nexport type Package<T = undefined> = {\n /**\n * The unique identifier of the package.\n */\n package_id: string\n /**\n * the package was published.\n */\n published_at: string\n /**\n * The version number of the package (optional).\n */\n version?: number\n /**\n * The configuration or data contained in the package (optional).\n */\n config?: T\n}\n/**\n * The Magma clmmpool's position NFT.\n */\nexport type Position = {\n /**\n * The unique identifier of the position object.\n */\n pos_object_id: SuiObjectIdType\n /**\n * The owner of the position.\n */\n owner: SuiObjectIdType\n /**\n * The liquidity pool associated with the position.\n */\n pool: SuiObjectIdType\n /**\n * The type of position represented by an address.\n */\n type: SuiAddressType\n /**\n * The index of the position.\n */\n index: number\n /**\n * The amount of liquidity held by the position.\n */\n liquidity: string\n /**\n * The lower tick index of the position range.\n */\n tick_lower_index: number\n /**\n * The upper tick index of the position range.\n */\n tick_upper_index: number\n /**\n * The status of the position within the liquidity mining module.\n */\n position_status: ClmmPositionStatus\n\n /**\n * The address type of the first coin in the position.\n */\n coin_type_a: SuiAddressType\n /**\n * The address type of the second coin in the position.\n */\n coin_type_b: SuiAddressType\n} & NFT &\n PositionReward\n\n/**\n * Represents reward information associated with a liquidity mining position.\n */\nexport type PositionReward = {\n /**\n * The unique identifier of the position object.\n */\n pos_object_id: SuiObjectIdType\n\n /**\n * The amount of liquidity held by the position.\n */\n liquidity: string\n\n /**\n * The lower tick index of the position range.\n */\n tick_lower_index: number\n\n /**\n * The upper tick index of the position range.\n */\n tick_upper_index: number\n\n /**\n * The accumulated fee growth inside the first coin of the position.\n */\n fee_growth_inside_a: string\n\n /**\n * The accumulated fee owed in the first coin of the position.\n */\n fee_owed_a: string\n\n /**\n * The accumulated fee growth inside the second coin of the position.\n */\n fee_growth_inside_b: string\n\n /**\n * The accumulated fee owed in the second coin of the position.\n */\n fee_owed_b: string\n\n /**\n * The amount of reward owed in the first reward category.\n */\n reward_amount_owed_0: string\n\n /**\n * The amount of reward owed in the second reward category.\n */\n reward_amount_owed_1: string\n\n /**\n * The amount of reward owed in the third reward category.\n */\n reward_amount_owed_2: string\n\n /**\n * The accumulated reward growth inside the first reward category.\n */\n reward_growth_inside_0: string\n\n /**\n * The accumulated reward growth inside the second reward category.\n */\n reward_growth_inside_1: string\n\n /**\n * The accumulated reward growth inside the third reward category.\n */\n reward_growth_inside_2: string\n}\n\n/**\n * Represents a pair of coins used in a financial context.\n */\nexport type CoinPairType = {\n /**\n * The address type of the coin a in the pair.\n */\n coinTypeA: SuiAddressType\n\n /**\n * The address type of the coin b in the pair.\n */\n coinTypeB: SuiAddressType\n}\n\n/**\n * Represents immutable properties of a liquidity pool.\n */\nexport type PoolImmutables = {\n /**\n * The address of the liquidity pool.\n */\n poolAddress: string\n\n /**\n * The tick spacing value used in the pool.\n */\n tickSpacing: string\n} & CoinPairType\n/**\n * \"Pool\" is the core module of Clmm protocol, which defines the trading pairs of \"clmmpool\".\n */\nexport type Pool = {\n /**\n * Represents the type or category of a liquidity pool.\n */\n poolType: string\n /**\n * The amount of coin a.\n */\n coinAmountA: number\n /**\n * The amount of coin b.\n */\n coinAmountB: number\n /**\n * The current sqrt price\n */\n current_sqrt_price: number\n /**\n * The current tick index\n */\n current_tick_index: number\n /**\n * The global fee growth of coin a as Q64.64\n */\n fee_growth_global_b: number\n /**\n * The global fee growth of coin b as Q64.64\n */\n fee_growth_global_a: number\n /**\n * The amounts of coin a owend to protocol\n */\n fee_protocol_coin_a: number\n /**\n * The amounts of coin b owend to protocol\n */\n fee_protocol_coin_b: number\n /**\n * The numerator of fee rate, the denominator is 1_000_000.\n */\n fee_rate: number\n /**\n * is the pool pause\n */\n is_pause: boolean\n /**\n * The liquidity of current tick index\n */\n liquidity: number\n /**\n * The pool index\n */\n index: number\n /**\n * The positions manager\n */\n position_manager: {\n positions_handle: string\n size: number\n }\n /**\n * The rewarder manager\n */\n rewarder_infos: Array<Rewarder>\n rewarder_last_updated_time: string\n /**\n * The tick manager handle\n */\n ticks_handle: string\n /**\n * The url for pool and position\n */\n uri: string\n /**\n * The name for pool\n */\n name: string\n} & PoolImmutables\n\nexport type Rewarder = {\n /**\n * The coin address where rewards will be distributed.\n */\n coinAddress: string\n /**\n * The rate of emissions in coins per second.\n */\n emissions_per_second: number\n /**\n * The global growth factor influencing reward emissions.\n */\n growth_global: number\n /**\n * The total emissions in coins that occur every day.\n */\n emissionsEveryDay: number\n}\n/**\n * Configuration settings for the Cryptocurrency Liquidity Mining Module (CLMM).\n */\nexport type ClmmConfig = {\n /**\n * Identifier of the pools for liquidity mining.\n */\n pools_id: SuiObjectIdType\n\n /**\n * Identifier of the global configuration for the module.\n */\n global_config_id: SuiObjectIdType\n\n /**\n * Identifier of the administrative capacity for the module.\n */\n admin_cap_id: SuiObjectIdType\n\n /**\n * Identifier of the global vault for the module.\n */\n global_vault_id: SuiObjectIdType\n\n /**\n * Optional identifier of partners for the liquidity mining module.\n */\n partners_id?: SuiObjectIdType\n}\n\nexport type DlmmConfig = {\n factory: SuiObjectIdType\n}\n\n/**\n * Represents an event to create a liquidity mining partner.\n */\nexport type CreatePartnerEvent = {\n /**\n * The name of the liquidity mining partner.\n */\n name: string\n\n /**\n * The recipient's address for the partner.\n */\n recipient: SuiAddressType\n\n /**\n * Identifier of the partner.\n */\n partner_id: SuiObjectIdType\n\n /**\n * Identifier of the partner's capacity.\n */\n partner_cap_id: SuiObjectIdType\n\n /**\n * The fee rate associated with the partner.\n */\n fee_rate: string\n\n /**\n * The starting epoch of the partnership.\n */\n start_epoch: string\n\n /**\n * The ending epoch of the partnership.\n */\n end_epoch: string\n}\n\n/**\n * Represents a coin asset with address, object ID, and balance information.\n */\nexport type CoinAsset = {\n /**\n * The address type of the coin asset.\n */\n coinAddress: SuiAddressType\n\n /**\n * The object identifier of the coin asset.\n */\n coinObjectId: SuiObjectIdType\n\n /**\n * The balance amount of the coin asset.\n */\n balance: bigint\n}\n\n/**\n * Represents a faucet coin configuration.\n */\nexport type FaucetCoin = {\n /**\n * The name or identifier of the transaction module.\n */\n transactionModule: string\n\n /**\n * The supply ID or object identifier of the faucet coin.\n */\n suplyID: SuiObjectIdType\n\n /**\n * The number of decimal places used for the faucet coin.\n */\n decimals: number\n}\n\n/**\n * Represents parameters for creating a liquidity pool.\n */\nexport type CreatePoolParams = {\n /**\n * The tick spacing value used for the pool.\n */\n tick_spacing: number\n\n /**\n * The initial square root price value for the pool.\n */\n initialize_sqrt_price: string\n\n /**\n * The Uniform Resource Identifier (URI) associated with the pool.\n */\n uri: string\n} & CoinPairType\n\n/**\n * Represents parameters for adding liquidity to a created liquidity pool.\n * Extends the CreatePoolParams type.\n */\nexport type CreatePoolAddLiquidityParams = CreatePoolParams & {\n /**\n * The amount of the first coin to be added as liquidity.\n * Can be a number or a string.\n */\n amount_a: number | string\n\n /**\n * The amount of the second coin to be added as liquidity.\n * Can be a number or a string.\n */\n amount_b: number | string\n\n /**\n * Indicates whether the amount of the first coin is fixed.\n */\n fix_amount_a: boolean\n\n /**\n * The lower tick index for liquidity provision.\n */\n tick_lower: number\n\n /**\n * The upper tick index for liquidity provision.\n */\n tick_upper: number\n\n metadata_a: SuiObjectIdType\n metadata_b: SuiObjectIdType\n\n /**\n * The allowed slippage percentage for the liquidity provision.\n */\n slippage: number\n}\n\nexport type FetchParams = {\n pool_id: SuiObjectIdType\n} & CoinPairType\n\ntype CommonParams = {\n /**\n * The object id about which pool you want to operation.\n */\n pool_id: SuiObjectIdType\n /**\n * The object id about position.\n */\n pos_id: SuiObjectIdType\n}\n\nexport type AddLiquidityFixTokenParams = {\n /**\n * If fixed amount A, you must set amount_a, amount_b will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n */\n amount_a: number | string\n /**\n * If fixed amount B, you must set amount_b, amount_a will be auto calculated by ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts().\n */\n amount_b: number | string\n /**\n * Price slippage point.\n */\n slippage: number\n /**\n * true means fixed coinA amount, false means fixed coinB amount\n */\n fix_amount_a: boolean\n /**\n * control whether or not to create a new position or add liquidity on existed position.\n */\n is_open: boolean\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityParams = {\n /**\n * The actual change in liquidity that has been added.\n */\n delta_liquidity: string\n /**\n * The max limit about used coin a amount\n */\n max_amount_a: number | string\n /**\n * The max limit about used coin b amount.\n */\n max_amount_b: number | string\n} & AddLiquidityCommonParams\n\nexport type AddLiquidityCommonParams = {\n /**\n * Represents the index of the lower tick boundary.\n */\n tick_lower: string | number\n /**\n * Represents the index of the upper tick boundary.\n */\n tick_upper: string | number\n /**\n * If you already has one position, you can select collect fees while adding liquidity.\n */\n collect_fee: boolean\n /**\n * If these not empty, it will collect rewarder in this position, if you already open the position.\n */\n rewarder_coin_types: SuiAddressType[]\n} & CoinPairType &\n CommonParams\n\n/**\n * Parameters for opening a position within a liquidity pool.\n * Extends the CoinPairType type.\n */\nexport type OpenPositionParams = CoinPairType & {\n /**\n * The lower tick index for the position.\n */\n tick_lower: string\n\n /**\n * The upper tick index for the position.\n */\n tick_upper: string\n\n /**\n * The object identifier of the liquidity pool.\n */\n pool_id: SuiObjectIdType\n}\n\n/**\n * Parameters for removing liquidity from a pool.\n * Extends the CoinPairType and CommonParams types.\n */\nexport type RemoveLiquidityParams = CoinPairType &\n CommonParams & {\n /**\n * The change in liquidity amount to be removed.\n */\n delta_liquidity: string\n\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: string\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: string\n\n /**\n * Indicates whether to collect fees during the removal.\n */\n collect_fee: boolean\n\n /**\n * Coin types associated with rewarder contracts.\n */\n rewarder_coin_types: string[]\n }\n\n/**\n * Parameters for closing a position within a liquidity pool.\n * Extends the CoinPairType, CommonParams, and CommonParams types.\n */\nexport type ClosePositionParams = CoinPairType &\n CommonParams & {\n /**\n * Coin types associated with rewarder contracts.\n */\n rewarder_coin_types: SuiAddressType[]\n\n /**\n * The minimum amount of the first coin to be received.\n */\n min_amount_a: string\n\n /**\n * The minimum amount of the second coin to be received.\n */\n min_amount_b: string\n\n /**\n * Indicates whether to collect fees during the closing.\n */\n collect_fee: boolean\n } & CoinPairType &\n CommonParams\n/**\n * Represents parameters for collecting fees.\n */\nexport type CollectFeeParams = CommonParams & CoinPairType\n\n/**\n * Represents parameters for creating a test transfer transaction payload.\n */\nexport type createTestTransferTxPayloadParams = {\n /**\n * The recipient account address.\n */\n account: string\n\n /**\n * The value to transfer.\n */\n value: number\n}\n\n/**\n * Represents parameters for calculating rates in a swap.\n */\nexport type CalculateRatesParams = {\n /**\n * The number of decimal places for token A.\n */\n decimalsA: number\n\n /**\n * The number of decimal places for token B.\n */\n decimalsB: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The amount to swap.\n */\n amount: BN\n\n /**\n * An array of tick data for swap ticks.\n */\n swapTicks: Array<TickData>\n\n /**\n * The current pool information.\n */\n currentPool: Pool\n}\n\n/**\n * Represents the result of calculating rates in a swap.\n */\nexport type CalculateRatesResult = {\n /**\n * The estimated amount in token A.\n */\n estimatedAmountIn: BN\n\n /**\n * The estimated amount in token B.\n */\n estimatedAmountOut: BN\n\n /**\n * The estimated ending square root price.\n */\n estimatedEndSqrtPrice: BN\n\n /**\n * The estimated fee amount.\n */\n estimatedFeeAmount: BN\n\n /**\n * Indicates if the estimated amount exceeds the limit.\n */\n isExceed: boolean\n\n /**\n * The extra compute limit.\n */\n extraComputeLimit: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n aToB: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The amount to swap.\n */\n amount: BN\n\n /**\n * The price impact percentage.\n */\n priceImpactPct: number\n}\n\n/**\n * Represents parameters for a swap operation.\n */\nexport type SwapParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n by_amount_in: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n\n /**\n * The amount limit for the swap.\n */\n amount_limit: string\n\n /**\n * The optional swap partner.\n */\n swap_partner?: string\n} & CoinPairType\n\n/**\n * Represents parameters for a pre-swap operation.\n */\nexport type PreSwapParams = {\n /**\n * The pool information for the pre-swap.\n */\n pool: Pool\n\n /**\n * The current square root price.\n */\n currentSqrtPrice: number\n\n /**\n * The number of decimal places for token A.\n */\n decimalsA: number\n\n /**\n * The number of decimal places for token B.\n */\n decimalsB: number\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for a pre-swap operation with multiple pools.\n */\nexport type PreSwapWithMultiPoolParams = {\n /**\n * An array of pool addresses for the pre-swap.\n */\n poolAddresses: string[]\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n/**\n * If changes in liquidity are required before the swap, then this parameter should be passed.\n */\nexport type PreSwapLpChangeParams = {\n /**\n * Unique identifier for the liquidity pool involved in the transaction.\n */\n pool_id: string\n\n /**\n * Lower bound of the liquidity range. In AMM models, like Uniswap V3, liquidity is provided within specific price ranges. This represents the lower limit of that range.\n */\n tick_lower: number\n\n /**\n * Upper bound of the liquidity range, corresponding to the lower bound. This defines the upper limit of the range where liquidity is provided.\n */\n tick_upper: number\n\n /**\n * The change in liquidity, which can be a large number and is thus represented as a string. It can be positive or negative, indicating an increase or decrease in liquidity.\n */\n delta_liquidity: number\n\n /**\n * A boolean value indicating whether the 'delta_liquidity' represents an increase (true) or decrease (false) in liquidity.\n */\n is_increase: boolean\n}\n/**\n * Represents parameters for a transitional pre-swap operation with multiple pools.\n */\nexport type TransPreSwapWithMultiPoolParams = {\n /**\n * The address of the pool for the transitional pre-swap.\n */\n poolAddress: string\n\n /**\n * Specifies if the swap is from token A to token B.\n */\n a2b: boolean\n\n /**\n * Specifies if the swap amount is specified in token A.\n */\n byAmountIn: boolean\n\n /**\n * The swap amount.\n */\n amount: string\n} & CoinPairType\n\n/**\n * Represents parameters for collecting rewarder fees.\n */\nexport type CollectRewarderParams = {\n /**\n * The identifier of the pool.\n */\n pool_id: SuiObjectIdType\n\n /**\n * The identifier of the position.\n */\n pos_id: SuiObjectIdType\n\n /**\n * Specifies if the fee should be collected.\n */\n collect_fee: boolean\n\n /**\n * An array of rewarder coin types.\n */\n rewarder_coin_types: SuiAddressType[]\n} & CoinPairType\n\n/**\n * Represents the amount owed by a rewarder.\n */\nexport type RewarderAmountOwed = {\n /**\n * The amount owed.\n */\n amount_owed: BN\n\n /**\n * The address of the coin.\n */\n coin_address: string\n}\n\n/**\n * Utility function to retrieve packager configurations from a package object.\n * @param {Package<T>} packageObj - The package object containing configurations.\n * @throws {Error} Throws an error if the package does not have a valid config.\n * @returns {T} The retrieved configuration.\n */\nexport function getPackagerConfigs<T>(packageObj: Package<T>) {\n if (packageObj.config === undefined) {\n throw new ClmmpoolsError(`package: ${packageObj.package_id} not config in sdk SdkOptions`, ConfigErrorCode.InvalidConfig)\n }\n return packageObj.config\n}\n\nexport type OpenPositionAddLiquidityWithProtectionParams = {\n pool: SuiAddressType\n tick_lower: number\n tick_upper: number\n coin_a: number | string\n coin_b: number | string\n\n /**\n * The address type of the coin A.\n */\n coinAType: SuiAddressType\n\n /**\n * The address type of the coin A.\n */\n coinBType: SuiAddressType\n\n max_amount_a: number\n max_amount_b: number\n min_amount_a: number\n min_amount_b: number\n by_amount_a: boolean\n}\n\nexport type AddLiquidityWithProtectionParams = AddLiquidityFixTokenParams & {\n // pool: SuiAddressType\n // position: SuiObjectIdType\n // coin_a: number | string\n // coin_b: number | string\n // /**\n // * The address type of the coin A.\n // */\n // coinAType: SuiAddressType\n // /**\n // * The address type of the coin A.\n // */\n // coinBType: SuiAddressType\n // max_amount_a: number\n // max_amount_b: number\n // min_amount_a: number\n // min_amount_b: number\n // fix_amount_a: boolean\n}\n","import BN from 'bn.js'\n\n/**\n * Represents input data for adding liquidity to a pool.\n */\nexport type LiquidityInput = {\n /**\n * The amount of coin A.\n */\n coinAmountA: BN\n\n /**\n * The amount of coin B.\n */\n coinAmountB: BN\n\n /**\n * The maximum amount of token A.\n */\n tokenMaxA: BN\n\n /**\n * The maximum amount of token B.\n */\n tokenMaxB: BN\n\n /**\n * The liquidity amount.\n */\n liquidityAmount: BN\n\n fix_amount_a: boolean\n}\n\n/**\n * Represents the direction of a swap.\n */\nexport enum SwapDirection {\n /**\n * Swap from coin A to coin B.\n */\n A2B = 'a2b',\n\n /**\n * Swap from coin B to coin A.\n */\n B2A = 'b2a',\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { TickMath } from './tick'\nimport { MathUtil } from './utils'\n\nconst D365 = new BN(365)\nconst H24 = new BN(24)\nconst S3600 = new BN(3600)\nconst B05 = new BN(0.5)\n\nexport function estPoolAPR(preBlockReward: BN, rewardPrice: BN, totalTradingFee: BN, totalLiquidityValue: BN): BN {\n const annualRate = D365.mul(H24).mul(S3600).mul(B05)\n\n const APR = annualRate.mul(preBlockReward.mul(rewardPrice).add(totalTradingFee).div(totalLiquidityValue))\n\n return APR\n}\n\nfunction calculatePoolValidTVL(\n amountA: BN,\n amountB: BN,\n decimalsA: number,\n decimalsB: number,\n coinAPrice: Decimal,\n coinBPrice: Decimal\n): Decimal {\n const poolValidAmountA = new Decimal(amountA.toString()).div(new Decimal(10 ** decimalsA))\n const poolValidAmountB = new Decimal(amountB.toString()).div(new Decimal(10 ** decimalsB))\n\n const TVL = poolValidAmountA.mul(coinAPrice).add(poolValidAmountB.mul(coinBPrice))\n\n return TVL\n}\n\nexport type estPosAPRResult = {\n feeAPR: Decimal\n posRewarder0APR: Decimal\n posRewarder1APR: Decimal\n posRewarder2APR: Decimal\n}\n\nexport function estPositionAPRWithDeltaMethod(\n currentTickIndex: number,\n lowerTickIndex: number,\n upperTickIndex: number,\n currentSqrtPriceX64: BN,\n poolLiquidity: BN,\n decimalsA: number,\n decimalsB: number,\n decimalsRewarder0: number,\n decimalsRewarder1: number,\n decimalsRewarder2: number,\n feeRate: number,\n amountAStr: string,\n amountBStr: string,\n poolAmountA: BN,\n poolAmountB: BN,\n swapVolumeStr: string,\n poolRewarders0Str: string,\n poolRewarders1Str: string,\n poolRewarders2Str: string,\n coinAPriceStr: string,\n coinBPriceStr: string,\n rewarder0PriceStr: string,\n rewarder1PriceStr: string,\n rewarder2PriceStr: string\n): estPosAPRResult {\n const amountA = new Decimal(amountAStr)\n const amountB = new Decimal(amountBStr)\n const swapVolume = new Decimal(swapVolumeStr)\n const poolRewarders0 = new Decimal(poolRewarders0Str)\n const poolRewarders1 = new Decimal(poolRewarders1Str)\n const poolRewarders2 = new Decimal(poolRewarders2Str)\n const coinAPrice = new Decimal(coinAPriceStr)\n const coinBPrice = new Decimal(coinBPriceStr)\n const rewarder0Price = new Decimal(rewarder0PriceStr)\n const rewarder1Price = new Decimal(rewarder1PriceStr)\n const rewarder2Price = new Decimal(rewarder2PriceStr)\n\n const lowerSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(lowerTickIndex)\n const upperSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(upperTickIndex)\n const lowerSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(lowerSqrtPriceX64)).round()\n const upperSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(upperSqrtPriceX64)).round()\n const currentSqrtPriceD = MathUtil.toX64_Decimal(MathUtil.fromX64(currentSqrtPriceX64)).round()\n let deltaLiquidity\n const liquidityAmount0 = amountA\n .mul(new Decimal(10 ** decimalsA))\n .mul(upperSqrtPriceD.mul(lowerSqrtPriceD))\n .div(upperSqrtPriceD.sub(lowerSqrtPriceD))\n .round()\n const liquidityAmount1 = amountB\n .mul(new Decimal(10 ** decimalsB))\n .div(upperSqrtPriceD.sub(lowerSqrtPriceD))\n .round()\n if (currentTickIndex < lowerTickIndex) {\n deltaLiquidity = liquidityAmount0\n } else if (currentTickIndex > upperTickIndex) {\n deltaLiquidity = liquidityAmount1\n } else {\n deltaLiquidity = Decimal.min(liquidityAmount0, liquidityAmount1)\n }\n const deltaY = deltaLiquidity.mul(currentSqrtPriceD.sub(lowerSqrtPriceD))\n const deltaX = deltaLiquidity.mul(upperSqrtPriceD.sub(currentSqrtPriceD)).div(currentSqrtPriceD.mul(upperSqrtPriceD))\n const posValidTVL = deltaX\n .div(new Decimal(10 ** decimalsA))\n .mul(coinAPrice)\n .add(deltaY.div(new Decimal(10 ** decimalsB).mul(coinBPrice)))\n const poolValidTVL = calculatePoolValidTVL(poolAmountA, poolAmountB, decimalsA, decimalsB, coinAPrice, coinBPrice)\n const posValidRate = posValidTVL.div(poolValidTVL)\n\n const feeAPR = deltaLiquidity.eq(new Decimal(0))\n ? new Decimal(0)\n : new Decimal(feeRate / 10000)\n .mul(swapVolume)\n .mul(new Decimal(deltaLiquidity.toString()).div(new Decimal(poolLiquidity.toString()).add(new Decimal(deltaLiquidity.toString()))))\n .div(posValidTVL)\n\n const aprCoe = posValidRate.eq(new Decimal(0)) ? new Decimal(0) : posValidRate.mul(new Decimal(36500 / 7)).div(posValidTVL)\n const posRewarder0APR = poolRewarders0\n .div(new Decimal(10 ** decimalsRewarder0))\n .mul(rewarder0Price)\n .mul(aprCoe)\n const posRewarder1APR = poolRewarders1\n .div(new Decimal(10 ** decimalsRewarder1))\n .mul(rewarder1Price)\n .mul(aprCoe)\n const posRewarder2APR = poolRewarders2\n .div(new Decimal(10 ** decimalsRewarder2))\n .mul(rewarder2Price)\n .mul(aprCoe)\n return {\n feeAPR,\n posRewarder0APR,\n posRewarder1APR,\n posRewarder2APR,\n }\n}\n\nexport function estPositionAPRWithMultiMethod(\n lowerUserPrice: number,\n upperUserPrice: number,\n lowerHistPrice: number,\n upperHistPrice: number\n): Decimal {\n const retroLower = Math.max(lowerUserPrice, lowerHistPrice)\n const retroUpper = Math.min(upperUserPrice, upperHistPrice)\n const retroRange = retroUpper - retroLower\n const userRange = upperUserPrice - lowerUserPrice\n const histRange = upperHistPrice - lowerHistPrice\n const userRangeD = new Decimal(userRange.toString())\n const histRangeD = new Decimal(histRange.toString())\n const retroRangeD = new Decimal(retroRange.toString())\n\n let m = new Decimal('0')\n if (retroRange < 0) {\n m = new Decimal('0')\n } else if (userRange === retroRange) {\n m = histRangeD.div(retroRangeD)\n } else if (histRange === retroRange) {\n m = retroRangeD.div(userRangeD)\n } else {\n m = retroRangeD.mul(retroRangeD).div(histRangeD).div(userRangeD)\n }\n\n return m\n}\n","/* eslint-disable import/no-unresolved */\n/* eslint-disable no-bitwise */\nimport BN from 'bn.js'\nimport { asIntN, d } from '../utils'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport Decimal from '../utils/decimal'\nimport { MathUtil } from './utils'\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nconst BIT_PRECISION = 14\nconst LOG_B_2_X32 = '59543866431248'\nconst LOG_B_P_ERR_MARGIN_LOWER_X64 = '184467440737095516'\nconst LOG_B_P_ERR_MARGIN_UPPER_X64 = '15793534762490258745'\nconst TICK_BOUND = 443636\n\nfunction signedShiftLeft(n0: BN, shiftBy: number, bitWidth: number) {\n const twosN0 = n0.toTwos(bitWidth).shln(shiftBy)\n twosN0.imaskn(bitWidth + 1)\n return twosN0.fromTwos(bitWidth)\n}\n\nfunction signedShiftRight(n0: BN, shiftBy: number, bitWidth: number) {\n const twoN0 = n0.toTwos(bitWidth).shrn(shiftBy)\n twoN0.imaskn(bitWidth - shiftBy + 1)\n return twoN0.fromTwos(bitWidth - shiftBy)\n}\n\nfunction tickIndexToSqrtPricePositive(tick: number) {\n let ratio: BN\n\n if ((tick & 1) !== 0) {\n ratio = new BN('79232123823359799118286999567')\n } else {\n ratio = new BN('79228162514264337593543950336')\n }\n\n if ((tick & 2) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79236085330515764027303304731')), 96, 256)\n }\n if ((tick & 4) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79244008939048815603706035061')), 96, 256)\n }\n if ((tick & 8) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79259858533276714757314932305')), 96, 256)\n }\n if ((tick & 16) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79291567232598584799939703904')), 96, 256)\n }\n if ((tick & 32) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79355022692464371645785046466')), 96, 256)\n }\n if ((tick & 64) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79482085999252804386437311141')), 96, 256)\n }\n if ((tick & 128) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('79736823300114093921829183326')), 96, 256)\n }\n if ((tick & 256) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('80248749790819932309965073892')), 96, 256)\n }\n if ((tick & 512) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('81282483887344747381513967011')), 96, 256)\n }\n if ((tick & 1024) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('83390072131320151908154831281')), 96, 256)\n }\n if ((tick & 2048) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('87770609709833776024991924138')), 96, 256)\n }\n if ((tick & 4096) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('97234110755111693312479820773')), 96, 256)\n }\n if ((tick & 8192) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('119332217159966728226237229890')), 96, 256)\n }\n if ((tick & 16384) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('179736315981702064433883588727')), 96, 256)\n }\n if ((tick & 32768) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('407748233172238350107850275304')), 96, 256)\n }\n if ((tick & 65536) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('2098478828474011932436660412517')), 96, 256)\n }\n if ((tick & 131072) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('55581415166113811149459800483533')), 96, 256)\n }\n if ((tick & 262144) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('38992368544603139932233054999993551')), 96, 256)\n }\n\n return signedShiftRight(ratio, 32, 256)\n}\n\nfunction tickIndexToSqrtPriceNegative(tickIndex: number) {\n const tick = Math.abs(tickIndex)\n let ratio: BN\n\n if ((tick & 1) !== 0) {\n ratio = new BN('18445821805675392311')\n } else {\n ratio = new BN('18446744073709551616')\n }\n\n if ((tick & 2) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18444899583751176498')), 64, 256)\n }\n if ((tick & 4) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18443055278223354162')), 64, 256)\n }\n if ((tick & 8) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18439367220385604838')), 64, 256)\n }\n if ((tick & 16) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18431993317065449817')), 64, 256)\n }\n if ((tick & 32) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18417254355718160513')), 64, 256)\n }\n if ((tick & 64) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18387811781193591352')), 64, 256)\n }\n if ((tick & 128) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18329067761203520168')), 64, 256)\n }\n if ((tick & 256) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('18212142134806087854')), 64, 256)\n }\n if ((tick & 512) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('17980523815641551639')), 64, 256)\n }\n if ((tick & 1024) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('17526086738831147013')), 64, 256)\n }\n if ((tick & 2048) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('16651378430235024244')), 64, 256)\n }\n if ((tick & 4096) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('15030750278693429944')), 64, 256)\n }\n if ((tick & 8192) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('12247334978882834399')), 64, 256)\n }\n if ((tick & 16384) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('8131365268884726200')), 64, 256)\n }\n if ((tick & 32768) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('3584323654723342297')), 64, 256)\n }\n if ((tick & 65536) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('696457651847595233')), 64, 256)\n }\n if ((tick & 131072) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('26294789957452057')), 64, 256)\n }\n if ((tick & 262144) !== 0) {\n ratio = signedShiftRight(ratio.mul(new BN('37481735321082')), 64, 256)\n }\n\n return ratio\n}\n\nexport class TickMath {\n static priceToSqrtPriceX64(price: Decimal, decimalsA: number, decimalsB: number): BN {\n return MathUtil.toX64(price.mul(Decimal.pow(10, decimalsB - decimalsA)).sqrt())\n }\n\n static sqrtPriceX64ToPrice(sqrtPriceX64: BN, decimalsA: number, decimalsB: number): Decimal {\n return MathUtil.fromX64(sqrtPriceX64)\n .pow(2)\n .mul(Decimal.pow(10, decimalsA - decimalsB))\n }\n\n static tickIndexToSqrtPriceX64(tickIndex: number): BN {\n if (tickIndex > 0) {\n return new BN(tickIndexToSqrtPricePositive(tickIndex))\n }\n return new BN(tickIndexToSqrtPriceNegative(tickIndex))\n }\n\n static sqrtPriceX64ToTickIndex(sqrtPriceX64: BN): number {\n if (sqrtPriceX64.gt(new BN(MAX_SQRT_PRICE)) || sqrtPriceX64.lt(new BN(MIN_SQRT_PRICE))) {\n throw new ClmmpoolsError('Provided sqrtPrice is not within the supported sqrtPrice range.', MathErrorCode.InvalidSqrtPrice)\n }\n\n const msb = sqrtPriceX64.bitLength() - 1\n const adjustedMsb = new BN(msb - 64)\n const log2pIntegerX32 = signedShiftLeft(adjustedMsb, 32, 128)\n\n let bit = new BN('8000000000000000', 'hex')\n let precision = 0\n let log2pFractionX64 = new BN(0)\n\n let r = msb >= 64 ? sqrtPriceX64.shrn(msb - 63) : sqrtPriceX64.shln(63 - msb)\n\n while (bit.gt(new BN(0)) && precision < BIT_PRECISION) {\n r = r.mul(r)\n const rMoreThanTwo = r.shrn(127)\n r = r.shrn(63 + rMoreThanTwo.toNumber())\n log2pFractionX64 = log2pFractionX64.add(bit.mul(rMoreThanTwo))\n bit = bit.shrn(1)\n precision += 1\n }\n\n const log2pFractionX32 = log2pFractionX64.shrn(32)\n\n const log2pX32 = log2pIntegerX32.add(log2pFractionX32)\n const logbpX64 = log2pX32.mul(new BN(LOG_B_2_X32))\n\n const tickLow = signedShiftRight(logbpX64.sub(new BN(LOG_B_P_ERR_MARGIN_LOWER_X64)), 64, 128).toNumber()\n const tickHigh = signedShiftRight(logbpX64.add(new BN(LOG_B_P_ERR_MARGIN_UPPER_X64)), 64, 128).toNumber()\n\n if (tickLow === tickHigh) {\n return tickLow\n }\n const derivedTickHighSqrtPriceX64 = TickMath.tickIndexToSqrtPriceX64(tickHigh)\n if (derivedTickHighSqrtPriceX64.lte(sqrtPriceX64)) {\n return tickHigh\n }\n return tickLow\n }\n\n static tickIndexToPrice(tickIndex: number, decimalsA: number, decimalsB: number): Decimal {\n return TickMath.sqrtPriceX64ToPrice(TickMath.tickIndexToSqrtPriceX64(tickIndex), decimalsA, decimalsB)\n }\n\n static priceToTickIndex(price: Decimal, decimalsA: number, decimalsB: number): number {\n return TickMath.sqrtPriceX64ToTickIndex(TickMath.priceToSqrtPriceX64(price, decimalsA, decimalsB))\n }\n\n static priceToInitializableTickIndex(price: Decimal, decimalsA: number, decimalsB: number, tickSpacing: number): number {\n return TickMath.getInitializableTickIndex(TickMath.priceToTickIndex(price, decimalsA, decimalsB), tickSpacing)\n }\n\n static getInitializableTickIndex(tickIndex: number, tickSpacing: number): number {\n return tickIndex - (tickIndex % tickSpacing)\n }\n\n /**\n *\n * @param tickIndex\n * @param tickSpacing\n * @returns\n */\n static getNextInitializableTickIndex(tickIndex: number, tickSpacing: number) {\n return TickMath.getInitializableTickIndex(tickIndex, tickSpacing) + tickSpacing\n }\n\n static getPrevInitializableTickIndex(tickIndex: number, tickSpacing: number) {\n return TickMath.getInitializableTickIndex(tickIndex, tickSpacing) - tickSpacing\n }\n}\n\nexport function getTickDataFromUrlData(ticks: any) {\n const tickdatas: any[] = []\n for (const tick of ticks) {\n const td: any = {\n objectId: tick.objectId,\n index: Number(asIntN(BigInt(tick.index)).toString()),\n sqrtPrice: tick.sqrtPrice,\n liquidityNet: new BN(BigInt.asIntN(128, BigInt(BigInt(tick.liquidityNet.toString()))).toString()),\n liquidityGross: tick.liquidityGross,\n feeGrowthOutsideA: tick.feeGrowthOutsideA,\n feeGrowthOutsideB: tick.feeGrowthOutsideB,\n rewardersGrowthOutside: [\n new BN(tick.rewardersGrowthOutside[0]),\n new BN(tick.rewardersGrowthOutside[1]),\n new BN(tick.rewardersGrowthOutside[2]),\n ],\n }\n tickdatas.push(td)\n }\n return tickdatas\n}\n\nexport function tickScore(tickIndex: number) {\n return d(tickIndex).add(d(TICK_BOUND))\n}\n","import BN from 'bn.js'\nimport { asUintN, d } from '../utils'\nimport { LiquidityInput } from '../types/liquidity'\nimport { ClmmpoolsError, MathErrorCode, CoinErrorCode } from '../errors/errors'\nimport type { ClmmpoolData, TickData } from '../types/clmmpool'\nimport { FEE_RATE_DENOMINATOR, MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport Decimal from '../utils/decimal'\nimport { SwapUtils } from './swap'\nimport { TickMath } from './tick'\nimport { MathUtil, ONE, U64_MAX, ZERO } from './utils'\n\nexport type SwapStepResult = {\n amountIn: BN\n amountOut: BN\n nextSqrtPrice: BN\n feeAmount: BN\n}\n\nexport type SwapResult = {\n amountIn: BN\n amountOut: BN\n feeAmount: BN\n refAmount: BN\n nextSqrtPrice: BN\n crossTickNum: number\n}\n\nexport type CoinAmounts = {\n coinA: BN\n coinB: BN\n}\n\nexport function toCoinAmount(a: number, b: number): CoinAmounts {\n return {\n coinA: new BN(a.toString()),\n coinB: new BN(b.toString()),\n }\n}\n\n/**\n * Get the amount A delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaA(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n const numberator = liquidity.mul(sqrtPriceDiff).shln(64)\n const denomminator = sqrtPrice0.mul(sqrtPrice1)\n const quotient = numberator.div(denomminator)\n const remainder = numberator.mod(denomminator)\n const result = roundUp && !remainder.eq(ZERO) ? quotient.add(new BN(1)) : quotient\n // if (MathUtil.isOverflow(result, 64)) {\n // throw new ClmmpoolsError('Result large than u64 max', MathErrorCode.IntegerDowncastOverflow)\n // }\n return result\n}\n\n/**\n * Get the amount B delta about two prices, for give amount of liquidity.\n * `delta_a = (liquidity * delta_sqrt_price) / sqrt_price_upper * sqrt_price_lower)`\n *\n * @param sqrtPrice0 - A sqrt price\n * @param sqrtPrice1 - Another sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param roundUp - Whether to round the amount up or down\n * @returns\n */\nexport function getDeltaB(sqrtPrice0: BN, sqrtPrice1: BN, liquidity: BN, roundUp: boolean): BN {\n const sqrtPriceDiff = sqrtPrice0.gt(sqrtPrice1) ? sqrtPrice0.sub(sqrtPrice1) : sqrtPrice1.sub(sqrtPrice0)\n if (liquidity.eq(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n return ZERO\n }\n const p = liquidity.mul(sqrtPriceDiff)\n const shoudRoundUp = roundUp && p.and(U64_MAX).gt(ZERO)\n const result = shoudRoundUp ? p.shrn(64).add(ONE) : p.shrn(64)\n if (MathUtil.isOverflow(result, 64)) {\n throw new ClmmpoolsError('Result large than u64 max', MathErrorCode.IntegerDowncastOverflow)\n }\n return result\n}\n\n/**\n * Get the next sqrt price from give a delta of token_a.\n * `new_sqrt_price = (sqrt_price * liquidity) / (liquidity +/- amount * sqrt_price)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceAUp(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n if (amount.eq(ZERO)) {\n return sqrtPrice\n }\n const numberator = MathUtil.checkMulShiftLeft(sqrtPrice, liquidity, 64, 256)\n const liquidityShl64 = liquidity.shln(64)\n const product = MathUtil.checkMul(sqrtPrice, amount, 256)\n if (!byAmountIn && liquidityShl64.lte(product)) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Unable to divide liquidityShl64 by product', MathErrorCode.DivideByZero)\n }\n const nextSqrtPrice = byAmountIn\n ? MathUtil.checkDivRoundUpIf(numberator, liquidityShl64.add(product), true)\n : MathUtil.checkDivRoundUpIf(numberator, liquidityShl64.sub(product), true)\n if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE))) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price less than min sqrt price', CoinErrorCode.CoinAmountMinSubceeded)\n }\n if (nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price greater than max sqrt price', CoinErrorCode.CoinAmountMaxExceeded)\n }\n\n return nextSqrtPrice\n}\n\n/**\n * Get the next sqrt price from give a delta of token_b.\n * `new_sqrt_price = (sqrt_price +(delta_b / liquidity)`\n *\n * @param sqrtPrice - The start sqrt price\n * @param liquidity - The amount of usable liquidity\n * @param amount - The amount of token_a\n * @param byAmountIn - Weather to fixed input\n */\nexport function getNextSqrtPriceBDown(sqrtPrice: BN, liquidity: BN, amount: BN, byAmountIn: boolean): BN {\n const deltaSqrtPrice = MathUtil.checkDivRoundUpIf(amount.shln(64), liquidity, !byAmountIn)\n const nextSqrtPrice = byAmountIn ? sqrtPrice.add(deltaSqrtPrice) : sqrtPrice.sub(deltaSqrtPrice)\n\n if (nextSqrtPrice.lt(new BN(MIN_SQRT_PRICE)) || nextSqrtPrice.gt(new BN(MAX_SQRT_PRICE))) {\n throw new ClmmpoolsError('getNextSqrtPriceAUp - Next sqrt price out of bounds', CoinErrorCode.SqrtPriceOutOfBounds)\n }\n\n return nextSqrtPrice\n}\n\n/**\n * Get next sqrt price from input parameter.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param aToB\n * @returns\n */\nexport function getNextSqrtPriceFromInput(sqrtPrice: BN, liquidity: BN, amount: BN, aToB: boolean): BN {\n return aToB ? getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, true) : getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, true)\n}\n\n/**\n * Get the next sqrt price from output parameters.\n *\n * @param sqrtPrice\n * @param liquidity\n * @param amount\n * @param a2b\n * @returns\n */\nexport function getNextSqrtPriceFromOutput(sqrtPrice: BN, liquidity: BN, amount: BN, a2b: boolean): BN {\n return a2b ? getNextSqrtPriceBDown(sqrtPrice, liquidity, amount, false) : getNextSqrtPriceAUp(sqrtPrice, liquidity, amount, false)\n}\n\n/**\n * Get the amount of delta_a or delta_b from input parameters, and round up result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaUpFromInput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n return ZERO\n }\n\n let result\n if (a2b) {\n const numberator = new BN(liquidity).mul(new BN(sqrtPriceDiff)).shln(64)\n const denomminator = targetSqrtPrice.mul(currentSqrtPrice)\n const quotient = numberator.div(denomminator)\n const remainder = numberator.mod(denomminator)\n result = !remainder.eq(ZERO) ? quotient.add(ONE) : quotient\n } else {\n const product = new BN(liquidity).mul(new BN(sqrtPriceDiff))\n const shoudRoundUp = product.and(U64_MAX).gt(ZERO)\n result = shoudRoundUp ? product.shrn(64).add(ONE) : product.shrn(64)\n }\n return result\n}\n\n/**\n * Get the amount of delta_a or delta_b from output parameters, and round down result.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param a2b\n * @returns\n */\nexport function getDeltaDownFromOutput(currentSqrtPrice: BN, targetSqrtPrice: BN, liquidity: BN, a2b: boolean): BN {\n const sqrtPriceDiff = currentSqrtPrice.gt(targetSqrtPrice) ? currentSqrtPrice.sub(targetSqrtPrice) : targetSqrtPrice.sub(currentSqrtPrice)\n\n if (liquidity.lte(ZERO) || sqrtPriceDiff.eq(ZERO)) {\n return ZERO\n }\n\n let result\n if (a2b) {\n const product = liquidity.mul(sqrtPriceDiff)\n result = product.shrn(64)\n } else {\n const numberator = liquidity.mul(sqrtPriceDiff).shln(64)\n const denomminator = targetSqrtPrice.mul(currentSqrtPrice)\n result = numberator.div(denomminator)\n }\n return result\n}\n\n/**\n * Simulate per step of swap on every tick.\n *\n * @param currentSqrtPrice\n * @param targetSqrtPrice\n * @param liquidity\n * @param amount\n * @param feeRate\n * @param byAmountIn\n * @returns\n */\nexport function computeSwapStep(\n currentSqrtPrice: BN,\n targetSqrtPrice: BN,\n liquidity: BN,\n amount: BN,\n feeRate: BN,\n byAmountIn: boolean\n): SwapStepResult {\n if (liquidity === ZERO) {\n return {\n amountIn: ZERO,\n amountOut: ZERO,\n nextSqrtPrice: targetSqrtPrice,\n feeAmount: ZERO,\n }\n }\n const a2b = currentSqrtPrice.gte(targetSqrtPrice)\n let amountIn: BN\n let amountOut: BN\n let nextSqrtPrice: BN\n let feeAmount: BN\n if (byAmountIn) {\n const amountRemain = MathUtil.checkMulDivFloor(\n amount,\n MathUtil.checkUnsignedSub(FEE_RATE_DENOMINATOR, feeRate),\n FEE_RATE_DENOMINATOR,\n 64\n )\n const maxAmountIn = getDeltaUpFromInput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n if (maxAmountIn.gt(amountRemain)) {\n amountIn = amountRemain\n feeAmount = MathUtil.checkUnsignedSub(amount, amountRemain)\n nextSqrtPrice = getNextSqrtPriceFromInput(currentSqrtPrice, liquidity, amountRemain, a2b)\n } else {\n amountIn = maxAmountIn\n feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n nextSqrtPrice = targetSqrtPrice\n }\n amountOut = getDeltaDownFromOutput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n } else {\n const maxAmountOut = getDeltaDownFromOutput(currentSqrtPrice, targetSqrtPrice, liquidity, a2b)\n if (maxAmountOut.gt(amount)) {\n amountOut = amount\n nextSqrtPrice = getNextSqrtPriceFromOutput(currentSqrtPrice, liquidity, amount, a2b)\n } else {\n amountOut = maxAmountOut\n nextSqrtPrice = targetSqrtPrice\n }\n amountIn = getDeltaUpFromInput(currentSqrtPrice, nextSqrtPrice, liquidity, a2b)\n feeAmount = MathUtil.checkMulDivCeil(amountIn, feeRate, FEE_RATE_DENOMINATOR.sub(feeRate), 64)\n }\n return {\n amountIn,\n amountOut,\n nextSqrtPrice,\n feeAmount,\n }\n}\n\n/**\n * Simulate swap by imput lots of ticks.\n * @param aToB\n * @param byAmountIn\n * @param amount\n * @param poolData\n * @param swapTicks\n * @returns\n */\nexport function computeSwap(\n aToB: boolean,\n byAmountIn: boolean,\n amount: BN,\n poolData: ClmmpoolData,\n swapTicks: Array<TickData>\n): SwapResult {\n let remainerAmount = amount\n let currentLiquidity = poolData.liquidity\n let { currentSqrtPrice } = poolData\n const swapResult: SwapResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n feeAmount: ZERO,\n refAmount: ZERO,\n nextSqrtPrice: ZERO,\n crossTickNum: 0,\n }\n let targetSqrtPrice\n let signedLiquidityChange\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(aToB)\n for (const tick of swapTicks) {\n if (aToB && poolData.currentTickIndex < tick.index) {\n continue\n }\n if (!aToB && poolData.currentTickIndex >= tick.index) {\n continue\n }\n if (tick === null) {\n continue\n }\n if ((aToB && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!aToB && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n targetSqrtPrice = sqrtPriceLimit\n } else {\n targetSqrtPrice = tick.sqrtPrice\n }\n\n const stepResult = computeSwapStep(currentSqrtPrice, targetSqrtPrice, currentLiquidity, remainerAmount, poolData.feeRate, byAmountIn)\n\n if (!stepResult.amountIn.eq(ZERO)) {\n remainerAmount = byAmountIn\n ? remainerAmount.sub(stepResult.amountIn.add(stepResult.feeAmount))\n : remainerAmount.sub(stepResult.amountOut)\n }\n\n swapResult.amountIn = swapResult.amountIn.add(stepResult.amountIn)\n swapResult.amountOut = swapResult.amountOut.add(stepResult.amountOut)\n swapResult.feeAmount = swapResult.feeAmount.add(stepResult.feeAmount)\n if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n signedLiquidityChange = tick.liquidityNet.mul(new BN(-1))\n\n if (aToB) {\n if (MathUtil.is_neg(signedLiquidityChange)) {\n currentLiquidity = currentLiquidity.add(new BN(asUintN(BigInt(signedLiquidityChange.toString()), 128)))\n } else {\n currentLiquidity = currentLiquidity.add(signedLiquidityChange)\n }\n } else if (MathUtil.is_neg(signedLiquidityChange)) {\n currentLiquidity = currentLiquidity.sub(new BN(asUintN(BigInt(signedLiquidityChange.toString()), 128)))\n } else {\n currentLiquidity = currentLiquidity.sub(signedLiquidityChange)\n }\n\n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice\n }\n swapResult.crossTickNum += 1\n if (remainerAmount.eq(ZERO)) {\n break\n }\n }\n swapResult.amountIn = swapResult.amountIn.add(swapResult.feeAmount)\n swapResult.nextSqrtPrice = currentSqrtPrice\n return swapResult\n}\n\n/**\n * Estimate liquidity for coin A\n * @param sqrtPriceX - coin A sqrtprice\n * @param sqrtPriceY - coin B sqrtprice\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinA(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n const num = MathUtil.fromX64_BN(coinAmount.mul(upperSqrtPriceX64).mul(lowerSqrtPriceX64))\n const dem = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n return !num.isZero() && !dem.isZero() ? num.div(dem) : new BN(0)\n}\n\n/**\n * Estimate liquidity for coin B\n * @param sqrtPriceX - coin A sqrtprice\n * @param sqrtPriceY - coin B sqrtprice\n * @param coinAmount - token amount\n * @return\n */\nexport function estimateLiquidityForCoinB(sqrtPriceX: BN, sqrtPriceY: BN, coinAmount: BN) {\n const lowerSqrtPriceX64 = BN.min(sqrtPriceX, sqrtPriceY)\n const upperSqrtPriceX64 = BN.max(sqrtPriceX, sqrtPriceY)\n const delta = upperSqrtPriceX64.sub(lowerSqrtPriceX64)\n return !delta.isZero() ? coinAmount.shln(64).div(delta) : new BN(0)\n}\n\nexport class ClmmPoolUtil {\n /**\n * Update fee rate.\n * @param clmm - clmmpool data\n * @param feeAmount - fee Amount\n * @param refRate - ref rate\n * @param protocolFeeRate - protocol fee rate\n * @param iscoinA - is token A\n * @returns percentage\n */\n static updateFeeRate(clmm: ClmmpoolData, feeAmount: BN, refRate: number, protocolFeeRate: number, iscoinA: boolean) {\n const protocolFee = MathUtil.checkMulDivCeil(feeAmount, new BN(protocolFeeRate), FEE_RATE_DENOMINATOR, 64)\n const refFee = refRate === 0 ? ZERO : MathUtil.checkMulDivFloor(feeAmount, new BN(refRate), FEE_RATE_DENOMINATOR, 64)\n const poolFee = feeAmount.mul(protocolFee).mul(refFee)\n if (iscoinA) {\n clmm.feeProtocolCoinA = clmm.feeProtocolCoinA.add(protocolFee)\n } else {\n clmm.feeProtocolCoinB = clmm.feeProtocolCoinB.add(protocolFee)\n }\n if (poolFee.eq(ZERO) || clmm.liquidity.eq(ZERO)) {\n return { refFee, clmm }\n }\n const growthFee = poolFee.shln(64).div(clmm.liquidity)\n if (iscoinA) {\n clmm.feeGrowthGlobalA = clmm.feeGrowthGlobalA.add(growthFee)\n } else {\n clmm.feeGrowthGlobalB = clmm.feeGrowthGlobalB.add(growthFee)\n }\n return { refFee, clmm }\n }\n\n /**\n * Get token amount fron liquidity.\n * @param liquidity - liquidity\n * @param curSqrtPrice - Pool current sqrt price\n * @param lowerSqrtPrice - position lower sqrt price\n * @param upperSqrtPrice - position upper sqrt price\n * @param roundUp - is round up\n * @returns\n */\n static getCoinAmountFromLiquidity(\n liquidity: BN,\n curSqrtPrice: BN,\n lowerSqrtPrice: BN,\n upperSqrtPrice: BN,\n roundUp: boolean\n ): CoinAmounts {\n const liq = new Decimal(liquidity.toString())\n const curSqrtPriceStr = new Decimal(curSqrtPrice.toString())\n const lowerPriceStr = new Decimal(lowerSqrtPrice.toString())\n const upperPriceStr = new Decimal(upperSqrtPrice.toString())\n let coinA\n let coinB\n if (curSqrtPrice.lt(lowerSqrtPrice)) {\n coinA = MathUtil.toX64_Decimal(liq).mul(upperPriceStr.sub(lowerPriceStr)).div(lowerPriceStr.mul(upperPriceStr))\n coinB = new Decimal(0)\n } else if (curSqrtPrice.lt(upperSqrtPrice)) {\n coinA = MathUtil.toX64_Decimal(liq).mul(upperPriceStr.sub(curSqrtPriceStr)).div(curSqrtPriceStr.mul(upperPriceStr))\n\n coinB = MathUtil.fromX64_Decimal(liq.mul(curSqrtPriceStr.sub(lowerPriceStr)))\n } else {\n coinA = new Decimal(0)\n coinB = MathUtil.fromX64_Decimal(liq.mul(upperPriceStr.sub(lowerPriceStr)))\n }\n if (roundUp) {\n return {\n coinA: new BN(coinA.ceil().toString()),\n coinB: new BN(coinB.ceil().toString()),\n }\n }\n return {\n coinA: new BN(coinA.floor().toString()),\n coinB: new BN(coinB.floor().toString()),\n }\n }\n\n /**\n * Estimate liquidity and token amount from one amounts\n * @param lowerTick - lower tick\n * @param upperTick - upper tick\n * @param coinAmount - token amount\n * @param iscoinA - is token A\n * @param roundUp - is round up\n * @param isIncrease - is increase\n * @param slippage - slippage percentage\n * @param curSqrtPrice - current sqrt price.\n * @return IncreaseLiquidityInput\n */\n static estLiquidityAndcoinAmountFromOneAmounts(\n lowerTick: number,\n upperTick: number,\n coinAmount: BN,\n iscoinA: boolean,\n roundUp: boolean,\n slippage: number,\n curSqrtPrice: BN\n ): LiquidityInput {\n const currentTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n let liquidity\n if (currentTick < lowerTick) {\n if (!iscoinA) {\n throw new ClmmpoolsError('lower tick cannot calculate liquidity by coinB', MathErrorCode.NotSupportedThisCoin)\n }\n liquidity = estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, coinAmount)\n } else if (currentTick > upperTick) {\n if (iscoinA) {\n throw new ClmmpoolsError('upper tick cannot calculate liquidity by coinA', MathErrorCode.NotSupportedThisCoin)\n }\n liquidity = estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, coinAmount)\n } else if (iscoinA) {\n liquidity = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, coinAmount)\n } else {\n liquidity = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, coinAmount)\n }\n const coinAmounts = ClmmPoolUtil.getCoinAmountFromLiquidity(liquidity, curSqrtPrice, lowerSqrtPrice, upperSqrtPrice, roundUp)\n const tokenLimitA = roundUp\n ? d(coinAmounts.coinA.toString())\n .mul(1 + slippage)\n .toString()\n : d(coinAmounts.coinA.toString())\n .mul(1 - slippage)\n .toString()\n\n const tokenLimitB = roundUp\n ? d(coinAmounts.coinB.toString())\n .mul(1 + slippage)\n .toString()\n : d(coinAmounts.coinB.toString())\n .mul(1 - slippage)\n .toString()\n\n return {\n coinAmountA: coinAmounts.coinA,\n coinAmountB: coinAmounts.coinB,\n tokenMaxA: roundUp ? new BN(Decimal.ceil(tokenLimitA).toString()) : new BN(Decimal.floor(tokenLimitA).toString()),\n tokenMaxB: roundUp ? new BN(Decimal.ceil(tokenLimitB).toString()) : new BN(Decimal.floor(tokenLimitB).toString()),\n liquidityAmount: liquidity,\n fix_amount_a: iscoinA,\n }\n }\n\n /**\n * Estimate liquidity from token amounts\n * @param curSqrtPrice - current sqrt price.\n * @param lowerTick - lower tick\n * @param upperTick - upper tick\n * @param tokenAmount - token amount\n * @return\n */\n static estimateLiquidityFromcoinAmounts(curSqrtPrice: BN, lowerTick: number, upperTick: number, tokenAmount: CoinAmounts): BN {\n if (lowerTick > upperTick) {\n throw new ClmmpoolsError('lower tick cannot be greater than lower tick', MathErrorCode.InvalidTwoTickIndex)\n }\n const currTick = TickMath.sqrtPriceX64ToTickIndex(curSqrtPrice)\n const lowerSqrtPrice = TickMath.tickIndexToSqrtPriceX64(lowerTick)\n const upperSqrtPrice = TickMath.tickIndexToSqrtPriceX64(upperTick)\n if (currTick < lowerTick) {\n return estimateLiquidityForCoinA(lowerSqrtPrice, upperSqrtPrice, tokenAmount.coinA)\n }\n if (currTick >= upperTick) {\n return estimateLiquidityForCoinB(upperSqrtPrice, lowerSqrtPrice, tokenAmount.coinB)\n }\n const estimateLiquidityAmountA = estimateLiquidityForCoinA(curSqrtPrice, upperSqrtPrice, tokenAmount.coinA)\n const estimateLiquidityAmountB = estimateLiquidityForCoinB(curSqrtPrice, lowerSqrtPrice, tokenAmount.coinB)\n return BN.min(estimateLiquidityAmountA, estimateLiquidityAmountB)\n }\n\n /**\n * Estimate coin amounts from total amount\n * @param lowerTick\n * @param upperTick\n * @param decimalsA\n * @param decimalsB\n * @param curSqrtPrice\n * @param totalAmount\n * @param tokenPriceA\n * @param tokenPriceB\n * @returns\n */\n static estCoinAmountsFromTotalAmount(\n lowerTick: number,\n upperTick: number,\n curSqrtPrice: BN,\n totalAmount: string,\n tokenPriceA: string,\n tokenPriceB: string\n ) {\n const { ratioA, ratioB } = ClmmPoolUtil.calculateDepositRatioFixTokenA(lowerTick, upperTick, curSqrtPrice)\n\n const amountA = d(totalAmount).mul(ratioA).div(tokenPriceA)\n const amountB = d(totalAmount).mul(ratioB).div(tokenPriceB)\n\n return { amountA, amountB }\n }\n\n static calculateDepositRatioFixTokenA(lowerTick: number, upperTick: number, curSqrtPrice: BN) {\n const coinAmountA = new BN(100000000)\n const { coinAmountB } = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(\n lowerTick,\n upperTick,\n coinAmountA,\n true,\n true,\n 0,\n curSqrtPrice\n )\n const currPrice = TickMath.sqrtPriceX64ToPrice(curSqrtPrice, 0, 0)\n const transformAmountB = d(coinAmountA.toString()).mul(currPrice)\n const totalAmount = transformAmountB.add(coinAmountB.toString())\n const ratioA = transformAmountB.div(totalAmount)\n const ratioB = d(coinAmountB.toString()).div(totalAmount)\n\n return { ratioA, ratioB }\n }\n}\n","import BN from 'bn.js'\nimport { MAX_SQRT_PRICE, MIN_SQRT_PRICE } from '../types/constants'\nimport { MathUtil, U64_MAX, ZERO } from './utils'\n\nexport class SwapUtils {\n /**\n * Get the default sqrt price limit for a swap.\n *\n * @param a2b - true if the swap is A to B, false if the swap is B to A.\n * @returns The default sqrt price limit for the swap.\n */\n static getDefaultSqrtPriceLimit(a2b: boolean): BN {\n return new BN(a2b ? MIN_SQRT_PRICE : MAX_SQRT_PRICE)\n }\n\n /**\n * Get the default values for the otherAmountThreshold in a swap.\n *\n * @param amountSpecifiedIsInput - The direction of a swap\n * @returns The default values for the otherAmountThreshold parameter in a swap.\n */\n static getDefaultOtherAmountThreshold(amountSpecifiedIsInput: boolean): BN {\n return amountSpecifiedIsInput ? ZERO : U64_MAX\n }\n}\n\n/**\n * Get lower sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n const numerator = liquidity.mul(sqrtPriceX64).shln(64)\n const denominator = liquidity.shln(64).add(amount.mul(sqrtPriceX64))\n\n // always round up\n return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get upper sqrt price from token A.\n *\n * @param amount - The amount of tokens the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinA(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n const numerator = liquidity.mul(sqrtPriceX64).shln(64)\n const denominator = liquidity.shln(64).sub(amount.mul(sqrtPriceX64))\n\n // always round up\n return MathUtil.divRoundUp(numerator, denominator)\n}\n\n/**\n * Get lower sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getLowerSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n // always round down(rounding up a negative number)\n return sqrtPriceX64.sub(MathUtil.divRoundUp(amount.shln(64), liquidity))\n}\n\n/**\n * Get upper sqrt price from coin B.\n *\n * @param amount - The amount of coins the user wanted to swap from.\n * @param liquidity - The liquidity of the pool.\n * @param sqrtPriceX64 - The sqrt price of the pool.\n * @returns LowesqrtPriceX64\n */\nexport function getUpperSqrtPriceFromCoinB(amount: BN, liquidity: BN, sqrtPriceX64: BN): BN {\n // always round down (rounding up a negative number)\n return sqrtPriceX64.add(amount.shln(64).div(liquidity))\n}\n","import { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { SuiAddressType, SuiStructTag } from '../types/sui'\nimport { CoinAssist, GAS_TYPE_ARG, GAS_TYPE_ARG_LONG } from '../math/CoinAssist'\nimport { removeHexPrefix } from './hex'\n\nconst EQUAL = 0\nconst LESS_THAN = 1\nconst GREATER_THAN = 2\n\nfunction cmp(a: number, b: number) {\n if (a === b) {\n return EQUAL\n }\n if (a < b) {\n return LESS_THAN\n }\n return GREATER_THAN\n}\n\nfunction compare(symbolX: string, symbolY: string) {\n let i = 0\n\n const len = symbolX.length <= symbolY.length ? symbolX.length : symbolY.length\n\n const lenCmp = cmp(symbolX.length, symbolY.length)\n while (i < len) {\n const elemCmp = cmp(symbolX.charCodeAt(i), symbolY.charCodeAt(i))\n i += 1\n if (elemCmp !== 0) {\n return elemCmp\n }\n }\n\n return lenCmp\n}\n\nexport function isSortedSymbols(symbolX: string, symbolY: string) {\n return compare(symbolX, symbolY) === LESS_THAN\n}\n\nexport function composeType(address: string, generics: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, module: string, struct: string, generics?: SuiAddressType[]): SuiAddressType\nexport function composeType(address: string, ...args: unknown[]): SuiAddressType {\n const generics: string[] = Array.isArray(args[args.length - 1]) ? (args.pop() as string[]) : []\n const chains = [address, ...args].filter(Boolean)\n\n let result: string = chains.join('::')\n\n if (generics && generics.length) {\n result += `<${generics.join(', ')}>`\n }\n\n return result\n}\n\nexport function extractAddressFromType(type: string) {\n return type.split('::')[0]\n}\n\nexport function extractStructTagFromType(type: string): SuiStructTag {\n try {\n let _type = type.replace(/\\s/g, '')\n\n const genericsString = _type.match(/(<.+>)$/)\n const generics = genericsString?.[0]?.match(/(\\w+::\\w+::\\w+)(?:<.*?>(?!>))?/g)\n if (generics) {\n _type = _type.slice(0, _type.indexOf('<'))\n const tag = extractStructTagFromType(_type)\n const structTag: SuiStructTag = {\n ...tag,\n type_arguments: generics.map((item) => extractStructTagFromType(item).source_address),\n }\n structTag.type_arguments = structTag.type_arguments.map((item) => {\n return CoinAssist.isSuiCoin(item) ? item : extractStructTagFromType(item).source_address\n })\n structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n return structTag\n }\n const parts = _type.split('::')\n\n const isSuiCoin = _type === GAS_TYPE_ARG || _type === GAS_TYPE_ARG_LONG\n\n const structTag: SuiStructTag = {\n full_address: _type,\n address: isSuiCoin ? '0x2' : normalizeSuiObjectId(parts[0]),\n module: parts[1],\n name: parts[2],\n type_arguments: [],\n source_address: '',\n }\n structTag.full_address = `${structTag.address}::${structTag.module}::${structTag.name}`\n structTag.source_address = composeType(structTag.full_address, structTag.type_arguments)\n return structTag\n } catch (error) {\n return {\n full_address: type,\n address: '',\n module: '',\n name: '',\n type_arguments: [],\n source_address: type,\n }\n }\n}\n\nexport function normalizeCoinType(coinType: string): string {\n return extractStructTagFromType(coinType).source_address\n}\n\nexport function fixSuiObjectId(value: string): string {\n if (value.toLowerCase().startsWith('0x')) {\n return normalizeSuiObjectId(value)\n }\n return value\n}\n\n/**\n * Fixes and normalizes a coin type by removing or keeping the prefix.\n *\n * @param {string} coinType - The coin type to be fixed.\n * @param {boolean} removePrefix - Whether to remove the prefix or not (default: true).\n * @returns {string} - The fixed and normalized coin type.\n */\nexport const fixCoinType = (coinType: string, removePrefix = true) => {\n const arr = coinType.split('::')\n const address = arr.shift() as string\n let normalizeAddress = normalizeSuiObjectId(address)\n if (removePrefix) {\n normalizeAddress = removeHexPrefix(normalizeAddress)\n }\n return `${normalizeAddress}::${arr.join('::')}`\n}\n\n/**\n * Recursively traverses the given data object and patches any string values that represent Sui object IDs.\n *\n * @param {any} data - The data object to be patched.\n */\nexport function patchFixSuiObjectId(data: any) {\n for (const key in data) {\n const type = typeof data[key]\n if (type === 'object') {\n patchFixSuiObjectId(data[key])\n } else if (type === 'string') {\n const value = data[key]\n if (value && !value.includes('::')) {\n data[key] = fixSuiObjectId(value)\n }\n }\n }\n}\n","// eslint-disable-next-line import/no-import-module-exports\nimport { ClmmpoolsError, TypesErrorCode } from '../errors/errors'\n\nconst HEX_REGEXP = /^[-+]?[0-9A-Fa-f]+\\.?[0-9A-Fa-f]*?$/\n\nexport function addHexPrefix(hex: string): string {\n return !hex.startsWith('0x') ? `0x${hex}` : hex\n}\n\nexport function removeHexPrefix(hex: string): string {\n return hex.startsWith('0x') ? `${hex.slice(2)}` : hex\n}\n\nexport function shortString(str: string, start = 4, end = 4) {\n const slen = Math.max(start, 1)\n const elen = Math.max(end, 1)\n\n return `${str.slice(0, slen + 2)} ... ${str.slice(-elen)}`\n}\n\nexport function shortAddress(address: string, start = 4, end = 4) {\n return shortString(addHexPrefix(address), start, end)\n}\n\nexport function checkAddress(address: any, options: { leadingZero: boolean } = { leadingZero: true }): boolean {\n if (typeof address !== 'string') {\n return false\n }\n let str = address\n\n if (options.leadingZero) {\n if (!address.startsWith('0x')) {\n return false\n }\n str = str.substring(2)\n }\n\n return HEX_REGEXP.test(str)\n}\n\n/**\n * Attempts to turn a value into a `Buffer`. As input it supports `Buffer`, `String`, `Number`, null/undefined, `BN` and other objects with a `toArray()` method.\n * @param v the value\n */\nexport function toBuffer(v: any): Buffer {\n if (!Buffer.isBuffer(v)) {\n if (Array.isArray(v)) {\n v = Buffer.from(v)\n } else if (typeof v === 'string') {\n if (exports.isHexString(v)) {\n v = Buffer.from(exports.padToEven(exports.stripHexPrefix(v)), 'hex')\n } else {\n v = Buffer.from(v)\n }\n } else if (typeof v === 'number') {\n v = exports.intToBuffer(v)\n } else if (v === null || v === undefined) {\n v = Buffer.allocUnsafe(0)\n } else if (v.toArray) {\n // converts a BN to a Buffer\n v = Buffer.from(v.toArray())\n } else {\n throw new ClmmpoolsError(`Invalid type`, TypesErrorCode.InvalidType)\n }\n }\n return v\n}\n\nexport function bufferToHex(buffer: Buffer): string {\n return addHexPrefix(toBuffer(buffer).toString('hex'))\n}\n/**\n * '\\x02\\x00\\x00\\x00' to 2\n * @param binaryData\n */\nexport function hexToNumber(binaryData: string) {\n const buffer = new ArrayBuffer(4)\n const view = new DataView(buffer)\n\n for (let i = 0; i < binaryData.length; i++) {\n view.setUint8(i, binaryData.charCodeAt(i))\n }\n\n const number = view.getUint32(0, true) //\n\n return number\n}\n\nexport function utf8to16(str: string) {\n let out\n let i\n let c\n let char2\n let char3\n out = ''\n const len = str.length\n i = 0\n while (i < len) {\n c = str.charCodeAt(i++)\n switch (c >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n out += str.charAt(i - 1)\n break\n case 12:\n case 13:\n char2 = str.charCodeAt(i++)\n out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))\n break\n case 14:\n char2 = str.charCodeAt(i++)\n char3 = str.charCodeAt(i++)\n out += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0))\n break\n }\n }\n return out\n}\n\nexport function hexToString(str: string) {\n let val = ''\n const newStr = removeHexPrefix(str)\n\n const len = newStr.length / 2\n for (let i = 0; i < len; i++) {\n val += String.fromCharCode(parseInt(newStr.substr(i * 2, 2), 16))\n }\n return utf8to16(val)\n}\n","import { SuiMoveObject, SuiTransactionBlockResponse } from '@mysten/sui/client'\nimport { CoinAsset, FaucetCoin } from '../types'\nimport { extractStructTagFromType, normalizeCoinType } from '../utils/contracts'\nimport { SuiAddressType } from '../types/sui'\n\nconst COIN_TYPE = '0x2::coin::Coin'\nconst COIN_TYPE_ARG_REGEX = /^0x2::coin::Coin<(.+)>$/\nexport const DEFAULT_GAS_BUDGET_FOR_SPLIT = 1000\nexport const DEFAULT_GAS_BUDGET_FOR_MERGE = 500\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER = 100\nexport const DEFAULT_GAS_BUDGET_FOR_TRANSFER_SUI = 100\nexport const DEFAULT_GAS_BUDGET_FOR_STAKE = 1000\nexport const GAS_TYPE_ARG = '0x2::sui::SUI'\nexport const GAS_TYPE_ARG_LONG = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI'\nexport const GAS_SYMBOL = 'SUI'\nexport const DEFAULT_NFT_TRANSFER_GAS_FEE = 450\nexport const SUI_SYSTEM_STATE_OBJECT_ID = '0x0000000000000000000000000000000000000005'\n/**\n * This class provides helper methods for working with coins.\n */\nexport class CoinAssist {\n /**\n * Get the coin type argument from a SuiMoveObject.\n *\n * @param obj The SuiMoveObject to get the coin type argument from.\n * @returns The coin type argument, or null if it is not found.\n */\n public static getCoinTypeArg(obj: SuiMoveObject) {\n const res = obj.type.match(COIN_TYPE_ARG_REGEX)\n return res ? res[1] : null\n }\n\n /**\n * Get whether a SuiMoveObject is a SUI coin.\n *\n * @param obj The SuiMoveObject to check.\n * @returns Whether the SuiMoveObject is a SUI coin.\n */\n public static isSUI(obj: SuiMoveObject) {\n const arg = CoinAssist.getCoinTypeArg(obj)\n return arg ? CoinAssist.getCoinSymbol(arg) === 'SUI' : false\n }\n\n /**\n * Get the coin symbol from a coin type argument.\n *\n * @param coinTypeArg The coin type argument to get the symbol from.\n * @returns The coin symbol.\n */\n public static getCoinSymbol(coinTypeArg: string) {\n return coinTypeArg.substring(coinTypeArg.lastIndexOf(':') + 1)\n }\n\n /**\n * Get the balance of a SuiMoveObject.\n *\n * @param obj The SuiMoveObject to get the balance from.\n * @returns The balance of the SuiMoveObject.\n */\n public static getBalance(obj: SuiMoveObject): bigint {\n return BigInt((obj.fields as any).balance)\n }\n\n /**\n * Get the total balance of a list of CoinAsset objects for a given coin address.\n *\n * @param objs The list of CoinAsset objects to get the total balance for.\n * @param coinAddress The coin address to get the total balance for.\n * @returns The total balance of the CoinAsset objects for the given coin address.\n */\n public static totalBalance(objs: CoinAsset[], coinAddress: SuiAddressType): bigint {\n let balanceTotal = BigInt(0)\n objs.forEach((obj) => {\n if (coinAddress === obj.coinAddress) {\n balanceTotal += BigInt(obj.balance)\n }\n })\n return balanceTotal\n }\n\n /**\n * Get the ID of a SuiMoveObject.\n *\n * @param obj The SuiMoveObject to get the ID from.\n * @returns The ID of the SuiMoveObject.\n */\n public static getID(obj: SuiMoveObject): string {\n return (obj.fields as any).id.id\n }\n\n /**\n * Get the coin type from a coin type argument.\n *\n * @param coinTypeArg The coin type argument to get the coin type from.\n * @returns The coin type.\n */\n public static getCoinTypeFromArg(coinTypeArg: string) {\n return `${COIN_TYPE}<${coinTypeArg}>`\n }\n\n /**\n * Get the FaucetCoin objects from a SuiTransactionBlockResponse.\n *\n * @param suiTransactionResponse The SuiTransactionBlockResponse to get the FaucetCoin objects from.\n * @returns The FaucetCoin objects.\n */\n public static getFaucetCoins(suiTransactionResponse: SuiTransactionBlockResponse): FaucetCoin[] {\n const { events } = suiTransactionResponse\n const faucetCoin: FaucetCoin[] = []\n\n events?.forEach((item: any) => {\n const { type } = item\n if (extractStructTagFromType(type).name === 'InitEvent') {\n const fields = item.parsedJson as any\n faucetCoin.push({\n transactionModule: item.transactionModule,\n suplyID: fields.suplyID,\n decimals: fields.decimals,\n })\n }\n })\n return faucetCoin\n }\n\n /**\n * Get the CoinAsset objects for a given coin type.\n *\n * @param coinType The coin type to get the CoinAsset objects for.\n * @param allSuiObjects The list of all SuiMoveObjects.\n * @returns The CoinAsset objects for the given coin type.\n */\n public static getCoinAssets(coinType: string, allSuiObjects: CoinAsset[]): CoinAsset[] {\n const coins: CoinAsset[] = []\n allSuiObjects.forEach((anObj) => {\n if (normalizeCoinType(anObj.coinAddress) === normalizeCoinType(coinType)) {\n coins.push(anObj)\n }\n })\n return coins\n }\n\n /**\n * Get whether a coin address is a SUI coin.\n *\n * @param coinAddress The coin address to check.\n * @returns Whether the coin address is a SUI coin.\n */\n public static isSuiCoin(coinAddress: SuiAddressType) {\n return extractStructTagFromType(coinAddress).full_address === GAS_TYPE_ARG\n }\n\n /**\n * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n *\n * @param coins The list of CoinAsset objects to select from.\n * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n * @param exclude A list of CoinAsset objects to exclude from the selection.\n * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n */\n static selectCoinObjectIdGreaterThanOrEqual(\n coins: CoinAsset[],\n amount: bigint,\n exclude: string[] = []\n ): { objectArray: string[]; remainCoins: CoinAsset[]; amountArray: string[] } {\n const selectedResult = CoinAssist.selectCoinAssetGreaterThanOrEqual(coins, amount, exclude)\n const objectArray = selectedResult.selectedCoins.map((item) => item.coinObjectId)\n const remainCoins = selectedResult.remainingCoins\n const amountArray = selectedResult.selectedCoins.map((item) => item.balance.toString())\n return { objectArray, remainCoins, amountArray }\n }\n\n /**\n * Select the CoinAsset objects from a list of CoinAsset objects that have a balance greater than or equal to a given amount.\n *\n * @param coins The list of CoinAsset objects to select from.\n * @param amount The amount to select CoinAsset objects with a balance greater than or equal to.\n * @param exclude A list of CoinAsset objects to exclude from the selection.\n * @returns The CoinAsset objects that have a balance greater than or equal to the given amount.\n */\n static selectCoinAssetGreaterThanOrEqual(\n coins: CoinAsset[],\n amount: bigint,\n exclude: string[] = []\n ): { selectedCoins: CoinAsset[]; remainingCoins: CoinAsset[] } {\n const sortedCoins = CoinAssist.sortByBalance(coins.filter((c) => !exclude.includes(c.coinObjectId)))\n\n const total = CoinAssist.calculateTotalBalance(sortedCoins)\n\n if (total < amount) {\n return { selectedCoins: [], remainingCoins: sortedCoins }\n }\n if (total === amount) {\n return { selectedCoins: sortedCoins, remainingCoins: [] }\n }\n\n let sum = BigInt(0)\n const selectedCoins = []\n const remainingCoins = [...sortedCoins]\n while (sum < total) {\n const target = amount - sum\n const coinWithSmallestSufficientBalanceIndex = remainingCoins.findIndex((c) => c.balance >= target)\n if (coinWithSmallestSufficientBalanceIndex !== -1) {\n selectedCoins.push(remainingCoins[coinWithSmallestSufficientBalanceIndex])\n remainingCoins.splice(coinWithSmallestSufficientBalanceIndex, 1)\n break\n }\n\n const coinWithLargestBalance = remainingCoins.pop()!\n if (coinWithLargestBalance.balance > 0) {\n selectedCoins.push(coinWithLargestBalance)\n sum += coinWithLargestBalance.balance\n }\n }\n return { selectedCoins: CoinAssist.sortByBalance(selectedCoins), remainingCoins: CoinAssist.sortByBalance(remainingCoins) }\n }\n\n /**\n * Sort the CoinAsset objects by their balance.\n *\n * @param coins The CoinAsset objects to sort.\n * @returns The sorted CoinAsset objects.\n */\n static sortByBalance(coins: CoinAsset[]): CoinAsset[] {\n return coins.sort((a, b) => (a.balance < b.balance ? -1 : a.balance > b.balance ? 1 : 0))\n }\n\n static sortByBalanceDes(coins: CoinAsset[]): CoinAsset[] {\n return coins.sort((a, b) => (a.balance > b.balance ? -1 : a.balance < b.balance ? 0 : 1))\n }\n\n /**\n * Calculate the total balance of a list of CoinAsset objects.\n *\n * @param coins The list of CoinAsset objects to calculate the total balance for.\n * @returns The total balance of the CoinAsset objects.\n */\n static calculateTotalBalance(coins: CoinAsset[]): bigint {\n return coins.reduce((partialSum, c) => partialSum + c.balance, BigInt(0))\n }\n}\n","import BN from 'bn.js'\nimport { Pool, Position } from '../types'\nimport { TickData } from '../types/clmmpool'\nimport { MathUtil } from './utils'\n\n/**\n * @category CollectFeesQuoteParam\n */\nexport type CollectFeesQuoteParam = {\n clmmpool: Pool\n position: Position\n tickLower: TickData\n tickUpper: TickData\n}\n\n/**\n * @category CollectFeesQuote\n */\nexport type CollectFeesQuote = {\n position_id: string\n feeOwedA: BN\n feeOwedB: BN\n}\n/**\n * Get the fee growth in the given tick range.\n *\n * @param clmmpool The CLMM pool.\n * @param tickLower The lower tick.\n * @param tickUpper The upper tick.\n * @returns The fee growth in the given tick range.\n */\nfunction getFeeInTickRange(clmmpool: Pool, tickLower: TickData, tickUpper: TickData): { fee_growth_inside_a: BN; fee_growth_inside_b: BN } {\n let fee_growth_below_a = new BN(0)\n let fee_growth_below_b = new BN(0)\n\n if (clmmpool.current_tick_index < tickLower.index) {\n fee_growth_below_a = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), new BN(tickLower.feeGrowthOutsideA))\n fee_growth_below_b = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), new BN(tickLower.feeGrowthOutsideB))\n } else {\n fee_growth_below_a = new BN(tickLower.feeGrowthOutsideA)\n fee_growth_below_b = new BN(tickLower.feeGrowthOutsideB)\n }\n\n let fee_growth_above_a = new BN(0)\n let fee_growth_above_b = new BN(0)\n\n if (clmmpool.current_tick_index < tickUpper.index) {\n fee_growth_above_a = new BN(tickUpper.feeGrowthOutsideA)\n fee_growth_above_b = new BN(tickUpper.feeGrowthOutsideB)\n } else {\n fee_growth_above_a = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), new BN(tickUpper.feeGrowthOutsideA))\n fee_growth_above_b = MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), new BN(tickUpper.feeGrowthOutsideB))\n }\n const fee_growth_inside_a = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_a), fee_growth_below_a),\n fee_growth_above_a\n )\n const fee_growth_inside_b = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(clmmpool.fee_growth_global_b), fee_growth_below_b),\n fee_growth_above_b\n )\n\n return { fee_growth_inside_a, fee_growth_inside_b }\n}\n\nfunction updateFees(position: Position, fee_growth_inside_a: BN, fee_growth_inside_b: BN): CollectFeesQuote {\n const growth_delta_a = MathUtil.subUnderflowU128(fee_growth_inside_a, new BN(position.fee_growth_inside_a))\n const fee_delta_a = new BN(position.liquidity).mul(growth_delta_a).shrn(64)\n const growth_delta_b = MathUtil.subUnderflowU128(fee_growth_inside_b, new BN(position.fee_growth_inside_b))\n const fee_delta_b = new BN(position.liquidity).mul(growth_delta_b).shrn(64)\n\n const fee_owed_a = new BN(position.fee_owed_a).add(fee_delta_a)\n const fee_owed_b = new BN(position.fee_owed_b).add(fee_delta_b)\n\n return {\n position_id: position.pos_object_id,\n feeOwedA: fee_owed_a,\n feeOwedB: fee_owed_b,\n }\n}\n/**\n * Get a fee quote on the outstanding fees owed to a position.\n *\n * @category CollectFeesQuoteParam\n * @param param A collection of fetched Clmmpool accounts to faciliate the quote.\n * @returns A quote object containing the fees owed for each token in the pool.\n */\nexport function collectFeesQuote(param: CollectFeesQuoteParam): CollectFeesQuote {\n // Calculate the fee growths inside the position\n const { fee_growth_inside_a, fee_growth_inside_b } = getFeeInTickRange(param.clmmpool, param.tickLower, param.tickUpper)\n // Calculate the updated fees owed\n return updateFees(param.position, fee_growth_inside_a, fee_growth_inside_b)\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { get_price_x128_from_real_id } from '@magmaprotocol/calc_dlmm'\n\nexport function getPriceOfBinByBinId(binId: number, binStep: number): Decimal {\n const twoDec = new Decimal(2)\n const price = new Decimal(get_price_x128_from_real_id(binId, binStep))\n return price.div(twoDec.pow(128))\n}\n\nexport function autoFillYByWeight(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]\n): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId\n })\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep)\n let wx0 = new Decimal(0)\n let wy0 = new Decimal(0)\n const activeBin = activeBins[0]\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n const amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString())\n const amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString())\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec)))\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)))\n }\n }\n\n let totalWeightX = wx0\n let totalWeightY = wy0\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX)\n const amountY = kx.mul(totalWeightY)\n return new BN(amountY.floor().toString())\n }\n\n let totalWeightX = new Decimal(0)\n let totalWeightY = new Decimal(0)\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const kx = totalWeightX.isZero() ? new Decimal(1) : new Decimal(amountX.toString()).div(totalWeightX)\n const amountY = kx.mul(totalWeightY)\n return new BN(amountY.floor().toString())\n}\n\nexport function autoFillXByWeight(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]\n): BN {\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId\n })\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep)\n let wx0 = new Decimal(0)\n let wy0 = new Decimal(0)\n const activeBin = activeBins[0]\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n const amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString())\n const amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString())\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec)))\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)))\n }\n }\n\n let totalWeightX = wx0\n let totalWeightY = wy0\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY)\n const amountX = ky.mul(totalWeightX)\n return new BN(amountX.floor().toString())\n }\n let totalWeightX = new Decimal(0)\n let totalWeightY = new Decimal(0)\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const ky = totalWeightY.isZero() ? new Decimal(1) : new Decimal(amountY.toString()).div(totalWeightY)\n const amountX = ky.mul(totalWeightX)\n return new BN(amountX.floor().toString())\n}\n\n/**\n * Distribute totalAmount to all bid side bins according to given distributions.\n * @param activeId active bin id\n * @param totalAmount total amount of token Y to be distributed\n * @param distributions weight distribution of each bin\n * @param mintY mint of token Y, get from DLMM instance\n * @param clock clock of the program, for calculating transfer fee, get from DLMM instance\n * @returns array of {binId, amount} where amount is the amount of token Y in each bin\n */\nexport function toAmountBidSide(\n activeId: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[]\n): {\n binId: number\n amount: BN\n}[] {\n // get sum of weight\n const totalWeight = distributions.reduce((sum, el) => {\n return el.binId > activeId ? sum : sum.add(el.weight) // skip all ask side\n }, new Decimal(0))\n\n if (totalWeight.cmp(new Decimal(0)) !== 1) {\n throw Error('Invalid parameteres')\n }\n return distributions.map((bin) => {\n if (bin.binId > activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n }\n }\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString()).mul(new Decimal(bin.weight).div(totalWeight)).floor().toString()),\n }\n })\n}\n\n/**\n * Distribute totalAmount to all ask side bins according to given distributions.\n * @param activeId active bin id\n * @param totalAmount total amount of token Y to be distributed\n * @param distributions weight distribution of each bin\n * @param mintX mint of token X, get from DLMM instance\n * @param clock clock of the program, for calculating transfer fee, get from DLMM instance\n * @returns array of {binId, amount} where amount is the amount of token X in each bin\n */\nexport function toAmountAskSide(\n activeId: number,\n binStep: number,\n totalAmount: BN,\n distributions: { binId: number; weight: number }[]\n): {\n binId: number\n amount: BN\n}[] {\n // get sum of weight\n const totalWeight: Decimal = distributions.reduce((sum, el) => {\n if (el.binId < activeId) {\n return sum\n }\n const price = getPriceOfBinByBinId(el.binId, binStep)\n const weightPerPrice = new Decimal(el.weight).div(price)\n return sum.add(weightPerPrice)\n }, new Decimal(0))\n\n if (totalWeight.cmp(new Decimal(0)) !== 1) {\n throw Error('Invalid parameteres')\n }\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n return {\n binId: bin.binId,\n amount: new BN(0),\n }\n }\n const price = getPriceOfBinByBinId(bin.binId, binStep)\n const weightPerPrice = new Decimal(bin.weight).div(price)\n return {\n binId: bin.binId,\n amount: new BN(new Decimal(totalAmount.toString()).mul(weightPerPrice).div(totalWeight).floor().toString()),\n }\n })\n}\n\n/**\n * Distributes the given amounts of tokens X and Y to both bid and ask side bins\n * based on the provided weight distributions.\n *\n * @param activeId - The id of the active bin.\n * @param binStep - The step interval between bin ids.\n * @param amountX - Total amount of token X to distribute.\n * @param amountY - Total amount of token Y to distribute.\n * @param amountXInActiveBin - Amount of token X already in the active bin.\n * @param amountYInActiveBin - Amount of token Y already in the active bin.\n * @param distributions - Array of bins with their respective weight distributions.\n * @param mintX - Mint information for token X. Get from DLMM instance.\n * @param mintY - Mint information for token Y. Get from DLMM instance.\n * @param clock - Clock instance. Get from DLMM instance.\n * @returns An array of objects containing binId, amountX, and amountY for each bin.\n */\n\nexport function toAmountBothSide(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n distributions: { binId: number; weight: number }[]\n): {\n binId: number\n amountX: BN\n amountY: BN\n}[] {\n // only bid side\n if (activeId > distributions[distributions.length - 1].binId || amountX.isZero()) {\n const amounts = toAmountBidSide(activeId, amountY, distributions)\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: bin.amount,\n }\n })\n }\n // only ask side\n if (activeId < distributions[0].binId || amountY.isZero()) {\n const amounts = toAmountAskSide(activeId, binStep, amountX, distributions)\n return amounts.map((bin) => {\n return {\n binId: bin.binId,\n amountX: bin.amount,\n amountY: new BN(0),\n }\n })\n }\n\n const activeBins = distributions.filter((element) => {\n return element.binId === activeId\n })\n\n if (activeBins.length === 1) {\n const p0 = getPriceOfBinByBinId(activeId, binStep)\n let wx0 = new Decimal(0)\n let wy0 = new Decimal(0)\n const activeBin = activeBins[0]\n if (amountXInActiveBin.isZero() && amountYInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.mul(new Decimal(2)))\n wy0 = new Decimal(activeBin.weight).div(new Decimal(2))\n } else {\n const amountXInActiveBinDec = new Decimal(amountXInActiveBin.toString())\n const amountYInActiveBinDec = new Decimal(amountYInActiveBin.toString())\n\n if (!amountXInActiveBin.isZero()) {\n wx0 = new Decimal(activeBin.weight).div(p0.add(amountYInActiveBinDec.div(amountXInActiveBinDec)))\n }\n if (!amountYInActiveBin.isZero()) {\n wy0 = new Decimal(activeBin.weight).div(new Decimal(1).add(p0.mul(amountXInActiveBinDec).div(amountYInActiveBinDec)))\n }\n }\n\n let totalWeightX = wx0\n let totalWeightY = wy0\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n }\n if (element.binId > activeId) {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n const kx = new Decimal(amountX.toString()).div(totalWeightX)\n const ky = new Decimal(amountY.toString()).div(totalWeightY)\n const k = kx.lessThan(ky) ? kx : ky\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight))\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n }\n }\n if (bin.binId > activeId) {\n const price = getPriceOfBinByBinId(bin.binId, binStep)\n const weighPerPrice = new Decimal(bin.weight).div(price)\n const amount = k.mul(weighPerPrice)\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n }\n }\n\n const amountXActiveBin = k.mul(wx0)\n const amountYActiveBin = k.mul(wy0)\n return {\n binId: bin.binId,\n amountX: new BN(amountXActiveBin.floor().toString()),\n amountY: new BN(amountYActiveBin.floor().toString()),\n }\n })\n }\n let totalWeightX = new Decimal(0)\n let totalWeightY = new Decimal(0)\n distributions.forEach((element) => {\n if (element.binId < activeId) {\n totalWeightY = totalWeightY.add(new Decimal(element.weight))\n } else {\n const price = getPriceOfBinByBinId(element.binId, binStep)\n const weighPerPrice = new Decimal(element.weight).div(price)\n totalWeightX = totalWeightX.add(weighPerPrice)\n }\n })\n\n const kx = new Decimal(amountX.toString()).div(totalWeightX)\n const ky = new Decimal(amountY.toString()).div(totalWeightY)\n const k = kx.lessThan(ky) ? kx : ky\n\n return distributions.map((bin) => {\n if (bin.binId < activeId) {\n const amount = k.mul(new Decimal(bin.weight))\n return {\n binId: bin.binId,\n amountX: new BN(0),\n amountY: new BN(amount.floor().toString()),\n }\n }\n const price = getPriceOfBinByBinId(bin.binId, binStep)\n const weighPerPrice = new Decimal(bin.weight).div(price)\n const amount = k.mul(weighPerPrice)\n return {\n binId: bin.binId,\n amountX: new BN(amount.floor().toString()),\n amountY: new BN(0),\n }\n })\n}\n","import BN from 'bn.js'\nimport { ClmmpoolsError, DlmmStrategyCode } from '../errors/errors'\nimport { autoFillXByWeight, autoFillYByWeight, toAmountAskSide, toAmountBidSide, toAmountBothSide } from './dlmmWeightToAmounts'\nimport { BinDisplay } from '../types'\n\nexport enum StrategyType {\n Spot = 1,\n Curve = 2,\n BidAsk = 3,\n}\n\nexport type BinLiquidity = {\n ActiveId: number\n StorageId: number\n Price: number\n CoinAType: number\n CoinBType: number\n CoinAAmount: number\n CoinBAmount: number\n}\n\nfunction toWeightDecendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number\n weight: number\n}[] {\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: maxBinId - i + 1,\n })\n }\n return distributions\n}\n\nfunction toWeightAscendingOrder(\n minBinId: number,\n maxBinId: number\n): {\n binId: number\n weight: number\n}[] {\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: i - minBinId + 1,\n })\n }\n return distributions\n}\n\nfunction toWeightSpotBalanced(\n minBinId: number,\n maxBinId: number\n): {\n binId: number\n weight: number\n}[] {\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n distributions.push({\n binId: i,\n weight: 1,\n })\n }\n return distributions\n}\n\nconst DEFAULT_MAX_WEIGHT = 2000\nconst DEFAULT_MIN_WEIGHT = 200\n\nfunction toWeightCurve(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number\n weight: number\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw new ClmmpoolsError('Invalid strategy params', DlmmStrategyCode.InvalidParams)\n }\n const maxWeight = DEFAULT_MAX_WEIGHT\n const minWeight = DEFAULT_MIN_WEIGHT\n\n const diffWeight = maxWeight - minWeight\n const diffMinWeight = activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0\n const diffMaxWeight = maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0\n\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (activeId - i) * diffMinWeight,\n })\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: maxWeight - (i - activeId) * diffMaxWeight,\n })\n } else {\n distributions.push({\n binId: i,\n weight: maxWeight,\n })\n }\n }\n return distributions\n}\n\nfunction toWeightBidAsk(\n minBinId: number,\n maxBinId: number,\n activeId: number\n): {\n binId: number\n weight: number\n}[] {\n if (activeId < minBinId || activeId > maxBinId) {\n throw new ClmmpoolsError('Invalid strategy params', DlmmStrategyCode.InvalidParams)\n }\n const maxWeight = DEFAULT_MAX_WEIGHT\n const minWeight = DEFAULT_MIN_WEIGHT\n\n const diffWeight = maxWeight - minWeight\n const diffMinWeight = activeId > minBinId ? Math.floor(diffWeight / (activeId - minBinId)) : 0\n const diffMaxWeight = maxBinId > activeId ? Math.floor(diffWeight / (maxBinId - activeId)) : 0\n\n const distributions = []\n for (let i = minBinId; i <= maxBinId; i++) {\n if (i < activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (activeId - i) * diffMinWeight,\n })\n } else if (i > activeId) {\n distributions.push({\n binId: i,\n weight: minWeight + (i - activeId) * diffMaxWeight,\n })\n } else {\n distributions.push({\n binId: i,\n weight: minWeight,\n })\n }\n }\n return distributions\n}\n\n// only apply for balanced deposit\nexport function autoFillYByStrategy(\n activeId: number,\n binStep: number,\n amountX: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n const weights = toWeightSpotBalanced(minBinId, maxBinId)\n return autoFillYByWeight(activeId, binStep, amountX, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.Curve: {\n const weights = toWeightCurve(minBinId, maxBinId, activeId)\n return autoFillYByWeight(activeId, binStep, amountX, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.BidAsk: {\n const weights = toWeightBidAsk(minBinId, maxBinId, activeId)\n return autoFillYByWeight(activeId, binStep, amountX, amountXInActiveBin, amountYInActiveBin, weights)\n }\n default:\n throw new Error(`Unsupported strategy type: ${strategyType}`)\n }\n}\n\n// only apply for balanced deposit\nexport function autoFillXByStrategy(\n activeId: number,\n binStep: number,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n minBinId: number,\n maxBinId: number,\n strategyType: StrategyType\n): BN {\n switch (strategyType) {\n case StrategyType.Spot: {\n const weights = toWeightSpotBalanced(minBinId, maxBinId)\n return autoFillXByWeight(activeId, binStep, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.Curve: {\n const weights = toWeightCurve(minBinId, maxBinId, activeId)\n return autoFillXByWeight(activeId, binStep, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.BidAsk: {\n const weights = toWeightBidAsk(minBinId, maxBinId, activeId)\n return autoFillXByWeight(activeId, binStep, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n default:\n throw new Error(`Unsupported strategy type: ${strategyType}`)\n }\n}\n\n/**\n * Given a strategy type and amounts of X and Y, returns the distribution of liquidity.\n * @param activeId The bin id of the active bin.\n * @param binStep The step size of each bin.\n * @param minBinId The min bin id.\n * @param maxBinId The max bin id.\n * @param amountX The amount of X token to deposit.\n * @param amountY The amount of Y token to deposit.\n * @param amountXInActiveBin The amount of X token in the active bin.\n * @param amountYInActiveBin The amount of Y token in the active bin.\n * @param strategyType The strategy type.\n * @param mintX The mint info of X token. Get from DLMM instance.\n * @param mintY The mint info of Y token. Get from DLMM instance.\n * @param clock The clock info. Get from DLMM instance.\n * @returns The distribution of liquidity.\n */\nexport function toAmountsBothSideByStrategy(\n activeId: number,\n binStep: number,\n minBinId: number,\n maxBinId: number,\n amountX: BN,\n amountY: BN,\n amountXInActiveBin: BN,\n amountYInActiveBin: BN,\n strategyType: StrategyType\n): BinDisplay[] {\n const isSingleSideX = amountY.isZero()\n switch (strategyType) {\n // case StrategyType.Spot: {\n // if (activeId < minBinId || activeId > maxBinId) {\n // const weights = toWeightSpotBalanced(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // const amountsInBin = []\n // if (!isSingleSideX) {\n // if (minBinId <= activeId) {\n // const weights = toWeightSpotBalanced(minBinId, activeId)\n // const amounts = toAmountBidSide(activeId, amountY, weights)\n\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId < maxBinId) {\n // const weights = toWeightSpotBalanced(activeId + 1, maxBinId)\n // const amounts = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // } else {\n // if (minBinId < activeId) {\n // const weights = toWeightSpotBalanced(minBinId, activeId - 1)\n // const amountsIntoBidSide = toAmountBidSide(activeId, amountY, weights)\n // for (const bin of amountsIntoBidSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId <= maxBinId) {\n // const weights = toWeightSpotBalanced(activeId, maxBinId)\n // const amountsIntoAskSide = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amountsIntoAskSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // }\n // return amountsInBin\n // }\n // case StrategyType.Curve: {\n // // ask side\n // if (activeId < minBinId) {\n // const weights = toWeightDecendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // // bid side\n // if (activeId > maxBinId) {\n // const weights = toWeightAscendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // const amountsInBin = []\n // if (!isSingleSideX) {\n // if (minBinId <= activeId) {\n // const weights = toWeightAscendingOrder(minBinId, activeId)\n // const amounts = toAmountBidSide(activeId, amountY, weights)\n\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId < maxBinId) {\n // const weights = toWeightDecendingOrder(activeId + 1, maxBinId)\n // const amounts = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // } else {\n // if (minBinId < activeId) {\n // const weights = toWeightAscendingOrder(minBinId, activeId - 1)\n // const amountsIntoBidSide = toAmountBidSide(activeId, amountY, weights)\n // for (const bin of amountsIntoBidSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId <= maxBinId) {\n // const weights = toWeightDecendingOrder(activeId, maxBinId)\n // const amountsIntoAskSide = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amountsIntoAskSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // }\n // return amountsInBin\n // }\n // case StrategyType.BidAsk: {\n // // ask side\n // if (activeId < minBinId) {\n // const weights = toWeightAscendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // // bid side\n // if (activeId > maxBinId) {\n // const weights = toWeightDecendingOrder(minBinId, maxBinId)\n // return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n // }\n // const amountsInBin = []\n // if (!isSingleSideX) {\n // if (minBinId <= activeId) {\n // const weights = toWeightDecendingOrder(minBinId, activeId)\n // const amounts = toAmountBidSide(activeId, amountY, weights)\n\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId < maxBinId) {\n // const weights = toWeightAscendingOrder(activeId + 1, maxBinId)\n // const amounts = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amounts) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // } else {\n // if (minBinId < activeId) {\n // const weights = toWeightDecendingOrder(minBinId, activeId - 1)\n // const amountsIntoBidSide = toAmountBidSide(activeId, amountY, weights)\n // for (const bin of amountsIntoBidSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: new BN(0),\n // amountY: bin.amount,\n // })\n // }\n // }\n // if (activeId <= maxBinId) {\n // const weights = toWeightAscendingOrder(activeId, maxBinId)\n // const amountsIntoAskSide = toAmountAskSide(activeId, binStep, amountX, weights)\n // for (const bin of amountsIntoAskSide) {\n // amountsInBin.push({\n // binId: bin.binId,\n // amountX: bin.amount,\n // amountY: new BN(0),\n // })\n // }\n // }\n // }\n // return amountsInBin\n // }\n case StrategyType.Spot: {\n const weights = toWeightSpotBalanced(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.Curve: {\n if (activeId < minBinId) {\n const weights = toWeightDecendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n if (activeId > maxBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n\n const weights = toWeightCurve(minBinId, maxBinId, activeId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n case StrategyType.BidAsk: {\n if (activeId < minBinId) {\n const weights = toWeightAscendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n if (activeId > maxBinId) {\n const weights = toWeightDecendingOrder(minBinId, maxBinId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n\n const weights = toWeightBidAsk(minBinId, maxBinId, activeId)\n return toAmountBothSide(activeId, binStep, amountX, amountY, amountXInActiveBin, amountYInActiveBin, weights)\n }\n\n default:\n throw new Error(`Unsupported strategy type: ${strategyType}`)\n }\n}\n","import Decimal from 'decimal.js'\nimport { d } from '../utils/numbers'\nimport { ClmmpoolsError, MathErrorCode } from '../errors/errors'\n\nexport function withLiquiditySlippage(value: Decimal.Instance, slippage: Decimal.Instance, mode: 'plus' | 'minus') {\n return d(value)[mode](d(value).mul(slippage)).toDP(0)\n}\n\nexport type POOL_NO_LIQUIDITY = -1\n\nexport type LiquidityAndCoinYResult = {\n coinYAmount: Decimal\n lpAmount: Decimal\n}\n\nexport function getLiquidityAndCoinYByCoinX(\n coinInVal: Decimal.Instance,\n reserveInSize: Decimal.Instance,\n reserveOutSize: Decimal.Instance,\n lpSupply: Decimal.Instance\n): LiquidityAndCoinYResult | POOL_NO_LIQUIDITY {\n if (coinInVal.lessThanOrEqualTo(0)) {\n throw new ClmmpoolsError('coinInVal is less than zero', MathErrorCode.InvalidCoinAmount)\n }\n\n if (reserveInSize.lessThanOrEqualTo(0) || reserveOutSize.lessThanOrEqualTo(0)) {\n return -1\n }\n\n const coinYAmount = coinInVal.mul(reserveOutSize).div(reserveInSize)\n // const sqrtSupply = reserveInSize.mul(reserveOutSize).sqrt()\n const sqrtSupply = lpSupply\n\n const lpX = coinInVal.div(reserveInSize).mul(sqrtSupply)\n const lpY = coinYAmount.div(reserveOutSize).mul(sqrtSupply)\n const lpAmount = Decimal.min(lpX, lpY)\n return {\n coinYAmount,\n lpAmount,\n }\n}\n\nexport function getCoinXYForLiquidity(\n liquidity: Decimal.Instance,\n reserveInSize: Decimal.Instance,\n reserveOutSize: Decimal.Instance,\n lpSuply: Decimal.Instance\n) {\n if (liquidity.lessThanOrEqualTo(0)) {\n throw new ClmmpoolsError(\"liquidity can't be equal or less than zero\", MathErrorCode.InvalidLiquidityAmount)\n }\n\n if (reserveInSize.lessThanOrEqualTo(0) || reserveOutSize.lessThanOrEqualTo(0)) {\n throw new ClmmpoolsError('reserveInSize or reserveOutSize can not be equal or less than zero', MathErrorCode.InvalidReserveAmount)\n }\n\n // const sqrtSupply = reserveInSize.mul(reserveOutSize).sqrt()\n const sqrtSupply = lpSuply\n const coinXAmount = liquidity.div(sqrtSupply).mul(reserveInSize)\n const coinYAmount = liquidity.div(sqrtSupply).mul(reserveOutSize)\n\n return {\n coinXAmount,\n coinYAmount,\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","import BN from 'bn.js'\nimport type { Decimal } from 'decimal.js'\n\n/**\n * Percentage - the util set for percentage struct.\n */\nexport class Percentage {\n readonly numerator: BN\n\n readonly denominator: BN\n\n constructor(numerator: BN, denominator: BN) {\n this.toString = () => {\n return `${this.numerator.toString()}/${this.denominator.toString()}`\n }\n this.numerator = numerator\n this.denominator = denominator\n }\n\n /**\n * Get the percentage of a number.\n *\n * @param number\n * @returns\n */\n static fromDecimal(number: Decimal): Percentage {\n return Percentage.fromFraction(number.toDecimalPlaces(1).mul(10).toNumber(), 1000)\n }\n\n /**\n * Get the percentage of a fraction.\n *\n * @param numerator\n * @param denominator\n * @returns\n */\n static fromFraction(numerator: BN | number, denominator: BN | number): Percentage {\n const num = typeof numerator === 'number' ? new BN(numerator.toString()) : numerator\n const denom = typeof denominator === 'number' ? new BN(denominator.toString()) : denominator\n return new Percentage(num, denom)\n }\n}\n","import BN from 'bn.js'\nimport { SwapDirection } from '../types/liquidity'\nimport { CoinAmounts } from './clmm'\nimport { Percentage } from './percentage'\nimport { MathUtil } from './utils'\n\nexport enum AmountSpecified {\n Input = 'Specified input amount',\n Output = 'Specified output amount',\n}\n\nexport enum PositionStatus {\n BelowRange,\n InRange,\n AboveRange,\n}\n/**\n * This class provides utility methods for working with positions.\n */\nexport class PositionUtil {\n /**\n * Get the position status for the given tick indices.\n *\n * @param currentTickIndex The current tick index.\n * @param lowerTickIndex The lower tick index.\n * @param upperTickIndex The upper tick index.\n * @returns The position status.\n */\n static getPositionStatus(currentTickIndex: number, lowerTickIndex: number, upperTickIndex: number): PositionStatus {\n if (currentTickIndex < lowerTickIndex) {\n return PositionStatus.BelowRange\n }\n if (currentTickIndex < upperTickIndex) {\n return PositionStatus.InRange\n }\n return PositionStatus.AboveRange\n }\n}\n\n/**\n * Order sqrt price.\n * @param liquidity - liqudity.\n * @param sqrtPrice0X64 - Current sqrt price of coin 0.\n * @param sqrtPrice1X64 - Current sqrt price of coin 1.\n *\n * @returns\n */\nfunction orderSqrtPrice(sqrtPrice0X64: BN, sqrtPrice1X64: BN): [BN, BN] {\n if (sqrtPrice0X64.lt(sqrtPrice1X64)) {\n return [sqrtPrice0X64, sqrtPrice1X64]\n }\n return [sqrtPrice1X64, sqrtPrice0X64]\n}\n\n/**\n * Get token A from liquidity.\n * @param liquidity - liquidity.\n * @param sqrtPrice0X64 - Current sqrt price of coin 0.\n * @param sqrtPrice1X64 - Current sqrt price of coin 1.\n * @param roundUp - If round up.\n *\n * @returns\n */\nexport function getCoinAFromLiquidity(liquidity: BN, sqrtPrice0X64: BN, sqrtPrice1X64: BN, roundUp: boolean) {\n const [sqrtPriceLowerX64, sqrtPriceUpperX64] = orderSqrtPrice(sqrtPrice0X64, sqrtPrice1X64)\n\n const numerator = liquidity.mul(sqrtPriceUpperX64.sub(sqrtPriceLowerX64)).shln(64)\n const denominator = sqrtPriceUpperX64.mul(sqrtPriceLowerX64)\n if (roundUp) {\n return MathUtil.divRoundUp(numerator, denominator)\n }\n return numerator.div(denominator)\n}\n\n/**\n * Get token B from liquidity.\n * @param liquidity - liqudity.\n * @param sqrtPrice0X64 - Current sqrt price of token 0.\n * @param sqrtPrice1X64 - Current sqrt price of token 1.\n * @param roundUp - If round up.\n *\n * @returns\n */\nexport function getCoinBFromLiquidity(liquidity: BN, sqrtPrice0X64: BN, sqrtPrice1X64: BN, roundUp: boolean) {\n const [sqrtPriceLowerX64, sqrtPriceUpperX64] = orderSqrtPrice(sqrtPrice0X64, sqrtPrice1X64)\n\n const result = liquidity.mul(sqrtPriceUpperX64.sub(sqrtPriceLowerX64))\n if (roundUp) {\n return MathUtil.shiftRightRoundUp(result)\n }\n return result.shrn(64)\n}\n\n/**\n * Get liquidity from token A.\n *\n * @param amount - The amount of token A.\n * @param sqrtPriceLowerX64 - The lower sqrt price.\n * @param sqrtPriceUpperX64 - The upper sqrt price.\n * @param roundUp - If round up.\n * @returns liquidity.\n */\nexport function getLiquidityFromCoinA(amount: BN, sqrtPriceLowerX64: BN, sqrtPriceUpperX64: BN, roundUp: boolean) {\n const result = amount.mul(sqrtPriceLowerX64).mul(sqrtPriceUpperX64).div(sqrtPriceUpperX64.sub(sqrtPriceLowerX64))\n if (roundUp) {\n return MathUtil.shiftRightRoundUp(result)\n }\n return result.shrn(64)\n}\n\n/**\n * Get liquidity from token B.\n * @param amount - The amount of token B.\n * @param sqrtPriceLowerX64 - The lower sqrt price.\n * @param sqrtPriceUpperX64 - The upper sqrt price.\n * @param roundUp - If round up.\n *\n * @returns liquidity.\n */\nexport function getLiquidityFromCoinB(amount: BN, sqrtPriceLowerX64: BN, sqrtPriceUpperX64: BN, roundUp: boolean) {\n const numerator = amount.shln(64)\n const denominator = sqrtPriceUpperX64.sub(sqrtPriceLowerX64)\n if (roundUp) {\n return MathUtil.divRoundUp(numerator, denominator)\n }\n return numerator.div(denominator)\n}\n\n/**\n * Get amount of fixed delta.\n * @param currentSqrtPriceX64 - Current sqrt price.\n * @param targetSqrtPriceX64 - Target sqrt price.\n * @param liquidity - liqudity.\n * @param amountSpecified - The amount specified in the swap.\n * @param swapDirection - The swap direction.\n *\n * @returns\n */\nexport function getAmountFixedDelta(\n currentSqrtPriceX64: BN,\n targetSqrtPriceX64: BN,\n liquidity: BN,\n amountSpecified: AmountSpecified,\n swapDirection: SwapDirection\n) {\n if ((amountSpecified === AmountSpecified.Input) === (swapDirection === SwapDirection.A2B)) {\n return getCoinAFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Input)\n }\n return getCoinBFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Input)\n}\n\n/**\n * Get amount of unfixed delta.\n * @param currentSqrtPriceX64 - Current sqrt price.\n * @param targetSqrtPriceX64 - Target sqrt price.\n * @param liquidity - liqudity.\n * @param amountSpecified - The amount specified in the swap.\n * @param swapDirection - The swap direction.\n *\n * @returns\n */\nexport function getAmountUnfixedDelta(\n currentSqrtPriceX64: BN,\n targetSqrtPriceX64: BN,\n liquidity: BN,\n amountSpecified: AmountSpecified,\n swapDirection: SwapDirection\n) {\n if ((amountSpecified === AmountSpecified.Input) === (swapDirection === SwapDirection.A2B)) {\n return getCoinBFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Output)\n }\n return getCoinAFromLiquidity(liquidity, currentSqrtPriceX64, targetSqrtPriceX64, amountSpecified === AmountSpecified.Output)\n}\n\nexport function adjustForSlippage(n: BN, { numerator, denominator }: Percentage, adjustUp: boolean): BN {\n if (adjustUp) {\n return n.mul(denominator.add(numerator)).div(denominator)\n }\n return n.mul(denominator).div(denominator.add(numerator))\n}\n\nexport function adjustForCoinSlippage(tokenAmount: CoinAmounts, slippage: Percentage, adjustUp: boolean) {\n return {\n tokenMaxA: adjustForSlippage(tokenAmount.coinA, slippage, adjustUp),\n tokenMaxB: adjustForSlippage(tokenAmount.coinB, slippage, adjustUp),\n }\n}\n","import BN from 'bn.js'\nimport { Pool } from '../types/clmm_type'\nimport { ClmmpoolData, TickData, transClmmpoolDataWithoutTicks } from '../types/clmmpool'\nimport { computeSwapStep, SwapStepResult } from './clmm'\nimport { SwapUtils } from './swap'\nimport { ZERO } from './utils'\n\nexport enum SplitUnit {\n FIVE = 5,\n TEN = 10,\n TWENTY = 20,\n TWENTY_FIVE = 25,\n FIVETY = 50,\n HUNDRED = 100,\n}\n\nexport function createSplitArray(minSplitUnit: SplitUnit): number[] {\n let unit\n switch (minSplitUnit) {\n case SplitUnit.FIVE:\n unit = 5\n break\n case SplitUnit.TEN:\n unit = 10\n break\n case SplitUnit.TWENTY:\n unit = 20\n break\n case SplitUnit.TWENTY_FIVE:\n unit = 25\n break\n case SplitUnit.FIVETY:\n unit = 50\n break\n case SplitUnit.HUNDRED:\n unit = 100\n break\n default:\n unit = 1\n }\n const length = 100 / unit + 1\n const splitArray = new Array<number>(length)\n for (let i = 0; i < length; i += 1) {\n splitArray[i] = i * unit\n }\n return splitArray\n}\n\nexport function createSplitAmountArray(amount: BN, minSplitUnit: SplitUnit): BN[] {\n const splitArray = createSplitArray(minSplitUnit)\n const splitAmountArray = new Array<BN>(splitArray.length)\n\n for (let i = 0; i < splitArray.length; i += 1) {\n splitAmountArray[i] = amount.muln(splitArray[i]).divn(100)\n }\n\n return splitAmountArray\n}\n\nexport type SplitSwapResult = {\n amountInArray: BN[]\n amountOutArray: BN[]\n feeAmountArray: BN[]\n nextSqrtPriceArray: BN[]\n isExceed: boolean[]\n}\n\nfunction updateSplitSwapResult(\n maxIndex: number,\n currentIndex: number,\n splitSwapResult: SplitSwapResult,\n stepResult: SwapStepResult\n): SplitSwapResult {\n for (let index = currentIndex; index < maxIndex; index += 1) {\n splitSwapResult.amountInArray[index] = splitSwapResult.amountInArray[index].add(stepResult.amountIn)\n splitSwapResult.amountOutArray[index] = splitSwapResult.amountOutArray[index].add(stepResult.amountOut)\n splitSwapResult.feeAmountArray[index] = splitSwapResult.feeAmountArray[index].add(stepResult.feeAmount)\n }\n return splitSwapResult\n}\n\nfunction computeSplitSwap(\n a2b: boolean,\n byAmountIn: boolean,\n amounts: BN[],\n poolData: ClmmpoolData,\n swapTicks: TickData[]\n): SplitSwapResult {\n let currentLiquidity = new BN(poolData.liquidity)\n let { currentSqrtPrice } = poolData\n\n let splitSwapResult: SplitSwapResult = {\n amountInArray: [],\n amountOutArray: [],\n feeAmountArray: [],\n nextSqrtPriceArray: [],\n isExceed: [],\n }\n\n amounts.forEach(() => {\n splitSwapResult.amountInArray.push(ZERO)\n splitSwapResult.amountOutArray.push(ZERO)\n splitSwapResult.feeAmountArray.push(ZERO)\n splitSwapResult.nextSqrtPriceArray.push(ZERO)\n })\n\n let targetSqrtPrice\n let signedLiquidityChange\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b)\n\n const maxIndex = amounts.length\n let remainerAmount = amounts[1]\n let currentIndex = 1\n\n let ticks\n if (a2b) {\n ticks = swapTicks.sort((a, b) => {\n return b.index - a.index\n })\n } else {\n ticks = swapTicks.sort((a, b) => {\n return a.index - b.index\n })\n }\n\n for (const tick of ticks) {\n if (a2b) {\n if (poolData.currentTickIndex < tick.index) {\n continue\n }\n } else if (poolData.currentTickIndex > tick.index) {\n continue\n }\n if (tick === null) {\n continue\n }\n if ((a2b && sqrtPriceLimit.gt(tick.sqrtPrice)) || (!a2b && sqrtPriceLimit.lt(tick.sqrtPrice))) {\n targetSqrtPrice = sqrtPriceLimit\n } else {\n targetSqrtPrice = tick.sqrtPrice\n }\n\n let tempStepResult: SwapStepResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n nextSqrtPrice: ZERO,\n feeAmount: ZERO,\n }\n\n const tempSqrtPrice = currentSqrtPrice\n const tempLiquidity = currentLiquidity\n let tempRemainerAmount = remainerAmount\n let currentTempIndex = currentIndex\n\n for (let i = currentIndex; i < maxIndex; i += 1) {\n const stepResult = computeSwapStep(\n currentSqrtPrice,\n targetSqrtPrice,\n currentLiquidity,\n remainerAmount,\n new BN(poolData.feeRate),\n byAmountIn\n )\n tempStepResult = stepResult\n\n if (!stepResult.amountIn.eq(ZERO)) {\n remainerAmount = byAmountIn\n ? remainerAmount.sub(stepResult.amountIn.add(stepResult.feeAmount))\n : remainerAmount.sub(stepResult.amountOut)\n }\n\n // splitSwapResult = updateSplitSwapResult(maxIndex, currentIndex, splitSwapResult, stepResult)\n if (remainerAmount.eq(ZERO)) {\n splitSwapResult.amountInArray[i] = splitSwapResult.amountInArray[i].add(stepResult.amountIn)\n splitSwapResult.amountOutArray[i] = splitSwapResult.amountOutArray[i].add(stepResult.amountOut)\n splitSwapResult.feeAmountArray[i] = splitSwapResult.feeAmountArray[i].add(stepResult.feeAmount)\n\n // When current index remainerAmount run out, we need to update the swapResult of current index amountIn\n if (stepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n signedLiquidityChange = a2b ? tick.liquidityNet.mul(new BN(-1)) : tick.liquidityNet\n currentLiquidity = signedLiquidityChange.gt(ZERO)\n ? currentLiquidity.add(signedLiquidityChange)\n : currentLiquidity.sub(signedLiquidityChange.abs())\n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = stepResult.nextSqrtPrice\n }\n splitSwapResult.amountInArray[i] = splitSwapResult.amountInArray[i].add(splitSwapResult.feeAmountArray[i])\n splitSwapResult.nextSqrtPriceArray[i] = currentSqrtPrice\n currentLiquidity = tempLiquidity\n currentSqrtPrice = tempSqrtPrice\n // remainerAmount = tempRemainerAmount.add(amounts[1].muln(i - currentTempIndex + 1))\n if (i !== maxIndex - 1) {\n remainerAmount = tempRemainerAmount.add(amounts[i + 1].sub(amounts[currentTempIndex]))\n }\n currentIndex += 1\n } else {\n splitSwapResult = updateSplitSwapResult(maxIndex, i, splitSwapResult, stepResult)\n tempRemainerAmount = remainerAmount\n currentTempIndex = currentIndex\n break\n }\n }\n\n if (currentIndex === maxIndex) {\n break\n }\n\n if (tempStepResult.nextSqrtPrice.eq(tick.sqrtPrice)) {\n signedLiquidityChange = a2b ? tick.liquidityNet.mul(new BN(-1)) : tick.liquidityNet\n currentLiquidity = signedLiquidityChange.gt(ZERO)\n ? currentLiquidity.add(signedLiquidityChange)\n : currentLiquidity.sub(signedLiquidityChange.abs())\n currentSqrtPrice = tick.sqrtPrice\n } else {\n currentSqrtPrice = tempStepResult.nextSqrtPrice\n }\n }\n\n if (byAmountIn) {\n amounts.forEach((a, i) => {\n splitSwapResult.isExceed.push(splitSwapResult.amountInArray[i].lt(a))\n })\n } else {\n amounts.forEach((a, i) => {\n splitSwapResult.isExceed.push(splitSwapResult.amountOutArray[i].lt(a))\n })\n }\n\n return splitSwapResult\n}\n\nexport class SplitSwap {\n readonly minSplitUnit: number\n\n amountArray: BN[]\n\n private byAmountIn: boolean\n\n private a2b: boolean\n\n private clmmpool: Pool\n\n private ticks: TickData[]\n\n private splitSwapResult: SplitSwapResult\n\n constructor(amount: BN, unit: SplitUnit, clmmpool: Pool, a2b: boolean, byAmountIn: boolean, tickData: TickData[]) {\n this.minSplitUnit = unit\n this.a2b = a2b\n this.byAmountIn = byAmountIn\n this.clmmpool = clmmpool\n this.ticks = tickData\n this.amountArray = []\n this.createSplitSwapParams = this.createSplitSwapParams.bind(this)\n this.createSplitSwapParams(amount, unit)\n this.splitSwapResult = {\n amountInArray: [],\n amountOutArray: [],\n feeAmountArray: [],\n nextSqrtPriceArray: [],\n isExceed: [],\n }\n this.computeSwap = this.computeSwap.bind(this)\n }\n\n createSplitSwapParams(amount: BN, unit: SplitUnit) {\n const amountArray = createSplitAmountArray(amount, unit)\n this.amountArray = amountArray\n }\n\n computeSwap(): SplitSwapResult {\n const pool = transClmmpoolDataWithoutTicks(this.clmmpool)\n this.splitSwapResult = computeSplitSwap(this.a2b, this.byAmountIn, this.amountArray, pool, this.ticks)\n return this.splitSwapResult\n }\n}\n","import Decimal from 'decimal.js'\nimport { get_price_x128_from_real_id, get_real_id_from_price_x128 } from '@magmaprotocol/calc_dlmm'\n\n\nexport class BinMath {\n static getPriceOfBinByBinId(binId: number, binStep: number, decimalsA: number, decimalsB: number): Decimal {\n const twoDec = new Decimal(2)\n const price = new Decimal(get_price_x128_from_real_id(binId, binStep))\n return price.div(twoDec.pow(128)).mul(Decimal.pow(10, decimalsA - decimalsB))\n }\n static getBinIdFromPrice(price: string, binStep: number, decimalsA: number, decimalsB: number) {\n const twoDec = new Decimal(2);\n const tenDec = new Decimal(10)\n const realid = get_real_id_from_price_x128(new Decimal(price).mul(tenDec.pow(decimalsB - decimalsA)).mul(twoDec.pow(128)).toDecimalPlaces(0).toString(), binStep);\n return realid\n }\n\n}\n","/* -------------------------------------------------------------------------- */\n/* Helper functions */\n/* -------------------------------------------------------------------------- */\n\nimport {\n SuiObjectData,\n SuiObjectRef,\n SuiObjectResponse,\n OwnedObjectRef,\n ObjectOwner,\n DisplayFieldsResponse,\n SuiMoveObject,\n SuiParsedData,\n} from '@mysten/sui/client'\n\n/* -------------------------- SuiObjectResponse ------------------------- */\n\nexport function getSuiObjectData(resp: SuiObjectResponse): SuiObjectData | null | undefined {\n return resp.data\n}\n\nexport function getObjectDeletedResponse(resp: SuiObjectResponse): SuiObjectRef | undefined {\n if (resp.error && 'object_id' in resp.error && 'version' in resp.error && 'digest' in resp.error) {\n const { error } = resp\n return {\n objectId: error.object_id,\n version: error.version,\n digest: error.digest,\n } as SuiObjectRef\n }\n\n return undefined\n}\n\nexport function getObjectNotExistsResponse(resp: SuiObjectResponse): string | undefined {\n if (resp.error && 'object_id' in resp.error && !('version' in resp.error) && !('digest' in resp.error)) {\n return resp.error.object_id as string\n }\n\n return undefined\n}\n\nexport function getObjectReference(resp: SuiObjectResponse | OwnedObjectRef): SuiObjectRef | undefined {\n if ('reference' in resp) {\n return resp.reference\n }\n const exists = getSuiObjectData(resp)\n if (exists) {\n return {\n objectId: exists.objectId,\n version: exists.version,\n digest: exists.digest,\n }\n }\n return getObjectDeletedResponse(resp)\n}\n\n/* ------------------------------ SuiObjectRef ------------------------------ */\n\nexport function getObjectId(data: SuiObjectResponse | SuiObjectRef | OwnedObjectRef): string {\n if ('objectId' in data) {\n return data.objectId\n }\n return getObjectReference(data)?.objectId ?? getObjectNotExistsResponse(data as SuiObjectResponse)!\n}\n\nexport function getObjectVersion(data: SuiObjectResponse | SuiObjectRef | SuiObjectData): string | number | undefined {\n if ('version' in data) {\n return data.version\n }\n return getObjectReference(data)?.version\n}\n\n/* -------------------------------- SuiObject ------------------------------- */\n\nexport function isSuiObjectResponse(resp: SuiObjectResponse | SuiObjectData): resp is SuiObjectResponse {\n return (resp as SuiObjectResponse).data !== undefined\n}\n\nfunction isSuiObjectDataWithContent(data: SuiObjectData): data is SuiObjectDataWithContent {\n return data.content !== undefined\n}\n\nexport function getMovePackageContent(data: SuiObjectResponse): any | undefined {\n const suiObject = getSuiObjectData(data)\n if (suiObject?.content?.dataType !== 'package') {\n return undefined\n }\n return suiObject.content.disassembled\n}\nexport function getMoveObject(data: SuiObjectResponse | SuiObjectData): SuiMoveObject | undefined {\n const suiObject = 'data' in data ? getSuiObjectData(data) : (data as SuiObjectData)\n\n if (!suiObject || !isSuiObjectDataWithContent(suiObject) || suiObject.content.dataType !== 'moveObject') {\n return undefined\n }\n\n return suiObject.content as SuiMoveObject\n}\n\nexport function getMoveObjectType(resp: SuiObjectResponse): string | undefined {\n return getMoveObject(resp)?.type\n}\n\n/**\n * Deriving the object type from the object response\n * @returns 'package' if the object is a package, move object type(e.g., 0x2::coin::Coin<0x2::sui::SUI>)\n * if the object is a move object\n */\nexport function getObjectType(resp: SuiObjectResponse | SuiObjectData): string | null | undefined {\n const data = isSuiObjectResponse(resp) ? resp.data : resp\n\n if (!data?.type && 'data' in resp) {\n if (data?.content?.dataType === 'package') {\n return 'package'\n }\n return getMoveObjectType(resp)\n }\n return data?.type\n}\n\nexport function getObjectPreviousTransactionDigest(resp: SuiObjectResponse): string | null | undefined {\n return getSuiObjectData(resp)?.previousTransaction\n}\n\nexport function getObjectOwner(resp: SuiObjectResponse): ObjectOwner | null | undefined {\n return getSuiObjectData(resp)?.owner\n}\n\nexport function getObjectDisplay(resp: SuiObjectResponse): DisplayFieldsResponse {\n const display = getSuiObjectData(resp)?.display\n if (!display) {\n return { data: null, error: null }\n }\n return display\n}\n\n/**\n * Get the fields of a sui object response or data. The dataType of the object must be moveObject.\n * @param {SuiObjectResponse | SuiObjectData}object The object to get the fields from.\n * @returns {any} The fields of the object.\n */\nexport function getObjectFields(object: SuiObjectResponse | SuiObjectData): any {\n const fields = getMoveObject(object)?.fields\n if (fields) {\n if ('fields' in fields) {\n return fields.fields\n }\n return fields\n }\n return undefined\n}\n\nexport interface SuiObjectDataWithContent extends SuiObjectData {\n content: SuiParsedData\n}\n\n/**\n * Return hasPublicTransfer of a move object.\n * @param {SuiObjectResponse | SuiObjectData}data\n * @returns\n */\nexport function hasPublicTransfer(data: SuiObjectResponse | SuiObjectData): boolean {\n return getMoveObject(data)?.hasPublicTransfer ?? false\n}\n","import BN from 'bn.js'\nimport { Pool } from '../types'\nimport { MathUtil } from '../math/utils'\nimport { TickData } from '../types/clmmpool'\nimport { MIN_TICK_INDEX, MAX_TICK_INDEX } from '../types/constants'\n\nexport class TickUtil {\n /**\n * Get min tick index.\n * @param tick_spacing tick spacing\n * @retruns min tick index\n */\n static getMinIndex(tickSpacing: number): number {\n return MIN_TICK_INDEX + (Math.abs(MIN_TICK_INDEX) % tickSpacing)\n }\n\n /**\n * Get max tick index.\n * @param tick_spacing - tick spacing\n * @retruns max tick index\n */\n // eslint-disable-next-line camelcase\n static getMaxIndex(tickSpacing: number): number {\n return MAX_TICK_INDEX - (MAX_TICK_INDEX % tickSpacing)\n }\n}\n\n/**\n * Get nearest tick by current tick.\n *\n * @param tickIndex\n * @param tickSpacing\n * @returns\n */\nexport function getNearestTickByTick(tickIndex: number, tickSpacing: number): number {\n const mod = Math.abs(tickIndex) % tickSpacing\n if (tickIndex > 0) {\n if (mod > tickSpacing / 2) {\n return tickIndex + tickSpacing - mod\n }\n return tickIndex - mod\n }\n if (mod > tickSpacing / 2) {\n return tickIndex - tickSpacing + mod\n }\n return tickIndex + mod\n}\n\n/**\n * Calculate reward amount in tick range.\n * @param {Pool}pool Pool object.\n * @param {TickData}tickLower Tick lower data.\n * @param {TickData}tickUpper Tick upper data.\n * @param {number}tickLowerIndex Tick lower index.\n * @param {number}tickUpperIndex Tick upper index.\n * @param {BN[]}growthGlobal\n * @returns\n */\nexport function getRewardInTickRange(\n pool: Pool,\n tickLower: TickData,\n tickUpper: TickData,\n tickLowerIndex: number,\n tickUpperIndex: number,\n growthGlobal: BN[]\n) {\n const rewarderInfos: any = pool.rewarder_infos\n const rewarderGrowthInside: BN[] = []\n\n for (let i = 0; i < rewarderInfos.length; i += 1) {\n let rewarder_growth_below = growthGlobal[i]\n if (tickLower !== null) {\n if (pool.current_tick_index < tickLowerIndex) {\n rewarder_growth_below = growthGlobal[i].sub(new BN(tickLower.rewardersGrowthOutside[i]))\n } else {\n rewarder_growth_below = tickLower.rewardersGrowthOutside[i]\n }\n }\n let rewarder_growth_above = new BN(0)\n if (tickUpper !== null) {\n if (pool.current_tick_index >= tickUpperIndex) {\n rewarder_growth_above = growthGlobal[i].sub(new BN(tickUpper.rewardersGrowthOutside[i]))\n } else {\n rewarder_growth_above = tickUpper.rewardersGrowthOutside[i]\n }\n }\n const rewGrowthInside = MathUtil.subUnderflowU128(\n MathUtil.subUnderflowU128(new BN(growthGlobal[i]), new BN(rewarder_growth_below)),\n new BN(rewarder_growth_above)\n )\n\n rewarderGrowthInside.push(rewGrowthInside)\n }\n return rewarderGrowthInside\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { bcs } from '@mysten/bcs'\nimport { CoinAssist } from '../math/CoinAssist'\nimport { OnePath, SwapWithRouterParams } from '../modules/routerModule'\nimport { TickData } from '../types/clmmpool'\nimport {\n ClaimAndLockParams,\n ClaimFeesParams,\n ClaimFeesPoolsParams,\n CreateLockParams,\n IncreaseLockAmountParams,\n IncreaseUnlockTimeParams,\n LockPermanentParams,\n MergeLockParams,\n PokeParams,\n TransferLockParams,\n VoteParams,\n} from '../types/lock_type'\nimport {\n ClmmIntegrateRouterWithPartnerModule,\n ClmmIntegratePoolV2Module,\n ClmmIntegrateRouterModule,\n ClmmIntegrateUtilsModule,\n CLOCK_ADDRESS,\n VotingEscrow,\n Voter,\n RewardDistributor,\n} from '../types/sui'\nimport SDK, {\n AddLiquidityFixTokenParams,\n adjustForSlippage,\n asUintN,\n ClmmPoolUtil,\n CoinAsset,\n CoinPairType,\n CollectRewarderParams,\n d,\n DeepbookUtils,\n getPackagerConfigs,\n normalizeCoinType,\n Percentage,\n Pool,\n SdkOptions,\n SwapParams,\n SwapUtils,\n ZERO,\n} from '../index'\nimport { AggregatorResult, BasePath } from '../modules/routerModuleV2'\nimport { ClmmpoolsError, UtilsErrorCode } from '../errors/errors'\n\nexport type AdjustResult = {\n isAdjustCoinA: boolean\n isAdjustCoinB: boolean\n}\n\n/**\n * Adjust coinpair is sui\n * @param {CoinPairType} coinPair\n * @returns\n */\nexport function findAdjustCoin(coinPair: CoinPairType): AdjustResult {\n const isAdjustCoinA = CoinAssist.isSuiCoin(coinPair.coinTypeA)\n const isAdjustCoinB = CoinAssist.isSuiCoin(coinPair.coinTypeB)\n return { isAdjustCoinA, isAdjustCoinB }\n}\n\nexport type BuildCoinResult = {\n targetCoin: TransactionObjectArgument\n remainCoins: CoinAsset[]\n isMintZeroCoin: boolean\n tragetCoinAmount: string\n originalSplitedCoin?: TransactionObjectArgument\n}\n\ntype CoinInputInterval = {\n amountSecond: bigint\n amountFirst: bigint\n}\n\n/**\n *\n * @param {number} slippageAmount\n * @param slippage\n * @returns\n */\nfunction reverSlippageAmount(slippageAmount: number | string, slippage: number): string {\n return Decimal.ceil(d(slippageAmount).div(1 + slippage)).toString()\n}\n\nexport async function printTransaction(tx: Transaction, isPrint = true) {\n console.log(`inputs`, tx.blockData.inputs)\n tx.blockData.transactions.forEach((item, index) => {\n if (isPrint) {\n console.log(`transaction ${index}: `, item)\n }\n })\n}\n\ninterface TransferedCoin {\n coinType: string\n coin: TransactionObjectArgument\n}\n\nexport class TransactionUtil {\n static createCollectRewarderAndFeeParams(\n sdk: SDK,\n tx: Transaction,\n params: CollectRewarderParams,\n allCoinAsset: CoinAsset[],\n allCoinAssetA?: CoinAsset[],\n allCoinAssetB?: CoinAsset[]\n ) {\n if (allCoinAssetA === undefined) {\n allCoinAssetA = [...allCoinAsset]\n }\n if (allCoinAssetB === undefined) {\n allCoinAssetB = [...allCoinAsset]\n }\n const coinTypeA = normalizeCoinType(params.coinTypeA)\n const coinTypeB = normalizeCoinType(params.coinTypeB)\n if (params.collect_fee) {\n const primaryCoinAInput = TransactionUtil.buildCoinForAmount(tx, allCoinAssetA, BigInt(0), coinTypeA, false)\n allCoinAssetA = primaryCoinAInput.remainCoins\n\n const primaryCoinBInput = TransactionUtil.buildCoinForAmount(tx, allCoinAssetB, BigInt(0), coinTypeB, false)\n allCoinAssetB = primaryCoinBInput.remainCoins\n\n tx = sdk.Position.createCollectFeePaylod(\n {\n pool_id: params.pool_id,\n pos_id: params.pos_id,\n coinTypeA: params.coinTypeA,\n coinTypeB: params.coinTypeB,\n },\n tx,\n primaryCoinAInput.targetCoin,\n primaryCoinBInput.targetCoin\n )\n }\n const primaryCoinInputs: TransactionObjectArgument[] = []\n params.rewarder_coin_types.forEach((type) => {\n switch (normalizeCoinType(type)) {\n case coinTypeA:\n primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAssetA!, BigInt(0), type, false).targetCoin)\n break\n case coinTypeB:\n primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAssetB!, BigInt(0), type, false).targetCoin)\n break\n default:\n primaryCoinInputs.push(TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(0), type, false).targetCoin)\n break\n }\n })\n tx = sdk.Rewarder.createCollectRewarderPaylod(params, tx, primaryCoinInputs)\n return tx\n }\n\n /**\n * adjust transaction for gas\n * @param sdk\n * @param amount\n * @param tx\n * @returns\n */\n static async adjustTransactionForGas(\n sdk: SDK,\n allCoins: CoinAsset[],\n amount: bigint,\n tx: Transaction\n ): Promise<{ fixAmount: bigint; newTx?: Transaction }> {\n tx.setSender(sdk.senderAddress)\n // amount coins\n const amountCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(allCoins, amount).selectedCoins\n if (amountCoins.length === 0) {\n throw new ClmmpoolsError(`Insufficient balance`, UtilsErrorCode.InsufficientBalance)\n }\n const totalAmount = CoinAssist.calculateTotalBalance(allCoins)\n // If the remaining coin balance is greater than 1000000000, no gas fee correction will be done\n if (totalAmount - amount > 1000000000) {\n return { fixAmount: amount }\n }\n\n // payload Estimated gas consumption\n const estimateGas = await sdk.fullClient.calculationTxGas(tx)\n\n // Find estimateGas objectIds\n const gasCoins = CoinAssist.selectCoinAssetGreaterThanOrEqual(\n allCoins,\n BigInt(estimateGas),\n amountCoins.map((item) => item.coinObjectId)\n ).selectedCoins\n\n // There is not enough gas and the amount needs to be adjusted\n if (gasCoins.length === 0) {\n // Readjust the amount , Reserve 500 gas for the spit\n const newGas = BigInt(estimateGas) + BigInt(500)\n if (totalAmount - amount < newGas) {\n amount -= newGas\n if (amount < 0) {\n throw new ClmmpoolsError(`gas Insufficient balance`, UtilsErrorCode.InsufficientBalance)\n }\n\n const newTx = new Transaction()\n return { fixAmount: amount, newTx }\n }\n }\n return { fixAmount: amount }\n }\n\n // -----------------------------------------liquidity-----------------------------------------------//\n /**\n * build add liquidity transaction\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildAddLiquidityFixTokenForGas(\n sdk: SDK,\n allCoins: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n gasEstimateArg: {\n slippage: number\n curSqrtPrice: BN\n },\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n tx = await TransactionUtil.buildAddLiquidityFixToken(sdk, allCoins, params, tx, inputCoinA, inputCoinB)\n\n const { isAdjustCoinA } = findAdjustCoin(params)\n\n const suiAmount = isAdjustCoinA ? params.amount_a : params.amount_b\n\n const newResult = await TransactionUtil.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(isAdjustCoinA ? params.coinTypeA : params.coinTypeB, allCoins),\n BigInt(suiAmount),\n tx\n )\n\n const { fixAmount } = newResult\n const { newTx } = newResult\n\n if (newTx != null) {\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n\n if (isAdjustCoinA) {\n params.amount_a = Number(fixAmount)\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n !params.fix_amount_a,\n fixAmount.toString(),\n params.slippage,\n params.coinTypeA,\n allCoins,\n false,\n true\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coinTypeB,\n allCoins,\n false,\n true\n )\n } else {\n params.amount_b = Number(fixAmount)\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coinTypeA,\n allCoins,\n false,\n true\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n newTx,\n params.fix_amount_a,\n fixAmount.toString(),\n params.slippage,\n params.coinTypeB,\n allCoins,\n false,\n true\n )\n params = TransactionUtil.fixAddLiquidityFixTokenParams(params, gasEstimateArg.slippage, gasEstimateArg.curSqrtPrice)\n\n tx = TransactionUtil.buildAddLiquidityFixTokenArgs(newTx, sdk, allCoins, params, primaryCoinAInputs, primaryCoinBInputs)\n return tx\n }\n }\n return tx\n }\n\n /**\n * build add liquidity transaction\n * @param params\n * @param packageId\n * @returns\n */\n static async buildAddLiquidityFixToken(\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n tx = tx || new Transaction()\n\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n if (inputCoinA == null || inputCoinB == null) {\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coinTypeA,\n allCoinAsset,\n false,\n true\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coinTypeB,\n allCoinAsset,\n false,\n true\n )\n } else {\n primaryCoinAInputs = {\n targetCoin: inputCoinA,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n primaryCoinBInputs = {\n targetCoin: inputCoinB,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n }\n\n tx = TransactionUtil.buildAddLiquidityFixTokenArgs(\n tx,\n sdk,\n allCoinAsset,\n params as AddLiquidityFixTokenParams,\n primaryCoinAInputs,\n primaryCoinBInputs\n )\n return tx\n }\n\n /**\n * build add liquidity with protection transaction\n * @param params\n * @param packageId\n * @returns\n */\n static async buildAddLiquidityWithProtectionFixToken(\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n tx = tx || new Transaction()\n\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n if (inputCoinA == null || inputCoinB == null) {\n primaryCoinAInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n !params.fix_amount_a,\n params.amount_a,\n params.slippage,\n params.coinTypeA,\n allCoinAsset,\n false\n )\n primaryCoinBInputs = TransactionUtil.buildAddLiquidityFixTokenCoinInput(\n tx,\n params.fix_amount_a,\n params.amount_b,\n params.slippage,\n params.coinTypeB,\n allCoinAsset,\n false\n )\n } else {\n primaryCoinAInputs = {\n targetCoin: inputCoinA,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n primaryCoinBInputs = {\n targetCoin: inputCoinB,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n }\n\n tx = TransactionUtil.buildAddLiquidityWithProtectionFixTokenArgs(\n tx,\n sdk,\n allCoinAsset,\n params as AddLiquidityFixTokenParams,\n primaryCoinAInputs,\n primaryCoinBInputs\n )\n return tx\n }\n\n public static buildAddLiquidityFixTokenCoinInput(\n tx: Transaction,\n need_interval_amount: boolean,\n amount: number | string,\n slippage: number,\n coinType: string,\n allCoinAsset: CoinAsset[],\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n return need_interval_amount\n ? TransactionUtil.buildCoinForAmountInterval(\n tx,\n allCoinAsset,\n { amountSecond: BigInt(reverSlippageAmount(amount, slippage)), amountFirst: BigInt(amount) },\n coinType,\n buildVector,\n fixAmount\n )\n : TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(amount), coinType, buildVector, fixAmount)\n }\n\n /**\n * fix add liquidity fix token for coin amount\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static fixAddLiquidityFixTokenParams(params: AddLiquidityFixTokenParams, slippage: number, curSqrtPrice: BN): AddLiquidityFixTokenParams {\n const coinAmount = params.fix_amount_a ? params.amount_a : params.amount_b\n const liquidityInput = ClmmPoolUtil.estLiquidityAndcoinAmountFromOneAmounts(\n Number(params.tick_lower),\n Number(params.tick_upper),\n new BN(coinAmount),\n params.fix_amount_a,\n true,\n slippage,\n curSqrtPrice\n )\n\n params.amount_a = params.fix_amount_a ? params.amount_a : liquidityInput.tokenMaxA.toNumber()\n params.amount_b = params.fix_amount_a ? liquidityInput.tokenMaxB.toNumber() : params.amount_b\n\n return params\n }\n\n private static buildAddLiquidityFixTokenArgs(\n tx: Transaction,\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n primaryCoinAInputs: BuildCoinResult,\n primaryCoinBInputs: BuildCoinResult\n ) {\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const functionName = params.is_open ? 'open_position_with_liquidity_by_fix_coin' : 'add_liquidity_by_fix_coin'\n const { clmm_pool, integrate } = sdk.sdkOptions\n\n if (!params.is_open) {\n tx = TransactionUtil.createCollectRewarderAndFeeParams(\n sdk,\n tx,\n params,\n allCoinAsset,\n primaryCoinAInputs.remainCoins,\n primaryCoinBInputs.remainCoins\n )\n }\n\n const clmmConfig = getPackagerConfigs(clmm_pool)\n const args = params.is_open\n ? [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.amount_a),\n tx.pure.u64(params.amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.amount_a),\n tx.pure.u64(params.amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n private static buildAddLiquidityWithProtectionFixTokenArgs(\n tx: Transaction,\n sdk: SDK,\n allCoinAsset: CoinAsset[],\n params: AddLiquidityFixTokenParams,\n primaryCoinAInputs: BuildCoinResult,\n primaryCoinBInputs: BuildCoinResult\n ) {\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const functionName = params.is_open\n ? 'open_position_with_liquidity_by_fix_coin_with_protection'\n : 'add_liquidity_by_fix_coin_with_protection'\n const { clmm_pool, integrate } = sdk.sdkOptions\n\n if (!params.is_open) {\n tx = TransactionUtil.createCollectRewarderAndFeeParams(\n sdk,\n tx,\n params,\n allCoinAsset,\n primaryCoinAInputs.remainCoins,\n primaryCoinBInputs.remainCoins\n )\n }\n\n const clmmConfig = getPackagerConfigs(clmm_pool)\n let min_amount_a, max_amount_a, min_amount_b, max_amount_b\n if (params.fix_amount_a) {\n max_amount_a = params.amount_a\n min_amount_a = params.amount_a\n max_amount_b = params.amount_b\n min_amount_b = new Decimal(params.amount_b)\n .div(new Decimal(1).plus(new Decimal(params.slippage)))\n .mul(new Decimal(1).minus(new Decimal(params.slippage)))\n .toDecimalPlaces(0)\n .toNumber()\n } else {\n max_amount_b = params.amount_b\n min_amount_b = params.amount_b\n max_amount_a = params.amount_a\n min_amount_a = new Decimal(params.amount_a)\n .div(new Decimal(1).plus(new Decimal(params.slippage)))\n .mul(new Decimal(1).minus(new Decimal(params.slippage)))\n .toDecimalPlaces(0)\n .toNumber()\n }\n\n const args = params.is_open\n ? [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(max_amount_a),\n tx.pure.u64(max_amount_b),\n tx.pure.u64(min_amount_a),\n tx.pure.u64(min_amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(clmmConfig.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(max_amount_a),\n tx.pure.u64(max_amount_b),\n tx.pure.u64(min_amount_a),\n tx.pure.u64(min_amount_b),\n tx.pure.bool(params.fix_amount_a),\n tx.object(CLOCK_ADDRESS),\n ]\n // const args = params.is_open\n // ? [\n // tx.object(clmmConfig.global_config_id),\n // tx.object(params.pool_id),\n // tx.pure.u32(Number(asUintN(BigInt(params.tick_lower)).toString())),\n // tx.pure.u32(Number(asUintN(BigInt(params.tick_upper)).toString())),\n // primaryCoinAInputs.targetCoin,\n // primaryCoinBInputs.targetCoin,\n // tx.pure.u64(params.amount_a),\n // tx.pure.u64(params.amount_b),\n // tx.pure.bool(params.fix_amount_a),\n // tx.object(CLOCK_ADDRESS),\n // ]\n // : [\n // tx.object(clmmConfig.global_config_id),\n // tx.object(params.pool_id),\n // tx.object(params.pos_id),\n // primaryCoinAInputs.targetCoin,\n // primaryCoinBInputs.targetCoin,\n // tx.pure.u64(params.amount_a),\n // tx.pure.u64(params.amount_b),\n // tx.pure.bool(params.fix_amount_a),\n // tx.object(CLOCK_ADDRESS),\n // ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // -------------------------------------------swap--------------------------------------------------//\n /**\n * build add liquidity transaction\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildSwapTransactionForGas(\n sdk: SDK,\n params: SwapParams,\n allCoinAsset: CoinAsset[],\n gasEstimateArg: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<Transaction> {\n let tx = TransactionUtil.buildSwapTransaction(sdk, params, allCoinAsset)\n tx.setSender(sdk.senderAddress)\n const newResult = await TransactionUtil.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(params.a2b ? params.coinTypeA : params.coinTypeB, allCoinAsset),\n BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n tx\n )\n\n const { fixAmount, newTx } = newResult\n\n if (newTx !== undefined) {\n newTx.setSender(sdk.senderAddress)\n if (params.by_amount_in) {\n params.amount = fixAmount.toString()\n } else {\n params.amount_limit = fixAmount.toString()\n }\n params = await TransactionUtil.fixSwapParams(sdk, params, gasEstimateArg)\n\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB\n )\n\n tx = TransactionUtil.buildSwapTransactionArgs(newTx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n }\n\n return tx\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransaction(sdk: SDK, params: SwapParams, allCoinAsset: CoinAsset[]): Transaction {\n let tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA,\n false\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB,\n false\n )\n\n tx = TransactionUtil.buildSwapTransactionArgs(tx, params, sdk.sdkOptions, primaryCoinInputA, primaryCoinInputB)\n return tx\n }\n\n static buildCreateLockTransaction(sdk: SDK, params: CreateLockParams, allCoinAsset: CoinAsset[]): Transaction {\n let tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { magma_token } = getPackagerConfigs(sdk.sdkOptions.ve33)\n const lockCoinInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount), magma_token, false, true)\n tx = TransactionUtil.buildCreateTransactionArgs(tx, params, sdk.sdkOptions, lockCoinInput)\n return tx\n }\n\n static buildCreateTransactionArgs(\n tx: Transaction,\n params: CreateLockParams,\n sdkOptions: SdkOptions,\n lockCoinInput: BuildCoinResult\n ): Transaction {\n const { integrate, ve33 } = sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'create_lock'\n const coins = tx.makeMoveVec({ elements: [lockCoinInput.targetCoin] })\n const args = [\n tx.object(voting_escrow_id),\n coins,\n tx.pure.u64(params.lockDurationDays),\n tx.pure.bool(params.permanent),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildIncreaseLockAmountTransaction(sdk: SDK, params: IncreaseLockAmountParams, allCoinAsset: CoinAsset[]): Transaction {\n const { magma_token } = getPackagerConfigs(sdk.sdkOptions.ve33)\n\n let tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n const lockCoinInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount), magma_token, false, true)\n\n tx = TransactionUtil.buildIncreaseLockAmountTransactionArgs(tx, params, sdk.sdkOptions, lockCoinInput)\n return tx\n }\n\n static buildIncreaseLockAmountTransactionArgs(\n tx: Transaction,\n params: IncreaseLockAmountParams,\n sdkOptions: SdkOptions,\n increaseCoinInput: BuildCoinResult\n ): Transaction {\n const { integrate, ve33 } = sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'increase_amount_single_coin'\n\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), increaseCoinInput.targetCoin, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun merge<T>(self: &mut VotingEscrow<T>, from_lock: Lock, to_lock: &mut Lock, clock: &Clock, ctx: &mut TxContext) {\n static buildMergeLockTransaction(sdk: SDK, params: MergeLockParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voter_id, voting_escrow_id, magma_token, distribution_cfg } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'merge_locks'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(params.fromLockId),\n tx.object(params.toLockId),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun transfer<T>(lock: Lock, ve: &mut VotingEscrow<T>, to: address, clock: &Clock, ctx: &mut TxContext) {\n static buildTransferLockTransaction(sdk: SDK, params: TransferLockParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'transfer'\n\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), tx.object(params.to), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun increase_unlock_time<T>(self: &mut VotingEscrow<T>, lock: &mut Lock, lock_duration: u64, clock: &Clock, ctx: &mut TxContext) {\n static buildIncreaseUnlockTimeTransaction(sdk: SDK, params: IncreaseUnlockTimeParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const oneDay = 24 * 60 * 60\n const newLockDuration = Math.ceil((params.newLockEndAt - Date.now() / 1000) / oneDay)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'increase_unlock_time'\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), tx.pure.u64(newLockDuration), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // public fun lock_permanent<T>(self: &mut VotingEscrow<T>, lock: &mut Lock, clock: &Clock, ctx: &mut TxContext) {\n static buildLockPermanentTransaction(sdk: SDK, params: LockPermanentParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'lock_permanent'\n\n const args = [tx.object(voting_escrow_id), tx.object(params.lockId), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildUnlockPermanentTransaction(sdk: SDK, params: LockPermanentParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, distribution_cfg, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'unlock_permanent'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(params.lockId),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildBurnLockTransaction(sdk: SDK, lockId: string) {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, distribution_cfg, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'burn_lock'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(lockId),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildSplitLockTransaction(sdk: SDK, lockId: string, splitAmount: bigint | number | string) {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, distribution_cfg, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'split_lock'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voting_escrow_id),\n tx.object(voter_id),\n tx.object(lockId),\n tx.pure.u64(splitAmount),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildVoteTransaction(sdk: SDK, params: VoteParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { distribution_cfg, voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'vote'\n\n const pools = tx.pure.vector('id', params.pools)\n const weights = tx.makeMoveVec({\n elements: params.weights.map((weight) => tx.pure.u64(weight)),\n type: 'u64',\n })\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(params.lockId),\n pools,\n weights,\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimVotingRewardsTransaction(sdk: SDK, params: ClaimFeesParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n\n const typeArguments = [magma_token, params.coinAType, params.coinBType]\n const functionName = 'claim_voting_fee_rewards_single'\n\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), tx.object(params.locks), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimVotingRewardsPoolsTransaction(sdk: SDK, params: ClaimFeesPoolsParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, distribution, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n\n const typeArguments = [magma_token, params.coinAType, params.coinBType]\n const functionName = 'claim_voting_fee_rewards'\n\n const locks = tx.makeMoveVec({\n elements: params.locks.map((lock) => tx.object(lock)),\n type: `${distribution.package_id}::voting_escrow::Lock`,\n })\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), locks, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimAndLockRebases(sdk: SDK, params: ClaimAndLockParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, reward_distributor_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'claim_and_lock'\n\n const args = [tx.object(reward_distributor_id), tx.object(voting_escrow_id), tx.object(params.lockId), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${RewardDistributor}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildPoke(sdk: SDK, params: PokeParams): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, ve33 } = sdk.sdkOptions\n const { distribution_cfg, voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const functionName = 'poke'\n\n const args = [\n tx.object(distribution_cfg),\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(params.lockId),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n static buildClaimVotingBribe(sdk: SDK, locks: string[], incentive_tokens: string[]): Transaction {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n const { integrate, distribution, ve33 } = sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...incentive_tokens]\n\n let targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes_${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes`\n }\n\n const locksParams = tx.makeMoveVec({\n elements: locks.map((lock) => tx.object(lock)),\n type: `${distribution.package_id}::voting_escrow::Lock`,\n })\n\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), locksParams, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: targetFunc,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionArgs(\n tx: Transaction,\n params: SwapParams,\n sdkOptions: SdkOptions,\n primaryCoinInputA: BuildCoinResult,\n primaryCoinInputB: BuildCoinResult\n ): Transaction {\n const { clmm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n if (global_config_id === undefined) {\n throw Error('clmm.config.global_config_id is undefined')\n }\n\n const hasSwapPartner = params.swap_partner !== undefined\n\n const functionName = hasSwapPartner\n ? params.a2b\n ? 'swap_a2b_with_partner'\n : 'swap_b2a_with_partner'\n : params.a2b\n ? 'swap_a2b'\n : 'swap_b2a'\n\n const args = hasSwapPartner\n ? [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n tx.object(params.swap_partner!),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u64(params.amount_limit),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u64(params.amount_limit),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // -------------------------------------swap-with-out-transfer-coin-----------------------------------------//\n /**\n * build add liquidity transaction with out transfer coins\n * @param params\n * @param slippage\n * @param curSqrtPrice\n * @returns\n */\n static async buildSwapTransactionWithoutTransferCoinsForGas(\n sdk: SDK,\n params: SwapParams,\n allCoinAsset: CoinAsset[],\n gasEstimateArg: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<{ tx: Transaction; coinABs: TransactionObjectArgument[] }> {\n let { tx, coinABs } = TransactionUtil.buildSwapTransactionWithoutTransferCoins(sdk, params, allCoinAsset)\n tx.setSender(sdk.senderAddress)\n const newResult = await TransactionUtil.adjustTransactionForGas(\n sdk,\n CoinAssist.getCoinAssets(params.a2b ? params.coinTypeA : params.coinTypeB, allCoinAsset),\n BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n tx\n )\n\n const { fixAmount, newTx } = newResult\n\n if (newTx !== undefined) {\n newTx.setSender(sdk.senderAddress)\n if (params.by_amount_in) {\n params.amount = fixAmount.toString()\n } else {\n params.amount_limit = fixAmount.toString()\n }\n params = await TransactionUtil.fixSwapParams(sdk, params, gasEstimateArg)\n\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA,\n false,\n true\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB,\n false,\n true\n )\n\n const res = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n sdk,\n newTx,\n params,\n sdk.sdkOptions,\n primaryCoinInputA,\n primaryCoinInputB\n )\n tx = res.tx\n coinABs = res.txRes\n }\n\n return { tx, coinABs }\n }\n\n /**\n * build swap transaction and return swaped coin\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionWithoutTransferCoins(\n sdk: SDK,\n params: SwapParams,\n allCoinAsset: CoinAsset[]\n ): { tx: Transaction; coinABs: TransactionObjectArgument[] } {\n const tx = new Transaction()\n tx.setSender(sdk.senderAddress)\n\n // Fix amount must set true, to support amount limit.\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(params.by_amount_in ? params.amount : params.amount_limit) : BigInt(0),\n params.coinTypeA,\n false,\n true\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.a2b ? BigInt(0) : BigInt(params.by_amount_in ? params.amount : params.amount_limit),\n params.coinTypeB,\n false,\n true\n )\n\n const res = TransactionUtil.buildSwapTransactionWithoutTransferCoinArgs(\n sdk,\n tx,\n params,\n sdk.sdkOptions,\n primaryCoinInputA,\n primaryCoinInputB\n )\n return { tx: res.tx, coinABs: res.txRes }\n }\n\n /**\n * build swap transaction\n * @param params\n * @param packageId\n * @returns\n */\n static buildSwapTransactionWithoutTransferCoinArgs(\n sdk: SDK,\n tx: Transaction,\n params: SwapParams,\n sdkOptions: SdkOptions,\n primaryCoinInputA: BuildCoinResult,\n primaryCoinInputB: BuildCoinResult\n ): { tx: Transaction; txRes: TransactionObjectArgument[] } {\n const { clmm_pool, integrate } = sdkOptions\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n if (global_config_id === undefined) {\n throw Error('clmm.config.global_config_id is undefined')\n }\n\n const hasSwapPartner = params.swap_partner !== undefined\n\n const functionName = hasSwapPartner ? 'swap_with_partner' : 'swap'\n\n const moduleName = hasSwapPartner ? ClmmIntegrateRouterWithPartnerModule : ClmmIntegrateRouterModule\n\n const args = hasSwapPartner\n ? [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n tx.object(params.swap_partner!),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(false), // use coin value always set false.\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(global_config_id),\n tx.object(params.pool_id),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.by_amount_in),\n tx.pure.u64(params.amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(false), // use coin value always set false.\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const coinABs: TransactionObjectArgument[] = tx.moveCall({\n target: `${integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n if (params.by_amount_in) {\n const toCoinType = params.a2b ? params.coinTypeB : params.coinTypeA\n const toCoin = params.a2b ? coinABs[1] : coinABs[0]\n const totalAmount = Number(params.amount_limit)\n this.checkCoinThreshold(sdk, params.by_amount_in, tx, toCoin, totalAmount, toCoinType)\n }\n\n return { tx, txRes: coinABs }\n }\n\n static async fixSwapParams(\n sdk: SDK,\n params: SwapParams,\n gasEstimateArg: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<SwapParams> {\n const { currentPool } = gasEstimateArg\n try {\n const res: any = await sdk.Swap.preswap({\n decimalsA: gasEstimateArg.decimalsA,\n decimalsB: gasEstimateArg.decimalsB,\n a2b: params.a2b,\n byAmountIn: params.by_amount_in,\n amount: params.amount,\n pool: currentPool,\n currentSqrtPrice: currentPool.current_sqrt_price,\n coinTypeA: currentPool.coinTypeA,\n coinTypeB: currentPool.coinTypeB,\n })\n\n const toAmount = gasEstimateArg.byAmountIn ? res.estimatedAmountOut : res.estimatedAmountIn\n\n const amountLimit = adjustForSlippage(toAmount, gasEstimateArg.slippage, !gasEstimateArg.byAmountIn)\n params.amount_limit = amountLimit.toString()\n } catch (error) {\n console.log('fixSwapParams', error)\n }\n\n return params\n }\n\n public static async syncBuildCoinInputForAmount(\n sdk: SDK,\n tx: Transaction,\n amount: bigint,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): Promise<TransactionObjectArgument | undefined> {\n if (sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n const allCoins = await sdk.getOwnerCoinAssets(sdk.senderAddress, coinType)\n const primaryCoinInput: any = TransactionUtil.buildCoinForAmount(tx, allCoins, amount, coinType, buildVector, fixAmount)!.targetCoin\n\n return primaryCoinInput\n }\n\n public static buildCoinForAmount(\n tx: Transaction,\n allCoins: CoinAsset[],\n amount: bigint,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n // mint zero coin\n if (amount === BigInt(0)) {\n return TransactionUtil.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n }\n const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n if (amountTotal < amount) {\n throw new ClmmpoolsError(\n `The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amount} `,\n UtilsErrorCode.InsufficientBalance\n )\n }\n\n return TransactionUtil.buildCoin(tx, allCoins, coinAssets, amount, coinType, buildVector, fixAmount)\n }\n\n private static buildVectorCoin(\n tx: Transaction,\n allCoins: CoinAsset[],\n coinAssets: CoinAsset[],\n amount: bigint,\n coinType: string,\n fixAmount = true\n ) {\n if (CoinAssist.isSuiCoin(coinType)) {\n const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n return {\n targetCoin: tx.makeMoveVec({ elements: [amountCoin] }),\n remainCoins: allCoins,\n tragetCoinAmount: amount.toString(),\n isMintZeroCoin: false,\n originalSplitedCoin: tx.gas,\n }\n }\n\n const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult, coinObjectIds } = this.buildSpitTargeCoin(\n tx,\n amount,\n coinAssets,\n fixAmount\n )\n\n if (fixAmount) {\n return {\n targetCoin: tx.makeMoveVec({ elements: [targetCoin] }),\n remainCoins: selectedCoinsResult.remainCoins,\n originalSplitedCoin,\n tragetCoinAmount,\n isMintZeroCoin: false,\n }\n }\n\n return {\n targetCoin: tx.makeMoveVec({ elements: coinObjectIds.map((id) => tx.object(id)) }),\n remainCoins: selectedCoinsResult.remainCoins,\n tragetCoinAmount: selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString(),\n isMintZeroCoin: false,\n }\n }\n\n private static buildOneCoin(tx: Transaction, coinAssets: CoinAsset[], amount: bigint, coinType: string, fixAmount = true) {\n if (CoinAssist.isSuiCoin(coinType)) {\n if (amount === 0n && coinAssets.length > 1) {\n const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n return {\n targetCoin: tx.object(selectedCoinsResult.objectArray[0]),\n remainCoins: selectedCoinsResult.remainCoins,\n tragetCoinAmount: selectedCoinsResult.amountArray[0],\n isMintZeroCoin: false,\n }\n }\n const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n const amountCoin = tx.splitCoins(tx.gas, [tx.pure.u64(amount)])\n return {\n targetCoin: amountCoin,\n remainCoins: selectedCoinsResult.remainCoins,\n tragetCoinAmount: amount.toString(),\n isMintZeroCoin: false,\n originalSplitedCoin: tx.gas,\n }\n }\n\n const { targetCoin, originalSplitedCoin, tragetCoinAmount, selectedCoinsResult } = this.buildSpitTargeCoin(\n tx,\n amount,\n coinAssets,\n fixAmount\n )\n\n return {\n targetCoin,\n remainCoins: selectedCoinsResult.remainCoins,\n originalSplitedCoin,\n tragetCoinAmount,\n isMintZeroCoin: false,\n }\n }\n\n private static buildSpitTargeCoin(tx: Transaction, amount: bigint, coinAssets: CoinAsset[], fixAmount: boolean) {\n const selectedCoinsResult = CoinAssist.selectCoinObjectIdGreaterThanOrEqual(coinAssets, amount)\n const totalSelectedCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n const coinObjectIds = selectedCoinsResult.objectArray\n\n const [primaryCoinA, ...mergeCoinAs] = coinObjectIds\n const primaryCoinAObject = tx.object(primaryCoinA)\n\n let targetCoin: any = primaryCoinAObject\n const tragetCoinAmount = selectedCoinsResult.amountArray.reduce((a, b) => Number(a) + Number(b), 0).toString()\n let originalSplitedCoin\n if (mergeCoinAs.length > 0) {\n tx.mergeCoins(\n primaryCoinAObject,\n mergeCoinAs.map((coin) => tx.object(coin))\n )\n }\n\n if (fixAmount && Number(totalSelectedCoinAmount) > Number(amount)) {\n targetCoin = tx.splitCoins(primaryCoinAObject, [tx.pure.u64(amount)])\n originalSplitedCoin = primaryCoinAObject\n }\n\n return {\n originalSplitedCoin,\n targetCoin,\n tragetCoinAmount,\n selectedCoinsResult,\n coinObjectIds,\n }\n }\n\n private static buildCoin(\n tx: Transaction,\n allCoins: CoinAsset[],\n coinAssets: CoinAsset[],\n amount: bigint,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n if (buildVector) {\n return this.buildVectorCoin(tx, allCoins, coinAssets, amount, coinType, fixAmount)\n }\n\n return this.buildOneCoin(tx, coinAssets, amount, coinType, fixAmount)\n }\n\n private static buildZeroValueCoin(allCoins: CoinAsset[], tx: Transaction, coinType: string, buildVector = true): BuildCoinResult {\n const zeroCoin = TransactionUtil.callMintZeroValueCoin(tx, coinType)\n let targetCoin: any\n if (buildVector) {\n targetCoin = tx.makeMoveVec({ elements: [zeroCoin] })\n } else {\n targetCoin = zeroCoin\n }\n\n return {\n targetCoin,\n remainCoins: allCoins,\n isMintZeroCoin: true,\n tragetCoinAmount: '0',\n }\n }\n\n public static buildCoinForAmountInterval(\n tx: Transaction,\n allCoins: CoinAsset[],\n amounts: CoinInputInterval,\n coinType: string,\n buildVector = true,\n fixAmount = true\n ): BuildCoinResult {\n const coinAssets: CoinAsset[] = CoinAssist.getCoinAssets(coinType, allCoins)\n if (amounts.amountFirst === BigInt(0)) {\n if (coinAssets.length > 0) {\n return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n }\n return TransactionUtil.buildZeroValueCoin(allCoins, tx, coinType, buildVector)\n }\n\n const amountTotal = CoinAssist.calculateTotalBalance(coinAssets)\n\n if (amountTotal >= amounts.amountFirst) {\n return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountFirst, coinType, buildVector, fixAmount)\n }\n\n if (amountTotal < amounts.amountSecond) {\n throw new ClmmpoolsError(\n `The amount(${amountTotal}) is Insufficient balance for ${coinType} , expect ${amounts.amountSecond} `,\n UtilsErrorCode.InsufficientBalance\n )\n }\n\n return TransactionUtil.buildCoin(tx, [...allCoins], [...coinAssets], amounts.amountSecond, coinType, buildVector, fixAmount)\n }\n\n static callMintZeroValueCoin = (txb: Transaction, coinType: string) => {\n return txb.moveCall({\n target: '0x2::coin::zero',\n typeArguments: [coinType],\n })\n }\n\n // ------------------------------------------router-v1-------------------------------------------------//\n public static async buildRouterSwapTransaction(\n sdk: SDK,\n params: SwapWithRouterParams,\n byAmountIn: boolean,\n allCoinAsset: CoinAsset[],\n // If recipient not set, transfer objects move call will use ctx sender.\n recipient?: string\n ): Promise<Transaction> {\n let tx = new Transaction()\n\n // When the router's split path length exceeds 1, router cannot support partner.\n // now router v1 just return one best path.\n // when use router v2, must set allow split to false.\n if (params.paths.length > 1) {\n params.partner = ''\n }\n\n tx = await this.buildRouterBasePathTx(sdk, params, byAmountIn, allCoinAsset, tx, recipient)\n return tx\n }\n\n static async buildRouterBasePathTx(\n sdk: SDK,\n params: SwapWithRouterParams,\n byAmountIn: boolean,\n allCoinAsset: CoinAsset[],\n tx: Transaction,\n // If recipient not set, transfer objects move call will use ctx sender.\n recipient?: string\n ) {\n const validPaths = params.paths.filter((path) => path && path.poolAddress)\n const inputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n const outputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n const totalAmountLimit = byAmountIn\n ? Math.round(Number(outputAmount.toString()) * (1 - params.priceSlippagePoint))\n : Math.round(Number(inputAmount.toString()) * (1 + params.priceSlippagePoint))\n\n const fromCoinType = params.paths[0].coinType[0]\n const toCoinType = params.paths[0].coinType[params.paths[0].coinType.length - 1]\n\n // When fix amount out, the amount of fromCoin must set to amountLimit to support limit amount slippage point.\n const fromCoinBuildResult = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n byAmountIn ? BigInt(inputAmount) : BigInt(totalAmountLimit),\n fromCoinType,\n false,\n true\n )\n const isSplited = fromCoinBuildResult.originalSplitedCoin !== undefined\n const toCoinBuildResult = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, 0n, toCoinType, false)\n\n const buildRouterBasePathReturnCoin = await this.buildRouterBasePathReturnCoins(\n sdk,\n params,\n byAmountIn,\n fromCoinBuildResult,\n toCoinBuildResult,\n tx\n )\n\n const transferedCoins: TransferedCoin[] = []\n const { toCoin, fromCoin } = buildRouterBasePathReturnCoin\n tx = buildRouterBasePathReturnCoin.tx\n\n if (toCoinBuildResult.isMintZeroCoin) {\n transferedCoins.push({\n coinType: toCoinType,\n coin: toCoin,\n })\n } else if (toCoinBuildResult.originalSplitedCoin !== undefined) {\n tx.mergeCoins(toCoinBuildResult.originalSplitedCoin!, [toCoin])\n } else {\n tx.mergeCoins(toCoinBuildResult.targetCoin, [toCoin])\n }\n\n if (isSplited) {\n const originalSplitedFromCoin = fromCoinBuildResult?.originalSplitedCoin as TransactionObjectArgument\n tx.mergeCoins(originalSplitedFromCoin, [fromCoin])\n } else {\n transferedCoins.push({\n coinType: fromCoinType,\n coin: fromCoin,\n })\n }\n\n for (let i = 0; i < transferedCoins.length; i++) {\n this.buildTransferCoin(sdk, tx, transferedCoins[i].coin, transferedCoins[i].coinType, recipient)\n }\n\n return tx\n }\n\n static async buildRouterBasePathReturnCoins(\n sdk: SDK,\n params: SwapWithRouterParams,\n byAmountIn: boolean,\n fromCoinBuildRes: BuildCoinResult,\n toCoinBuildRes: BuildCoinResult,\n tx: Transaction\n ) {\n const { clmm_pool, integrate } = sdk.sdkOptions\n const globalConfigID = getPackagerConfigs(clmm_pool).global_config_id\n\n const validPaths = params.paths.filter((path) => path && path.poolAddress)\n\n const inputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountIn), ZERO).toString())\n const outputAmount = Number(validPaths.reduce((total, path) => total.add(path.amountOut), ZERO).toString())\n\n const totalAmountLimit = byAmountIn\n ? Math.round(Number(outputAmount.toString()) * (1 - params.priceSlippagePoint))\n : Math.round(Number(inputAmount.toString()) * (1 + params.priceSlippagePoint))\n\n const fromCoinType = params.paths[0].coinType[0]\n const toCoinType = params.paths[0].coinType[params.paths[0].coinType.length - 1]\n\n let fromCoin = fromCoinBuildRes.targetCoin as TransactionObjectArgument\n let toCoin\n if (toCoinBuildRes.isMintZeroCoin || toCoinBuildRes.originalSplitedCoin !== undefined) {\n toCoin = toCoinBuildRes.targetCoin as TransactionObjectArgument\n } else {\n toCoin = TransactionUtil.callMintZeroValueCoin(tx, toCoinType)\n }\n\n const noPartner = params.partner === ''\n\n const moduleName = noPartner ? ClmmIntegrateRouterModule : ClmmIntegrateRouterWithPartnerModule\n\n for (const path of validPaths) {\n if (path.poolAddress.length === 1) {\n const a2b = path.a2b[0]\n const swapParams = {\n amount: Number(path.amountIn.toString()),\n amountLimit: totalAmountLimit,\n poolCoinA: path.a2b[0] ? fromCoinType : toCoinType,\n poolCoinB: path.a2b[0] ? toCoinType : fromCoinType,\n }\n\n const functionName = noPartner ? 'swap' : 'swap_with_partner'\n\n const poolCoinA = a2b ? fromCoin : toCoin\n const poolCoinB = a2b ? toCoin : fromCoin\n const amount = byAmountIn ? path.amountIn.toString() : path.amountOut.toString()\n\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(a2b).toString()\n const args: any = noPartner\n ? [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n poolCoinA,\n poolCoinB,\n tx.pure.bool(a2b),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit),\n tx.pure.bool(false),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n tx.object(params.partner),\n poolCoinA,\n poolCoinB,\n tx.pure.bool(a2b),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit),\n tx.pure.bool(false),\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = [swapParams.poolCoinA, swapParams.poolCoinB]\n\n const coinABs: TransactionObjectArgument[] = tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n fromCoin = a2b ? coinABs[0] : coinABs[1]\n toCoin = a2b ? coinABs[1] : coinABs[0]\n } else {\n const amount0 = byAmountIn ? path.amountIn : path.rawAmountLimit[0]\n const amount1 = byAmountIn ? 0 : path.amountOut\n\n let functionName = ''\n if (path.a2b[0]) {\n if (path.a2b[1]) {\n functionName = 'swap_ab_bc'\n } else {\n functionName = 'swap_ab_cb'\n }\n } else if (path.a2b[1]) {\n functionName = 'swap_ba_bc'\n } else {\n functionName = 'swap_ba_cb'\n }\n\n if (!noPartner) {\n functionName = `${functionName}_with_partner`\n }\n\n const sqrtPriceLimit0 = SwapUtils.getDefaultSqrtPriceLimit(path.a2b[0])\n const sqrtPriceLimit1 = SwapUtils.getDefaultSqrtPriceLimit(path.a2b[1])\n const args: any = noPartner\n ? [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n tx.object(path.poolAddress[1]),\n fromCoin,\n toCoin,\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount0.toString()),\n tx.pure.u64(amount1.toString()),\n tx.pure.u128(sqrtPriceLimit0.toString()),\n tx.pure.u128(sqrtPriceLimit1.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(globalConfigID),\n tx.object(path.poolAddress[0]),\n tx.object(path.poolAddress[1]),\n tx.object(params.partner),\n fromCoin,\n toCoin,\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount0.toString()),\n tx.pure.u64(amount1.toString()),\n tx.pure.u128(sqrtPriceLimit0.toString()),\n tx.pure.u128(sqrtPriceLimit1.toString()),\n tx.object(CLOCK_ADDRESS),\n ]\n const typeArguments = [path.coinType[0], path.coinType[1], path.coinType[2]]\n const fromToCoins = tx.moveCall({\n target: `${integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n fromCoin = fromToCoins[0] as TransactionObjectArgument\n toCoin = fromToCoins[1] as TransactionObjectArgument\n }\n }\n\n this.checkCoinThreshold(sdk, byAmountIn, tx, toCoin, totalAmountLimit, toCoinType)\n return { fromCoin, toCoin, tx }\n }\n\n // ------------------------------------------router-v2-------------------------------------------------//\n public static async buildAggregatorSwapReturnCoins(\n sdk: SDK,\n param: AggregatorResult,\n fromCoinBuildRes: BuildCoinResult,\n toCoinBuildRes: BuildCoinResult,\n partner: string,\n priceSplitPoint: number,\n tx: Transaction,\n // If recipient not set, transfer objects move call will use sdk.senderAddress\n recipient?: string\n ) {\n if (recipient == null) {\n if (sdk.senderAddress.length === 0) {\n throw Error('recipient and this config sdk senderAddress all not set')\n }\n recipient = sdk.senderAddress\n }\n\n // When the router's split path length exceeds 1, router cannot support partner.\n // now router v1 just return one best path.\n // when use router v2, must set allow split to false.\n if (param.splitPaths.length > 1) {\n partner = ''\n }\n\n let fromCoin\n let toCoin\n\n const hasExternalPool = param.splitPaths.some((splitPath) => splitPath.basePaths.some((basePath) => basePath.label === 'Deepbook'))\n\n if ((!param.byAmountIn || param.splitPaths.length === 1) && !hasExternalPool) {\n const onePaths: OnePath[] = []\n for (const splitPath of param.splitPaths) {\n const a2b = []\n const poolAddress = []\n const rawAmountLimit: BN[] = []\n const coinType = []\n\n for (let i = 0; i < splitPath.basePaths.length; i += 1) {\n const basePath = splitPath.basePaths[i]\n a2b.push(basePath.direction)\n poolAddress.push(basePath.poolAddress)\n rawAmountLimit.push(new BN(basePath.inputAmount.toString()))\n if (i === 0) {\n coinType.push(basePath.fromCoin, basePath.toCoin)\n } else {\n coinType.push(basePath.toCoin)\n }\n }\n\n const onePath: OnePath = {\n amountIn: new BN(splitPath.inputAmount.toString()),\n amountOut: new BN(splitPath.outputAmount.toString()),\n poolAddress,\n a2b,\n rawAmountLimit,\n isExceed: false,\n coinType,\n }\n onePaths.push(onePath)\n }\n const params: SwapWithRouterParams = {\n paths: onePaths,\n partner,\n priceSlippagePoint: priceSplitPoint,\n }\n\n const buildRouterBasePathReturnCoinRes = await this.buildRouterBasePathReturnCoins(\n sdk,\n params,\n param.byAmountIn,\n fromCoinBuildRes,\n toCoinBuildRes,\n tx\n )\n fromCoin = buildRouterBasePathReturnCoinRes.fromCoin\n toCoin = buildRouterBasePathReturnCoinRes.toCoin\n tx = buildRouterBasePathReturnCoinRes.tx\n } else {\n const amountLimit = Math.round(param.outputAmount * (1 - priceSplitPoint))\n\n fromCoin = fromCoinBuildRes.targetCoin as TransactionObjectArgument\n if (toCoinBuildRes.isMintZeroCoin || toCoinBuildRes.originalSplitedCoin !== undefined) {\n toCoin = toCoinBuildRes.targetCoin as TransactionObjectArgument\n } else {\n toCoin = TransactionUtil.callMintZeroValueCoin(tx, param.toCoin)\n }\n\n let isCreateAccountCap = false\n\n let accountCap\n if (hasExternalPool) {\n const [cap, createAccountCapTX] = DeepbookUtils.createAccountCap(recipient, sdk.sdkOptions, tx)\n tx = createAccountCapTX as Transaction\n accountCap = cap as TransactionObjectArgument\n isCreateAccountCap = true\n }\n\n for (let i = 0; i < param.splitPaths.length; i += 1) {\n const splitPath = param.splitPaths[i]\n\n let middleCoin: any\n for (let i = 0; i < splitPath.basePaths.length; i += 1) {\n const basePath = splitPath.basePaths[i]\n if (basePath.label === 'Deepbook') {\n if (i === 0) {\n if (splitPath.basePaths.length === 1) {\n const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, fromCoin, toCoin, false)\n\n fromCoin = deepbookTxBuild.from as TransactionObjectArgument\n toCoin = deepbookTxBuild.to as TransactionObjectArgument\n } else {\n middleCoin = TransactionUtil.callMintZeroValueCoin(tx, basePath.toCoin)\n const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, fromCoin, middleCoin, false)\n fromCoin = deepbookTxBuild.from as TransactionObjectArgument\n middleCoin = deepbookTxBuild.to as TransactionObjectArgument\n }\n } else {\n const deepbookTxBuild = this.buildDeepbookBasePathTx(sdk, basePath, tx, accountCap, middleCoin, toCoin, true)\n\n middleCoin = deepbookTxBuild.from as TransactionObjectArgument\n toCoin = deepbookTxBuild.to as TransactionObjectArgument\n }\n }\n if (basePath.label === 'Magma') {\n if (i === 0) {\n if (splitPath.basePaths.length === 1) {\n const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, fromCoin, toCoin, false, partner)\n fromCoin = clmmTxBuild.from as TransactionObjectArgument\n toCoin = clmmTxBuild.to as TransactionObjectArgument\n } else {\n middleCoin = TransactionUtil.callMintZeroValueCoin(tx, basePath.toCoin)\n const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, fromCoin, middleCoin, false, partner)\n fromCoin = clmmTxBuild.from as TransactionObjectArgument\n middleCoin = clmmTxBuild.to as TransactionObjectArgument\n }\n } else {\n const clmmTxBuild = this.buildClmmBasePathTx(sdk, basePath, tx, param.byAmountIn, middleCoin, toCoin, true, partner)\n middleCoin = clmmTxBuild.from as TransactionObjectArgument\n toCoin = clmmTxBuild.to as TransactionObjectArgument\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::send_coin`,\n typeArguments: [basePath.fromCoin],\n arguments: [middleCoin, tx.pure.address(recipient)],\n })\n }\n }\n }\n }\n\n this.checkCoinThreshold(sdk, param.byAmountIn, tx, toCoin, amountLimit, param.toCoin)\n\n if (isCreateAccountCap) {\n tx = DeepbookUtils.deleteAccountCapByObject(accountCap as TransactionObjectArgument, sdk.sdkOptions, tx)\n }\n }\n return { fromCoin, toCoin, tx }\n }\n\n public static async buildAggregatorSwapTransaction(\n sdk: SDK,\n param: AggregatorResult,\n allCoinAsset: CoinAsset[],\n partner: string,\n priceSlippagePoint: number,\n recipient?: string\n ) {\n let tx = new Transaction()\n\n const amountLimit = param.byAmountIn\n ? Math.round(param.outputAmount * (1 - priceSlippagePoint))\n : Math.round(param.inputAmount * (1 + priceSlippagePoint))\n const fromCoinBuildResult = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n param.byAmountIn ? BigInt(param.inputAmount) : BigInt(amountLimit),\n param.fromCoin,\n false,\n true\n )\n const isSplited = fromCoinBuildResult.originalSplitedCoin != null\n const toCoinBuildResult = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, 0n, param.toCoin, false)\n\n const buildAggregatorSwapReturnCoinsRes = await this.buildAggregatorSwapReturnCoins(\n sdk,\n param,\n fromCoinBuildResult,\n toCoinBuildResult,\n partner,\n priceSlippagePoint,\n tx,\n recipient\n )\n const { fromCoin, toCoin } = buildAggregatorSwapReturnCoinsRes\n tx = buildAggregatorSwapReturnCoinsRes.tx\n\n const transferedCoins: TransferedCoin[] = []\n if (toCoinBuildResult.isMintZeroCoin) {\n transferedCoins.push({\n coinType: param.toCoin,\n coin: toCoin,\n })\n } else if (toCoinBuildResult.originalSplitedCoin != null) {\n tx.mergeCoins(toCoinBuildResult.originalSplitedCoin!, [toCoin])\n } else {\n tx.mergeCoins(toCoinBuildResult.targetCoin, [toCoin])\n }\n\n if (isSplited) {\n const originalSplitedFromCoin = fromCoinBuildResult.originalSplitedCoin as TransactionObjectArgument\n tx.mergeCoins(originalSplitedFromCoin, [fromCoin])\n } else {\n transferedCoins.push({\n coinType: param.fromCoin,\n coin: fromCoin,\n })\n }\n\n for (let i = 0; i < transferedCoins.length; i++) {\n this.buildTransferCoin(sdk, tx, transferedCoins[i].coin, transferedCoins[i].coinType, recipient)\n }\n return tx\n }\n\n static checkCoinThreshold(\n sdk: SDK,\n byAmountIn: boolean,\n tx: Transaction,\n coin: TransactionObjectArgument,\n amountLimit: number,\n coinType: string\n ) {\n if (byAmountIn) {\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateRouterModule}::check_coin_threshold`,\n typeArguments: [coinType],\n arguments: [coin, tx.pure.u64(amountLimit)],\n })\n }\n }\n\n static buildDeepbookBasePathTx(\n sdk: SDK,\n basePath: BasePath,\n tx: Transaction,\n accountCap: any,\n from: TransactionObjectArgument,\n to: TransactionObjectArgument,\n middleStep: boolean\n ) {\n const base = basePath.direction ? from : to\n const quote = basePath.direction ? to : from\n\n const args: any = [\n tx.object(basePath.poolAddress),\n accountCap,\n tx.pure.u64(basePath.inputAmount),\n tx.pure.u64(0),\n tx.pure.bool(basePath.direction),\n base,\n quote,\n tx.pure.bool(middleStep),\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = basePath.direction ? [basePath.fromCoin, basePath.toCoin] : [basePath.toCoin, basePath.fromCoin]\n\n const coinAB: TransactionObjectArgument[] = tx.moveCall({\n target: `${sdk.sdkOptions.deepbook_endpoint_v2.published_at}::endpoints_v2::swap`,\n typeArguments,\n arguments: args,\n })\n\n from = basePath.direction ? coinAB[0] : coinAB[1]\n to = basePath.direction ? coinAB[1] : coinAB[0]\n\n return {\n from,\n to,\n tx,\n }\n }\n\n private static buildClmmBasePathTx(\n sdk: SDK,\n basePath: BasePath,\n tx: Transaction,\n byAmountIn: boolean,\n from: TransactionObjectArgument,\n to: TransactionObjectArgument,\n middleStep: boolean,\n partner: string\n ) {\n const { clmm_pool, integrate } = sdk.sdkOptions\n const globalConfigID = getPackagerConfigs(clmm_pool).global_config_id\n let coinA = basePath.direction ? from : to\n let coinB = basePath.direction ? to : from\n const noPartner = partner === ''\n const moduleName = noPartner ? ClmmIntegrateRouterModule : ClmmIntegrateRouterWithPartnerModule\n const functionName = noPartner ? 'swap' : 'swap_with_partner'\n const amount = byAmountIn ? basePath.inputAmount.toString() : basePath.outputAmount.toString()\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(basePath.direction)\n const args: any = noPartner\n ? [\n tx.object(globalConfigID),\n tx.object(basePath.poolAddress),\n coinA,\n coinB,\n tx.pure.bool(basePath.direction),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(middleStep),\n tx.object(CLOCK_ADDRESS),\n ]\n : [\n tx.object(globalConfigID),\n tx.object(basePath.poolAddress),\n tx.object(partner),\n coinA,\n coinB,\n tx.pure.bool(basePath.direction),\n tx.pure.bool(byAmountIn),\n tx.pure.u64(amount),\n tx.pure.u128(sqrtPriceLimit.toString()),\n tx.pure.bool(middleStep),\n tx.object(CLOCK_ADDRESS),\n ]\n\n const typeArguments = basePath.direction ? [basePath.fromCoin, basePath.toCoin] : [basePath.toCoin, basePath.fromCoin]\n\n const coinAB: TransactionObjectArgument[] = tx.moveCall({\n target: `${integrate.published_at}::${moduleName}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n coinA = coinAB[0] as any\n coinB = coinAB[1] as any\n\n from = basePath.direction ? coinA : coinB\n to = basePath.direction ? coinB : coinA\n\n return {\n from,\n to,\n tx,\n }\n }\n\n static buildCoinTypePair(coinTypes: string[], partitionQuantities: number[]): string[][] {\n const coinTypePair: string[][] = []\n if (coinTypes.length === 2) {\n const pair: string[] = []\n pair.push(coinTypes[0], coinTypes[1])\n coinTypePair.push(pair)\n } else {\n const directPair: string[] = []\n directPair.push(coinTypes[0], coinTypes[coinTypes.length - 1])\n coinTypePair.push(directPair)\n for (let i = 1; i < coinTypes.length - 1; i += 1) {\n if (partitionQuantities[i - 1] === 0) {\n continue\n }\n const pair: string[] = []\n pair.push(coinTypes[0], coinTypes[i], coinTypes[coinTypes.length - 1])\n coinTypePair.push(pair)\n }\n }\n return coinTypePair\n }\n\n // ------------------------------------------utils-------------------------------------------------//\n static buildTransferCoinToSender(sdk: SDK, tx: Transaction, coin: TransactionObjectArgument, coinType: string) {\n tx.moveCall({\n target: `${sdk.sdkOptions.integrate.published_at}::${ClmmIntegrateUtilsModule}::transfer_coin_to_sender`,\n typeArguments: [coinType],\n arguments: [coin],\n })\n }\n\n // If recipient not set, transfer objects move call will use ctx sender\n static buildTransferCoin(sdk: SDK, tx: Transaction, coin: TransactionObjectArgument, coinType: string, recipient?: string) {\n if (recipient != null) {\n tx.transferObjects([coin], tx.pure.address(recipient))\n } else {\n TransactionUtil.buildTransferCoinToSender(sdk, tx, coin, coinType)\n }\n }\n}\n","import { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { TransactionArgument, Transaction, TransactionObjectArgument, TransactionResult } from '@mysten/sui/transactions'\nimport { getDefaultSuiInputType, SuiInputTypes, SuiTxArg } from '../types/sui'\nimport { ClmmpoolsError, UtilsErrorCode } from '../errors/errors'\n\n/**\n * Check if the address is a valid sui address.\n * @param {string}address\n * @returns\n */\nexport function checkInvalidSuiAddress(address: string): boolean {\n if (!address.startsWith('0x') || address.length !== 66) {\n return false\n }\n return true\n}\nexport class TxBlock {\n public txBlock: Transaction\n\n constructor() {\n this.txBlock = new Transaction()\n }\n\n /**\n * Transfer sui to many recipoents.\n * @param {string[]}recipients The recipient addresses.\n * @param {number[]}amounts The amounts of sui coins to be transferred.\n * @returns this\n */\n transferSuiToMany(recipients: string[], amounts: number[]) {\n if (recipients.length !== amounts.length) {\n throw new ClmmpoolsError('The length of recipients and amounts must be the same', UtilsErrorCode.InvalidRecipientAndAmountLength)\n }\n\n for (const recipient of recipients) {\n if (!checkInvalidSuiAddress(recipient) === false) {\n throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n }\n }\n\n const tx = this.txBlock\n const coins = tx.splitCoins(\n tx.gas,\n amounts.map((amount) => tx.pure.u64(amount))\n )\n recipients.forEach((recipient, index) => {\n tx.transferObjects([coins[index]], tx.pure.address(recipient))\n })\n return this\n }\n\n /**\n * Transfer sui to one recipient.\n * @param {string}recipient recipient cannot be empty or invalid sui address.\n * @param {number}amount\n * @returns this\n */\n transferSui(recipient: string, amount: number) {\n if (!checkInvalidSuiAddress(recipient) === false) {\n throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n }\n\n return this.transferSuiToMany([recipient], [amount])\n }\n\n /**\n * Transfer coin to many recipients.\n * @param {string}recipient recipient cannot be empty or invalid sui address.\n * @param {number}amount amount cannot be empty or invalid sui address.\n * @param {string[]}coinObjectIds object ids of coins to be transferred.\n * @returns this\n * @deprecated use transferAndDestoryZeroCoin instead\n */\n transferCoin(recipient: string, amount: number, coinObjectIds: string[]) {\n if (!checkInvalidSuiAddress(recipient) === false) {\n throw new ClmmpoolsError('Invalid recipient address', UtilsErrorCode.InvalidRecipientAddress)\n }\n\n const tx = this.txBlock\n const [primaryCoinA, ...mergeCoinAs] = coinObjectIds\n const primaryCoinAInput = tx.object(primaryCoinA)\n\n if (mergeCoinAs.length > 0) {\n tx.mergeCoins(\n primaryCoinAInput,\n mergeCoinAs.map((coin) => tx.object(coin))\n )\n }\n\n const spitAmount = tx.splitCoins(primaryCoinAInput, [tx.pure.u64(amount)])\n tx.transferObjects([spitAmount], tx.pure.address(recipient))\n return this\n }\n}\n","import BN from 'bn.js'\nimport { TransactionArgument, Transaction } from '@mysten/sui/transactions'\nimport { SdkOptions } from '../sdk'\nimport { CLOCK_ADDRESS, DeepbookClobV2Moudle, DeepbookCustodianV2Moudle, DeepbookEndpointsV2Moudle } from '../types'\nimport SDK from '../main'\nimport { extractStructTagFromType } from './contracts'\nimport { TransactionUtil } from './transaction-util'\nimport { ZERO } from '../math'\n\nconst FLOAT_SCALING = new BN(1000000000)\n\nexport type Order = {\n quantity: number\n price: number\n}\n\nexport type DeepbookPool = {\n poolID: string\n tickSize: number\n lotSize: number\n baseAsset: string\n quoteAsset: string\n takerFeeRate: number\n makerRebateRate: number\n}\n\nexport class DeepbookUtils {\n static createAccountCap(senderAddress: string, sdkOptions: SdkOptions, tx: Transaction, isTransfer = false) {\n if (senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n const { deepbook } = sdkOptions\n\n const [cap] = tx.moveCall({\n target: `${deepbook.published_at}::${DeepbookClobV2Moudle}::create_account`,\n typeArguments: [],\n arguments: [],\n })\n\n if (isTransfer) {\n tx.transferObjects([cap], tx.pure.address(senderAddress))\n }\n\n return [cap, tx]\n }\n\n static deleteAccountCap(accountCap: string, sdkOptions: SdkOptions, tx: Transaction): Transaction {\n const { deepbook } = sdkOptions\n\n const args = [tx.object(accountCap)]\n\n tx.moveCall({\n target: `${deepbook.published_at}::${DeepbookCustodianV2Moudle}::delete_account_cap`,\n typeArguments: [],\n arguments: args,\n })\n return tx\n }\n\n static deleteAccountCapByObject(accountCap: TransactionArgument, sdkOptions: SdkOptions, tx: Transaction): Transaction {\n const { deepbook } = sdkOptions\n\n const args = [accountCap]\n\n tx.moveCall({\n target: `${deepbook.published_at}::${DeepbookCustodianV2Moudle}::delete_account_cap`,\n typeArguments: [],\n arguments: args,\n })\n return tx\n }\n\n static async getAccountCap(sdk: SDK, showDisplay = true): Promise<string> {\n const ownerRes: any = await sdk.fullClient.getOwnedObjectsByPage(sdk.senderAddress, {\n options: { showType: true, showContent: true, showDisplay, showOwner: true },\n filter: {\n MoveModule: {\n package: sdk.sdkOptions.deepbook.package_id,\n module: DeepbookCustodianV2Moudle,\n },\n },\n })\n\n if (ownerRes.data.length === 0) {\n return ''\n }\n\n const accountCap = ownerRes.data[0].data.objectId\n\n return accountCap\n }\n\n static async getPools(sdk: SDK): Promise<DeepbookPool[]> {\n const deepbook = sdk.sdkOptions.deepbook.package_id\n\n const allPools: DeepbookPool[] = []\n\n try {\n const objects = await sdk.fullClient.queryEventsByPage({ MoveEventType: `${deepbook}::clob_v2::PoolCreated` })\n\n objects.data.forEach((object: any) => {\n const fields = object.parsedJson\n if (fields) {\n allPools.push({\n poolID: fields.pool_id,\n tickSize: Number(fields.tick_size),\n lotSize: Number(fields.lot_size),\n takerFeeRate: Number(fields.taker_fee_rate),\n makerRebateRate: Number(fields.maker_rebate_rate),\n baseAsset: fields.base_asset.name,\n quoteAsset: fields.quote_asset.name,\n })\n }\n })\n } catch (error) {\n console.log('getPoolImmutables', error)\n }\n\n // console.log('allPools', allPools)\n return allPools\n }\n\n static async getPoolAsks(sdk: SDK, poolAddress: string, baseCoin: string, quoteCoin: string): Promise<Order[]> {\n const { simulationAccount } = sdk.sdkOptions\n const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n const tx = new Transaction()\n\n const asks: Order[] = []\n\n const typeArguments = [baseCoin, quoteCoin]\n const args = [tx.object(poolAddress), tx.pure.u64('0'), tx.pure.u64('999999999999'), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${deepbook_endpoint_v2.published_at}::endpoints_v2::get_level2_book_status_ask_side`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `BookStatus`\n })\n if (valueData.length === 0) {\n return asks\n }\n\n for (let i = 0; i < valueData[0].parsedJson.depths.length; i++) {\n const price = valueData[0].parsedJson.price[i]\n const depth = valueData[0].parsedJson.depths[i]\n const ask: Order = {\n price: parseInt(price, 10),\n quantity: parseInt(depth, 10),\n }\n asks.push(ask)\n }\n\n return asks\n }\n\n static async getPoolBids(sdk: SDK, poolAddress: string, baseCoin: string, quoteCoin: string): Promise<Order[]> {\n const { simulationAccount } = sdk.sdkOptions\n const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n const tx = new Transaction()\n\n const bids: Order[] = []\n\n const typeArguments = [baseCoin, quoteCoin]\n const args = [tx.object(poolAddress), tx.pure.u64('0'), tx.pure.u64('999999999999'), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${deepbook_endpoint_v2.published_at}::endpoints_v2::get_level2_book_status_bid_side`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `BookStatus`\n })\n if (valueData.length === 0) {\n return bids\n }\n\n for (let i = 0; i < valueData[0].parsedJson.depths.length; i++) {\n const price = valueData[0].parsedJson.price[i]\n const depth = valueData[0].parsedJson.depths[i]\n const bid: Order = {\n price: parseInt(price, 10),\n quantity: parseInt(depth, 10),\n }\n bids.push(bid)\n }\n\n return bids\n }\n\n static async preSwap(sdk: SDK, pool: DeepbookPool, a2b: boolean, amountIn: number) {\n let isExceed = false\n let amountOut = ZERO\n let remainAmount = new BN(amountIn)\n let feeAmount = ZERO\n const initAmountIn = new BN(amountIn)\n\n if (a2b) {\n let bids = await this.getPoolBids(sdk, pool.poolID, pool.baseAsset, pool.quoteAsset)\n if (bids === null) {\n isExceed = true\n }\n bids = bids.sort((a, b) => {\n return b.price - a.price\n })\n\n for (let i = 0; i < bids.length; i += 1) {\n const curBidAmount = new BN(bids[i].quantity)\n const curBidPrice = new BN(bids[i].price)\n const fee = curBidAmount.mul(new BN(curBidPrice)).mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING).div(FLOAT_SCALING)\n if (remainAmount.gt(curBidAmount)) {\n remainAmount = remainAmount.sub(curBidAmount)\n amountOut = amountOut.add(curBidAmount.mul(curBidPrice).div(FLOAT_SCALING).sub(fee))\n feeAmount = feeAmount.add(fee)\n } else {\n const curOut = remainAmount.mul(new BN(bids[i].price)).div(FLOAT_SCALING)\n const curFee = curOut.mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING)\n amountOut = amountOut.add(curOut.sub(curFee))\n remainAmount = remainAmount.sub(remainAmount)\n feeAmount = feeAmount.add(curFee)\n }\n if (remainAmount.eq(ZERO)) {\n break\n }\n }\n } else {\n const asks = await this.getPoolAsks(sdk, pool.poolID, pool.baseAsset, pool.quoteAsset)\n if (asks === null) {\n isExceed = true\n }\n\n for (let i = 0; i < asks.length; i += 1) {\n const curAskAmount = new BN(asks[i].price).mul(new BN(asks[i].quantity)).div(new BN(1000000000))\n const fee = curAskAmount.mul(new BN(pool.takerFeeRate)).div(FLOAT_SCALING)\n const curAskAmountWithFee = curAskAmount.add(fee)\n if (remainAmount.gt(curAskAmount)) {\n amountOut = amountOut.add(new BN(asks[i].quantity))\n remainAmount = remainAmount.sub(curAskAmountWithFee)\n feeAmount = feeAmount.add(fee)\n } else {\n const splitNums = new BN(asks[i].quantity).div(new BN(pool.lotSize))\n const splitAmount = curAskAmountWithFee.div(splitNums)\n const swapSplitNum = remainAmount.div(splitAmount)\n amountOut = amountOut.add(swapSplitNum.muln(pool.lotSize))\n remainAmount = remainAmount.sub(swapSplitNum.mul(splitAmount))\n feeAmount = feeAmount.add(swapSplitNum.div(splitNums).mul(fee))\n }\n if (remainAmount.eq(ZERO)) {\n break\n }\n }\n }\n\n return {\n poolAddress: pool.poolID,\n // currentSqrtPrice: current_sqrt_price,\n estimatedAmountIn: initAmountIn.sub(remainAmount).toNumber(),\n estimatedAmountOut: amountOut.toNumber(),\n // estimatedEndSqrtPrice: target_sqrt_price,\n estimatedFeeAmount: feeAmount,\n isExceed,\n amount: Number(amountIn),\n aToB: a2b,\n byAmountIn: true,\n }\n }\n\n static async simulateSwap(sdk: SDK, poolID: string, baseCoin: string, quoteCoin: string, a2b: boolean, amount: number) {\n const { deepbook_endpoint_v2 } = sdk.sdkOptions\n\n let tx = new Transaction()\n\n const accountCapStr = await this.getAccountCap(sdk)\n\n let accountCap\n if (accountCapStr === '') {\n const getAccoutCapResult = this.createAccountCap(sdk.senderAddress, sdk.sdkOptions, tx)\n const cap = getAccoutCapResult[0] as TransactionArgument\n tx = getAccoutCapResult[1] as Transaction\n accountCap = cap\n } else {\n accountCap = tx.object(accountCapStr)\n }\n\n const allCoins = await sdk.getOwnerCoinAssets(sdk.senderAddress)\n const primaryBaseInput = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount), baseCoin, false)\n const baseAsset = primaryBaseInput?.targetCoin\n\n const primaryQuoteInput = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount), quoteCoin, false)\n const quoteAsset = primaryQuoteInput?.targetCoin\n\n const typeArguments = [baseCoin, quoteCoin]\n const args: any = [\n tx.object(poolID),\n accountCap,\n tx.pure.u64(amount),\n tx.pure.u64(0),\n tx.pure.bool(a2b),\n baseAsset,\n quoteAsset,\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${deepbook_endpoint_v2.published_at}::${DeepbookEndpointsV2Moudle}::swap`,\n arguments: args,\n typeArguments,\n })\n\n const { simulationAccount } = sdk.sdkOptions\n const simulateRes = await sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `DeepbookSwapEvent`\n })\n if (valueData.length === 0) {\n return null\n }\n const params: any = valueData[0].parsedJson\n return {\n poolAddress: params.pool,\n estimatedAmountIn: params.amount_in,\n estimatedAmountOut: params.amount_out,\n aToB: params.atob,\n }\n }\n}\n","import BN from 'bn.js'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { isValidSuiObjectId } from '@mysten/sui/utils'\nimport {\n AddLiquidityFixTokenParams,\n AddLiquidityParams,\n ClosePositionParams,\n CollectFeeParams,\n OpenPositionParams,\n Position,\n PositionReward,\n RemoveLiquidityParams,\n getPackagerConfigs,\n AddLiquidityWithProtectionParams,\n OpenPositionAddLiquidityWithProtectionParams,\n} from '../types'\nimport {\n CachedContent,\n asUintN,\n buildPosition,\n buildPositionReward,\n cacheTime24h,\n cacheTime5min,\n checkInvalidSuiAddress,\n extractStructTagFromType,\n getFutureTime,\n} from '../utils'\nimport { BuildCoinResult, findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport {\n ClmmFetcherModule,\n ClmmIntegratePoolModule,\n ClmmIntegratePoolV2Module,\n ClmmIntegratePoolV3Module,\n CLOCK_ADDRESS,\n SuiObjectIdType,\n SuiResource,\n} from '../types/sui'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectFields } from '../utils/objects'\nimport { CollectFeesQuote } from '../math'\nimport { FetchPosFeeParams } from './rewarderModule'\nimport { ClmmpoolsError, ConfigErrorCode, PoolErrorCode, UtilsErrorCode } from '../errors/errors'\n\n/**\n * Helper class to help interact with clmm position with a position router interface.\n */\nexport class PositionModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Builds the full address of the Position type.\n * @returns The full address of the Position type.\n */\n buildPositionType() {\n const magmaClmm = this._sdk.sdkOptions.clmm_pool.package_id\n return `${magmaClmm}::position::Position`\n }\n\n /**\n * Gets a list of positions for the given account address.\n * @param accountAddress The account address to get positions for.\n * @param assignPoolIds An array of pool IDs to filter the positions by.\n * @returns array of Position objects.\n */\n async getPositionList(accountAddress: string, assignPoolIds: string[] = [], showDisplay = true): Promise<Position[]> {\n const allPosition: Position[] = []\n\n const ownerRes: any = await this._sdk.fullClient.getOwnedObjectsByPage(accountAddress, {\n options: { showType: true, showContent: true, showDisplay, showOwner: true },\n filter: { Package: this._sdk.sdkOptions.clmm_pool.package_id },\n })\n\n const hasAssignPoolIds = assignPoolIds.length > 0\n for (const item of ownerRes.data as any[]) {\n const type = extractStructTagFromType(item.data.type)\n\n if (type.full_address === this.buildPositionType()) {\n const position = buildPosition(item)\n const cacheKey = `${position.pos_object_id}_getPositionList`\n this.updateCache(cacheKey, position, cacheTime24h)\n if (hasAssignPoolIds) {\n if (assignPoolIds.includes(position.pool)) {\n allPosition.push(position)\n }\n } else {\n allPosition.push(position)\n }\n }\n }\n\n return allPosition\n }\n\n /**\n * Gets a position by its handle and ID. But it needs pool info, so it is not recommended to use this method.\n * if you want to get a position, you can use getPositionById method directly.\n * @param {string} positionHandle The handle of the position to get.\n * @param {string} positionID The ID of the position to get.\n * @param {boolean} calculateRewarder Whether to calculate the rewarder of the position.\n * @returns {Promise<Position>} Position object.\n */\n async getPosition(positionHandle: string, positionID: string, calculateRewarder = true, showDisplay = true): Promise<Position> {\n let position = await this.getSimplePosition(positionID, showDisplay)\n if (calculateRewarder) {\n position = await this.updatePositionRewarders(positionHandle, position)\n }\n return position\n }\n\n /**\n * Gets a position by its ID.\n * @param {string} positionID The ID of the position to get.\n * @param {boolean} calculateRewarder Whether to calculate the rewarder of the position.\n * @returns {Promise<Position>} Position object.\n */\n async getPositionById(positionID: string, calculateRewarder = true, showDisplay = true): Promise<Position> {\n const position = await this.getSimplePosition(positionID, showDisplay)\n if (calculateRewarder) {\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n const result = await this.updatePositionRewarders(pool.position_manager.positions_handle, position)\n return result\n }\n return position\n }\n\n /**\n * Gets a simple position for the given position ID.\n * @param {string} positionID The ID of the position to get.\n * @returns {Promise<Position>} Position object.\n */\n async getSimplePosition(positionID: string, showDisplay = true): Promise<Position> {\n const cacheKey = `${positionID}_getPositionList`\n\n let position = this.getSimplePositionByCache(positionID)\n\n if (position === undefined) {\n const objectDataResponses = await this.sdk.fullClient.getObject({\n id: positionID,\n options: { showContent: true, showType: true, showDisplay, showOwner: true },\n })\n position = buildPosition(objectDataResponses)\n\n this.updateCache(cacheKey, position, cacheTime24h)\n }\n return position\n }\n\n /**\n * Gets a simple position for the given position ID.\n * @param {string} positionID Position object id\n * @returns {Position | undefined} Position object\n */\n private getSimplePositionByCache(positionID: string): Position | undefined {\n const cacheKey = `${positionID}_getPositionList`\n return this.getCache<Position>(cacheKey)\n }\n\n /**\n * Gets a list of simple positions for the given position IDs.\n * @param {SuiObjectIdType[]} positionIDs The IDs of the positions to get.\n * @returns {Promise<Position[]>} A promise that resolves to an array of Position objects.\n */\n async getSipmlePositionList(positionIDs: SuiObjectIdType[], showDisplay = true): Promise<Position[]> {\n const positionList: Position[] = []\n const notFoundIds: SuiObjectIdType[] = []\n\n positionIDs.forEach((id) => {\n const position = this.getSimplePositionByCache(id)\n if (position) {\n positionList.push(position)\n } else {\n notFoundIds.push(id)\n }\n })\n\n if (notFoundIds.length > 0) {\n const objectDataResponses = await this._sdk.fullClient.batchGetObjects(notFoundIds, {\n showOwner: true,\n showContent: true,\n showDisplay,\n showType: true,\n })\n\n objectDataResponses.forEach((info) => {\n if (info.error == null) {\n const position = buildPosition(info)\n positionList.push(position)\n const cacheKey = `${position.pos_object_id}_getPositionList`\n this.updateCache(cacheKey, position, cacheTime24h)\n }\n })\n }\n\n return positionList\n }\n\n /**\n * Updates the rewarders of position\n * @param {string} positionHandle Position handle\n * @param {Position} position Position object\n * @returns {Promise<Position>} A promise that resolves to an array of Position objects.\n */\n private async updatePositionRewarders(positionHandle: string, position: Position): Promise<Position> {\n const positionReward = await this.getPositionRewarders(positionHandle, position.pos_object_id)\n return {\n ...position,\n ...positionReward,\n }\n }\n\n /**\n * Gets the position rewarders for the given position handle and position object ID.\n * @param {string} positionHandle The handle of the position.\n * @param {string} positionID The ID of the position object.\n * @returns {Promise<PositionReward | undefined>} PositionReward object.\n */\n async getPositionRewarders(positionHandle: string, positionID: string): Promise<PositionReward | undefined> {\n try {\n const dynamicFieldObject = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: positionHandle,\n name: {\n type: '0x2::object::ID',\n value: positionID,\n },\n })\n\n const objectFields = getObjectFields(dynamicFieldObject.data as any) as any\n const fields = objectFields.value.fields.value\n const positionReward = buildPositionReward(fields)\n return positionReward\n } catch (error) {\n console.log(error)\n return undefined\n }\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param {FetchPosFeeParams[]} params An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n * @returns {Promise<CollectFeesQuote[]>} A Promise that resolves with the fetched position fee amount for the specified addresses.\n */\n public async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n for (const paramItem of params) {\n const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_fees`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `fetch position fee error code: ${simulateRes.error ?? 'unknown error'}, please check config and postion and pool object ids`,\n PoolErrorCode.InvalidPoolObject\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `FetchPositionFeesEvent`\n })\n if (valueData.length === 0) {\n return []\n }\n\n const result: CollectFeesQuote[] = []\n\n for (let i = 0; i < valueData.length; i += 1) {\n const { parsedJson } = valueData[i]\n const posRrewarderResult: CollectFeesQuote = {\n feeOwedA: new BN(parsedJson.fee_owned_a),\n feeOwedB: new BN(parsedJson.fee_owned_b),\n position_id: parsedJson.position_id,\n }\n result.push(posRrewarderResult)\n }\n\n return result\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param positionIDs An array of position object ids.\n * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n */\n async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n const posFeeParamsList: FetchPosFeeParams[] = []\n for (const id of positionIDs) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n posFeeParamsList.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n })\n }\n\n const positionMap: Record<string, CollectFeesQuote> = {}\n\n if (posFeeParamsList.length > 0) {\n const result: CollectFeesQuote[] = await this.fetchPosFeeAmount(posFeeParamsList)\n for (const posRewarderInfo of result) {\n positionMap[posRewarderInfo.position_id] = posRewarderInfo\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * create add liquidity transaction payload with fix token\n * @param {AddLiquidityFixTokenParams} params\n * @param gasEstimateArg : When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityFixTokenPayload(\n params: AddLiquidityFixTokenParams,\n gasEstimateArg?: {\n slippage: number\n curSqrtPrice: BN\n },\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n params = params as AddLiquidityFixTokenParams\n if ((params.fix_amount_a && isAdjustCoinA) || (!params.fix_amount_a && isAdjustCoinB)) {\n tx = await TransactionUtil.buildAddLiquidityFixTokenForGas(\n this._sdk,\n allCoinAsset,\n params,\n gasEstimateArg,\n tx,\n inputCoinA,\n inputCoinB\n )\n return tx\n }\n }\n\n return TransactionUtil.buildAddLiquidityFixToken(this._sdk, allCoinAsset, params, tx, inputCoinA, inputCoinB)\n }\n\n /**\n * create add liquidity transaction payload with fix token\n * @param {AddLiquidityFixTokenParams} params\n * @param gasEstimateArg : When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityFixTokenWithProtectionPayload(\n params: AddLiquidityWithProtectionParams,\n gasEstimateArg?: {\n slippage: number\n curSqrtPrice: BN\n },\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n params = params as AddLiquidityWithProtectionParams\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.buildAddLiquidityWithProtectionFixToken(this._sdk, allCoinAsset, params, tx, inputCoinA, inputCoinB)\n }\n\n /**\n * create add liquidity transaction payload\n * @param {AddLiquidityParams} params\n * @returns {Promise<TransactionBlock>}\n */\n async createAddLiquidityPayload(\n params: AddLiquidityParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n const { integrate, clmm_pool } = this._sdk.sdkOptions\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n tx = tx || new Transaction()\n\n const needOpenPosition = !isValidSuiObjectId(params.pos_id)\n const max_amount_a = BigInt(params.max_amount_a)\n const max_amount_b = BigInt(params.max_amount_b)\n\n let primaryCoinAInputs: BuildCoinResult\n let primaryCoinBInputs: BuildCoinResult\n if (inputCoinA == null || inputCoinB == null) {\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, max_amount_a, params.coinTypeA, false, true)\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, max_amount_b, params.coinTypeB, false, true)\n } else {\n primaryCoinAInputs = {\n targetCoin: inputCoinA,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n primaryCoinBInputs = {\n targetCoin: inputCoinB,\n remainCoins: [],\n isMintZeroCoin: false,\n tragetCoinAmount: '0',\n }\n }\n\n if (needOpenPosition) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::open_position_with_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.max_amount_a),\n tx.pure.u64(params.max_amount_b),\n tx.pure.u128(params.delta_liquidity),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n } else {\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n tx = TransactionUtil.createCollectRewarderAndFeeParams(\n this._sdk,\n tx,\n params,\n allCoinAsset,\n primaryCoinAInputs.remainCoins,\n primaryCoinBInputs.remainCoins\n )\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::add_liquidity`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.max_amount_a),\n tx.pure.u64(params.max_amount_b),\n tx.pure.u128(params.delta_liquidity),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n return tx\n }\n\n /**\n * Remove liquidity from a position.\n * @param {RemoveLiquidityParams} params\n * @returns {TransactionBlock}\n */\n async removeLiquidityTransactionPayload(params: RemoveLiquidityParams, tx?: Transaction): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n const functionName = 'remove_liquidity'\n\n tx = tx || new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.pure.u128(params.delta_liquidity),\n tx.pure.u64(params.min_amount_a),\n tx.pure.u64(params.min_amount_b),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::${functionName}`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Close position and remove all liquidity and collect_reward\n * @param {ClosePositionParams} params\n * @returns {TransactionBlock}\n */\n async closePositionTransactionPayload(params: ClosePositionParams, tx?: Transaction): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n\n tx = tx || new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::close_position`,\n typeArguments,\n arguments: [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.pure.u64(params.min_amount_a),\n tx.pure.u64(params.min_amount_b),\n tx.object(CLOCK_ADDRESS),\n ],\n })\n\n return tx\n }\n\n /**\n * Open position in clmmpool.\n * @param {OpenPositionParams} params\n * @returns {TransactionBlock}\n */\n openPositionTransactionPayload(params: OpenPositionParams, tx?: Transaction): Transaction {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n tx = tx || new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const tick_lower = asUintN(BigInt(params.tick_lower)).toString()\n const tick_upper = asUintN(BigInt(params.tick_upper)).toString()\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.pure.u32(Number(tick_lower)),\n tx.pure.u32(Number(tick_upper)),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolModule}::open_position`,\n typeArguments,\n arguments: args,\n })\n\n return tx\n }\n\n /**\n * Collect LP fee from Position.\n * @param {CollectFeeParams} params\n * @param {TransactionBlock} tx\n * @returns {TransactionBlock}\n */\n async collectFeeTransactionPayload(\n params: CollectFeeParams,\n tx?: Transaction,\n inputCoinA?: TransactionObjectArgument,\n inputCoinB?: TransactionObjectArgument\n ): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress, null, true)\n tx = tx || new Transaction()\n\n const primaryCoinAInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(0), params.coinTypeA, false)\n const primaryCoinBInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(0), params.coinTypeB, false)\n\n const coinA = inputCoinA ?? primaryCoinAInput.targetCoin\n const coinB = inputCoinB ?? primaryCoinBInput.targetCoin\n\n this.createCollectFeePaylod(params, tx, coinA, coinB)\n return tx\n }\n\n createCollectFeePaylod(\n params: CollectFeeParams,\n tx: Transaction,\n primaryCoinAInput: TransactionObjectArgument,\n primaryCoinBInput: TransactionObjectArgument\n ) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInput,\n primaryCoinBInput,\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n createCollectFeeNoSendPaylod(\n params: CollectFeeParams,\n tx: Transaction,\n primaryCoinAInput: TransactionObjectArgument,\n primaryCoinBInput: TransactionObjectArgument\n ) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n primaryCoinAInput,\n primaryCoinBInput,\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_fee`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n /**\n * calculate fee\n * @param {CollectFeeParams} params\n * @returns\n */\n async calculateFee(params: CollectFeeParams) {\n const paylod = await this.collectFeeTransactionPayload(params)\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const res = await this._sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: paylod,\n sender: this._sdk.senderAddress,\n })\n for (const event of res.events) {\n if (extractStructTagFromType(event.type).name === 'CollectFeeEvent') {\n const json = event.parsedJson as any\n return {\n feeOwedA: json.amount_a,\n feeOwedB: json.amount_b,\n }\n }\n }\n\n return {\n feeOwedA: '0',\n feeOwedB: '0',\n }\n }\n\n /**\n * Updates the cache for the given key.\n * @param {string} key The key of the cache entry to update.\n * @param {SuiResource} data The data to store in the cache.\n * @param {cacheTime5min} time The time in minutes after which the cache entry should expire.\n */\n private updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n * @param {string} key The key of the cache entry to get.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n private getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport BN from 'bn.js'\nimport { Transaction, TransactionArgument, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport { BuildCoinResult, checkInvalidSuiAddress, extractStructTagFromType, normalizeCoinType, TransactionUtil } from '../utils'\nimport { ClmmFetcherModule, ClmmIntegratePoolV2Module, ClmmIntegratePoolV3Module, CLOCK_ADDRESS } from '../types/sui'\nimport { getRewardInTickRange } from '../utils/tick'\nimport { MathUtil, ONE, ZERO } from '../math/utils'\nimport { TickData } from '../types/clmmpool'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { CollectRewarderParams, getPackagerConfigs, Pool, Position, PositionReward, Rewarder, RewarderAmountOwed } from '../types'\nimport { CollectFeesQuote } from '../math'\nimport { ClmmpoolsError, ConfigErrorCode, UtilsErrorCode } from '../errors/errors'\n\nexport type FetchPosRewardParams = {\n poolAddress: string\n positionId: string\n coinTypeA: string\n coinTypeB: string\n rewarderInfo: Rewarder[]\n}\n\nexport type FetchPosFeeParams = {\n poolAddress: string\n positionId: string\n coinTypeA: string\n coinTypeB: string\n}\n\nexport type PosRewarderResult = {\n poolAddress: string\n positionId: string\n rewarderAmountOwed: RewarderAmountOwed[]\n}\n\n/**\n * Helper class to help interact with clmm position rewaeder with a rewaeder router interface.\n */\nexport class RewarderModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private growthGlobal: BN[]\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n this.growthGlobal = [ZERO, ZERO, ZERO]\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Gets the emissions for the given pool every day.\n *\n * @param {string} poolID The object ID of the pool.\n * @returns {Promise<Array<{emissions: number, coinAddress: string}>>} A promise that resolves to an array of objects with the emissions and coin address for each rewarder.\n */\n async emissionsEveryDay(poolID: string) {\n const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n const rewarderInfos = currentPool.rewarder_infos\n if (!rewarderInfos) {\n return null\n }\n\n const emissionsEveryDay = []\n for (const rewarderInfo of rewarderInfos) {\n const emissionSeconds = MathUtil.fromX64(new BN(rewarderInfo.emissions_per_second))\n emissionsEveryDay.push({\n emissions: Math.floor(emissionSeconds.toNumber() * 60 * 60 * 24),\n coin_address: rewarderInfo.coinAddress,\n })\n }\n\n return emissionsEveryDay\n }\n\n /**\n * Updates the rewarder for the given pool.\n *\n * @param {string} poolID The object ID of the pool.\n * @param {BN} currentTime The current time in seconds since the Unix epoch.\n * @returns {Promise<Pool>} A promise that resolves to the updated pool.\n */\n private async updatePoolRewarder(poolID: string, currentTime: BN): Promise<Pool> {\n // refresh pool rewarder\n const currentPool: Pool = await this.sdk.Pool.getPool(poolID)\n const lastTime = currentPool.rewarder_last_updated_time\n currentPool.rewarder_last_updated_time = currentTime.toString()\n\n if (Number(currentPool.liquidity) === 0 || currentTime.eq(new BN(lastTime))) {\n return currentPool\n }\n const timeDelta = currentTime.div(new BN(1000)).sub(new BN(lastTime)).add(new BN(15))\n const rewarderInfos: any = currentPool.rewarder_infos\n\n for (let i = 0; i < rewarderInfos.length; i += 1) {\n const rewarderInfo = rewarderInfos[i]\n const rewarderGrowthDelta = MathUtil.checkMulDivFloor(\n timeDelta,\n new BN(rewarderInfo.emissions_per_second),\n new BN(currentPool.liquidity),\n 128\n )\n this.growthGlobal[i] = new BN(rewarderInfo.growth_global).add(new BN(rewarderGrowthDelta))\n }\n\n return currentPool\n }\n\n /**\n * Gets the amount owed to the rewarders for the given position.\n *\n * @param {string} poolID The object ID of the pool.\n * @param {string} positionHandle The handle of the position.\n * @param {string} positionID The ID of the position.\n * @returns {Promise<Array<{amountOwed: number}>>} A promise that resolves to an array of objects with the amount owed to each rewarder.\n * @deprecated This method is deprecated and may be removed in future versions. Use `sdk.Rewarder.fetchPosRewardersAmount()` instead.\n */\n async posRewardersAmount(poolID: string, positionHandle: string, positionID: string) {\n const currentTime = Date.parse(new Date().toString())\n const pool: Pool = await this.updatePoolRewarder(poolID, new BN(currentTime))\n const position = await this.sdk.Position.getPositionRewarders(positionHandle, positionID)\n\n if (position === undefined) {\n return []\n }\n\n const ticksHandle = pool.ticks_handle\n const tickLower = await this.sdk.Pool.getTickDataByIndex(ticksHandle, position.tick_lower_index)\n const tickUpper = await this.sdk.Pool.getTickDataByIndex(ticksHandle, position.tick_upper_index)\n\n const amountOwed = this.posRewardersAmountInternal(pool, position, tickLower!, tickUpper!)\n return amountOwed\n }\n\n /**\n * Gets the amount owed to the rewarders for the given account and pool.\n *\n * @param {string} accountAddress The account address.\n * @param {string} poolID The object ID of the pool.\n * @returns {Promise<Array<{amountOwed: number}>>} A promise that resolves to an array of objects with the amount owed to each rewarder.\n * @deprecated This method is deprecated and may be removed in future versions. Use `sdk.Rewarder.fetchPosRewardersAmount()` instead.\n */\n async poolRewardersAmount(accountAddress: string, poolID: string) {\n const currentTime = Date.parse(new Date().toString())\n const pool: Pool = await this.updatePoolRewarder(poolID, new BN(currentTime))\n\n const positions = await this.sdk.Position.getPositionList(accountAddress, [poolID])\n const tickDatas = await this.getPoolLowerAndUpperTicks(pool.ticks_handle, positions)\n\n const rewarderAmount = [ZERO, ZERO, ZERO]\n\n for (let i = 0; i < positions.length; i += 1) {\n // eslint-disable-next-line no-await-in-loop\n const posRewarderInfo: any = await this.posRewardersAmountInternal(pool, positions[i], tickDatas[0][i], tickDatas[1][i])\n for (let j = 0; j < 3; j += 1) {\n rewarderAmount[j] = rewarderAmount[j].add(posRewarderInfo[j].amount_owed)\n }\n }\n\n return rewarderAmount\n }\n\n /**\n * Gets the amount owed to the rewarders for the given account and pool.\n * @param {Pool} pool Pool object\n * @param {PositionReward} position Position object\n * @param {TickData} tickLower Lower tick data\n * @param {TickData} tickUpper Upper tick data\n * @returns {RewarderAmountOwed[]}\n */\n private posRewardersAmountInternal(pool: Pool, position: PositionReward, tickLower: TickData, tickUpper: TickData): RewarderAmountOwed[] {\n const tickLowerIndex = position.tick_lower_index\n const tickUpperIndex = position.tick_upper_index\n const rewardersInside = getRewardInTickRange(pool, tickLower, tickUpper, tickLowerIndex, tickUpperIndex, this.growthGlobal)\n\n const growthInside = []\n const AmountOwed = []\n\n if (rewardersInside.length > 0) {\n let growthDelta0 = MathUtil.subUnderflowU128(rewardersInside[0], new BN(position.reward_growth_inside_0))\n\n if (growthDelta0.gt(new BN('3402823669209384634633745948738404'))) {\n growthDelta0 = ONE\n }\n\n const amountOwed_0 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta0, 64, 128)\n growthInside.push(rewardersInside[0])\n AmountOwed.push({\n amount_owed: new BN(position.reward_amount_owed_0).add(amountOwed_0),\n\n coin_address: pool.rewarder_infos[0].coinAddress,\n })\n }\n\n if (rewardersInside.length > 1) {\n let growthDelta_1 = MathUtil.subUnderflowU128(rewardersInside[1], new BN(position.reward_growth_inside_1))\n if (growthDelta_1.gt(new BN('3402823669209384634633745948738404'))) {\n growthDelta_1 = ONE\n }\n\n const amountOwed_1 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta_1, 64, 128)\n growthInside.push(rewardersInside[1])\n\n AmountOwed.push({\n amount_owed: new BN(position.reward_amount_owed_1).add(amountOwed_1),\n coin_address: pool.rewarder_infos[1].coinAddress,\n })\n }\n\n if (rewardersInside.length > 2) {\n let growthDelta_2 = MathUtil.subUnderflowU128(rewardersInside[2], new BN(position.reward_growth_inside_2))\n if (growthDelta_2.gt(new BN('3402823669209384634633745948738404'))) {\n growthDelta_2 = ONE\n }\n\n const amountOwed_2 = MathUtil.checkMulShiftRight(new BN(position.liquidity), growthDelta_2, 64, 128)\n growthInside.push(rewardersInside[2])\n\n AmountOwed.push({\n amount_owed: new BN(position.reward_amount_owed_2).add(amountOwed_2),\n coin_address: pool.rewarder_infos[2].coinAddress,\n })\n }\n return AmountOwed\n }\n\n /**\n * Fetches the Position reward amount for a given list of addresses.\n * @param {string[]}positionIDs An array of position object ids.\n * @returns {Promise<Record<string, RewarderAmountOwed[]>>} A Promise that resolves with the fetched position reward amount for the specified position object ids.\n */\n async batchFetchPositionRewarders(positionIDs: string[]): Promise<Record<string, RewarderAmountOwed[]>> {\n const posRewardParamsList: FetchPosRewardParams[] = []\n for (const id of positionIDs) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n posRewardParamsList.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n rewarderInfo: pool.rewarder_infos,\n })\n }\n\n const positionMap: Record<string, RewarderAmountOwed[]> = {}\n\n if (posRewardParamsList.length > 0) {\n const result: PosRewarderResult[] = await this.fetchPosRewardersAmount(posRewardParamsList)\n for (const posRewarderInfo of result) {\n positionMap[posRewarderInfo.positionId] = posRewarderInfo.rewarderAmountOwed\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * Fetch the position rewards for a given pool.\n * @param {Pool}pool Pool object\n * @param {string}positionId Position object id\n * @returns {Promise<RewarderAmountOwed[]>} A Promise that resolves with the fetched position reward amount for the specified position object id.\n */\n async fetchPositionRewarders(pool: Pool, positionId: string): Promise<RewarderAmountOwed[]> {\n const param = {\n poolAddress: pool.poolAddress,\n positionId,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n rewarderInfo: pool.rewarder_infos,\n }\n\n const result = await this.fetchPosRewardersAmount([param])\n\n return result[0].rewarderAmountOwed\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param positionIDs An array of position object ids.\n * @returns {Promise<Record<string, CollectFeesQuote>>} A Promise that resolves with the fetched position fee amount for the specified position object ids.\n * @deprecated This method is deprecated and may be removed in future versions. Use alternative methods if available.\n */\n async batchFetchPositionFees(positionIDs: string[]): Promise<Record<string, CollectFeesQuote>> {\n const posFeeParamsList: FetchPosFeeParams[] = []\n for (const id of positionIDs) {\n const position = await this._sdk.Position.getPositionById(id, false)\n const pool = await this._sdk.Pool.getPool(position.pool, false)\n posFeeParamsList.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n })\n }\n\n const positionMap: Record<string, CollectFeesQuote> = {}\n\n if (posFeeParamsList.length > 0) {\n const result: CollectFeesQuote[] = await this.fetchPosFeeAmount(posFeeParamsList)\n for (const posRewarderInfo of result) {\n positionMap[posRewarderInfo.position_id] = posRewarderInfo\n }\n return positionMap\n }\n return positionMap\n }\n\n /**\n * Fetches the Position fee amount for a given list of addresses.\n * @param params An array of FetchPosFeeParams objects containing the target addresses and their corresponding amounts.\n * @returns\n */\n async fetchPosFeeAmount(params: FetchPosFeeParams[]): Promise<CollectFeesQuote[]> {\n const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n for (const paramItem of params) {\n const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_fees`,\n arguments: args,\n typeArguments,\n })\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `FetchPositionFeesEvent`\n })\n if (valueData.length === 0) {\n return []\n }\n\n const result: CollectFeesQuote[] = []\n\n for (let i = 0; i < valueData.length; i += 1) {\n const { parsedJson } = valueData[i]\n const posRrewarderResult: CollectFeesQuote = {\n feeOwedA: new BN(parsedJson.fee_owned_a),\n feeOwedB: new BN(parsedJson.fee_owned_b),\n position_id: parsedJson.position_id,\n }\n result.push(posRrewarderResult)\n }\n\n return result\n }\n\n /**\n * Fetches the Position reward amount for a given list of addresses.\n * @param params An array of FetchPosRewardParams objects containing the target addresses and their corresponding amounts.\n * @returns\n */\n async fetchPosRewardersAmount(params: FetchPosRewardParams[]) {\n const { clmm_pool, integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n for (const paramItem of params) {\n const typeArguments = [paramItem.coinTypeA, paramItem.coinTypeB]\n const args = [\n tx.object(getPackagerConfigs(clmm_pool).global_config_id),\n tx.object(paramItem.poolAddress),\n tx.pure.address(paramItem.positionId),\n tx.object(CLOCK_ADDRESS),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::fetch_position_rewards`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError(\n `this config simulationAccount: ${simulationAccount.address} is not set right`,\n ConfigErrorCode.InvalidSimulateAccount\n )\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `fetch position rewards error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `FetchPositionRewardsEvent`\n })\n if (valueData.length === 0) {\n return []\n }\n\n if (valueData.length !== params.length) {\n throw new ClmmpoolsError('valueData.length !== params.pools.length')\n }\n\n const result: PosRewarderResult[] = []\n\n for (let i = 0; i < valueData.length; i += 1) {\n const posRrewarderResult: PosRewarderResult = {\n poolAddress: params[i].poolAddress,\n positionId: params[i].positionId,\n rewarderAmountOwed: [],\n }\n\n for (let j = 0; j < params[i].rewarderInfo.length; j += 1) {\n posRrewarderResult.rewarderAmountOwed.push({\n amount_owed: new BN(valueData[i].parsedJson.data[j]),\n coin_address: params[i].rewarderInfo[j].coinAddress,\n })\n }\n\n result.push(posRrewarderResult)\n }\n\n return result\n }\n\n /**\n * Fetches the pool reward amount for a given account and pool object id.\n * @param {string} account - The target account.\n * @param {string} poolObjectId - The target pool object id.\n * @returns {Promise<number|null>} - A Promise that resolves with the fetched pool reward amount for the specified account and pool, or null if the fetch is unsuccessful.\n */\n async fetchPoolRewardersAmount(account: string, poolObjectId: string) {\n const pool: Pool = await this.sdk.Pool.getPool(poolObjectId)\n const positions = await this.sdk.Position.getPositionList(account, [poolObjectId])\n\n const params: FetchPosRewardParams[] = []\n\n for (const position of positions) {\n params.push({\n poolAddress: pool.poolAddress,\n positionId: position.pos_object_id,\n rewarderInfo: pool.rewarder_infos,\n coinTypeA: pool.coinTypeA,\n coinTypeB: pool.coinTypeB,\n })\n }\n\n const result = await this.fetchPosRewardersAmount(params)\n\n const rewarderAmount = [ZERO, ZERO, ZERO]\n\n if (result != null) {\n for (const posRewarderInfo of result) {\n for (let j = 0; j < posRewarderInfo.rewarderAmountOwed.length; j += 1) {\n rewarderAmount[j] = rewarderAmount[j].add(posRewarderInfo.rewarderAmountOwed[j].amount_owed)\n }\n }\n }\n return rewarderAmount\n }\n\n private async getPoolLowerAndUpperTicks(ticksHandle: string, positions: Position[]): Promise<TickData[][]> {\n const lowerTicks: TickData[] = []\n const upperTicks: TickData[] = []\n\n for (const pos of positions) {\n const tickLower = await this.sdk.Pool.getTickDataByIndex(ticksHandle, pos.tick_lower_index)\n const tickUpper = await this.sdk.Pool.getTickDataByIndex(ticksHandle, pos.tick_upper_index)\n lowerTicks.push(tickLower!)\n upperTicks.push(tickUpper!)\n }\n\n return [lowerTicks, upperTicks]\n }\n\n /**\n * Collect rewards from Position.\n * @param params\n * @param gasBudget\n * @returns\n */\n async collectRewarderTransactionPayload(params: CollectRewarderParams): Promise<Transaction> {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress, null)\n let tx = new Transaction()\n\n tx = TransactionUtil.createCollectRewarderAndFeeParams(this._sdk, tx, params, allCoinAsset)\n return tx\n }\n\n /**\n * batech Collect rewards from Position.\n * @param params\n * @param published_at\n * @param tx\n * @returns\n */\n async batchCollectRewardePayload(params: CollectRewarderParams[], tx?: Transaction) {\n if (!checkInvalidSuiAddress(this._sdk.senderAddress)) {\n throw new ClmmpoolsError('this config sdk senderAddress is not set right', UtilsErrorCode.InvalidSendAddress)\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress, null)\n tx = tx || new Transaction()\n const coinIdList: { coin: BuildCoinResult; coin_addr: string }[] = []\n params.forEach((item) => {\n const coinTypeA = normalizeCoinType(item.coinTypeA)\n const coinTypeB = normalizeCoinType(item.coinTypeB)\n\n if (item.collect_fee) {\n const coinAInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinTypeA, false, true)\n const coinBInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinTypeB, false, true)\n\n coinIdList.push({ coin: coinAInput, coin_addr: coinTypeA })\n coinIdList.push({ coin: coinBInput, coin_addr: coinTypeB })\n\n tx = this._sdk.Position.createCollectFeeNoSendPaylod(\n {\n pool_id: item.pool_id,\n pos_id: item.pos_id,\n coinTypeA: item.coinTypeA,\n coinTypeB: item.coinTypeB,\n },\n tx!,\n coinAInput.targetCoin,\n coinBInput.targetCoin\n )\n }\n const primaryCoinInputs: TransactionObjectArgument[] = []\n item.rewarder_coin_types.forEach((type) => {\n const coinType = normalizeCoinType(type)\n const coinInput = TransactionUtil.buildCoinForAmount(tx!, allCoinAsset!, BigInt(0), coinType, false, true)\n primaryCoinInputs.push(coinInput.targetCoin)\n\n coinIdList.push({ coin: coinInput, coin_addr: coinType })\n })\n\n tx = this.createCollectRewarderNoSendPaylod(item, tx!, primaryCoinInputs)\n })\n\n coinIdList.forEach((item) => {\n TransactionUtil.buildTransferCoin(this._sdk, tx!, item.coin.targetCoin, item.coin_addr, this._sdk.senderAddress)\n })\n\n return tx\n }\n\n createCollectRewarderPaylod(params: CollectRewarderParams, tx: Transaction, primaryCoinInputs: TransactionArgument[]) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n params.rewarder_coin_types.forEach((type, index) => {\n if (tx) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV2Module}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(clmmConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(clmmConfigs.global_vault_id),\n primaryCoinInputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n\n createCollectRewarderNoSendPaylod(params: CollectRewarderParams, tx: Transaction, primaryCoinInputs: TransactionArgument[]) {\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n params.rewarder_coin_types.forEach((type, index) => {\n if (tx) {\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegratePoolV3Module}::collect_reward`,\n typeArguments: [...typeArguments, type],\n arguments: [\n tx.object(clmmConfigs.global_config_id),\n tx.object(params.pool_id),\n tx.object(params.pos_id),\n tx.object(clmmConfigs.global_vault_id),\n primaryCoinInputs[index],\n tx.object(CLOCK_ADDRESS),\n ],\n })\n }\n })\n return tx\n }\n}\n","import BN from 'bn.js'\nimport { Graph, GraphEdge, GraphVertex } from '@syntsugar/cc-graph'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { PreSwapWithMultiPoolParams } from '../types'\nimport { checkInvalidSuiAddress, extractStructTagFromType } from '../utils'\nimport { ClmmExpectSwapModule, ClmmIntegrateRouterModule, SuiAddressType } from '../types/sui'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { U64_MAX, ZERO } from '../math'\nimport { ClmmpoolsError, ConfigErrorCode, RouterErrorCode } from '../errors/errors'\n\n// coin node in coin map\nexport interface CoinNode {\n address: string\n decimals: number\n}\n\n// pass coin node to coin map\nexport interface CoinProvider {\n coins: CoinNode[]\n}\n\n// path link to coin map\nexport interface PathLink {\n base: string\n quote: string\n addressMap: Map<number, string>\n}\n\n// pass path link to coin map\nexport interface PathProvider {\n paths: PathLink[]\n}\n\n// simple path in router path\nexport type OnePath = {\n amountIn: BN\n amountOut: BN\n poolAddress: string[]\n a2b: boolean[]\n rawAmountLimit: BN[]\n isExceed: boolean\n coinType: string[]\n}\n\n// label address map with direction\nexport type AddressAndDirection = {\n addressMap: Map<number, string>\n direction: boolean\n}\n\n// use to build router swap transaction\nexport type SwapWithRouterParams = {\n paths: OnePath[]\n partner: string\n priceSlippagePoint: number\n}\n\n// use to do pre router swap param by sdk\nexport type PreRouterSwapParams = {\n stepNums: number\n poolAB: string\n poolBC: string | undefined\n a2b: boolean\n b2c: boolean | undefined\n byAmountIn: boolean\n amount: BN\n coinTypeA: SuiAddressType\n coinTypeB: SuiAddressType\n coinTypeC: SuiAddressType | undefined\n}\n\n// return the best path in pre swap result\nexport type PreSwapResult = {\n index: number\n amountIn: BN\n amountMedium: BN\n amountOut: BN\n targetSqrtPrice: BN[]\n currentSqrtPrice: BN[]\n isExceed: boolean\n stepNum: number\n}\n\n// return the\nexport type PriceResult = {\n amountIn: BN\n amountOut: BN\n paths: OnePath[]\n a2b: boolean\n b2c: boolean | undefined\n byAmountIn: boolean\n isExceed: boolean\n targetSqrtPrice: BN[]\n currentSqrtPrice: BN[]\n coinTypeA: SuiAddressType\n coinTypeB: SuiAddressType\n coinTypeC: SuiAddressType | undefined\n createTxParams: SwapWithRouterParams | undefined\n}\n\n// return the pool with tvl info by statistics API\ntype PoolWithTvl = {\n poolAddress: string\n tvl: number\n}\n\n/**\n * build pair symbol\n * @param base base coin\n * @param quote quote coin\n * @returns pair symbol\n */\nfunction _pairSymbol(\n base: string,\n quote: string\n): {\n pair: string\n reversePair: string\n} {\n return {\n pair: `${base}-${quote}`,\n reversePair: `${quote}-${base}`,\n }\n}\n\nexport class RouterModule implements IModule {\n readonly graph: Graph\n\n readonly pathProviders: PathProvider[]\n\n private coinProviders: CoinProvider\n\n private _coinAddressMap: Map<string, CoinNode>\n\n private poolAddressMap: Map<string, Map<number, string>>\n\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this.pathProviders = []\n this.coinProviders = {\n coins: [],\n }\n this.graph = new Graph(false)\n this._coinAddressMap = new Map()\n this.poolAddressMap = new Map()\n this._sdk = sdk\n\n this.getPoolAddressMapAndDirection = this.getPoolAddressMapAndDirection.bind(this)\n this.setCoinList = this.setCoinList.bind(this)\n this.loadGraph = this.loadGraph.bind(this)\n this.addCoinProvider = this.addCoinProvider.bind(this)\n this.addPathProvider = this.addPathProvider.bind(this)\n this.preRouterSwapA2B2C = this.preRouterSwapA2B2C.bind(this)\n this.price = this.price.bind(this)\n this.getPoolWithTVL = this.getPoolWithTVL.bind(this)\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Get pool address map with direction\n * @param {string} base base coin\n * @param {string} quote quote coin\n * @returns {AddressAndDirection} address with direction\n */\n getPoolAddressMapAndDirection(base: string, quote: string): AddressAndDirection | undefined {\n const { pair, reversePair } = _pairSymbol(base, quote)\n let addressMap: any = this.poolAddressMap.get(pair)\n\n if (addressMap != null) {\n return {\n addressMap,\n direction: true,\n }\n }\n\n addressMap = this.poolAddressMap.get(reversePair)\n if (addressMap != null) {\n return {\n addressMap,\n direction: false,\n }\n }\n return undefined\n }\n\n /**\n * set coin list in coin address map\n */\n private setCoinList() {\n this.coinProviders.coins.forEach((coin) => {\n this._coinAddressMap.set(coin.address, coin)\n })\n }\n\n /**\n * Find best router must load graph first\n * @param {CoinProvider} coins all coins\n * @param {PathProvider} paths all paths\n */\n loadGraph(coins: CoinProvider, paths: PathProvider) {\n this.addCoinProvider(coins)\n this.addPathProvider(paths)\n this.setCoinList()\n\n this.pathProviders.forEach((provider) => {\n const { paths } = provider\n paths.forEach((path) => {\n const vertexA = this.graph.getVertexByKey(path.base) ?? new GraphVertex(path.base)\n const vertexB = this.graph.getVertexByKey(path.quote) ?? new GraphVertex(path.quote)\n\n this.graph.addEdge(new GraphEdge(vertexA, vertexB))\n\n const coinA: any = this._coinAddressMap.get(path.base)\n const coinB: any = this._coinAddressMap.get(path.quote)\n\n if (coinA != null && coinB != null) {\n const poolSymbol = _pairSymbol(path.base, path.quote).pair\n this.poolAddressMap.set(poolSymbol, path.addressMap)\n }\n })\n })\n }\n\n /**\n * Add path provider to router graph\n * @param {PathProvider} provider path provider\n * @returns {RouterModule} module of router\n */\n private addPathProvider(provider: PathProvider): RouterModule {\n // fix all order about base and quote in paths\n for (let i = 0; i < provider.paths.length; i += 1) {\n const { base, quote } = provider.paths[i]\n const compareResult = base.localeCompare(quote)\n if (compareResult < 0) {\n provider.paths[i].base = quote\n provider.paths[i].quote = base\n }\n\n if (base === '0x2::sui::SUI') {\n provider.paths[i].base = quote\n provider.paths[i].quote = base\n }\n\n if (quote === '0x2::sui::SUI') {\n provider.paths[i].base = base\n provider.paths[i].quote = quote\n }\n }\n\n this.pathProviders.push(provider)\n return this\n }\n\n /**\n * Add coin provider to router graph\n * @param {CoinProvider} provider coin provider\n * @returns {RouterModule} module of router\n */\n private addCoinProvider(provider: CoinProvider): RouterModule {\n this.coinProviders = provider\n return this\n }\n\n /**\n * Get token info from coin address map\n * @param {string} key coin type\n * @returns {CoinNode | undefined}\n */\n tokenInfo(key: string): CoinNode | undefined {\n return this._coinAddressMap.get(key)\n }\n\n /**\n * Get fee rate info from pool address map\n * @param from from coin type\n * @param to to coin type\n * @param address pool address\n * @returns fee rate of pool\n */\n getFeeRate(from: string, to: string, address: string): number {\n const poolSymbol = _pairSymbol(from, to).pair\n const addressMap = this.poolAddressMap.get(poolSymbol)\n if (addressMap != null) {\n // get value by key from map\n for (const [key, value] of addressMap.entries()) {\n if (value === address) {\n return key * 100\n }\n }\n }\n const poolSymbolRev = _pairSymbol(from, to).reversePair\n const addressMapRev = this.poolAddressMap.get(poolSymbolRev)\n if (addressMapRev != null) {\n // get value by key from map\n for (const [key, value] of addressMapRev.entries()) {\n if (value === address) {\n return key * 100\n }\n }\n }\n return 0\n }\n\n /**\n * Get the best price from router graph.\n *\n * @param {string} from from coin type\n * @param {string} to to coin type\n * @param {BN} amount coin amount\n * @param {boolean} byAmountIn weather fixed inoput amount\n * @param {number} priceSlippagePoint price splippage point\n * @param {string} partner partner object id\n * @param {PreSwapWithMultiPoolParams} swapWithMultiPoolParams use to downgrade\n * @returns {Promise<PriceResult | undefined>} best swap router\n */\n async price(\n from: string,\n to: string,\n amount: BN,\n byAmountIn: boolean,\n priceSlippagePoint: number,\n partner: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n ): Promise<PriceResult | undefined> {\n const fromCoin = this.tokenInfo(from)\n const toCoin = this.tokenInfo(to)\n\n if (fromCoin === undefined || toCoin === undefined) {\n throw new ClmmpoolsError('From/To coin is undefined', RouterErrorCode.InvalidCoin)\n }\n\n const fromVertex = this.graph.getVertexByKey(fromCoin.address)\n const toVertex = this.graph.getVertexByKey(toCoin.address)\n\n const pathIters = this.graph.findAllPath(fromVertex, toVertex)\n const allPaths = Array.from(pathIters)\n\n if (allPaths.length === 0) {\n throw new ClmmpoolsError('No find valid path in coin graph', RouterErrorCode.NotFoundPath)\n }\n\n let preRouterSwapParams: PreRouterSwapParams[] = []\n\n for (let i = 0; i < allPaths.length; i += 1) {\n const path = allPaths[i]\n\n // only consider one and two pair path\n if (path.length > 3) {\n continue\n }\n const fromAndTo = []\n const swapDirection = []\n\n const poolsAB: string[] = []\n const poolsBC: string[] = []\n\n for (let j = 0; j < path.length - 1; j += 1) {\n const subFrom = path[j].value.toString()\n const subTo = path[j + 1].value.toString()\n const addressMapAndDirection = this.getPoolAddressMapAndDirection(subFrom, subTo)\n const addressMap = addressMapAndDirection?.addressMap\n const direction = addressMapAndDirection?.direction\n\n if (addressMap != null && direction != null) {\n swapDirection.push(direction)\n fromAndTo.push(subFrom)\n fromAndTo.push(subTo)\n addressMap.forEach((address) => {\n if (j === 0) {\n poolsAB.push(address)\n } else {\n poolsBC.push(address)\n }\n })\n }\n }\n\n for (const poolAB of poolsAB) {\n if (poolsBC.length > 0) {\n for (const poolBC of poolsBC) {\n const param: PreRouterSwapParams = {\n stepNums: 2,\n poolAB,\n poolBC,\n a2b: swapDirection[0],\n b2c: swapDirection[1],\n amount,\n byAmountIn,\n coinTypeA: fromAndTo[0],\n coinTypeB: fromAndTo[1],\n coinTypeC: fromAndTo[3],\n }\n preRouterSwapParams.push(param)\n }\n } else {\n const param: PreRouterSwapParams = {\n stepNums: 1,\n poolAB,\n poolBC: undefined,\n a2b: swapDirection[0],\n b2c: undefined,\n amount,\n byAmountIn,\n coinTypeA: fromAndTo[0],\n coinTypeB: fromAndTo[1],\n coinTypeC: undefined,\n }\n preRouterSwapParams.push(param)\n }\n }\n }\n\n // add one limit, must calculated two steps path.\n const stepNumsOne = preRouterSwapParams.filter((item) => item.stepNums === 1)\n const notStepNumsOne = preRouterSwapParams.filter((item) => item.stepNums !== 1)\n\n let poolWithTvls: PoolWithTvl[] = []\n try {\n poolWithTvls = await this.getPoolWithTVL()\n } catch (err) {\n poolWithTvls = []\n }\n\n if (poolWithTvls.length > 0) {\n const poolWithTvlsMap = new Map(poolWithTvls.map((item) => [item.poolAddress, item]))\n\n // sort notStepNumbsOne by tvl\n notStepNumsOne.sort((a, b) => {\n let aTvlMinimum = 0\n let bTvlMinimum = 0\n\n if (poolWithTvlsMap.has(a.poolAB) && poolWithTvlsMap.has(a.poolBC!)) {\n const aPoolAB = poolWithTvlsMap.get(a.poolAB)!\n const aPoolBC = poolWithTvlsMap.get(a.poolBC!)!\n aTvlMinimum = Math.min(aPoolAB.tvl, aPoolBC.tvl)\n }\n\n if (poolWithTvlsMap.has(b.poolAB) && poolWithTvlsMap.has(b.poolBC!)) {\n const bPoolAB = poolWithTvlsMap.get(b.poolAB)!\n const bPoolBC = poolWithTvlsMap.get(b.poolBC!)!\n bTvlMinimum = Math.min(bPoolAB.tvl, bPoolBC.tvl)\n }\n return bTvlMinimum - aTvlMinimum\n })\n }\n\n preRouterSwapParams = [...stepNumsOne, ...notStepNumsOne]\n\n if (preRouterSwapParams.length === 0) {\n if (swapWithMultiPoolParams != null) {\n const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n const onePath: OnePath = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n poolAddress: [preSwapResult!.poolAddress],\n a2b: [preSwapResult!.aToB],\n rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n isExceed: preSwapResult!.isExceed,\n coinType: [from, to],\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n paths: [onePath],\n a2b: preSwapResult!.aToB,\n b2c: undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n coinTypeA: from,\n coinTypeB: to,\n coinTypeC: undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n throw new ClmmpoolsError('No parameters available for service downgrade', RouterErrorCode.NoDowngradeNeedParams)\n }\n\n const preSwapResult = await this.preRouterSwapA2B2C(preRouterSwapParams.slice(0, 16))\n if (preSwapResult == null) {\n if (swapWithMultiPoolParams != null) {\n const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n const onePath: OnePath = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n poolAddress: [preSwapResult!.poolAddress],\n a2b: [preSwapResult!.aToB],\n rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n isExceed: preSwapResult!.isExceed,\n coinType: [from, to],\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n paths: [onePath],\n a2b: preSwapResult!.aToB,\n b2c: undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n coinTypeA: from,\n coinTypeB: to,\n coinTypeC: undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n const result: PriceResult = {\n amountIn: ZERO,\n amountOut: ZERO,\n paths: [],\n a2b: false,\n b2c: false,\n byAmountIn,\n isExceed: true,\n targetSqrtPrice: [],\n currentSqrtPrice: [],\n coinTypeA: '',\n coinTypeB: '',\n coinTypeC: undefined,\n createTxParams: undefined,\n }\n\n return result\n }\n\n const bestIndex = preSwapResult!.index\n\n const poolAddress =\n preRouterSwapParams[bestIndex].poolBC != null\n ? [preRouterSwapParams[bestIndex].poolAB, preRouterSwapParams[bestIndex].poolBC!]\n : [preRouterSwapParams[bestIndex].poolAB]\n\n const rawAmountLimit = byAmountIn\n ? [preSwapResult!.amountMedium, preSwapResult!.amountOut]\n : [preSwapResult!.amountIn, preSwapResult!.amountMedium]\n\n const a2bs = []\n a2bs.push(preRouterSwapParams[bestIndex].a2b)\n if (preSwapResult!.stepNum! > 1) {\n a2bs.push(preRouterSwapParams[bestIndex].b2c!)\n }\n\n const coinTypes = []\n coinTypes.push(preRouterSwapParams[bestIndex].coinTypeA)\n coinTypes.push(preRouterSwapParams[bestIndex].coinTypeB)\n if (preSwapResult!.stepNum! > 1) {\n coinTypes.push(preRouterSwapParams[bestIndex].coinTypeC!)\n }\n\n const onePath: OnePath = {\n amountIn: preSwapResult!.amountIn,\n amountOut: preSwapResult!.amountOut,\n poolAddress,\n a2b: a2bs,\n rawAmountLimit,\n isExceed: preSwapResult!.isExceed,\n coinType: coinTypes,\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: preSwapResult!.amountIn,\n amountOut: preSwapResult!.amountOut,\n paths: [onePath],\n a2b: preRouterSwapParams[bestIndex].a2b,\n b2c: preSwapResult!.stepNum! > 1 ? preRouterSwapParams[bestIndex].b2c! : undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: preSwapResult!.targetSqrtPrice,\n currentSqrtPrice: preSwapResult!.currentSqrtPrice,\n coinTypeA: preRouterSwapParams[bestIndex].coinTypeA,\n coinTypeB: preRouterSwapParams[bestIndex].coinTypeB,\n coinTypeC: preSwapResult!.stepNum! > 1 ? preRouterSwapParams[bestIndex].coinTypeC! : undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n\n async priceUseV1(\n from: string,\n to: string,\n _amount: BN,\n byAmountIn: boolean,\n priceSlippagePoint: number,\n partner: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n ) {\n if (swapWithMultiPoolParams != null) {\n const preSwapResult = await this.sdk.Swap.preSwapWithMultiPool(swapWithMultiPoolParams)\n\n const onePath: OnePath = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n poolAddress: [preSwapResult!.poolAddress],\n a2b: [preSwapResult!.aToB],\n rawAmountLimit: byAmountIn ? [preSwapResult!.estimatedAmountOut] : [preSwapResult!.estimatedAmountIn],\n isExceed: preSwapResult!.isExceed,\n coinType: [from, to],\n }\n\n const swapWithRouterParams = {\n paths: [onePath],\n partner,\n priceSlippagePoint,\n }\n\n const result: PriceResult = {\n amountIn: new BN(preSwapResult!.estimatedAmountIn),\n amountOut: new BN(preSwapResult!.estimatedAmountOut),\n paths: [onePath],\n a2b: preSwapResult!.aToB,\n b2c: undefined,\n byAmountIn,\n isExceed: preSwapResult!.isExceed,\n targetSqrtPrice: [preSwapResult!.estimatedEndSqrtPrice],\n currentSqrtPrice: [preSwapResult!.estimatedStartSqrtPrice],\n coinTypeA: from,\n coinTypeB: to,\n coinTypeC: undefined,\n createTxParams: swapWithRouterParams,\n }\n return result\n }\n throw new ClmmpoolsError('No parameters available for service downgrade', RouterErrorCode.NoDowngradeNeedParams)\n }\n\n async preRouterSwapA2B2C(params: PreRouterSwapParams[]) {\n if (params.length === 0) {\n return null\n }\n\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const tx = new Transaction()\n for (const param of params) {\n if (param.stepNums > 1) {\n const args = [\n tx.object(param.poolAB),\n tx.object(param.poolBC!),\n tx.pure.bool(param.a2b),\n tx.pure.bool(param.b2c!),\n tx.pure.bool(param.byAmountIn),\n tx.pure.u64(param.amount.toString()),\n ]\n const typeArguments = []\n if (param.a2b) {\n typeArguments.push(param.coinTypeA, param.coinTypeB)\n } else {\n typeArguments.push(param.coinTypeB, param.coinTypeA)\n }\n\n if (param.b2c) {\n typeArguments.push(param.coinTypeB, param.coinTypeC!)\n } else {\n typeArguments.push(param.coinTypeC!, param.coinTypeB)\n }\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmIntegrateRouterModule}::calculate_router_swap_result`,\n typeArguments,\n arguments: args,\n })\n } else {\n const args = [\n tx.object(param.poolAB),\n tx.pure.bool(param.a2b),\n tx.pure.bool(param.byAmountIn),\n tx.pure.u64(param.amount.toString()),\n ]\n const typeArguments = param.a2b ? [param.coinTypeA, param.coinTypeB] : [param.coinTypeB, param.coinTypeA]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmExpectSwapModule}::get_expect_swap_result`,\n arguments: args,\n typeArguments,\n })\n }\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return (\n extractStructTagFromType(item.type).name === `CalculatedRouterSwapResultEvent` ||\n extractStructTagFromType(item.type).name === `ExpectSwapResultEvent`\n )\n })\n if (valueData.length === 0) {\n return null\n }\n\n let tempMaxAmount = params[0].byAmountIn ? ZERO : U64_MAX\n let tempIndex = 0\n\n for (let i = 0; i < valueData.length; i += 1) {\n if (valueData[i].parsedJson.data.is_exceed) {\n continue\n }\n\n if (params[0].byAmountIn) {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.gt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n } else {\n const amount =\n params[i].stepNums > 1\n ? new BN(valueData[i].parsedJson.data.amount_in)\n : new BN(valueData[i].parsedJson.data.amount_in).add(new BN(valueData[i].parsedJson.data.fee_amount))\n if (amount.lt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n }\n }\n\n const currentSqrtPrice = []\n const targetSqrtPrice = []\n if (params[tempIndex].stepNums > 1) {\n targetSqrtPrice.push(\n valueData[tempIndex].parsedJson.data.target_sqrt_price_ab,\n valueData[tempIndex].parsedJson.data.target_sqrt_price_cd\n )\n currentSqrtPrice.push(\n valueData[tempIndex].parsedJson.data.current_sqrt_price_ab,\n valueData[tempIndex].parsedJson.data.current_sqrt_price_cd\n )\n } else {\n targetSqrtPrice.push(valueData[tempIndex].parsedJson.data.after_sqrt_price)\n currentSqrtPrice.push(valueData[tempIndex].parsedJson.current_sqrt_price)\n }\n\n const result: PreSwapResult = {\n index: tempIndex,\n amountIn: params[0].byAmountIn ? params[tempIndex].amount : tempMaxAmount,\n amountMedium: valueData[tempIndex].parsedJson.data.amount_medium,\n amountOut: params[0].byAmountIn ? tempMaxAmount : params[tempIndex].amount,\n targetSqrtPrice,\n currentSqrtPrice,\n isExceed: valueData[tempIndex].parsedJson.data.is_exceed,\n stepNum: params[tempIndex].stepNums,\n }\n return result\n }\n\n async getPoolWithTVL(): Promise<PoolWithTvl[]> {\n const result: PoolWithTvl[] = []\n\n const { swapCountUrl } = this._sdk.sdkOptions\n if (!swapCountUrl) {\n return result\n }\n\n let response\n try {\n response = await fetch(swapCountUrl)\n } catch (e) {\n throw new ClmmpoolsError(`Failed to get pool list with liquidity from ${swapCountUrl}.`, RouterErrorCode.InvalidSwapCountUrl)\n }\n\n let json\n try {\n json = await response.json()\n } catch (e) {\n throw new ClmmpoolsError(`Failed tp [arse response from ${swapCountUrl}].`, RouterErrorCode.InvalidSwapCountUrl)\n }\n\n if (json.code !== 200) {\n throw new ClmmpoolsError(\n `Failed to get pool list from ${swapCountUrl}. Statu code is ${json.code}.`,\n RouterErrorCode.InvalidSwapCountUrl\n )\n }\n\n const { pools } = json.data\n\n for (const pool of pools) {\n result.push({\n poolAddress: pool.swap_account,\n tvl: Number(pool.tvl_in_usd),\n })\n }\n\n return result\n }\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions'\nimport {\n CalculateRatesParams,\n CalculateRatesResult,\n getPackagerConfigs,\n Pool,\n PreSwapParams,\n PreSwapWithMultiPoolParams,\n SwapParams,\n TransPreSwapWithMultiPoolParams,\n} from '../types'\nimport { Percentage, U64_MAX, ZERO } from '../math'\nimport { findAdjustCoin, TransactionUtil } from '../utils/transaction-util'\nimport { extractStructTagFromType } from '../utils/contracts'\nimport { ClmmFetcherModule } from '../types/sui'\nimport { TickData, transClmmpoolDataWithoutTicks } from '../types/clmmpool'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { SwapUtils } from '../math/swap'\nimport { computeSwap } from '../math/clmm'\nimport { TickMath } from '../math/tick'\nimport { checkInvalidSuiAddress, d } from '../utils'\nimport { SplitPath } from './routerModuleV2'\nimport { ClmmpoolsError, ConfigErrorCode, SwapErrorCode } from '../errors/errors'\n\nexport const AMM_SWAP_MODULE = 'amm_swap'\nexport const POOL_STRUCT = 'Pool'\n\n/**\n * Helper class to help interact with clmm pool swap with a swap router interface.\n */\nexport class SwapModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n calculateSwapFee(paths: SplitPath[]) {\n let fee = d(0)\n paths.forEach((item) => {\n const pathCount = item.basePaths.length\n if (pathCount > 0) {\n const path = item.basePaths[0]\n const feeRate = path.label === 'Magma' ? new Decimal(path.feeRate).div(10 ** 6) : new Decimal(path.feeRate).div(10 ** 9)\n const feeAmount = d(path.inputAmount)\n .div(10 ** path.fromDecimal)\n .mul(feeRate)\n fee = fee.add(feeAmount)\n if (pathCount > 1) {\n const path2 = item.basePaths[1]\n const price1 = path.direction ? path.currentPrice : new Decimal(1).div(path.currentPrice)\n const price2 = path2.direction ? path2.currentPrice : new Decimal(1).div(path2.currentPrice)\n const feeRate2 = path2.label === 'Magma' ? new Decimal(path2.feeRate).div(10 ** 6) : new Decimal(path2.feeRate).div(10 ** 9)\n\n const feeAmount2 = d(path2.outputAmount)\n .div(10 ** path2.toDecimal)\n .mul(feeRate2)\n const fee2 = feeAmount2.div(price1.mul(price2))\n fee = fee.add(fee2)\n }\n }\n })\n\n return fee.toString()\n }\n\n calculateSwapPriceImpact(paths: SplitPath[]) {\n let impactValue = d(0)\n paths.forEach((item) => {\n const pathCount = item.basePaths.length\n if (pathCount === 1) {\n const path = item.basePaths[0]\n const outputAmount = d(path.outputAmount).div(10 ** path.toDecimal)\n const inputAmount = d(path.inputAmount).div(10 ** path.fromDecimal)\n const rate = outputAmount.div(inputAmount)\n const cprice = path.direction ? new Decimal(path.currentPrice) : new Decimal(1).div(path.currentPrice)\n impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n }\n if (pathCount === 2) {\n const path = item.basePaths[0]\n const path2 = item.basePaths[1]\n const cprice1 = path.direction ? new Decimal(path.currentPrice) : new Decimal(1).div(path.currentPrice)\n const cprice2 = path2.direction ? new Decimal(path2.currentPrice) : new Decimal(1).div(path2.currentPrice)\n const cprice = cprice1.mul(cprice2)\n const outputAmount = new Decimal(path2.outputAmount).div(10 ** path2.toDecimal)\n const inputAmount = new Decimal(path.inputAmount).div(10 ** path.fromDecimal)\n const rate = outputAmount.div(inputAmount)\n impactValue = impactValue.add(this.calculateSingleImpact(rate, cprice))\n }\n })\n\n return impactValue.toString()\n }\n\n private calculateSingleImpact = (rate: Decimal, cprice: Decimal) => {\n // ((cprice - rate)/cprice)*100\n return cprice.minus(rate).div(cprice).mul(100)\n }\n\n /**\n * Performs a pre-swap with multiple pools.\n *\n * @param {PreSwapWithMultiPoolParams} params The parameters for the pre-swap.\n * @returns {Promise<SwapWithMultiPoolData>} A promise that resolves to the swap data.\n */\n async preSwapWithMultiPool(params: PreSwapWithMultiPoolParams) {\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const tx = new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n for (let i = 0; i < params.poolAddresses.length; i += 1) {\n const args = [\n tx.object(params.poolAddresses[i]),\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.byAmountIn),\n tx.pure.u64(params.amount),\n ]\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n arguments: args,\n typeArguments,\n })\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `pre swap with multi pools error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n })\n if (valueData.length === 0) {\n return null\n }\n\n if (valueData.length !== params.poolAddresses.length) {\n throw new ClmmpoolsError('valueData.length !== params.pools.length', SwapErrorCode.ParamsLengthNotEqual)\n }\n\n let tempMaxAmount = params.byAmountIn ? ZERO : U64_MAX\n let tempIndex = 0\n for (let i = 0; i < valueData.length; i += 1) {\n if (valueData[i].parsedJson.data.is_exceed) {\n continue\n }\n\n if (params.byAmountIn) {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.gt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n } else {\n const amount = new BN(valueData[i].parsedJson.data.amount_out)\n if (amount.lt(tempMaxAmount)) {\n tempIndex = i\n tempMaxAmount = amount\n }\n }\n }\n\n return this.transformSwapWithMultiPoolData(\n {\n poolAddress: params.poolAddresses[tempIndex],\n a2b: params.a2b,\n byAmountIn: params.byAmountIn,\n amount: params.amount,\n coinTypeA: params.coinTypeA,\n coinTypeB: params.coinTypeB,\n },\n valueData[tempIndex].parsedJson\n )\n }\n\n /**\n * Performs a pre-swap.\n *\n * @param {PreSwapParams} params The parameters for the pre-swap.\n * @returns {Promise<PreSwapParams>} A promise that resolves to the swap data.\n */\n async preswap(params: PreSwapParams) {\n const { integrate, simulationAccount, clmm_pool } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n const tx = new Transaction()\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const args = [\n tx.object(global_config_id),\n tx.object(params.pool.poolAddress),\n tx.pure.bool(params.a2b),\n tx.pure.bool(params.byAmountIn),\n tx.pure.u64(params.amount),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${ClmmFetcherModule}::calculate_swap_result`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n throw new ClmmpoolsError(\n `preswap error code: ${simulateRes.error ?? 'unknown error'}, please check config and params`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const valueData: any = simulateRes.events?.filter((item: any) => {\n return extractStructTagFromType(item.type).name === `CalculatedSwapResultEvent`\n })\n if (valueData.length === 0) {\n return null\n }\n return this.transformSwapData(params, valueData[0].parsedJson.data)\n }\n\n private transformSwapData(params: PreSwapParams, data: any) {\n const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n return {\n poolAddress: params.pool.poolAddress,\n currentSqrtPrice: params.currentSqrtPrice,\n estimatedAmountIn,\n estimatedAmountOut: data.amount_out,\n estimatedEndSqrtPrice: data.after_sqrt_price,\n estimatedFeeAmount: data.fee_amount,\n isExceed: data.is_exceed,\n amount: params.amount,\n aToB: params.a2b,\n byAmountIn: params.byAmountIn,\n }\n }\n\n private transformSwapWithMultiPoolData(params: TransPreSwapWithMultiPoolParams, jsonData: any) {\n const { data } = jsonData\n\n console.log('json data. ', data)\n\n const estimatedAmountIn = data.amount_in && data.fee_amount ? new BN(data.amount_in).add(new BN(data.fee_amount)).toString() : ''\n return {\n poolAddress: params.poolAddress,\n estimatedAmountIn,\n estimatedAmountOut: data.amount_out,\n estimatedEndSqrtPrice: data.after_sqrt_price,\n estimatedStartSqrtPrice: data.step_results[0].current_sqrt_price,\n estimatedFeeAmount: data.fee_amount,\n isExceed: data.is_exceed,\n amount: params.amount,\n aToB: params.a2b,\n byAmountIn: params.byAmountIn,\n }\n }\n\n /**\n * Calculates the rates for a swap.\n * @param {CalculateRatesParams} params The parameters for the calculation.\n * @returns {CalculateRatesResult} The results of the calculation.\n */\n calculateRates(params: CalculateRatesParams): CalculateRatesResult {\n const { currentPool } = params\n const poolData = transClmmpoolDataWithoutTicks(currentPool)\n\n let ticks\n if (params.a2b) {\n ticks = params.swapTicks.sort((a, b) => {\n return b.index - a.index\n })\n } else {\n ticks = params.swapTicks.sort((a, b) => {\n return a.index - b.index\n })\n }\n\n const swapResult = computeSwap(params.a2b, params.byAmountIn, params.amount, poolData, ticks)\n\n let isExceed = false\n if (params.byAmountIn) {\n isExceed = swapResult.amountIn.lt(params.amount)\n } else {\n isExceed = swapResult.amountOut.lt(params.amount)\n }\n const sqrtPriceLimit = SwapUtils.getDefaultSqrtPriceLimit(params.a2b)\n if (params.a2b && swapResult.nextSqrtPrice.lt(sqrtPriceLimit)) {\n isExceed = true\n }\n\n if (!params.a2b && swapResult.nextSqrtPrice.gt(sqrtPriceLimit)) {\n isExceed = true\n }\n\n let extraComputeLimit = 0\n if (swapResult.crossTickNum > 6 && swapResult.crossTickNum < 40) {\n extraComputeLimit = 22000 * (swapResult.crossTickNum - 6)\n }\n\n if (swapResult.crossTickNum > 40) {\n isExceed = true\n }\n\n const prePrice = TickMath.sqrtPriceX64ToPrice(poolData.currentSqrtPrice, params.decimalsA, params.decimalsB).toNumber()\n const afterPrice = TickMath.sqrtPriceX64ToPrice(swapResult.nextSqrtPrice, params.decimalsA, params.decimalsB).toNumber()\n\n const priceImpactPct = (Math.abs(prePrice - afterPrice) / prePrice) * 100\n\n return {\n estimatedAmountIn: swapResult.amountIn,\n estimatedAmountOut: swapResult.amountOut,\n estimatedEndSqrtPrice: swapResult.nextSqrtPrice,\n estimatedFeeAmount: swapResult.feeAmount,\n isExceed,\n extraComputeLimit,\n amount: params.amount,\n aToB: params.a2b,\n byAmountIn: params.byAmountIn,\n priceImpactPct,\n }\n }\n\n /**\n * create swap transaction payload\n * @param params\n * @param gasEstimateArg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns\n */\n async createSwapTransactionPayload(\n params: SwapParams,\n gasEstimateArg?: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n\n if ((params.a2b && isAdjustCoinA) || (!params.a2b && isAdjustCoinB)) {\n const tx = await TransactionUtil.buildSwapTransactionForGas(this._sdk, params, allCoinAsset, gasEstimateArg)\n return tx\n }\n }\n\n return TransactionUtil.buildSwapTransaction(this.sdk, params, allCoinAsset)\n }\n\n /**\n * create swap transaction without transfer coins payload\n * @param params\n * @param gasEstimateArg When the fix input amount is SUI, gasEstimateArg can control whether to recalculate the number of SUI to prevent insufficient gas.\n * If this parameter is not passed, gas estimation is not performed\n * @returns tx and coin ABs\n */\n async createSwapTransactionWithoutTransferCoinsPayload(\n params: SwapParams,\n gasEstimateArg?: {\n byAmountIn: boolean\n slippage: Percentage\n decimalsA: number\n decimalsB: number\n swapTicks: Array<TickData>\n currentPool: Pool\n }\n ): Promise<{ tx: Transaction; coinABs: TransactionObjectArgument[] }> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n if (gasEstimateArg) {\n const { isAdjustCoinA, isAdjustCoinB } = findAdjustCoin(params)\n\n if ((params.a2b && isAdjustCoinA) || (!params.a2b && isAdjustCoinB)) {\n const res = await TransactionUtil.buildSwapTransactionWithoutTransferCoinsForGas(this._sdk, params, allCoinAsset, gasEstimateArg)\n return res\n }\n }\n\n return TransactionUtil.buildSwapTransactionWithoutTransferCoins(this.sdk, params, allCoinAsset)\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { ClmmpoolsError, LockErrorCode } from '../errors/errors'\nimport {\n CreateLockParams,\n IncreaseLockAmountParams,\n MergeLockParams,\n TransferLockParams,\n IncreaseUnlockTimeParams,\n LockPermanentParams,\n VoteParams,\n ClaimFeesParams as ClaimVotingRewardsParams,\n ClaimFeesPoolsParams as ClaimVotingRewardsPoolsParams,\n ClaimAndLockParams,\n PokeParams,\n VotingEscrow,\n CLOCK_ADDRESS,\n getPackagerConfigs,\n Voter,\n} from '../types'\nimport { checkInvalidSuiAddress, extractStructTagFromType, getObjectFields } from '../utils'\nimport { IModule } from '../interfaces/IModule'\nimport { MagmaClmmSDK } from '../sdk'\nimport { TransactionUtil } from '../utils/transaction-util'\n\ntype LockID = string\ntype PoolID = string\n\ntype LocksInfo = {\n owner: string\n lockInfo: LockInfo[]\n}\n\ntype AllLockSummary = {\n current_epoch_end: number\n current_epoch_vote_end: number\n rebase_apr: number\n team_emission_rate: number\n total_locked: number\n total_voted_power: number\n total_voting_power: number\n}\n\ntype LockInfo = {\n lock_id: string\n amount: string\n start: string\n end: string\n permanent: boolean\n\n rebase_amount: Coin\n voting_power: string\n voting_rewards: Map<string, Coin[]> // pool => incentiveTokenAmount / feeTokenAmount\n}\n\ntype Coin = {\n kind?: CoinType\n token_addr: string\n amount: string\n}\n\nenum CoinType {\n RebaseCoin = 'rebaseCoin',\n Fee = 'fee',\n Incentive = 'incentiveCoin',\n}\n\ntype PoolWeight = {\n poolId: string\n weight: string\n}\n\ntype ALockSummary = {\n fee_incentive_total: string\n reward_distributor_claimable: string\n voting_power: string\n}\n\nexport type AddBribeReward = {\n poolId: string\n amount: string\n coinType: string\n}\n\nexport type LockVoteEvent = {\n lock_id: string\n last_voted_at: string\n pools: string[]\n votes: string[]\n}\n\nexport class LockModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async createLockTransactionPayload(params: CreateLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n return TransactionUtil.buildCreateLockTransaction(this.sdk, params, allCoinAsset)\n }\n\n async increaseLockAmountTransactionPayload(params: IncreaseLockAmountParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n return TransactionUtil.buildIncreaseLockAmountTransaction(this.sdk, params, allCoinAsset)\n }\n\n async mergeLockTransactionPayload(params: MergeLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildMergeLockTransaction(this.sdk, params)\n }\n\n // public fun transfer<T>(lock: Lock, ve: &mut VotingEscrow<T>, to: address, clock: &Clock, ctx: &mut TxContext) {\n async transferLockTransactionPayload(params: TransferLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildTransferLockTransaction(this.sdk, params)\n }\n\n async increaseUnlockTimePayload(params: IncreaseUnlockTimeParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildIncreaseUnlockTimeTransaction(this.sdk, params)\n }\n\n // public fun lock_permanent<T>(self: &mut VotingEscrow<T>, lock: &mut Lock, clock: &Clock, ctx: &mut TxContext) {\n async lockPermanentPayload(params: LockPermanentParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildLockPermanentTransaction(this.sdk, params)\n }\n\n async unlockPermanentPayload(params: LockPermanentParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildUnlockPermanentTransaction(this.sdk, params)\n }\n\n async votePayload(params: VoteParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildVoteTransaction(this.sdk, params)\n }\n\n // public fun claim_fees<T, B>(self: &mut Voter<T>, ve: &mut VotingEscrow<T>, mut locks: vector<Lock>, clock: &Clock, ctx: &mut TxContext) {\n async claimVotingRewardsPayload(params: ClaimVotingRewardsParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildClaimVotingRewardsTransaction(this.sdk, params)\n }\n\n // public fun claim_fees<T, B>(self: &mut Voter<T>, ve: &mut VotingEscrow<T>, mut locks: vector<Lock>, clock: &Clock, ctx: &mut TxContext) {\n async claimVotingRewardsPoolsPayload(params: ClaimVotingRewardsPoolsParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n return TransactionUtil.buildClaimVotingRewardsPoolsTransaction(this.sdk, params)\n }\n\n async claimAndLockRebasesPayload(params: ClaimAndLockParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildClaimAndLockRebases(this.sdk, params)\n }\n\n async burnLockTransactionPayload(lockId: string): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildBurnLockTransaction(this.sdk, lockId)\n }\n\n async pokePayload(params: PokeParams): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildPoke(this.sdk, params)\n }\n\n async addBribeReward(params: AddBribeReward): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, params.coinType]\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const coinInput = TransactionUtil.buildCoinForAmount(tx, allCoinAsset, BigInt(params.amount), params.coinType, false, true)\n\n const args = [tx.object(voter_id), tx.object(params.poolId), coinInput.targetCoin, tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::add_bribe_reward`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async claimVotingBribe(locks: string[], incentive_tokens: string[]): Promise<Transaction> {\n if (this._sdk.senderAddress.length === 0) {\n throw Error('this config sdk senderAddress is empty')\n }\n return TransactionUtil.buildClaimVotingBribe(this.sdk, locks, incentive_tokens)\n }\n\n async claimVotingFeeAndBribeForPool(\n lockId: string,\n poolId: string,\n feeTokens: string[],\n incentiveTokens: string[]\n ): Promise<Transaction> {\n if (feeTokens.length !== 2) {\n throw Error('feeTokens length must be 2')\n }\n if (incentiveTokens.length < 1 || incentiveTokens.length > 3) {\n throw Error('incentiveTokens length must be between 1 and 3')\n }\n\n const { integrate, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...feeTokens, ...incentiveTokens]\n\n let targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes_for_single_pool${incentiveTokens.length}`\n if (incentiveTokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claim_voting_bribes_for_single_pool`\n }\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n const args = [tx.object(voter_id), tx.object(voting_escrow_id), tx.object(lockId), tx.object(poolId), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: targetFunc,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async fastLocksOfUser(user: string): Promise<LocksInfo> {\n const locksInfo: LocksInfo = { owner: user, lockInfo: [] }\n const { distribution, ve33 } = this._sdk.sdkOptions // getPackagerConfigs(this._sdk.sdkOptions.magma_config)\n const { magma_token } = getPackagerConfigs(ve33)\n\n // all objects\n const ownerRes = await this._sdk.fullClient.getOwnedObjectsByPage(user, {\n options: { showType: true, showContent: true, showDisplay: true, showOwner: true },\n filter: {\n MatchAll: [{ Package: distribution.package_id }, { StructType: `${distribution.package_id}::voting_escrow::Lock` }],\n },\n })\n\n for (const item of ownerRes.data as any[]) {\n try {\n const { fields } = item.data.content\n const aLockSummary = await this.aLockSummary(fields.id.id)\n const lockInfo: LockInfo = {\n lock_id: fields.id.id,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: aLockSummary.reward_distributor_claimable,\n },\n voting_power: aLockSummary.voting_power,\n voting_rewards: new Map<string, Coin[]>(),\n }\n\n locksInfo.lockInfo.push(lockInfo)\n } catch (error) {\n console.error('fastLocksOfUser error', error)\n }\n }\n return locksInfo\n }\n\n async locksOfUserV2(user: string): Promise<LocksInfo> {\n const locksInfo: LocksInfo = { owner: user, lockInfo: [] }\n const { distribution, ve33 } = this._sdk.sdkOptions // getPackagerConfigs(this._sdk.sdkOptions.magma_config)\n const { magma_token } = getPackagerConfigs(ve33)\n\n // all objects\n const ownerRes = await this._sdk.fullClient.getOwnedObjectsByPage(user, {\n options: { showType: true, showContent: true, showDisplay: true, showOwner: true },\n filter: {\n MatchAll: [{ Package: distribution.package_id }, { StructType: `${distribution.package_id}::voting_escrow::Lock` }],\n },\n })\n\n // const lockSummary = new Map<string, ALockSummary>()\n const ids = ownerRes.data.map((item) => item.data.content.id.id)\n const lockSummary = await this.getAllLockSummary(ids)\n const lockIncentiveTokens = await this.getAllBribeRewardTokensOfLock(ids) // all IncentiveTokens of LockId\n const lockFeeTokens = await this.getAllVotingFeeRewardTokens(ids) // all FeeTokens of LockId\n\n const poolIncentiveRewards = await this.getAllIncentiveRewards(lockIncentiveTokens)\n const poolFeeRewards = await this.getAllFeeRewards(lockFeeTokens)\n\n for (const item of ownerRes.data as any[]) {\n const { fields } = item.data.content\n const lock_id = fields.id.id\n\n // pool => coin...\n const votingRewards = new Map<string, Coin[]>() // pool => rewardTokens\n poolIncentiveRewards.get(lock_id)?.forEach((value, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push(...value)\n })\n poolFeeRewards.get(lock_id)?.forEach((value, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push(...value)\n })\n\n const lockInfo: LockInfo = {\n lock_id,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: lockSummary.get(lock_id)?.reward_distributor_claimable || '0',\n },\n voting_power: lockSummary.get(lock_id)?.voting_power || '0',\n // pool => incentive/fee => amount\n voting_rewards: votingRewards,\n }\n\n locksInfo.lockInfo.push(lockInfo)\n }\n return locksInfo\n }\n\n async locksOfUser(user: string): Promise<LocksInfo> {\n const locksInfo: LocksInfo = { owner: user, lockInfo: [] }\n const { distribution, ve33 } = this._sdk.sdkOptions // getPackagerConfigs(this._sdk.sdkOptions.magma_config)\n const { magma_token } = getPackagerConfigs(ve33)\n\n // all objects\n const ownerRes = await this._sdk.fullClient.getOwnedObjectsByPage(user, {\n options: { showType: true, showContent: true, showDisplay: true, showOwner: true },\n filter: {\n MatchAll: [{ Package: distribution.package_id }, { StructType: `${distribution.package_id}::voting_escrow::Lock` }],\n },\n })\n\n for (const item of ownerRes.data as any[]) {\n try {\n const { fields } = item.data.content\n\n const aLockSummary = await this.aLockSummary(fields.id.id)\n const poolIncentiveTokens = await this.getVotingBribeRewardTokens(fields.id.id)\n const poolFeeTokens = await this.getVotingFeeRewardTokens(fields.id.id)\n\n const incentiveTokens: string[] = []\n poolIncentiveTokens.forEach((value, key) => {\n incentiveTokens.push(...value)\n })\n\n const feeTokens: string[] = []\n poolFeeTokens.forEach((value, key) => {\n feeTokens.push(...value)\n })\n\n // coin => pool => amount\n const poolIncentiveRewards = await this.getPoolIncentiveRewards(fields.id.id, incentiveTokens)\n const votingRewards = new Map<string, Coin[]>() // pool => rewardTokens\n poolIncentiveRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Incentive,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const poolFeeRewards = await this.getPoolFeeRewards(fields.id.id, feeTokens)\n // const feeRewards = new Map<string, Coin[]>()\n poolFeeRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Fee,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const lockInfo: LockInfo = {\n lock_id: fields.id.id,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: aLockSummary.reward_distributor_claimable,\n },\n voting_power: aLockSummary.voting_power,\n // pool => incentive/fee => amount\n voting_rewards: votingRewards,\n }\n\n locksInfo.lockInfo.push(lockInfo)\n } catch (error) {\n console.error('locksOfUser error', error)\n }\n }\n return locksInfo\n }\n\n async aLockInfo(lockId: string): Promise<LockInfo> {\n const lockObj = await this._sdk.fullClient.getObject({\n id: lockId,\n options: {\n showContent: true,\n showDisplay: true,\n showOwner: true,\n showPreviousTransaction: true,\n showStorageRebate: true,\n showType: true,\n },\n })\n if (lockObj.error != null || lockObj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `getPool error code: ${lockObj.error?.code ?? 'unknown error'}, please check config and object id`,\n LockErrorCode.InvalidLockObject\n )\n }\n\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const aLockSummary = await this.aLockSummary(lockId)\n const poolIncentiveTokens = await this.getVotingBribeRewardTokens(lockId)\n const poolFeeTokens = await this.getVotingFeeRewardTokens(lockId)\n\n const incentiveTokens: string[] = []\n poolIncentiveTokens.forEach((value, key) => {\n incentiveTokens.push(...value)\n })\n\n const feeTokens: string[] = []\n poolFeeTokens.forEach((value, key) => {\n feeTokens.push(...value)\n })\n\n const poolIncentiveRewards = await this.getPoolIncentiveRewards(lockId, incentiveTokens)\n const votingRewards = new Map<string, Coin[]>() // pool => rewardTokens\n poolIncentiveRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Incentive,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const poolFeeRewards = await this.getPoolFeeRewards(lockId, feeTokens)\n // const feeRewards = new Map<string, Coin[]>()\n poolFeeRewards.forEach((value, coin) => {\n value.forEach((amount, pool) => {\n if (!votingRewards.has(pool)) {\n votingRewards.set(pool, [])\n }\n votingRewards.get(pool)?.push({\n kind: CoinType.Fee,\n token_addr: coin,\n amount: amount.toString(),\n })\n })\n })\n\n const fields = getObjectFields(lockObj)\n\n const lockInfo: LockInfo = {\n lock_id: lockId,\n amount: fields.amount,\n start: fields.start,\n end: fields.end,\n permanent: fields.permanent,\n\n rebase_amount: {\n kind: CoinType.RebaseCoin,\n token_addr: magma_token,\n amount: aLockSummary.reward_distributor_claimable,\n },\n voting_power: aLockSummary.voting_power,\n voting_rewards: votingRewards,\n }\n return lockInfo\n }\n\n async aLockSummary(lock_id: string): Promise<ALockSummary> {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id, reward_distributor_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(reward_distributor_id),\n tx.object(lock_id),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::lock_summary`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: ALockSummary = {\n // reward_distributor_claimable + incentive magma\n fee_incentive_total: '',\n // How much Magma can be claimed\n reward_distributor_claimable: '',\n\n voting_power: '',\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `LockSummary`) {\n res = {\n fee_incentive_total: item.parsedJson.fee_incentive_total,\n reward_distributor_claimable: item.parsedJson.reward_distributor_claimable,\n voting_power: item.parsedJson.voting_power,\n }\n }\n })\n return res\n }\n\n // Return: lock_id => ALockSummary\n async getAllLockSummary(lock_ids: string[]): Promise<Map<LockID, ALockSummary>> {\n let tx = new Transaction()\n for (const lock_id of lock_ids) {\n tx = await this._aLockSummary(lock_id, tx)\n }\n return this._parseLockSummary(tx)\n }\n\n async _aLockSummary(lock_id: string, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id, reward_distributor_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const args = [\n tx.object(voter_id),\n tx.object(voting_escrow_id),\n tx.object(reward_distributor_id),\n tx.object(lock_id),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::lock_summary`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseLockSummary(tx: Transaction): Promise<Map<LockID, ALockSummary>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n // const res: ALockSummary[] = []\n const res = new Map<LockID, ALockSummary>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `LockSummary`) {\n res.set(item.parsedJson.lock_id, {\n fee_incentive_total: item.parsedJson.fee_incentive_total,\n reward_distributor_claimable: item.parsedJson.reward_distributor_claimable,\n voting_power: item.parsedJson.voting_power,\n })\n }\n })\n return res\n }\n\n async allLockSummary(): Promise<AllLockSummary> {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { voting_escrow_id, magma_token, voter_id, minter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(minter_id), tx.object(voter_id), tx.object(voting_escrow_id), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${VotingEscrow}::summary`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let summary: AllLockSummary = {\n current_epoch_end: 0,\n current_epoch_vote_end: 0,\n rebase_apr: 0,\n team_emission_rate: 0,\n total_locked: 0,\n total_voted_power: 0,\n total_voting_power: 0,\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `Summary`) {\n summary = {\n current_epoch_end: Number(item.parsedJson.current_epoch_end),\n current_epoch_vote_end: Number(item.parsedJson.current_epoch_vote_end),\n rebase_apr: Number(item.parsedJson.rebase_apr),\n team_emission_rate: Number(item.parsedJson.team_emission_rate),\n total_locked: Number(item.parsedJson.total_locked),\n total_voted_power: Number(item.parsedJson.total_voted_power),\n total_voting_power: Number(item.parsedJson.total_voting_power),\n }\n }\n })\n return summary\n }\n\n async poolWeights(pools: string[]): Promise<PoolWeight[]> {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const poolsParams = tx.pure.vector('id', pools)\n const args = [tx.object(voter_id), poolsParams]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::pools_tally`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolWeights: PoolWeight[] = []\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `PoolsTally`) {\n item.parsedJson.list.forEach((item: any) => {\n poolWeights.push({\n poolId: item.id,\n weight: item.weight,\n })\n })\n }\n })\n return poolWeights\n }\n\n async getAllVotingFeeRewardTokens(lock_ids: string[]): Promise<Map<LockID, string[]>> {\n let tx = new Transaction()\n for (const lock_id of lock_ids) {\n tx = await this._getVotingFeeRewardTokens(lock_id, tx)\n }\n return this._parseVotingFeeRewardTokens(tx)\n }\n\n async _getVotingFeeRewardTokens(lock_id: string, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_fee_reward_tokens`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseVotingFeeRewardTokens(tx: Transaction): Promise<Map<LockID, string[]>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolFeeRewardTokens = new Map<LockID, string[]>()\n // const poolRewardTokens: string[] = []\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `EventFeeRewardTokens`) {\n const { lock_id } = event.parsedJson\n if (!poolFeeRewardTokens.has(lock_id)) {\n poolFeeRewardTokens.set(lock_id, [])\n }\n\n event.parsedJson.list.contents.forEach((poolTokens: any) => {\n poolTokens.value.forEach((token: any) => {\n poolFeeRewardTokens.get(lock_id)?.push(token.name)\n })\n })\n }\n })\n return poolFeeRewardTokens\n }\n\n async getVotingFeeRewardTokens(lock_id: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_fee_reward_tokens`,\n arguments: args,\n typeArguments,\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolRewardTokens = new Map<string, string[]>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventFeeRewardTokens`) {\n item.parsedJson.list.contents.forEach((poolTokens: any) => {\n if (!poolRewardTokens.has(poolTokens.key)) {\n poolRewardTokens.set(poolTokens.key, [])\n }\n\n poolTokens.value.forEach((token: any) => {\n poolRewardTokens.get(poolTokens.key)?.push(token.name)\n })\n })\n }\n })\n return poolRewardTokens\n }\n\n // tokens\n async getAllBribeRewardTokensOfLock(lock_ids: string[]): Promise<Map<LockID, string[]>> {\n let tx = new Transaction()\n for (const lock_id of lock_ids) {\n tx = await this._getVotingBribeRewardTokens(lock_id, tx)\n }\n return this._parseVotingBribeRewardTokens(tx)\n }\n\n async _getVotingBribeRewardTokens(lock_id: string, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_bribe_reward_tokens`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseVotingBribeRewardTokens(tx: Transaction): Promise<Map<LockID, string[]>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBirbeRewardTokens = new Map<LockID, string[]>()\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `EventBribeRewardTokens`) {\n const { lock_id } = event.parsedJson\n if (!poolBirbeRewardTokens.has(lock_id)) {\n poolBirbeRewardTokens.set(lock_id, [])\n }\n\n event.parsedJson.list.contents.forEach((poolTokens: any) => {\n poolTokens.value.forEach((token: any) => {\n poolBirbeRewardTokens.get(lock_id)?.push(token.name)\n })\n })\n }\n })\n return poolBirbeRewardTokens\n }\n\n // Return PoolId => tokens\n async getVotingBribeRewardTokens(lock_id: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const args = [tx.object(voter_id), tx.object(lock_id)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_bribe_reward_tokens`,\n arguments: args,\n typeArguments,\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBirbeRewardTokens = new Map<string, string[]>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventBribeRewardTokens`) {\n item.parsedJson.list.contents.forEach((poolTokens: any) => {\n if (!poolBirbeRewardTokens.has(poolTokens.key)) {\n poolBirbeRewardTokens.set(poolTokens.key, [])\n }\n\n poolTokens.value.forEach((token: any) => {\n poolBirbeRewardTokens.get(poolTokens.key)?.push(token.name)\n })\n })\n }\n })\n return poolBirbeRewardTokens\n }\n\n async getAllFeeRewards(fee_tokens: Map<LockID, string[]>): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n let tx = new Transaction()\n fee_tokens.forEach((tokens, lock_id) => {\n tx = this._getFeeRewards(lock_id, tokens, tx)\n })\n\n return await this._parseFeeRewards(tx)\n }\n\n _getFeeRewards(lock_id: string, fee_tokens: string[], tx: Transaction): Transaction {\n if (fee_tokens.length % 2 !== 0) {\n fee_tokens.push(fee_tokens[0])\n }\n\n for (let i = 0; i + 1 < fee_tokens.length; i += 2) {\n tx = this._getFeeRewardsInner(lock_id, fee_tokens[i], fee_tokens[i + 1], tx)\n }\n\n return tx\n }\n\n _getFeeRewardsInner(lock_id: LockID, token_a: string, token_b: string, tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n const { integrate, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, token_a, token_b]\n\n const args = [tx.object(voter_id), tx.object(lock_id), tx.object(CLOCK_ADDRESS)]\n const targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_fee_rewards`\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async _parseFeeRewards(tx: Transaction): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`getPoolIncentiveRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolFeeRewardTokens = new Map<LockID, Map<PoolID, Coin[]>>()\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `ClaimableVotingFee`) {\n const { lock_id } = event.parsedJson\n\n if (!poolFeeRewardTokens.has(lock_id)) {\n poolFeeRewardTokens.set(lock_id, new Map<PoolID, Coin[]>())\n }\n\n event.parsedJson.list.contents.forEach((rewardTokens: any) => {\n rewardTokens.value.contents.forEach((token: any) => {\n if (!poolFeeRewardTokens.get(lock_id)?.has(rewardTokens.key.name)) {\n poolFeeRewardTokens.get(lock_id)?.set(rewardTokens.key.name, [])\n }\n poolFeeRewardTokens.get(lock_id)?.get(rewardTokens.key.name)?.push({\n kind: CoinType.Incentive,\n token_addr: token.key,\n amount: token.value,\n })\n })\n })\n }\n })\n return poolFeeRewardTokens\n }\n\n async getPoolFeeRewards(lock_id: LockID, tokens: string[]) {\n const poolFeeRewardTokens = new Map<string, Map<string, string>>()\n\n if (tokens.length === 0) {\n return poolFeeRewardTokens\n }\n if (tokens.length % 2 !== 0) {\n tokens.push(tokens[0])\n }\n for (let i = 0; i + 1 < tokens.length; i += 2) {\n await this._getPoolFeeRewards(lock_id, tokens[i], tokens[i + 1], poolFeeRewardTokens)\n }\n return poolFeeRewardTokens\n }\n\n // if you have many tokens, call this function multi times\n async _getPoolFeeRewards(lock_id: string, token_a: string, token_b: string, poolFeeRewardTokens: Map<string, Map<string, string>>) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, token_a, token_b]\n\n const args = [tx.object(voter_id), tx.object(lock_id), tx.object(CLOCK_ADDRESS)]\n const targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_fee_rewards`\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n throw new Error(`getPoolFeeRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `ClaimableVotingFee`) {\n item.parsedJson.data.contents.forEach((rewardTokens: any) => {\n if (!poolFeeRewardTokens.has(rewardTokens.key.name)) {\n poolFeeRewardTokens.set(rewardTokens.key.name, new Map<string, string>())\n }\n\n rewardTokens.value.contents.forEach((token: any) => {\n poolFeeRewardTokens.get(rewardTokens.key.name)?.set(token.key, token.value)\n })\n })\n }\n })\n return poolFeeRewardTokens\n }\n\n // params: lock_id => incentive_tokens\n // lock_id => Pool => rewardTokens\n async getAllIncentiveRewards(lock_incentive_tokens: Map<LockID, string[]>): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n let tx = new Transaction()\n lock_incentive_tokens.forEach((tokens, lock_id) => {\n tx = this._getIncentiveRewards(lock_id, tokens, tx)\n })\n\n return await this._parseIncentiveRewards(tx)\n }\n\n _getIncentiveRewards(lock_id: string, incentive_tokens: string[], tx?: Transaction): Transaction {\n let i = 0\n for (; i + 3 < incentive_tokens.length; i += 3) {\n this._getIncentiveRewardsInner(lock_id, incentive_tokens.slice(i, i + 3), tx)\n }\n return this._getIncentiveRewardsInner(lock_id, incentive_tokens.slice(i), tx)\n }\n\n _getIncentiveRewardsInner(locksId: string, incentive_tokens: string[], tx?: Transaction): Transaction {\n tx = tx || new Transaction()\n // tokenId => pool => incentive_tokens\n if (incentive_tokens.length > 3) {\n throw Error('Too many tokens')\n }\n\n // const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...incentive_tokens]\n\n const args = [tx.object(voter_id), tx.object(locksId), tx.object(CLOCK_ADDRESS)]\n let targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes_${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes`\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\n })\n\n return tx\n }\n\n async _parseIncentiveRewards(tx: Transaction): Promise<Map<LockID, Map<PoolID, Coin[]>>> {\n const { simulationAccount } = this.sdk.sdkOptions\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 Error(`getPoolIncentiveRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBribeRewardTokens = new Map<LockID, Map<PoolID, Coin[]>>()\n simulateRes.events?.forEach((event: any) => {\n if (extractStructTagFromType(event.type).name === `ClaimableVotingBribes`) {\n const { lock_id } = event.parsedJson\n\n if (!poolBribeRewardTokens.has(lock_id)) {\n poolBribeRewardTokens.set(lock_id, new Map<PoolID, Coin[]>())\n }\n\n event.parsedJson.list.contents.forEach((rewardTokens: any) => {\n rewardTokens.value.contents.forEach((token: any) => {\n if (!poolBribeRewardTokens.get(lock_id)?.has(rewardTokens.key.name)) {\n poolBribeRewardTokens.get(lock_id)?.set(rewardTokens.key.name, [])\n }\n poolBribeRewardTokens.get(lock_id)?.get(rewardTokens.key.name)?.push({\n kind: CoinType.Incentive,\n token_addr: token.key,\n amount: token.value,\n })\n })\n })\n }\n })\n return poolBribeRewardTokens\n }\n\n // coin => pool => amount\n async getPoolIncentiveRewards(lock_id: string, incentive_tokens: string[]) {\n const poolBribeRewardTokens = new Map<string, Map<string, string>>()\n if (incentive_tokens.length === 0) {\n return poolBribeRewardTokens\n }\n let i = 0\n for (; i + 3 < incentive_tokens.length; i += 3) {\n await this._getPoolIncentiveRewards(lock_id, incentive_tokens.slice(i, i + 3), poolBribeRewardTokens)\n }\n await this._getPoolIncentiveRewards(lock_id, incentive_tokens.slice(i), poolBribeRewardTokens)\n\n return poolBribeRewardTokens\n }\n\n // tokenId => pool => incentive_tokens\n async _getPoolIncentiveRewards(locksId: string, incentive_tokens: string[], poolBribeRewardTokens: Map<string, Map<string, string>>) {\n // tokenId => pool => incentive_tokens\n if (incentive_tokens.length > 3) {\n throw Error('Too many tokens')\n }\n\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token, ...incentive_tokens]\n\n const args = [tx.object(voter_id), tx.object(locksId), tx.object(CLOCK_ADDRESS)]\n let targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes_${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::claimable_voting_bribes`\n }\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\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 Error(`getPoolIncentiveRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `ClaimableVotingBribes`) {\n item.parsedJson.data.contents.forEach((rewardTokens: any) => {\n if (!poolBribeRewardTokens.has(rewardTokens.key.name)) {\n poolBribeRewardTokens.set(rewardTokens.key.name, new Map<string, string>())\n }\n\n rewardTokens.value.contents.forEach((token: any) => {\n poolBribeRewardTokens.get(rewardTokens.key.name)?.set(token.key, token.value)\n })\n })\n }\n })\n return poolBribeRewardTokens\n }\n\n async getPoolBribeRewardTokens(pool_id: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n const typeArguments = [magma_token]\n\n const args = [tx.object(voter_id), tx.object(pool_id)]\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::get_voting_bribe_reward_tokens_by_pool`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\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 Error(`getPoolBribeRewardTokens error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolBirbeRewardTokens = new Map<string, string[]>()\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventRewardTokens`) {\n item.parsedJson.list.contents.forEach((poolTokens: any) => {\n if (!poolBirbeRewardTokens.has(poolTokens.key)) {\n poolBirbeRewardTokens.set(poolTokens.key, [])\n }\n\n poolTokens.value.forEach((token: any) => {\n poolBirbeRewardTokens.get(poolTokens.key)?.push(token.name)\n })\n })\n }\n })\n return poolBirbeRewardTokens\n }\n\n async getLockVotingStats(lockId: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount, ve33 } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(ve33)\n\n const args = [tx.object(voter_id), tx.object(lockId), tx.object(CLOCK_ADDRESS)]\n const typeArguments = [magma_token]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::lock_voting_stats`,\n arguments: args,\n typeArguments,\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw Error('this config simulationAccount is not set right')\n }\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n if (simulateRes.error != null) {\n console.log(`error code: ${simulateRes.error ?? 'unknown error'}`)\n return null\n }\n\n let res: LockVoteEvent = {\n lock_id: lockId,\n last_voted_at: '',\n pools: [],\n votes: [],\n }\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventLockVotingStats`) {\n res = {\n lock_id: item.parsedJson.lock_id,\n last_voted_at: item.parsedJson.last_voted_at,\n pools: item.parsedJson.pools,\n votes: item.parsedJson.votes,\n }\n }\n })\n return res\n }\n}\n","import { Base64 } from 'js-base64'\nimport { Transaction } from '@mysten/sui/transactions'\nimport { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { getPackagerConfigs, PoolInfo, TokenConfigEvent, TokenInfo } from '../types'\nimport { SuiResource, SuiAddressType } from '../types/sui'\nimport { CachedContent, cacheTime24h, cacheTime5min, getFutureTime } from '../utils/cachedContent'\nimport { extractStructTagFromType, normalizeCoinType } from '../utils/contracts'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { getObjectPreviousTransactionDigest } from '../utils/objects'\nimport { checkInvalidSuiAddress } from '../utils'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\n\n/**\n * Helper class to help interact with pool and token config\n * @deprecated TokenModule is no longer maintained. Please use ConfigModule instead\n */\nexport class TokenModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Get all registered token list.\n * @param forceRefresh\n * @returns\n */\n async getAllRegisteredTokenList(forceRefresh = false): Promise<TokenInfo[]> {\n const list = await this.factchTokenList('', forceRefresh)\n return list\n }\n\n /**\n * Get token list by owner address.\n * @param listOwnerAddr\n * @param forceRefresh\n * @returns\n */\n async getOwnerTokenList(listOwnerAddr = '', forceRefresh = false): Promise<TokenInfo[]> {\n const list = await this.factchTokenList(listOwnerAddr, forceRefresh)\n return list\n }\n\n /**\n * Get all registered pool list\n * @param forceRefresh\n * @returns\n */\n async getAllRegisteredPoolList(forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchPoolList('', forceRefresh)\n return list\n }\n\n /**\n * Get pool list by owner address.\n * @param listOwnerAddr\n * @param forceRefresh\n * @returns\n */\n async getOwnerPoolList(listOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchPoolList(listOwnerAddr, forceRefresh)\n return list\n }\n\n /**\n * Get warp pool list.\n * @param forceRefresh\n * @returns\n */\n async getWarpPoolList(forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchWarpPoolList('', '', forceRefresh)\n return list\n }\n\n /**\n * Get warp pool list by pool owner address and coin owner address.\n * @param poolOwnerAddr\n * @param coinOwnerAddr\n * @param forceRefresh\n * @returns\n */\n async getOwnerWarpPoolList(poolOwnerAddr = '', coinOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n const list = await this.factchWarpPoolList(poolOwnerAddr, coinOwnerAddr, forceRefresh)\n return list\n }\n\n /**\n * Get token list by coin types.\n * @param coinTypes\n * @returns\n */\n async getTokenListByCoinTypes(coinTypes: SuiAddressType[]): Promise<Record<string, TokenInfo>> {\n const tokenMap: Record<string, TokenInfo> = {}\n const cacheKey = `getAllRegisteredTokenList`\n const cacheData = this.getCache<TokenInfo[]>(cacheKey)\n\n if (cacheData !== undefined) {\n const tokenList = cacheData\n for (const coinType of coinTypes) {\n for (const token of tokenList) {\n if (normalizeCoinType(coinType) === normalizeCoinType(token.address)) {\n tokenMap[coinType] = token\n continue\n }\n }\n }\n }\n\n const unFindArray = coinTypes.filter((coinType: string) => {\n return tokenMap[coinType] === undefined\n })\n\n for (const coinType of unFindArray) {\n const metadataKey = `${coinType}_metadata`\n const metadata = this.getCache<TokenInfo>(metadataKey)\n if (metadata !== undefined) {\n tokenMap[coinType] = metadata as TokenInfo\n } else {\n const data = await this._sdk.fullClient.getCoinMetadata({\n coinType,\n })\n if (data) {\n const token = {\n id: data.id,\n name: data.name,\n symbol: data.symbol,\n official_symbol: data.symbol,\n coingecko_id: '',\n decimals: data.decimals,\n project_url: '',\n logo_url: data.iconUrl as string,\n address: coinType,\n }\n tokenMap[coinType] = token\n\n this.updateCache(metadataKey, token, cacheTime24h)\n }\n }\n }\n\n return tokenMap\n }\n\n private async factchTokenList(listOwnerAddr = '', forceRefresh = false): Promise<TokenInfo[]> {\n const { simulationAccount, token } = this.sdk.sdkOptions\n\n const cacheKey = `getAllRegisteredTokenList`\n const cacheData = this.getCache<TokenInfo[]>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const isOwnerRequest = listOwnerAddr.length > 0\n const limit = 512\n let index = 0\n let allTokenList: TokenInfo[] = []\n\n if (token === undefined) {\n throw Error('please config token ofsdkOptions')\n }\n const tokenConfig = getPackagerConfigs(token)\n while (true) {\n const tx = new Transaction()\n tx.moveCall({\n target: `${token.published_at}::coin_list::${\n isOwnerRequest ? 'fetch_full_list_with_limit' : 'fetch_all_registered_coin_info_with_limit'\n }`,\n arguments: isOwnerRequest\n ? [tx.pure.address(tokenConfig.coin_registry_id), tx.pure.address(listOwnerAddr), tx.pure.u64(index), tx.pure.u64(limit)]\n : [tx.pure.address(tokenConfig.coin_registry_id), tx.pure.u64(index), tx.pure.u64(limit)],\n })\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const tokenList: TokenInfo[] = []\n\n simulateRes.events?.forEach((item: any) => {\n const formatType = extractStructTagFromType(item.type)\n if (formatType.full_address === `${token.published_at}::coin_list::FetchCoinListEvent`) {\n item.parsedJson.full_list.value_list.forEach((item: any) => {\n tokenList.push(this.transformData(item, false))\n })\n }\n })\n allTokenList = [...allTokenList, ...tokenList]\n if (tokenList.length < limit) {\n break\n } else {\n index = allTokenList.length\n }\n }\n\n return allTokenList\n }\n\n private async factchPoolList(listOwnerAddr = '', forceRefresh = false): Promise<PoolInfo[]> {\n const { simulationAccount, token } = this.sdk.sdkOptions\n const cacheKey = `getAllRegisteredPoolList`\n const cacheData = this.getCache<PoolInfo[]>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n let allPoolList: PoolInfo[] = []\n const limit = 512\n let index = 0\n const isOwnerRequest = listOwnerAddr.length > 0\n\n if (token === undefined) {\n throw Error('please config token ofsdkOptions')\n }\n const tokenConfig = getPackagerConfigs(token)\n while (true) {\n const tx = new Transaction()\n tx.moveCall({\n target: `${token.published_at}::lp_list::${\n isOwnerRequest ? 'fetch_full_list_with_limit' : 'fetch_all_registered_coin_info_with_limit'\n }`,\n arguments: isOwnerRequest\n ? [tx.pure.address(tokenConfig.pool_registry_id), tx.pure.address(listOwnerAddr), tx.pure.u64(index), tx.pure.u64(limit)]\n : [tx.pure.address(tokenConfig.pool_registry_id), tx.pure.u64(index), tx.pure.u64(limit)],\n })\n\n if (!checkInvalidSuiAddress(simulationAccount.address)) {\n throw new ClmmpoolsError('this config simulationAccount is not set right', ConfigErrorCode.InvalidSimulateAccount)\n }\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const poolList: PoolInfo[] = []\n simulateRes.events?.forEach((item: any) => {\n const formatType = extractStructTagFromType(item.type)\n if (formatType.full_address === `${token.published_at}::lp_list::FetchPoolListEvent`) {\n item.parsedJson.full_list.value_list.forEach((item: any) => {\n poolList.push(this.transformData(item, true))\n })\n }\n })\n\n allPoolList = [...allPoolList, ...poolList]\n if (poolList.length < limit) {\n break\n } else {\n index = allPoolList.length\n }\n }\n\n return allPoolList\n }\n\n private async factchWarpPoolList(poolOwnerAddr = '', coinOwnerAddr = '', forceRefresh = false): Promise<any[]> {\n const poolList = await this.factchPoolList(poolOwnerAddr, forceRefresh)\n if (poolList.length === 0) {\n return []\n }\n const tokenList = await this.factchTokenList(coinOwnerAddr, forceRefresh)\n\n const lpPoolArray: any[] = []\n for (const pool of poolList) {\n for (const token of tokenList) {\n if (token.address === pool.coin_a_address) {\n pool.coinA = token\n }\n if (token.address === pool.coin_b_address) {\n pool.coinB = token\n }\n continue\n }\n lpPoolArray.push(pool)\n }\n return lpPoolArray\n }\n\n /**\n * Get the token config event.\n *\n * @param forceRefresh Whether to force a refresh of the event.\n * @returns The token config event.\n */\n async getTokenConfigEvent(forceRefresh = false): Promise<TokenConfigEvent> {\n const packageObjectId = this._sdk.sdkOptions.token!.package_id\n const cacheKey = `${packageObjectId}_getTokenConfigEvent`\n\n const cacheData = this.getCache<TokenConfigEvent>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const packageObject = await this._sdk.fullClient.getObject({\n id: packageObjectId,\n options: {\n showPreviousTransaction: true,\n },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n const objects = await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })\n const tokenConfigEvent: TokenConfigEvent = {\n coin_registry_id: '',\n pool_registry_id: '',\n coin_list_owner: '',\n pool_list_owner: '',\n }\n\n if (objects.data.length > 0) {\n objects.data.forEach((item: any) => {\n const formatType = extractStructTagFromType(item.type)\n if (item.transactionModule === 'coin_list') {\n switch (formatType.name) {\n case `InitListEvent`:\n tokenConfigEvent.coin_list_owner = item.parsedJson.list_id\n break\n case `InitRegistryEvent`:\n tokenConfigEvent.coin_registry_id = item.parsedJson.registry_id\n break\n default:\n break\n }\n } else if (item.transactionModule === 'lp_list') {\n switch (formatType.name) {\n case `InitListEvent<address>`:\n tokenConfigEvent.pool_list_owner = item.parsedJson.list_id\n break\n case `InitRegistryEvent<address>`:\n tokenConfigEvent.pool_registry_id = item.parsedJson.registry_id\n break\n default:\n break\n }\n }\n })\n }\n if (tokenConfigEvent.coin_registry_id.length > 0) {\n this.updateCache(cacheKey, tokenConfigEvent, cacheTime24h)\n }\n return tokenConfigEvent\n }\n\n private transformData(item: any, isPoolData: boolean): any {\n const token = { ...item }\n if (isPoolData) {\n try {\n token.coin_a_address = extractStructTagFromType(token.coin_a_address).full_address\n token.coin_b_address = extractStructTagFromType(token.coin_b_address).full_address\n } catch (error) {\n //\n }\n } else {\n token.address = extractStructTagFromType(token.address).full_address\n }\n if (item.extensions) {\n const extensionsDataArray = item.extensions.contents\n\n for (const item of extensionsDataArray) {\n const { key } = item\n let { value } = item\n if (key === 'labels') {\n try {\n value = JSON.parse(decodeURIComponent(Base64.decode(value)))\n } catch (error) {}\n }\n if (key === 'pyth_id') {\n value = normalizeSuiObjectId(value)\n }\n token[key] = value\n }\n delete token.extensions\n }\n return token\n }\n\n /**\n * Updates the cache for the given key.\n *\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n *\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import BN from 'bn.js'\nimport Decimal from 'decimal.js'\nimport { v4 as uuidv4 } from 'uuid'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { PreSwapLpChangeParams, PreSwapWithMultiPoolParams } from '../types'\nimport { TickMath, ZERO } from '../math'\nimport axios, { AxiosRequestConfig } from 'axios'\nimport { ClmmpoolsError, MathErrorCode, RouterErrorCode } from '../errors/errors'\n\nexport type BasePath = {\n direction: boolean\n label: string\n poolAddress: string\n fromCoin: string\n toCoin: string\n feeRate: number\n outputAmount: number\n inputAmount: number\n currentSqrtPrice: BN\n fromDecimal: number\n toDecimal: number\n currentPrice: Decimal\n}\n\nexport type SplitPath = {\n percent: number\n inputAmount: number\n outputAmount: number\n pathIndex: number\n lastQuoteOutput: number\n basePaths: BasePath[]\n}\n\nexport type AggregatorResult = {\n isExceed: boolean\n isTimeout: boolean\n inputAmount: number\n outputAmount: number\n fromCoin: string\n toCoin: string\n byAmountIn: boolean\n splitPaths: SplitPath[]\n}\n\nexport class RouterModuleV2 implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n private calculatePrice(currentSqrtPrice: BN, fromDecimals: number, toDecimals: number, a2b: boolean, label: string): Decimal {\n const decimalA = a2b ? fromDecimals : toDecimals\n const decimalB = a2b ? toDecimals : fromDecimals\n if (label === 'Magma') {\n return TickMath.sqrtPriceX64ToPrice(currentSqrtPrice, decimalA, decimalB)\n }\n\n return new Decimal(currentSqrtPrice.toString()).div(new Decimal(10).pow(new Decimal(decimalB + 9 - decimalA)))\n }\n\n private parseJsonResult(data: any): AggregatorResult {\n const result: AggregatorResult = {\n isExceed: data.is_exceed,\n isTimeout: data.is_timeout,\n inputAmount: data.input_amount,\n outputAmount: data.output_amount,\n fromCoin: data.from_coin,\n toCoin: data.to_coin,\n byAmountIn: data.by_amount_in,\n splitPaths: data.split_paths.map((path: any) => {\n const splitPath: SplitPath = {\n pathIndex: path.path_index,\n lastQuoteOutput: path.last_quote_output,\n percent: path.percent,\n basePaths: path.best_path.map((basePath: any) => {\n return {\n direction: basePath.direction,\n label: basePath.label,\n poolAddress: basePath.provider,\n fromCoin: basePath.from_coin,\n toCoin: basePath.to_coin,\n outputAmount: basePath.output_amount,\n inputAmount: basePath.input_amount,\n feeRate: basePath.fee_rate,\n currentSqrtPrice: new BN(basePath.current_sqrt_price.toString()),\n afterSqrtPrice: basePath.label === 'Magma' ? new BN(basePath.after_sqrt_price.toString()) : ZERO,\n fromDecimal: basePath.from_decimal,\n toDecimal: basePath.to_decimal,\n currentPrice: this.calculatePrice(\n new BN(basePath.current_sqrt_price.toString()),\n basePath.from_decimal,\n basePath.to_decimal,\n basePath.direction,\n basePath.label\n ),\n }\n }),\n inputAmount: path.input_amount,\n outputAmount: path.output_amount,\n }\n return splitPath\n }),\n }\n return result\n }\n\n async fetchDataWithAxios(apiUrl: string, _options: AxiosRequestConfig, timeoutDuration: number) {\n try {\n const config: AxiosRequestConfig = {\n ..._options,\n timeout: timeoutDuration,\n }\n\n const response = await axios(apiUrl, config)\n\n if (response.status === 200) {\n return this.parseJsonResult(response.data)\n }\n\n return null\n } catch (error) {\n console.error(error)\n return null\n }\n }\n\n /**\n * Optimal routing method with fallback functionality.\n * This method first attempts to find the optimal route using the routing backend. If the optimal route is available, it will return this route.\n * If the optimal route is not available (for example, due to network issues or API errors), this method will activate a fallback mechanism,\n * and try to find a suboptimal route using the routing algorithm built into the SDK, which only includes clmm pool. This way, even if the optimal route is not available, this method can still provide a usable route.\n * This method uses a fallback strategy to ensure that it can provide the best available route when facing problems, rather than failing completely.\n *\n * @param {string} from Sold `from` coin\n * @param {string} from: get `to` coin\n * @param {number} from: the amount of sold coin\n * @param {boolena} byAmountIn:\n */\n async getBestRouter(\n from: string,\n to: string,\n amount: number,\n byAmountIn: boolean,\n priceSplitPoint: number,\n partner: string,\n /**\n * @deprecated don't need to pass, just use empty string.\n */\n _senderAddress?: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams,\n orderSplit = false,\n externalRouter = false,\n lpChanges: PreSwapLpChangeParams[] = []\n ) {\n let result = null\n let version = 'v2'\n let options: AxiosRequestConfig = {}\n let apiUrl = this.sdk.sdkOptions.aggregatorUrl\n if (lpChanges.length > 0) {\n const url = new URL(apiUrl)\n apiUrl = `${url.protocol}//${url.hostname}/router_with_lp_changes`\n options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n data: JSON.stringify({\n from,\n to,\n amount,\n by_amount_in: byAmountIn,\n order_split: orderSplit,\n external_router: externalRouter,\n sender_address: 'None',\n request_id: encodeURIComponent(uuidv4()),\n lp_changes: lpChanges,\n }),\n }\n } else {\n apiUrl = `\n ${apiUrl}?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}&amount=${encodeURIComponent(\n amount\n )}&by_amount_in=${encodeURIComponent(byAmountIn)}&order_split=${encodeURIComponent(orderSplit)}&external_router=${encodeURIComponent(\n externalRouter\n )}&sender_address=''&request_id=${encodeURIComponent(uuidv4())}\n `\n }\n\n result = await this.fetchDataWithAxios(apiUrl, options, 6000)\n\n if (result == null) {\n const priceResult: any = await this.sdk.Router.priceUseV1(\n from,\n to,\n new BN(amount),\n byAmountIn,\n priceSplitPoint,\n partner,\n swapWithMultiPoolParams\n )\n\n const splitPaths: SplitPath[] = []\n\n for (const path of priceResult.paths) {\n const basePaths: BasePath[] = []\n if (path.poolAddress.length > 1) {\n const fromDecimal0 = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal0 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal0, toDecimal0)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal0, fromDecimal0)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal: fromDecimal0,\n toDecimal: toDecimal0,\n }\n\n const fromDecimal1 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const toDecimal1 = this.sdk.Router.tokenInfo(path.coinType[2])!.decimals\n const currentPrice1 = path.a2b[1]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), fromDecimal1, toDecimal1)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), toDecimal1, fromDecimal1)\n\n const path1: BasePath = {\n direction: path.a2b[1],\n label: 'Magma',\n poolAddress: path.poolAddress[1],\n fromCoin: path.coinType[1],\n toCoin: path.coinType[2],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[1], path.coinType[2], path.poolAddress[1]),\n outputAmount: path.amountOut.toString(),\n inputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[1],\n currentPrice: currentPrice1,\n fromDecimal: fromDecimal1,\n toDecimal: toDecimal1,\n }\n\n basePaths.push(path0, path1)\n } else {\n const fromDecimal = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal, toDecimal)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal, fromDecimal)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: path.amountOut.toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal,\n toDecimal,\n }\n basePaths.push(path0)\n }\n const splitPath: SplitPath = {\n percent: (Number(path.amountIn) / Number(priceResult.amountIn)) * 100,\n inputAmount: Number(path.amountIn.toString()),\n outputAmount: Number(path.amountOut.toString()),\n pathIndex: 0,\n lastQuoteOutput: 0,\n basePaths,\n }\n splitPaths.push(splitPath)\n }\n\n const aggregatorResult: AggregatorResult = {\n isExceed: priceResult.isExceed,\n isTimeout: true,\n inputAmount: Number(priceResult.amountIn.toString()),\n outputAmount: Number(priceResult.amountOut.toString()),\n fromCoin: priceResult.coinTypeA,\n toCoin: priceResult.coinTypeC != null ? priceResult.coinTypeC : priceResult.coinTypeB,\n byAmountIn: priceResult.byAmountIn,\n splitPaths,\n }\n version = 'v1'\n result = aggregatorResult\n }\n\n return { result, version }\n }\n\n async getBestRouterByServer(\n from: string,\n to: string,\n amount: number,\n byAmountIn: boolean,\n /**\n * @deprecated don't need to pass, just use empty string.\n */\n _senderAddress?: string,\n orderSplit = false,\n externalRouter = false,\n lpChanges: PreSwapLpChangeParams[] = []\n ): Promise<AggregatorResult> {\n let result = null\n let options: AxiosRequestConfig = {}\n let apiUrl = this.sdk.sdkOptions.aggregatorUrl\n if (lpChanges.length > 0) {\n const url = new URL(apiUrl)\n apiUrl = `${url.protocol}//${url.hostname}/router_with_lp_changes`\n options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n data: JSON.stringify({\n from,\n to,\n amount,\n by_amount_in: byAmountIn,\n order_split: orderSplit,\n external_router: externalRouter,\n sender_address: 'None',\n request_id: encodeURIComponent(uuidv4()),\n lp_changes: lpChanges,\n }),\n }\n } else {\n apiUrl = `\n ${apiUrl}?from=${encodeURIComponent(from)}&to=${encodeURIComponent(to)}&amount=${encodeURIComponent(\n amount\n )}&by_amount_in=${encodeURIComponent(byAmountIn)}&order_split=${encodeURIComponent(orderSplit)}&external_router=${encodeURIComponent(\n externalRouter\n )}&sender_address=''&request_id=${encodeURIComponent(uuidv4())}\n `\n }\n\n result = await this.fetchDataWithAxios(apiUrl, options, 6000)\n\n if (result == null) {\n throw new ClmmpoolsError('Invalid server response', RouterErrorCode.InvalidServerResponse)\n }\n\n return result\n }\n\n async getBestRouterByRpc(\n from: string,\n to: string,\n amount: number,\n byAmountIn: boolean,\n priceSplitPoint: number,\n partner: string,\n swapWithMultiPoolParams?: PreSwapWithMultiPoolParams\n ): Promise<AggregatorResult> {\n const priceResult: any = await this.sdk.Router.priceUseV1(\n from,\n to,\n new BN(amount),\n byAmountIn,\n priceSplitPoint,\n partner,\n swapWithMultiPoolParams\n )\n\n const splitPaths: SplitPath[] = []\n\n for (const path of priceResult.paths) {\n const basePaths: BasePath[] = []\n if (path.poolAddress.length > 1) {\n const fromDecimal0 = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal0 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal0, toDecimal0)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal0, fromDecimal0)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal: fromDecimal0,\n toDecimal: toDecimal0,\n }\n\n const fromDecimal1 = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const toDecimal1 = this.sdk.Router.tokenInfo(path.coinType[2])!.decimals\n const currentPrice1 = path.a2b[1]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), fromDecimal1, toDecimal1)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[1]), toDecimal1, fromDecimal1)\n\n const path1: BasePath = {\n direction: path.a2b[1],\n label: 'Magma',\n poolAddress: path.poolAddress[1],\n fromCoin: path.coinType[1],\n toCoin: path.coinType[2],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[1], path.coinType[2], path.poolAddress[1]),\n outputAmount: path.amountOut.toString(),\n inputAmount: priceResult.byAmountIn ? path.rawAmountLimit[0].toString() : path.rawAmountLimit[1].toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[1],\n currentPrice: currentPrice1,\n fromDecimal: fromDecimal1,\n toDecimal: toDecimal1,\n }\n\n basePaths.push(path0, path1)\n } else {\n const fromDecimal = this.sdk.Router.tokenInfo(path.coinType[0])!.decimals\n const toDecimal = this.sdk.Router.tokenInfo(path.coinType[1])!.decimals\n const currentPrice = path.a2b[0]\n ? TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), fromDecimal, toDecimal)\n : TickMath.sqrtPriceX64ToPrice(new BN(priceResult.currentSqrtPrice[0]), toDecimal, fromDecimal)\n\n const path0: BasePath = {\n direction: path.a2b[0],\n label: 'Magma',\n poolAddress: path.poolAddress[0],\n fromCoin: path.coinType[0],\n toCoin: path.coinType[1],\n feeRate: this.sdk.Router.getFeeRate(path.coinType[0], path.coinType[1], path.poolAddress[0]),\n outputAmount: path.amountOut.toString(),\n inputAmount: path.amountIn.toString(),\n currentSqrtPrice: priceResult.currentSqrtPrice[0],\n currentPrice,\n fromDecimal,\n toDecimal,\n }\n basePaths.push(path0)\n }\n const splitPath: SplitPath = {\n percent: (Number(path.amountIn) / Number(priceResult.amountIn)) * 100,\n inputAmount: Number(path.amountIn.toString()),\n outputAmount: Number(path.amountOut.toString()),\n pathIndex: 0,\n lastQuoteOutput: 0,\n basePaths,\n }\n splitPaths.push(splitPath)\n }\n\n const aggregatorResult: AggregatorResult = {\n isExceed: priceResult.isExceed,\n isTimeout: true,\n inputAmount: Number(priceResult.amountIn.toString()),\n outputAmount: Number(priceResult.amountOut.toString()),\n fromCoin: priceResult.coinTypeA,\n toCoin: priceResult.coinTypeC != null ? priceResult.coinTypeC : priceResult.coinTypeB,\n byAmountIn: priceResult.byAmountIn,\n splitPaths,\n }\n\n return aggregatorResult\n }\n}\n","import { SuiObjectResponse } from '@mysten/sui/client'\nimport { normalizeSuiObjectId } from '@mysten/sui/utils'\nimport { Base64 } from 'js-base64'\nimport { ClmmpoolsError, ConfigErrorCode } from '../errors/errors'\nimport { IModule } from '../interfaces/IModule'\nimport { MagmaClmmSDK } from '../sdk'\nimport { MagmaConfigs, ClmmPoolConfig, CoinConfig, LaunchpadPoolConfig, getPackagerConfigs } from '../types'\nimport { SuiAddressType, SuiResource } from '../types/sui'\nimport { CachedContent, cacheTime24h, cacheTime5min, getFutureTime } from '../utils/cachedContent'\nimport { extractStructTagFromType, fixCoinType, normalizeCoinType } from '../utils/contracts'\nimport { getObjectFields, getObjectId, getObjectPreviousTransactionDigest, getObjectType } from '../utils/objects'\n\n/**\n * Helper class to help interact with clmm pool and coin and launchpad pool config.\n */\nexport class ConfigModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n /**\n * Set default token list cache.\n * @param {CoinConfig[]}coinList\n */\n setTokenListCache(coinList: CoinConfig[]) {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n const updatedCacheData = cacheData ? [...cacheData, ...coinList] : coinList\n this.updateCache(cacheKey, updatedCacheData, cacheTime24h)\n }\n\n /**\n * Get token config list by coin type list.\n * @param {SuiAddressType[]} coinTypes Coin type list.\n * @returns {Promise<Record<string, CoinConfig>>} Token config map.\n */\n async getTokenListByCoinTypes(coinTypes: SuiAddressType[]): Promise<Record<string, CoinConfig>> {\n const tokenMap: Record<string, CoinConfig> = {}\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey)\n\n if (cacheData !== undefined) {\n const tokenList = cacheData\n for (const coinType of coinTypes) {\n for (const token of tokenList) {\n if (normalizeCoinType(coinType) === normalizeCoinType(token.address)) {\n tokenMap[coinType] = token\n continue\n }\n }\n }\n }\n\n const unFoundArray = coinTypes.filter((coinType: string) => {\n return tokenMap[coinType] === undefined\n })\n\n for (const coinType of unFoundArray) {\n const metadataKey = `${coinType}_metadata`\n const metadata = this.getCache<CoinConfig>(metadataKey)\n if (metadata !== undefined) {\n tokenMap[coinType] = metadata as CoinConfig\n } else {\n const data = await this._sdk.fullClient.getCoinMetadata({\n coinType,\n })\n if (data) {\n const token: CoinConfig = {\n id: data.id as string,\n pyth_id: '',\n name: data.name,\n symbol: data.symbol,\n official_symbol: data.symbol,\n coingecko_id: '',\n decimals: data.decimals,\n project_url: '',\n logo_url: data.iconUrl as string,\n address: coinType,\n }\n tokenMap[coinType] = token\n\n this.updateCache(metadataKey, token, cacheTime24h)\n } else {\n console.log(`not found ${coinType}`)\n }\n }\n }\n\n return tokenMap\n }\n\n /**\n * Get coin config list.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n * @param {boolean} transformExtensions Whether to transform extensions.\n * @returns {Promise<CoinConfig[]>} Coin config list.\n */\n async getCoinConfigs(forceRefresh = false, transformExtensions = true): Promise<CoinConfig[]> {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_getCoinConfigs`\n const cacheData = this.getCache<CoinConfig[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.fullClient.getDynamicFieldsByPage(coin_list_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n const coinList: CoinConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const coin = this.buildCoinConfig(object, transformExtensions)\n this.updateCache(`${coin_list_handle}_${coin.address}_getCoinConfig`, coin, cacheTime24h)\n coinList.push({ ...coin })\n })\n this.updateCache(cacheKey, coinList, cacheTime24h)\n return coinList\n }\n\n /**\n * Get coin config by coin type.\n * @param {string} coinType Coin type.\n * @param {boolean} forceRefresh Whether to force a refresh of the cache entry.\n * @param {boolean} transformExtensions Whether to transform extensions.\n * @returns {Promise<CoinConfig>} Coin config.\n */\n async getCoinConfig(coinType: string, forceRefresh = false, transformExtensions = true): Promise<CoinConfig> {\n const { coin_list_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${coin_list_handle}_${coinType}_getCoinConfig`\n const cacheData = this.getCache<CoinConfig>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: coin_list_handle,\n name: {\n type: '0x1::type_name::TypeName',\n value: {\n name: fixCoinType(coinType),\n },\n },\n })\n\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getCoinConfig get object error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const coin = this.buildCoinConfig(object, transformExtensions)\n this.updateCache(cacheKey, coin, cacheTime24h)\n return coin\n }\n\n /**\n * Build coin config.\n * @param {SuiObjectResponse} object Coin object.\n * @param {boolean} transformExtensions Whether to transform extensions.\n * @returns {CoinConfig} Coin config.\n */\n private buildCoinConfig(object: SuiObjectResponse, transformExtensions = true) {\n let fields = getObjectFields(object)\n\n fields = fields.value.fields\n const coin: any = { ...fields }\n\n coin.id = getObjectId(object)\n coin.address = extractStructTagFromType(fields.coin_type.fields.name).full_address\n if (fields.pyth_id) {\n coin.pyth_id = normalizeSuiObjectId(fields.pyth_id)\n }\n\n this.transformExtensions(coin, fields.extension_fields.fields.contents, transformExtensions)\n\n delete coin.coin_type\n return coin\n }\n\n /**\n * Get clmm pool config list.\n * @param forceRefresh\n * @returns\n */\n async getClmmPoolConfigs(forceRefresh = false, transformExtensions = true): Promise<ClmmPoolConfig[]> {\n const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${clmm_pools_handle}_getClmmPoolConfigs`\n const cacheData = this.getCache<ClmmPoolConfig[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.fullClient.getDynamicFieldsByPage(clmm_pools_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n const poolList: ClmmPoolConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getClmmPoolsConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const pool = this.buildClmmPoolConfig(object, transformExtensions)\n this.updateCache(`${pool.pool_address}_getClmmPoolConfig`, pool, cacheTime24h)\n poolList.push({ ...pool })\n })\n this.updateCache(cacheKey, poolList, cacheTime24h)\n return poolList\n }\n\n async getClmmPoolConfig(poolAddress: string, forceRefresh = false, transformExtensions = true): Promise<ClmmPoolConfig> {\n const { clmm_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${poolAddress}_getClmmPoolConfig`\n const cacheData = this.getCache<ClmmPoolConfig>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: clmm_pools_handle,\n name: {\n type: 'address',\n value: poolAddress,\n },\n })\n const pool = this.buildClmmPoolConfig(object, transformExtensions)\n this.updateCache(cacheKey, pool, cacheTime24h)\n return pool\n }\n\n private buildClmmPoolConfig(object: SuiObjectResponse, transformExtensions = true) {\n let fields = getObjectFields(object)\n fields = fields.value.fields\n const pool: any = { ...fields }\n\n pool.id = getObjectId(object)\n pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n this.transformExtensions(pool, fields.extension_fields.fields.contents, transformExtensions)\n return pool\n }\n\n /**\n * Get launchpad pool config list.\n * @param forceRefresh\n * @returns\n */\n async getLaunchpadPoolConfigs(forceRefresh = false, transformExtensions = true): Promise<LaunchpadPoolConfig[]> {\n const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${launchpad_pools_handle}_getLaunchpadPoolConfigs`\n const cacheData = this.getCache<LaunchpadPoolConfig[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const res = await this._sdk.fullClient.getDynamicFieldsByPage(launchpad_pools_handle)\n const warpIds = res.data.map((item: any) => {\n return item.objectId\n })\n const objects = await this._sdk.fullClient.batchGetObjects(warpIds, { showContent: true })\n const poolList: LaunchpadPoolConfig[] = []\n objects.forEach((object) => {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getCoinConfigs get objects error: ${object.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfig\n )\n }\n\n const pool = this.buildLaunchpadPoolConfig(object, transformExtensions)\n this.updateCache(`${pool.pool_address}_getLaunchpadPoolConfig`, pool, cacheTime24h)\n poolList.push({ ...pool })\n })\n this.updateCache(cacheKey, poolList, cacheTime24h)\n return poolList\n }\n\n async getLaunchpadPoolConfig(poolAddress: string, forceRefresh = false, transformExtensions = true): Promise<LaunchpadPoolConfig> {\n const { launchpad_pools_handle } = getPackagerConfigs(this.sdk.sdkOptions.magma_config)\n const cacheKey = `${poolAddress}_getLaunchpadPoolConfig`\n const cacheData = this.getCache<LaunchpadPoolConfig>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n const object = await this._sdk.fullClient.getDynamicFieldObject({\n parentId: launchpad_pools_handle,\n name: {\n type: 'address',\n value: poolAddress,\n },\n })\n const pool = this.buildLaunchpadPoolConfig(object, transformExtensions)\n this.updateCache(cacheKey, pool, cacheTime24h)\n return pool\n }\n\n private buildLaunchpadPoolConfig(object: SuiObjectResponse, transformExtensions = true) {\n let fields = getObjectFields(object)\n fields = fields.value.fields\n const pool: any = { ...fields }\n\n pool.id = getObjectId(object)\n pool.pool_address = normalizeSuiObjectId(fields.pool_address)\n\n this.transformExtensions(pool, fields.extension_fields.fields.contents, transformExtensions)\n const social_medias: {\n name: string\n link: string\n }[] = []\n fields.social_media.fields.contents.forEach((item: any) => {\n social_medias.push({\n name: item.fields.value.fields.name,\n link: item.fields.value.fields.link,\n })\n })\n pool.social_media = social_medias\n try {\n pool.regulation = decodeURIComponent(Base64.decode(pool.regulation).replace(/%/g, '%25'))\n } catch (error) {\n pool.regulation = Base64.decode(pool.regulation)\n }\n\n return pool\n }\n\n private transformExtensions(coin: any, dataArray: any[], transformExtensions = true) {\n const extensions: any[] = []\n for (const item of dataArray) {\n const { key } = item.fields\n let { value } = item.fields\n if (key === 'labels') {\n try {\n const decodedValue = decodeURIComponent(Base64.decode(value))\n try {\n value = JSON.parse(decodedValue)\n } catch {\n value = decodedValue\n }\n } catch (error) {}\n }\n if (transformExtensions) {\n coin[key] = value\n }\n extensions.push({\n key,\n value,\n })\n }\n delete coin.extension_fields\n\n if (!transformExtensions) {\n coin.extensions = extensions\n }\n }\n\n /**\n * Get the token config event.\n *\n * @param forceRefresh Whether to force a refresh of the event.\n * @returns The token config event.\n */\n async getMagmaConfig(forceRefresh = false): Promise<MagmaConfigs> {\n const packageObjectId = this._sdk.sdkOptions.magma_config.package_id\n const cacheKey = `${packageObjectId}_getMagmaConfig`\n\n const cacheData = this.getCache<MagmaConfigs>(cacheKey, forceRefresh)\n\n if (cacheData !== undefined) {\n return cacheData\n }\n\n const packageObject = await this._sdk.fullClient.getObject({\n id: packageObjectId,\n options: {\n showPreviousTransaction: true,\n },\n })\n\n const previousTx = getObjectPreviousTransactionDigest(packageObject) as string\n const objects = await this._sdk.fullClient.queryEventsByPage({ Transaction: previousTx })\n let tokenConfig: MagmaConfigs = {\n coin_list_id: '',\n launchpad_pools_id: '',\n clmm_pools_id: '',\n admin_cap_id: '',\n coin_list_handle: '',\n launchpad_pools_handle: '',\n clmm_pools_handle: '',\n }\n\n if (objects.data.length > 0) {\n for (const item of objects.data) {\n const formatType = extractStructTagFromType(item.type)\n switch (formatType.name) {\n case `InitCoinListEvent`:\n tokenConfig.coin_list_id = item.parsedJson.coin_list_id\n break\n case `InitLaunchpadPoolsEvent`:\n tokenConfig.launchpad_pools_id = item.parsedJson.launchpad_pools_id\n break\n case `InitClmmPoolsEvent`:\n tokenConfig.clmm_pools_id = item.parsedJson.pools_id\n break\n case `InitConfigEvent`:\n tokenConfig.admin_cap_id = item.parsedJson.admin_cap_id\n break\n default:\n break\n }\n }\n }\n tokenConfig = await this.getMagmaConfigHandle(tokenConfig)\n if (tokenConfig.clmm_pools_id.length > 0) {\n this.updateCache(cacheKey, tokenConfig, cacheTime24h)\n }\n return tokenConfig\n }\n\n private async getMagmaConfigHandle(tokenConfig: MagmaConfigs): Promise<MagmaConfigs> {\n const warpIds = [tokenConfig.clmm_pools_id, tokenConfig.coin_list_id, tokenConfig.launchpad_pools_id]\n\n const res = await this._sdk.fullClient.multiGetObjects({ ids: warpIds, options: { showContent: true } })\n\n res.forEach((item) => {\n if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(\n `when getMagmaConfigHandle get objects error: ${item.error}, please check the rpc and contracts address config.`,\n ConfigErrorCode.InvalidConfigHandle\n )\n }\n\n const fields = getObjectFields(item)\n const type = getObjectType(item) as string\n switch (extractStructTagFromType(type).name) {\n case 'ClmmPools':\n tokenConfig.clmm_pools_handle = fields.pools.fields.id.id\n break\n case 'CoinList':\n tokenConfig.coin_list_handle = fields.coins.fields.id.id\n break\n case 'LaunchpadPools':\n tokenConfig.launchpad_pools_handle = fields.pools.fields.id.id\n break\n default:\n break\n }\n })\n\n return tokenConfig\n }\n\n /**\n * Updates the cache for the given key.\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n try {\n const cacheData = this._cache[key]\n if (!cacheData) {\n return undefined // No cache data available\n }\n\n if (forceRefresh || !cacheData.isValid()) {\n delete this._cache[key]\n return undefined\n }\n\n return cacheData.value as T\n } catch (error) {\n console.error(`Error accessing cache for key ${key}:`, error)\n return undefined\n }\n }\n}\n","import { Inputs, Transaction } from '@mysten/sui/transactions'\nimport {\n DevInspectResults,\n DynamicFieldPage,\n PaginatedEvents,\n PaginatedObjectsResponse,\n SuiClient,\n SuiEventFilter,\n SuiObjectDataOptions,\n SuiObjectResponse,\n SuiObjectResponseQuery,\n SuiTransactionBlockResponse,\n} from '@mysten/sui/client'\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519'\nimport { Secp256k1Keypair } from '@mysten/sui/keypairs/secp256k1'\n\nimport { bcs } from '@mysten/sui/bcs'\nimport { toB64 } from '@mysten/bcs'\nimport { DataPage, PaginationArgs, SuiObjectIdType } from '../types'\n\n/**\n * Represents a module for making RPC (Remote Procedure Call) requests.\n */\nexport class RpcModule extends SuiClient {\n /**\n * Get events for a given query criteria\n * @param query\n * @param paginationArgs\n * @returns\n */\n async queryEventsByPage(query: SuiEventFilter, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n\n do {\n const res: PaginatedEvents = await this.queryEvents({\n query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Get all objects owned by an address\n * @param owner\n * @param query\n * @param paginationArgs\n * @returns\n */\n async getOwnedObjectsByPage(\n owner: string,\n query: SuiObjectResponseQuery,\n paginationArgs: PaginationArgs = 'all'\n ): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: PaginatedObjectsResponse = await this.getOwnedObjects({\n owner,\n ...query,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Return the list of dynamic field objects owned by an object\n * @param parentId\n * @param paginationArgs\n * @returns\n */\n async getDynamicFieldsByPage(parentId: SuiObjectIdType, paginationArgs: PaginationArgs = 'all'): Promise<DataPage<any>> {\n let result: any = []\n let hasNextPage = true\n const queryAll = paginationArgs === 'all'\n let nextCursor = queryAll ? null : paginationArgs.cursor\n do {\n const res: DynamicFieldPage = await this.getDynamicFields({\n parentId,\n cursor: nextCursor,\n limit: queryAll ? null : paginationArgs.limit,\n })\n\n if (res.data) {\n result = [...result, ...res.data]\n hasNextPage = res.hasNextPage\n nextCursor = res.nextCursor\n } else {\n hasNextPage = false\n }\n } while (queryAll && hasNextPage)\n\n return { data: result, nextCursor, hasNextPage }\n }\n\n /**\n * Batch get details about a list of objects. If any of the object ids are duplicates the call will fail\n * @param ids\n * @param options\n * @param limit\n * @returns\n */\n async batchGetObjects(ids: SuiObjectIdType[], options?: SuiObjectDataOptions, limit = 50): Promise<SuiObjectResponse[]> {\n let objectDataResponses: SuiObjectResponse[] = []\n\n try {\n for (let i = 0; i < Math.ceil(ids.length / limit); i++) {\n const res = await this.multiGetObjects({\n ids: ids.slice(i * limit, limit * (i + 1)),\n options,\n })\n objectDataResponses = [...objectDataResponses, ...res]\n }\n } catch (error) {\n console.log(error)\n }\n\n return objectDataResponses\n }\n\n /**\n * Calculates the gas cost of a transaction block.\n * @param {Transaction} tx - The transaction block to calculate gas for.\n * @returns {Promise<number>} - The estimated gas cost of the transaction block.\n * @throws {Error} - Throws an error if the sender is empty.\n */\n async calculationTxGas(tx: Transaction): Promise<number> {\n const { sender } = tx.blockData\n\n if (sender === undefined) {\n throw Error('sdk sender is empty')\n }\n\n const devResult = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender,\n })\n const { gasUsed } = devResult.effects\n\n const estimateGas = Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate)\n return estimateGas\n }\n\n /**\n * Sends a transaction block after signing it with the provided keypair.\n *\n * @param {Ed25519Keypair | Secp256k1Keypair} keypair - The keypair used for signing the transaction.\n * @param {Transaction} tx - The transaction block to send.\n * @returns {Promise<SuiTransactionBlockResponse | undefined>} - The response of the sent transaction block.\n */\n async sendTransaction(keypair: Ed25519Keypair | Secp256k1Keypair, tx: Transaction): Promise<SuiTransactionBlockResponse | undefined> {\n try {\n const resultTxn: any = await this.signAndExecuteTransaction({\n transaction: tx,\n signer: keypair,\n options: {\n showEffects: true,\n showEvents: true,\n },\n })\n return resultTxn\n } catch (error) {\n console.log('error: ', error)\n }\n return undefined\n }\n\n /**\n * Send a simulation transaction.\n * @param tx - The transaction block.\n * @param simulationAccount - The simulation account.\n * @param useDevInspect - A flag indicating whether to use DevInspect. Defaults to true.\n * @returns A promise that resolves to DevInspectResults or undefined.\n */\n async sendSimulationTransaction(\n tx: Transaction,\n simulationAccount: string,\n useDevInspect = true\n ): Promise<DevInspectResults | undefined> {\n try {\n if (useDevInspect) {\n const simulateRes = await this.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount,\n })\n return simulateRes\n }\n\n // If useDevInspect is false, manually construct the transaction for simulation.\n // const inputs = tx.inputs.map((input) => {\n // const { type, value } = input\n // if (type === 'object') {\n // return Inputs.SharedObjectRef({\n // objectId: value,\n // initialSharedVersion: 0,\n // mutable: true,\n // })\n // }\n // return value\n // })\n\n // const kind = {\n // ProgrammableTransaction: {\n // inputs,\n // transactions: tx,\n // },\n // }\n // // Serialize the transaction using BCS.\n // const serialize = bcs.TransactionKind.serialize(kind, {\n // maxSize: 131072,\n // }).toBytes()\n\n // const devInspectTxBytes = toB64(serialize)\n // // Send the request to DevInspect.\n // const res = await this.transport.request<DevInspectResults>({\n // method: 'sui_devInspectTransactionBlock',\n // params: [simulationAccount, devInspectTxBytes, null, null],\n // })\n // return res\n } catch (error) {\n console.log('devInspectTransactionBlock error', error)\n }\n\n return undefined\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport {\n CLOCK_ADDRESS,\n DepositPosition,\n EpochEmission,\n Gauge,\n getPackagerConfigs,\n GetRewardByPosition,\n Minter,\n StakedPositionOfPool,\n Voter,\n WithdrawPosition,\n} from '../types'\nimport { IModule } from '../interfaces/IModule'\nimport { MagmaClmmSDK } from '../sdk'\nimport { asIntN, extractStructTagFromType, getObjectType } from '../utils'\n\nexport class GaugeModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async depositPosition(params: DepositPosition): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const poolGauge = await this.getPoolGaguers()\n const gauge = poolGauge.get(params.poolId)\n if (gauge === undefined) {\n throw Error(`Fetch gauge of pool ${params.poolId} failed`)\n }\n\n const { distribution_cfg, magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const clmmConfig = getPackagerConfigs(clmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [\n tx.object(clmmConfig.global_config_id),\n tx.object(distribution_cfg),\n tx.object(gauge),\n tx.object(params.poolId),\n tx.object(params.positionId),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::deposit_position`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async withdrawPosition(params: WithdrawPosition): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const poolGauge = await this.sdk.Gauge.getPoolGaguers()\n const gauge = poolGauge.get(params.poolId)\n if (gauge === undefined) {\n throw Error(`Fetch gauge of pool ${params.poolId} failed`)\n }\n\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n const { integrate } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [tx.object(gauge), tx.object(params.poolId), tx.object(params.positionId), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::withdraw_position`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async getUserStakedPositionInfo(userAddr: string): Promise<StakedPositionOfPool[]> {\n const poolGauger = await this.getPoolGaguers()\n const poolCoins = await this.getPoolCoins([...poolGauger.keys()])\n\n const res: StakedPositionOfPool[] = []\n for (const [pool, gauger] of poolGauger) {\n const coins = poolCoins.get(pool)\n if (coins === undefined) {\n console.log(`Failed to get coins of pool: ${pool}`)\n continue\n }\n\n const stakedPositionOfPool = await this.getUserStakedPositionInfoOfPool(userAddr, pool, gauger, coins[0], coins[1])\n console.log('stakedPositionOfPool', stakedPositionOfPool)\n stakedPositionOfPool.forEach((value) => {\n ;(value.infos as any[]).forEach((info) => {\n if (info.info) {\n if (res.findIndex((position) => position.pos_object_id === info.info.fields.position_id) === -1) {\n res.push({\n coin_type_a: coins[0],\n coin_type_b: coins[1],\n liquidity: info.info.fields.liquidity,\n tick_lower_index: asIntN(BigInt(info.info.fields.tick_lower_index.fields.bits)),\n tick_upper_index: asIntN(BigInt(info.info.fields.tick_upper_index.fields.bits)),\n pos_object_id: info.info.fields.position_id,\n magma_distribution_staked: info.info.fields.magma_distribution_staked,\n pool: info.pool_id,\n earned: info.earned,\n name: info.name,\n })\n }\n }\n })\n })\n }\n\n return res\n }\n\n async getUserStakedPositionInfoOfPool(userAddr: string, pool: string, gauger: string, poolCoinA: string, poolCoinB: string) {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [poolCoinA, poolCoinB, magma_token]\n\n const args = [tx.object(voter_id), tx.object(gauger), tx.object(pool), tx.pure.address(userAddr), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::user_staked_position_infos`,\n arguments: args,\n typeArguments,\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 Error(`user_staked_position_infos error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const res: any[] = []\n\n simulateRes.events?.forEach((item: any) => {\n res.push(item.parsedJson)\n })\n\n return res\n }\n\n async getPoolGaguers() {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [magma_token]\n const args = [tx.object(voter_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Voter}::pools_gauges`,\n arguments: args,\n typeArguments,\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 Error(`getPoolGaguers error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const poolGauger = new Map<string, string>()\n simulateRes.events?.forEach((item: any) => {\n const { gauges } = item.parsedJson\n item.parsedJson.pools.map((pool: string, index: string) => {\n poolGauger.set(pool, gauges[index])\n })\n })\n\n // console.log('##### ', poolGauger)\n return poolGauger\n }\n\n async getPoolCoins(pools: string[]) {\n const res = await this._sdk.fullClient.multiGetObjects({ ids: pools, options: { showContent: true } })\n\n const poolCoins = new Map<string, string[]>()\n\n res.forEach((item) => {\n if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n throw new Error(`Failed to get poolCoins with err: ${item.error}`)\n }\n\n const type = getObjectType(item) as string\n const poolTypeFields = extractStructTagFromType(type)\n\n poolCoins.set(item.data.objectId, poolTypeFields.type_arguments)\n })\n return poolCoins\n }\n\n async getEmissions() {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, minter_id, voting_escrow_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [magma_token]\n\n const args = [tx.object(minter_id), tx.object(voting_escrow_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Minter}::emissions`,\n arguments: args,\n typeArguments,\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 Error(`all_lock_summary error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: EpochEmission = {\n emission: 0,\n rebase: 0,\n total_supply: 0,\n total_locked: 0,\n }\n simulateRes.events?.forEach((item: any) => {\n res = {\n emission: item.parsedJson.emission,\n rebase: item.parsedJson.rebase,\n total_supply: item.parsedJson.total_supply,\n total_locked: item.parsedJson.total_locked,\n }\n })\n\n return res\n }\n\n async getRewardByPosition(params: GetRewardByPosition): Promise<Transaction> {\n const tx = new Transaction()\n const { integrate } = this.sdk.sdkOptions\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [tx.object(params.gaugeId), tx.object(params.poolId), tx.object(params.positionId), tx.object(CLOCK_ADDRESS)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::get_reward_by_position`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n async getAllRewardByPositions(paramsList: GetRewardByPosition[]): Promise<Transaction> {\n const tx = new Transaction()\n const { integrate } = this.sdk.sdkOptions\n const { magma_token } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n paramsList.forEach((params) => {\n const typeArguments = [params.coinTypeA, params.coinTypeB, magma_token]\n const args = [tx.object(params.gaugeId), tx.object(params.poolId), tx.object(params.positionId), tx.object(CLOCK_ADDRESS)]\n tx.moveCall({\n target: `${integrate.published_at}::${Gauge}::get_reward_by_position`,\n arguments: args,\n typeArguments,\n })\n })\n\n return tx\n }\n\n async getEpochRewardByPool(pool: string, incentive_tokens: string[]): Promise<Map<string, string>> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n const { magma_token, voter_id } = getPackagerConfigs(this.sdk.sdkOptions.ve33)\n\n const typeArguments = [magma_token, ...incentive_tokens]\n\n const args = [tx.object(voter_id), tx.object(pool), tx.object(CLOCK_ADDRESS)]\n\n let targetFunc = `${integrate.published_at}::${Voter}::epoch_reward_by_pool${incentive_tokens.length}`\n if (incentive_tokens.length === 1) {\n targetFunc = `${integrate.published_at}::${Voter}::epoch_reward_by_pool`\n }\n\n tx.moveCall({\n target: targetFunc,\n arguments: args,\n typeArguments,\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 Error(`getEpochRewardByPool error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const res = new Map<string, string>()\n\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPoolIncentivesAmount`) {\n res.set(item.parsedJson.token, item.parsedJson.amount)\n }\n })\n\n return res\n }\n}\n","import { Transaction } from '@mysten/sui/transactions'\nimport { SuiObjectResponse } from '@mysten/sui/client'\nimport {\n get_price_x128_from_real_id,\n get_real_id,\n get_real_id_from_price_x128,\n get_storage_id_from_real_id,\n} from '@magmaprotocol/calc_dlmm'\nimport Decimal from 'decimal.js'\nimport { BinMath } from '../math'\nimport {\n EventBin,\n CreatePairParams,\n FetchBinsParams,\n MintAmountParams,\n MintPercentParams,\n DLMMSwapParams,\n EventPositionLiquidity,\n GetPositionLiquidityParams,\n EventPairLiquidity,\n GetPairLiquidityParams,\n FetchPairParams,\n EventPairParams,\n DlmmPoolInfo,\n DlmmAddLiquidityParams,\n DlmmBurnPositionParams,\n DlmmShrinkPosition,\n DlmmCollectRewardParams,\n DlmmCollectFeeParams,\n DlmmEventEarnedFees,\n DlmmRewardsParams,\n DlmmEventEarnedRewards,\n GetPairRewarderParams,\n DlmmEventPairRewardTypes,\n DlmmCreatePairAddLiquidityParams,\n DlmmPosition,\n DlmmPositionInfo,\n MintByStrategyParams,\n} from '../types/dlmm'\nimport {\n CachedContent,\n cacheTime24h,\n cacheTime5min,\n extractStructTagFromType,\n getFutureTime,\n getObjectFields,\n getObjectOwner,\n getObjectType,\n TransactionUtil,\n} from '../utils'\nimport { CLOCK_ADDRESS, DlmmScript, getPackagerConfigs, SuiResource } from '../types'\nimport { MagmaClmmSDK } from '../sdk'\nimport { IModule } from '../interfaces/IModule'\nimport { ClmmpoolsError, PositionErrorCode, TypesErrorCode } from '../errors/errors'\n\nexport class DlmmModule implements IModule {\n protected _sdk: MagmaClmmSDK\n\n private readonly _cache: Record<string, CachedContent> = {}\n\n constructor(sdk: MagmaClmmSDK) {\n this._sdk = sdk\n }\n\n get sdk() {\n return this._sdk\n }\n\n async getPoolInfo(pools: string[]): Promise<DlmmPoolInfo[]> {\n const objects = await this._sdk.fullClient.batchGetObjects(pools, { showContent: true })\n\n const poolList: DlmmPoolInfo[] = []\n objects.forEach((obj) => {\n if (obj.error != null || obj.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Invalid objects. error: ${obj.error}`, TypesErrorCode.InvalidType)\n }\n\n const fields = getObjectFields(obj)\n poolList.push({\n pool_id: fields.id.id,\n bin_step: fields.bin_step,\n coin_a: fields.x.fields.name,\n coin_b: fields.y.fields.name,\n base_factor: fields.params.fields.base_factor,\n base_fee: (fields.params.fields.base_factor / 10000) * (fields.bin_step / 10000),\n active_index: fields.params.fields.active_index,\n real_bin_id: get_real_id(fields.params.fields.active_index),\n coinAmountA: fields.reserve_x,\n coinAmountB: fields.reserve_y\n })\n })\n\n return poolList\n }\n\n // eg: fetch pool active_index\n async fetchPairParams(params: FetchPairParams): Promise<EventPairParams> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::fetch_pair_params`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: EventPairParams = {\n base_factor: 0,\n filter_period: 0,\n decay_period: 0,\n reduction_factor: 0,\n variable_fee_control: 0,\n protocol_share: 0,\n max_volatility_accumulator: 0,\n volatility_accumulator: 0,\n volatility_reference: 0,\n index_reference: 0,\n time_of_last_update: 0,\n oracle_index: 0,\n active_index: 0,\n }\n simulateRes.events?.forEach((item: any) => {\n console.log(extractStructTagFromType(item.type).name)\n if (extractStructTagFromType(item.type).name === `EventPairParams`) {\n res = item.parsedJson.params\n }\n })\n\n return res\n }\n\n // NOTE: x, y should be sorted\n async createPairPayload(params: CreatePairParams): Promise<Transaction> {\n const storage_id = get_storage_id_from_real_id(\n BinMath.getBinIdFromPrice(params.priceTokenBPerTokenA, params.bin_step, params.coinADecimal, params.coinBDecimal)\n )\n\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { clmm_pool, dlmm_pool, integrate } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [\n tx.object(dlmmConfig.factory),\n tx.object(global_config_id),\n tx.pure.u64(params.base_fee),\n tx.pure.u16(params.bin_step),\n tx.pure.u32(storage_id),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::create_pair`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async mintByStrategy(params: MintByStrategyParams): Promise<Transaction> {\n if (params.fixCoinA && params.fixCoinB) {\n if (params.amountATotal === 0 || params.amountBTotal === 0) {\n if (params.active_bin < params.max_bin && params.active_bin > params.min_bin) {\n if (params.amountATotal > 0) {\n params.min_bin = params.active_bin\n } else if (params.amountBTotal > 0) {\n params.max_bin = params.active_bin\n }\n }\n }\n }\n\n const tx = new Transaction()\n const slippage = new Decimal(params.slippage)\n const lower_slippage = new Decimal(1).sub(slippage.div(new Decimal(10000)))\n const upper_slippage = new Decimal(1).plus(slippage.div(new Decimal(10000)))\n\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const price = get_price_x128_from_real_id(params.active_bin, params.bin_step)\n const min_price = new Decimal(price).mul(lower_slippage)\n const max_price = new Decimal(price).mul(upper_slippage)\n\n const active_min = get_storage_id_from_real_id(get_real_id_from_price_x128(min_price.toDecimalPlaces(0).toString(), params.bin_step))\n const active_max = get_storage_id_from_real_id(get_real_id_from_price_x128(max_price.toDecimalPlaces(0).toString(), params.bin_step))\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n let amount_min = 0\n let amount_max = 0\n let primaryCoinAInputs\n let primaryCoinBInputs\n if (params.fixCoinA && params.fixCoinB) {\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n } else if (params.fixCoinA) {\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n amount_min = new Decimal(params.amountBTotal).mul(lower_slippage).toDecimalPlaces(0).toNumber()\n amount_max = new Decimal(params.amountBTotal).mul(upper_slippage).toDecimalPlaces(0).toNumber()\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount_max), params.coinTypeB, false, true)\n } else if (params.fixCoinB) {\n primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n amount_min = new Decimal(params.amountATotal).mul(lower_slippage).toDecimalPlaces(0).toNumber()\n amount_max = new Decimal(params.amountATotal).mul(upper_slippage).toDecimalPlaces(0).toNumber()\n primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amount_max), params.coinTypeA, false, true)\n }\n\n if (params.fixCoinA && params.fixCoinB) {\n } else if (params.fixCoinA) {\n params.amountBTotal = 0\n } else if (params.fixCoinB) {\n params.amountATotal = 0\n }\n\n const args = [\n tx.object(params.pair),\n tx.object(dlmmConfig.factory),\n primaryCoinAInputs!.targetCoin,\n primaryCoinBInputs!.targetCoin,\n tx.pure.bool(params.fixCoinA),\n tx.pure.u64(params.amountATotal),\n tx.pure.bool(params.fixCoinB),\n tx.pure.u64(params.amountBTotal),\n tx.pure.u8(params.strategy),\n tx.pure.u32(get_storage_id_from_real_id(params.min_bin)),\n tx.pure.u32(get_storage_id_from_real_id(params.max_bin)),\n tx.pure.u32(active_min),\n tx.pure.u32(active_max),\n tx.pure.u64(amount_min),\n tx.pure.u64(amount_max),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::mint_by_strategy`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // Create a position by percent\n async mintPercent(params: MintPercentParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n\n const args = [\n tx.object(params.pair),\n tx.object(dlmmConfig.factory),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.u64(params.amountATotal),\n tx.pure.u64(params.amountBTotal),\n tx.pure.vector('u32', params.storageIds),\n tx.pure.vector('u64', params.binsAPercent),\n tx.pure.vector('u64', params.binsBPercent),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::mint_percent`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n // Create a position by amount\n async createPositionByAmount(params: MintAmountParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountATotal), params.coinTypeA, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(params.amountBTotal), params.coinTypeB, false, true)\n\n const args = [\n tx.object(params.pair),\n tx.object(dlmmConfig.factory),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u32', params.storageIds),\n tx.pure.vector('u64', params.amountsA),\n tx.pure.vector('u64', params.amountsB),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::mint_amounts`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async addLiquidity(params: DlmmAddLiquidityParams): Promise<Transaction> {\n if (params.rewards_token.length === 0) {\n return this._raisePositionByAmounts(params)\n }\n return this._raisePositionByAmountsReward(params)\n }\n\n private async _raisePositionByAmounts(params: DlmmAddLiquidityParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n\n const typeArguments = [params.coin_a, params.coin_b]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n const amountATotal = params.amounts_a.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n const amountBTotal = params.amounts_b.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountATotal), params.coin_a, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountBTotal), params.coin_b, false, true)\n\n const args = [\n tx.object(params.pool_id),\n tx.object(dlmmConfig.factory),\n tx.object(params.position_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u64', params.amounts_a),\n tx.pure.vector('u64', params.amounts_b),\n tx.pure.address(params.receiver),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::raise_position_by_amounts`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n private async _raisePositionByAmountsReward(params: DlmmAddLiquidityParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { dlmm_pool, integrate, clmm_pool } = this.sdk.sdkOptions\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n const amountATotal = params.amounts_a.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n const amountBTotal = params.amounts_b.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountATotal), params.coin_a, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountBTotal), params.coin_b, false, true)\n\n const args = [\n tx.object(params.pool_id),\n tx.object(dlmmConfig.factory),\n tx.object(clmmConfigs.global_vault_id),\n tx.object(params.position_id),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u64', params.amounts_a),\n tx.pure.vector('u64', params.amounts_b),\n tx.pure.address(params.receiver),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::raise_position_by_amounts_reward${params.rewards_token.length}`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async burnPosition(params: DlmmBurnPositionParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n let args = [tx.object(params.pool_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n let target = `${integrate.published_at}::${DlmmScript}::burn_position`\n\n if (params.rewards_token.length > 0) {\n args = [tx.object(params.pool_id), tx.object(clmmConfigs.global_vault_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n target = `${integrate.published_at}::${DlmmScript}::burn_position_reward${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async shrinkPosition(params: DlmmShrinkPosition): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n let args = [tx.object(params.pool_id), tx.object(params.position_id), tx.pure.u64(params.delta_percentage), tx.object(CLOCK_ADDRESS)]\n let target = `${integrate.published_at}::${DlmmScript}::shrink_position`\n\n if (params.rewards_token.length > 0) {\n args = [\n tx.object(params.pool_id),\n tx.object(clmmConfigs.global_vault_id),\n tx.object(params.position_id),\n tx.pure.u64(params.delta_percentage),\n tx.object(CLOCK_ADDRESS),\n ]\n target = `${integrate.published_at}::${DlmmScript}::shrink_position_reward${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async collectFeeAndReward(params: DlmmCollectRewardParams & DlmmCollectFeeParams): Promise<Transaction> {\n let tx = new Transaction()\n tx = await this.collectFees(params)\n if (params.rewards_token.length > 0) {\n tx = await this.collectReward(params)\n }\n return tx\n }\n\n async collectReward(params: DlmmCollectRewardParams, transaction?: Transaction): Promise<Transaction> {\n const tx = transaction || new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate, clmm_pool } = this.sdk.sdkOptions\n const clmmConfigs = getPackagerConfigs(clmm_pool)\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n const args = [\n tx.object(params.pool_id),\n tx.object(clmmConfigs.global_vault_id),\n tx.object(params.position_id),\n tx.object(CLOCK_ADDRESS),\n ]\n let target = `${integrate.published_at}::${DlmmScript}::collect_reward`\n\n if (params.rewards_token.length > 1) {\n target = `${integrate.published_at}::${DlmmScript}::collect_reward${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async collectFees(params: DlmmCollectFeeParams, transaction?: Transaction): Promise<Transaction> {\n const tx = transaction || new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { integrate } = this.sdk.sdkOptions\n const typeArguments = [params.coin_a, params.coin_b]\n const args = [tx.object(params.pool_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n const target = `${integrate.published_at}::${DlmmScript}::collect_fees`\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async createPairAddLiquidity(params: DlmmCreatePairAddLiquidityParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { clmm_pool, dlmm_pool, integrate } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n const dlmmConfig = getPackagerConfigs(dlmm_pool)\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoins = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n\n const amountATotal = params.amountsX.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n const amountBTotal = params.amountsY.reduce((accumulator, currentValue) => accumulator + currentValue, 0)\n\n const primaryCoinAInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountATotal), params.coinTypeA, false, true)\n const primaryCoinBInputs = TransactionUtil.buildCoinForAmount(tx, allCoins, BigInt(amountBTotal), params.coinTypeB, false, true)\n\n const storageIds: number[] = []\n params.realIds.forEach((i) => {\n storageIds.push(get_storage_id_from_real_id(i))\n })\n const args = [\n tx.object(dlmmConfig.factory),\n tx.object(global_config_id),\n tx.pure.u64(params.baseFee),\n tx.pure.u16(params.binStep),\n tx.pure.u32(get_storage_id_from_real_id(params.activeId)),\n primaryCoinAInputs.targetCoin,\n primaryCoinBInputs.targetCoin,\n tx.pure.vector('u32', storageIds),\n tx.pure.vector('u64', params.amountsX),\n tx.pure.vector('u64', params.amountsY),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n const target = `${integrate.published_at}::${DlmmScript}::create_pair_add_liquidity`\n\n tx.moveCall({\n target,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async swap(params: DLMMSwapParams): Promise<Transaction> {\n const tx = new Transaction()\n tx.setSender(this.sdk.senderAddress)\n\n const { clmm_pool, integrate } = this.sdk.sdkOptions\n const { global_config_id } = getPackagerConfigs(clmm_pool)\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n\n const allCoinAsset = await this._sdk.getOwnerCoinAssets(this._sdk.senderAddress)\n const primaryCoinInputA = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.swapForY ? BigInt(params.amountIn) : BigInt(0),\n params.coinTypeA,\n false,\n true\n )\n\n const primaryCoinInputB = TransactionUtil.buildCoinForAmount(\n tx,\n allCoinAsset,\n params.swapForY ? BigInt(0) : BigInt(params.amountIn),\n params.coinTypeB,\n false,\n true\n )\n\n const args = [\n tx.object(params.pair),\n tx.object(global_config_id),\n primaryCoinInputA.targetCoin,\n primaryCoinInputB.targetCoin,\n tx.pure.u64(params.amountIn),\n tx.pure.u64(params.minAmountOut),\n tx.pure.bool(params.swapForY),\n tx.pure.address(params.to),\n tx.object(CLOCK_ADDRESS),\n ]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::swap`,\n typeArguments,\n arguments: args,\n })\n return tx\n }\n\n async fetchBins(params: FetchBinsParams): Promise<EventBin[]> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair), tx.pure.u64(params.offset), tx.pure.u64(params.limit)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::fetch_bins`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n let res: EventBin[] = []\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventFetchBins`) {\n const { bins } = item.parsedJson\n res = bins\n }\n })\n res.forEach(bin => {\n bin.real_bin_id = get_real_id(Number(bin.storage_id))\n })\n return res.sort((a, b) => a.real_bin_id - b.real_bin_id)\n }\n\n /**\n * Gets a list of positions for the given account address.\n * @param accountAddress The account address to get positions for.\n * @param assignPoolIds An array of pool IDs to filter the positions by.\n * @returns array of Position objects.\n */\n async getUserPositionById(positionId: string, showDisplay = true): Promise<DlmmPositionInfo> {\n let position\n const ownerRes: any = await this._sdk.fullClient.getObject({\n id: positionId,\n options: { showContent: true, showType: true, showDisplay, showOwner: true },\n })\n\n const type = extractStructTagFromType(ownerRes.data.type)\n if (type.full_address === this.buildPositionType()) {\n position = this.buildPosition(ownerRes)\n } else {\n throw new ClmmpoolsError(`Dlmm Position not exists. Get Position error:${ownerRes.error}`, PositionErrorCode.InvalidPositionObject)\n }\n const poolMap = new Set<string>()\n poolMap.add(position.pool)\n const pool = (await this.getPoolInfo(Array.from(poolMap)))[0]\n const _params: GetPairRewarderParams[] = []\n _params.push({\n pool_id: pool.pool_id,\n coin_a: pool.coin_a,\n coin_b: pool.coin_b,\n })\n\n const pool_reward_coins = await this.getPairRewarders(_params)\n // 1. Get Liquidity\n // 2. Get rewards\n // 3. Get fees\n const positionLiquidity = await this.getPositionLiquidity({\n pair: position.pool,\n positionId: position.pos_object_id,\n coinTypeA: pool!.coin_a,\n coinTypeB: pool!.coin_b,\n })\n const rewards_token = pool_reward_coins.get(position.pool) || []\n let positionRewards: DlmmEventEarnedRewards = { position_id: position.pos_object_id, reward: [], amount: [] }\n if (rewards_token.length > 0) {\n positionRewards = await this.getEarnedRewards({\n pool_id: position.pool,\n position_id: position.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n rewards_token: pool_reward_coins.get(position.pool) || [],\n })\n }\n\n const positionFees = await this.getEarnedFees({\n pool_id: position.pool,\n position_id: position.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n })\n\n return {\n position,\n liquidity: positionLiquidity,\n rewards: positionRewards,\n fees: positionFees,\n contractPool: pool,\n }\n }\n\n /**\n * Gets a list of positions for the given account address.\n * @param accountAddress The account address to get positions for.\n * @param assignPoolIds An array of pool IDs to filter the positions by.\n * @returns array of Position objects.\n */\n async getUserPositions(accountAddress: string, assignPoolIds: string[] = [], showDisplay = true): Promise<DlmmPositionInfo[]> {\n const allPosition = []\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.dlmm_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 = this.buildPosition(item)\n const cacheKey = `${position.pos_object_id}_getPositionList`\n this.updateCache(cacheKey, position, cacheTime24h)\n if (hasAssignPoolIds) {\n if (assignPoolIds.includes(position.pool)) {\n allPosition.push(position)\n }\n } else {\n allPosition.push(position)\n }\n }\n }\n\n const poolMap = new Set<string>()\n for (const item of allPosition) {\n poolMap.add(item.pool)\n }\n const poolList = await this.getPoolInfo(Array.from(poolMap))\n this.updateCache(`${DlmmScript}_positionList_poolList`, poolList, cacheTime24h)\n const _params: GetPairRewarderParams[] = []\n\n for (const pool of poolList) {\n _params.push({\n pool_id: pool.pool_id,\n coin_a: pool.coin_a,\n coin_b: pool.coin_b,\n })\n }\n\n const pool_reward_coins = await this.getPairRewarders(_params)\n\n const out = []\n\n // 1. Get Liquidity\n // 2. Get rewards\n // 3. Get fees\n for (const item of allPosition) {\n const pool = poolList.find((pool) => pool.pool_id === item.pool)\n const positionLiquidity = await this.getPositionLiquidity({\n pair: item.pool,\n positionId: item.pos_object_id,\n coinTypeA: pool!.coin_a,\n coinTypeB: pool!.coin_b,\n })\n const rewards_token = pool_reward_coins.get(item.pool) || []\n let positionRewards: DlmmEventEarnedRewards = { position_id: item.pos_object_id, reward: [], amount: [] }\n if (rewards_token.length > 0) {\n positionRewards = await this.getEarnedRewards({\n pool_id: item.pool,\n position_id: item.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n rewards_token: pool_reward_coins.get(item.pool) || [],\n })\n }\n\n const positionFees = await this.getEarnedFees({\n pool_id: item.pool,\n position_id: item.pos_object_id,\n coin_a: pool!.coin_a,\n coin_b: pool!.coin_b,\n })\n out.push({\n position: item,\n liquidity: positionLiquidity,\n rewards: positionRewards,\n fees: positionFees,\n contractPool: pool,\n })\n }\n\n return out\n }\n\n private buildPosition(object: SuiObjectResponse): DlmmPosition {\n if (object.error != null || object.data?.content?.dataType !== 'moveObject') {\n throw new ClmmpoolsError(`Dlmm Position not exists. Get Position error:${object.error}`, PositionErrorCode.InvalidPositionObject)\n }\n const fields = getObjectFields(object)\n\n const ownerWarp = getObjectOwner(object) as {\n AddressOwner: string\n }\n\n return {\n pos_object_id: fields.id.id,\n owner: ownerWarp.AddressOwner,\n pool: fields.pair_id,\n bin_real_ids: (fields.bin_ids as number[]).map((id) => get_real_id(id)),\n type: '',\n }\n }\n\n // return [coin_a, coin_b]\n private async getPoolCoins(pools: string[]): Promise<Map<string, string[]>> {\n const res = await this._sdk.fullClient.multiGetObjects({ ids: pools, options: { showContent: true } })\n\n const poolCoins = new Map<string, string[]>()\n\n res.forEach((item) => {\n if (item.error != null || item.data?.content?.dataType !== 'moveObject') {\n throw new Error(`Failed to get poolCoins with err: ${item.error}`)\n }\n\n const type = getObjectType(item) as string\n const poolTypeFields = extractStructTagFromType(type)\n\n poolCoins.set(item.data.objectId, poolTypeFields.type_arguments)\n })\n return poolCoins\n }\n\n private buildPositionType(): string {\n return `${this._sdk.sdkOptions.dlmm_pool.package_id}::dlmm_position::Position`\n }\n\n async getPositionLiquidity(params: GetPositionLiquidityParams): Promise<EventPositionLiquidity> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair), tx.object(params.positionId)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::position_liquidity`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const out: EventPositionLiquidity = {\n shares: 0,\n liquidity: 0,\n x_equivalent: 0,\n y_equivalent: 0,\n bin_real_ids: [],\n bin_x_eq: [],\n bin_y_eq: [],\n bin_liquidity: [],\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPositionLiquidity`) {\n out.shares = item.parsedJson.shares\n out.liquidity = item.parsedJson.liquidity\n out.x_equivalent = item.parsedJson.x_equivalent\n out.y_equivalent = item.parsedJson.y_equivalent\n out.bin_real_ids = (item.parsedJson.bin_ids as number[]).map((id) => get_real_id(id))\n out.bin_x_eq = item.parsedJson.bin_x_eq\n out.bin_y_eq = item.parsedJson.bin_y_eq\n out.bin_liquidity = item.parsedJson.bin_liquidity\n }\n })\n return out\n }\n\n async getPairLiquidity(params: GetPairLiquidityParams): Promise<EventPairLiquidity> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coinTypeA, params.coinTypeB]\n const args = [tx.object(params.pair)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::pair_liquidity`,\n arguments: args,\n typeArguments,\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 Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n\n const out: EventPairLiquidity = {\n shares: 0,\n liquidity: 0,\n x: 0,\n y: 0,\n bin_ids: [],\n bin_x: [],\n bin_y: [],\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPositionLiquidity`) {\n out.shares = item.parsedJson.shares\n out.liquidity = item.parsedJson.liquidity\n out.x = item.parsedJson.x\n out.y = item.parsedJson.y\n out.bin_ids = item.bin_ids\n out.bin_x = item.bin_x\n out.bin_y = item.bin_y\n }\n })\n return out\n }\n\n async getEarnedFees(params: DlmmCollectFeeParams): Promise<DlmmEventEarnedFees> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coin_a, params.coin_b]\n const args = [tx.object(params.pool_id), tx.object(params.position_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::earned_fees`,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const out: DlmmEventEarnedFees = {\n position_id: '',\n x: '',\n y: '',\n fee_x: 0,\n fee_y: 0,\n }\n if (simulateRes.error != null) {\n throw new Error(`fetchPairRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPositionLiquidity`) {\n out.position_id = item.parsedJson.position_id\n out.x = item.parsedJson.x\n out.y = item.parsedJson.y\n out.fee_x = item.parsedJson.fee_x\n out.fee_y = item.parsedJson.fee_y\n }\n })\n return out\n }\n\n async getEarnedRewards(params: DlmmRewardsParams): Promise<DlmmEventEarnedRewards> {\n const tx = new Transaction()\n const { integrate, simulationAccount } = this.sdk.sdkOptions\n\n const typeArguments = [params.coin_a, params.coin_b, ...params.rewards_token]\n\n const args = [tx.object(params.pool_id), tx.object(params.position_id), tx.object(CLOCK_ADDRESS)]\n let target = `${integrate.published_at}::${DlmmScript}::earned_rewards`\n if (params.rewards_token.length > 1) {\n target = `${integrate.published_at}::${DlmmScript}::earned_rewards${params.rewards_token.length}`\n }\n\n tx.moveCall({\n target,\n arguments: args,\n typeArguments,\n })\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const out: DlmmEventEarnedRewards = {\n position_id: '',\n reward: [],\n amount: [],\n }\n\n if (simulateRes.error != null) {\n throw new Error(`getEarnedRewards error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `DlmmEventEarnedRewards`) {\n out.position_id = item.parsedJson.position_id\n out.reward = [item.parsedJson.reward]\n out.amount = [item.parsedJson.amount]\n } else if (extractStructTagFromType(item.type).name === `DlmmEventEarnedRewards2`) {\n out.position_id = item.parsedJson.position_id\n out.reward = [item.parsedJson.reward1, item.parsedJson.reward2]\n out.amount = [item.parsedJson.amount1, item.parsedJson.amount2]\n } else if (extractStructTagFromType(item.type).name === `EventEarnedRewards3`) {\n out.position_id = item.parsedJson.position_id\n out.reward = [item.parsedJson.reward1, item.parsedJson.reward2, item.parsedJson.reward3]\n out.amount = [item.parsedJson.amount1, item.parsedJson.amount2, item.parsedJson.amount3]\n }\n })\n return out\n }\n\n // return pool_id => reward_tokens\n async getPairRewarders(params: GetPairRewarderParams[]): Promise<Map<string, string[]>> {\n let tx = new Transaction()\n for (const param of params) {\n tx = await this._getPairRewarders(param, tx)\n }\n return this._parsePairRewarders(tx)\n }\n\n private async _getPairRewarders(params: GetPairRewarderParams, tx?: Transaction): Promise<Transaction> {\n tx = tx || new Transaction()\n const { integrate } = this.sdk.sdkOptions\n\n const typeArguments = [params.coin_a, params.coin_b]\n const args = [tx.object(params.pool_id)]\n\n tx.moveCall({\n target: `${integrate.published_at}::${DlmmScript}::get_pair_rewarders`,\n arguments: args,\n typeArguments,\n })\n return tx\n }\n\n private async _parsePairRewarders(tx: Transaction): Promise<Map<string, string[]>> {\n const { simulationAccount } = this.sdk.sdkOptions\n\n const simulateRes = await this.sdk.fullClient.devInspectTransactionBlock({\n transactionBlock: tx,\n sender: simulationAccount.address,\n })\n\n const out = new Map<string, string[]>()\n if (simulateRes.error != null) {\n throw new Error(`fetchBins error code: ${simulateRes.error ?? 'unknown error'}`)\n }\n simulateRes.events?.forEach((item: any) => {\n if (extractStructTagFromType(item.type).name === `EventPairRewardTypes`) {\n const pairRewards: DlmmEventPairRewardTypes = {\n pair_id: '',\n tokens: [],\n }\n\n pairRewards.pair_id = item.parsedJson.pair_id\n item.parsedJson.tokens.forEach((token: any) => {\n pairRewards.tokens.push(token.name)\n })\n\n out.set(pairRewards.pair_id, pairRewards.tokens)\n }\n })\n return out\n }\n\n /**\n * Updates the cache for the given key.\n *\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime5min) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n *\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import { CoinBalance } from '@mysten/sui/client'\nimport { PoolModule } from './modules/poolModule'\nimport { PositionModule } from './modules/positionModule'\nimport { RewarderModule } from './modules/rewarderModule'\nimport { RouterModule } from './modules/routerModule'\nimport { SwapModule } from './modules/swapModule'\nimport { LockModule } from './modules/lockModule'\nimport { TokenModule } from './modules/tokenModule'\nimport { RouterModuleV2 } from './modules/routerModuleV2'\nimport { CachedContent, cacheTime24h, extractStructTagFromType, getFutureTime, patchFixSuiObjectId } from './utils'\nimport { MagmaConfigs, ClmmConfig, Ve33Config, CoinAsset, Package, SuiResource, SuiAddressType, TokenConfig, DlmmConfig } from './types'\nimport { ConfigModule } from './modules'\nimport { RpcModule } from './modules/rpcModule'\nimport { GaugeModule } from './modules/gaugeModule'\nimport { DlmmModule } from './modules/dlmm'\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 Magma protocol configurations.\n */\n magma_config: Package<MagmaConfigs>\n\n ve33: Package<Ve33Config>\n\n /**\n * Package containing Cryptocurrency Liquidity Mining Module (CLMM) pool configurations.\n */\n clmm_pool: Package<ClmmConfig>\n\n dlmm_pool: Package<DlmmConfig>\n\n distribution: Package\n\n /**\n * Package containing integration-related configurations.\n */\n integrate: Package\n\n /**\n * Package containing DeepBook-related configurations.\n */\n deepbook: Package\n\n /**\n * Package containing DeepBook endpoint version 2 configurations.\n */\n deepbook_endpoint_v2: Package\n\n /**\n * The URL for the aggregator service.\n */\n aggregatorUrl: string\n\n /**\n * The URL for the swap count\n */\n swapCountUrl?: string\n}\n\n/**\n * The entry class of MagmaClmmSDK, which is almost responsible for all interactions with CLMM.\n */\nexport class MagmaClmmSDK {\n private readonly _cache: Record<string, CachedContent> = {}\n\n /**\n * RPC provider on the SUI chain\n */\n protected _rpcModule: RpcModule\n\n /**\n * Provide interact with clmm pools with a pool router interface.\n */\n protected _pool: PoolModule\n\n /**\n * Provide interact with clmm position with a position router interface.\n */\n protected _position: PositionModule\n\n /**\n * Provide interact with a pool swap router interface.\n */\n protected _swap: SwapModule\n\n /**\n * Provide interact with a lock interface.\n */\n protected _lock: LockModule\n\n protected _gauge: GaugeModule\n\n protected _dlmm: DlmmModule\n\n /**\n * Provide interact with a position rewarder interface.\n */\n protected _rewarder: RewarderModule\n\n /**\n * Provide interact with a pool router interface.\n */\n protected _router: RouterModule\n\n /**\n * Provide interact with a pool routerV2 interface.\n */\n protected _router_v2: RouterModuleV2\n\n /**\n * Provide interact with pool and token config (contain token base info for metadat).\n * @deprecated Please use MagmaConfig instead\n */\n protected _token: TokenModule\n\n /**\n * Provide interact with clmm pool and coin and launchpad pool config\n */\n protected _config: ConfigModule\n\n /**\n * Provide sdk options\n */\n protected _sdkOptions: SdkOptions\n\n /**\n * After connecting the wallet, set the current wallet address to senderAddress.\n */\n protected _senderAddress = ''\n\n constructor(options: SdkOptions) {\n this._sdkOptions = options\n this._rpcModule = new RpcModule({\n url: options.fullRpcUrl,\n })\n\n this._swap = new SwapModule(this)\n this._lock = new LockModule(this)\n this._gauge = new GaugeModule(this)\n this._dlmm = new DlmmModule(this)\n this._pool = new PoolModule(this)\n this._position = new PositionModule(this)\n this._rewarder = new RewarderModule(this)\n this._router = new RouterModule(this)\n this._router_v2 = new RouterModuleV2(this)\n this._token = new TokenModule(this)\n this._config = new ConfigModule(this)\n\n patchFixSuiObjectId(this._sdkOptions)\n }\n\n /**\n * Getter for the sender address property.\n * @returns {SuiAddressType} The sender address.\n */\n get senderAddress(): SuiAddressType {\n return this._senderAddress\n }\n\n /**\n * Setter for the sender address property.\n * @param {string} value - The new sender address value.\n */\n set senderAddress(value: string) {\n this._senderAddress = value\n }\n\n /**\n * Getter for the Swap property.\n * @returns {SwapModule} The Swap property value.\n */\n get Swap(): SwapModule {\n return this._swap\n }\n\n /* */\n get Lock(): LockModule {\n return this._lock\n }\n\n get Gauge(): GaugeModule {\n return this._gauge\n }\n\n get Dlmm(): DlmmModule {\n return this._dlmm\n }\n\n /**\n * Getter for the fullClient property.\n * @returns {RpcModule} The fullClient property value.\n */\n get fullClient(): RpcModule {\n return this._rpcModule\n }\n\n /**\n * Getter for the sdkOptions property.\n * @returns {SdkOptions} The sdkOptions property value.\n */\n get sdkOptions(): SdkOptions {\n return this._sdkOptions\n }\n\n /**\n * Getter for the Pool property.\n * @returns {PoolModule} The Pool property value.\n */\n get Pool(): PoolModule {\n return this._pool\n }\n\n /**\n * Getter for the Position property.\n * @returns {PositionModule} The Position property value.\n */\n get Position(): PositionModule {\n return this._position\n }\n\n /**\n * Getter for the Rewarder property.\n * @returns {RewarderModule} The Rewarder property value.\n */\n get Rewarder(): RewarderModule {\n return this._rewarder\n }\n\n /**\n * Getter for the Router property.\n * @returns {RouterModule} The Router property value.\n */\n get Router(): RouterModule {\n return this._router\n }\n\n /**\n * Getter for the RouterV2 property.\n * @returns {RouterModuleV2} The RouterV2 property value.\n */\n get RouterV2(): RouterModuleV2 {\n return this._router_v2\n }\n\n /**\n * Getter for the MagmaConfig property.\n * @returns {ConfigModule} The MagmaConfig property value.\n */\n get MagmaConfig(): ConfigModule {\n return this._config\n }\n\n /**\n * @deprecated Token is no longer maintained. Please use MagmaConfig instead\n */\n get Token() {\n return this._token\n }\n\n /**\n * Gets all coin assets for the given owner and coin type.\n *\n * @param suiAddress The address of the owner.\n * @param coinType The type of the coin.\n * @returns an array of coin assets.\n */\n async getOwnerCoinAssets(suiAddress: string, coinType?: string | null, forceRefresh = true): Promise<CoinAsset[]> {\n const allCoinAsset: CoinAsset[] = []\n let nextCursor: string | null | undefined = null\n\n const cacheKey = `${this.sdkOptions.fullRpcUrl}_${suiAddress}_${coinType}_getOwnerCoinAssets`\n const cacheData = this.getCache<CoinAsset[]>(cacheKey, forceRefresh)\n if (cacheData) {\n return cacheData\n }\n\n while (true) {\n const allCoinObject: any = await (coinType\n ? this.fullClient.getCoins({\n owner: suiAddress,\n coinType,\n cursor: nextCursor,\n })\n : this.fullClient.getAllCoins({\n owner: suiAddress,\n cursor: nextCursor,\n }))\n\n allCoinObject.data.forEach((coin: any) => {\n if (BigInt(coin.balance) > 0) {\n allCoinAsset.push({\n coinAddress: extractStructTagFromType(coin.coinType).source_address,\n coinObjectId: coin.coinObjectId,\n balance: BigInt(coin.balance),\n })\n }\n })\n nextCursor = allCoinObject.nextCursor\n\n if (!allCoinObject.hasNextPage) {\n break\n }\n }\n this.updateCache(cacheKey, allCoinAsset, 30 * 1000)\n return allCoinAsset\n }\n\n /**\n * Gets all coin balances for the given owner and coin type.\n *\n * @param suiAddress The address of the owner.\n * @param coinType The type of the coin.\n * @returns an array of coin balances.\n */\n async getOwnerCoinBalances(suiAddress: string, coinType?: string | null): Promise<CoinBalance[]> {\n let allCoinBalance: CoinBalance[] = []\n\n if (coinType) {\n const res = await this.fullClient.getBalance({\n owner: suiAddress,\n coinType,\n })\n allCoinBalance = [res]\n } else {\n const res = await this.fullClient.getAllBalances({\n owner: suiAddress,\n })\n allCoinBalance = [...res]\n }\n return allCoinBalance\n }\n\n /**\n * Updates the cache for the given key.\n *\n * @param key The key of the cache entry to update.\n * @param data The data to store in the cache.\n * @param time The time in minutes after which the cache entry should expire.\n */\n updateCache(key: string, data: SuiResource, time = cacheTime24h) {\n let cacheData = this._cache[key]\n if (cacheData) {\n cacheData.overdueTime = getFutureTime(time)\n cacheData.value = data\n } else {\n cacheData = new CachedContent(data, getFutureTime(time))\n }\n this._cache[key] = cacheData\n }\n\n /**\n * Gets the cache entry for the given key.\n *\n * @param key The key of the cache entry to get.\n * @param forceRefresh Whether to force a refresh of the cache entry.\n * @returns The cache entry for the given key, or undefined if the cache entry does not exist or is expired.\n */\n getCache<T>(key: string, forceRefresh = false): T | undefined {\n const cacheData = this._cache[key]\n const isValid = cacheData?.isValid()\n if (!forceRefresh && isValid) {\n return cacheData.value as T\n }\n if (!isValid) {\n delete this._cache[key]\n }\n return undefined\n }\n}\n","import { getFullnodeUrl } from '@mysten/sui/client'\nimport MagmaClmmSDK, { SdkOptions } from '../main'\n\nconst SDKConfig = {\n clmmConfig: {\n pools_id: '0xfa145b9de10fe858be81edd1c6cdffcf27be9d016de02a1345eb1009a68ba8b2',\n // clmm and dlmm both use this global_config\n global_config_id: '0x4c4e1402401f72c7d8533d0ed8d5f8949da363c7a3319ccef261ffe153d32f8a',\n global_vault_id: '0xa7e1102f222b6eb81ccc8a126e7feb2353342be9df6f6646a77c4519da29c071',\n admin_cap_id: '0x89c1a321291d15ddae5a086c9abc533dff697fde3d89e0ca836c41af73e36a75',\n },\n magmaConfig: {\n coin_list_id: '0x8cbc11d9e10140db3d230f50b4d30e9b721201c0083615441707ffec1ef77b23',\n launchpad_pools_id: '0x1098fac992eab3a0ab7acf15bb654fc1cf29b5a6142c4ef1058e6c408dd15115',\n clmm_pools_id: '0x15b6a27dd9ae03eb455aba03b39e29aad74abd3757b8e18c0755651b2ae5b71e',\n admin_cap_id: '0x39d78781750e193ce35c45ff32c6c0c3f2941fa3ddaf8595c90c555589ddb113',\n coin_list_handle: '0x49136005e90e28c4695419ed4194cc240603f1ea8eb84e62275eaff088a71063',\n launchpad_pools_handle: '0x5e194a8efcf653830daf85a85b52e3ae8f65dc39481d54b2382acda25068375c',\n clmm_pools_handle: '0x37f60eb2d9d227949b95da8fea810db3c32d1e1fa8ed87434fc51664f87d83cb',\n },\n ve33Config: {\n voter_id: '0xaab0f3a90da96d29d743e09c269e1ae48ec1bae52a28cd38c49c5dc8c1bf92b8',\n voting_escrow_id: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n reward_distributor_id: '0x9f4f882245e49fd9213278dfbcb63a14fdbdd2ce7e25e9353a0cecdca30de853',\n distribution_cfg: '0xaff8d151ac29317201151f97d28c546b3c5923d8cfc5499f40dea61c4022c949',\n magma_token: '0x7161c6c6bb65f852797c8f7f5c4f8d57adaf796e1b840921f9e23fabeadfd54e::magma::MAGMA',\n minter_id: '0x4fa5766cd83b33b215b139fec27ac344040f3bbd84fcbee7b61fc671aadc51fa',\n },\n dlmmConfig: {\n factory: '',\n },\n gaugeConfig: {},\n}\n\n// mainnet\nexport const clmmMainnet: SdkOptions = {\n fullRpcUrl: getFullnodeUrl('mainnet'),\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n ve33: {\n package_id: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n published_at: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n config: SDKConfig.ve33Config,\n },\n magma_config: {\n package_id: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n published_at: '0x95b8d278b876cae22206131fb9724f701c9444515813042f54f0a426c9a3bc2f',\n config: SDKConfig.magmaConfig,\n },\n clmm_pool: {\n package_id: '0x4a35d3dfef55ed3631b7158544c6322a23bc434fe4fca1234cb680ce0505f82d',\n published_at: '0x4a35d3dfef55ed3631b7158544c6322a23bc434fe4fca1234cb680ce0505f82d',\n config: SDKConfig.clmmConfig,\n },\n dlmm_pool: {\n package_id: '',\n published_at: '',\n config: SDKConfig.dlmmConfig,\n },\n distribution: {\n package_id: '0xee4a1f231dc45a303389998fe26c4e39278cf68b404b32e4f0b9769129b8267b',\n published_at: '0xee4a1f231dc45a303389998fe26c4e39278cf68b404b32e4f0b9769129b8267b',\n },\n integrate: {\n package_id: '0x2e704d8afc1d6d7f154dee337cc14c153f6f9ce1708213e5dc04a32afe0e45f1',\n published_at: '0x2e704d8afc1d6d7f154dee337cc14c153f6f9ce1708213e5dc04a32afe0e45f1',\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0xac95e8a5e873cfa2544916c16fe1461b6a45542d9e65504c1794ae390b3345a7',\n published_at: '0xac95e8a5e873cfa2544916c16fe1461b6a45542d9e65504c1794ae390b3345a7',\n },\n aggregatorUrl: 'https://api.magmafinance.io/api/router',\n swapCountUrl: 'https://api.magmafinance.io/api/v2/sui/swap/count',\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 * @returns\n */\nexport function initMainnetSDK(fullNodeUrl?: string, simulationAccount?: string): MagmaClmmSDK {\n if (fullNodeUrl) {\n clmmMainnet.fullRpcUrl = fullNodeUrl\n }\n if (simulationAccount) {\n clmmMainnet.simulationAccount.address = simulationAccount\n }\n return new MagmaClmmSDK(clmmMainnet)\n}\n","import { MagmaClmmSDK, SdkOptions } from './sdk'\n\nexport { MagmaClmmSDK, SdkOptions }\n\nexport default MagmaClmmSDK\n","import { getFullnodeUrl } from '@mysten/sui/client'\nimport MagmaClmmSDK, { SdkOptions } from '../main'\n\nconst SDKConfig = {\n clmmConfig: {\n pools_id: '0xd7037b38ae757d7a69b61146b27c288600b9aefbffbf884b856881dff6a4f27b',\n global_config_id: '0x83baa8b07800029302f75ac6906240e86cf05066d37eedcabc61a0d6b6dc6eda',\n global_vault_id: '0xf78d2ee3c312f298882cb680695e5e8c81b1d441a646caccc058006c2851ddea',\n admin_cap_id: '0xa456f86a53fc31e1243f065738ff1fc93f5a62cc080ff894a0fb3747556a799b',\n },\n magmaConfig: {\n coin_list_id: '0x257eb2ba592a5480bba0a97d05338fab17cc3283f8df6998a0e12e4ab9b84478',\n launchpad_pools_id: '0xdc3a7bd66a6dcff73c77c866e87d73826e446e9171f34e1c1b656377314f94da',\n clmm_pools_id: '0x26c85500f5dd2983bf35123918a144de24e18936d0b234ef2b49fbb2d3d6307d',\n admin_cap_id: '0xd328ff427794b8ca0a69c3ebb0c0e4d2e81267ec4ba36e11487362c6508a4c0f',\n coin_list_handle: '0x3204350fc603609c91675e07b8f9ac0999b9607d83845086321fca7f469de235',\n launchpad_pools_handle: '0xae67ff87c34aceea4d28107f9c6c62e297a111e9f8e70b9abbc2f4c9f5ec20fd',\n clmm_pools_handle: '0xd28736923703342b4752f5ed8c2f2a5c0cb2336c30e1fed42b387234ce8408ec',\n },\n ve33Config: {\n // global_config_id: '0xbbe54f3c2bd06c5ab7f93950025bff6710c9a83836d7145636fea383b315774d',\n voter_id: '0x59571991a5c7041c4376d980061af5c7a6d8345006d6b5167bd1f00fc17b8ddb',\n voting_escrow_id: '0x9081c8044719135da4ff2d52907fcd40c19e2a40750cbba4c1d6a59610ae1446',\n reward_distributor_id: '0xdf213d8e0ca49c8f4a508e7d3b3a6983c4aafd639f7c99479fc75fb4451d752e',\n distribution_cfg: '0x94e23846c975e2faf89a61bfc2b10ad64decab9069eb1f9fc39752b010868c74',\n magma_token: '0x45ac2371c33ca0df8dc784d62c8ce5126d42edd8c56820396524dff2ae0619b1::magma_token::MAGMA_TOKEN',\n minter_id: '0x89435d6b2a510ba50ca23303f10e91ec058f138a88f69a43fe03cd22edb214c5',\n },\n dlmmConfig: {\n factory: '',\n },\n}\n\nexport const clmmTestnet: SdkOptions = {\n fullRpcUrl: getFullnodeUrl('testnet'),\n magma_config: {\n package_id: '',\n published_at: '',\n config: SDKConfig.magmaConfig,\n },\n ve33: {\n package_id: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n published_at: '0x7ab45fbe01da26e07ba21757916d540c8747cf7daa88f3171e13db17373d5adc',\n config: SDKConfig.ve33Config,\n },\n clmm_pool: {\n package_id: '0xca1b84a430d03e22dae08a7273c8e9dcfdb40b7f559574105f008600eeb7b4bd',\n published_at: '0xca1b84a430d03e22dae08a7273c8e9dcfdb40b7f559574105f008600eeb7b4bd',\n config: SDKConfig.clmmConfig,\n },\n dlmm_pool: {\n package_id: '',\n published_at: '',\n config: SDKConfig.dlmmConfig,\n },\n distribution: {\n package_id: '0x45ac2371c33ca0df8dc784d62c8ce5126d42edd8c56820396524dff2ae0619b1',\n published_at: '0x45ac2371c33ca0df8dc784d62c8ce5126d42edd8c56820396524dff2ae0619b1',\n },\n integrate: {\n package_id: '0x975672d26fc9ba026a35f2001951fbcf5e37e75aca41db7c762d61b4e1e64986',\n published_at: '0x975672d26fc9ba026a35f2001951fbcf5e37e75aca41db7c762d61b4e1e64986',\n },\n\n simulationAccount: {\n address: '0x0000000000000000000000000000000000000000000000000000000000000000',\n },\n faucet: {\n package_id: '0x26b3bc67befc214058ca78ea9a2690298d731a2d4309485ec3d40198063c4abc',\n published_at: '0x26b3bc67befc214058ca78ea9a2690298d731a2d4309485ec3d40198063c4abc',\n },\n deepbook: {\n package_id: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n published_at: '0x000000000000000000000000000000000000000000000000000000000000dee9',\n },\n deepbook_endpoint_v2: {\n package_id: '0x56d90d0c055edb534b11e7548270bb458fd47c69b77bf40c14d5eb00e6e6cf64',\n published_at: '0x56d90d0c055edb534b11e7548270bb458fd47c69b77bf40c14d5eb00e6e6cf64',\n },\n aggregatorUrl: 'https://testnet.magmafinance.io/api/router',\n swapCountUrl: 'https://api-sui.devmagma.com/v2/sui/swap/count',\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, simulationAccount?: string): MagmaClmmSDK {\n if (fullNodeUrl) {\n clmmTestnet.fullRpcUrl = fullNodeUrl\n }\n if (simulationAccount) {\n clmmTestnet.simulationAccount.address = simulationAccount\n }\n return new MagmaClmmSDK(clmmTestnet)\n}\n","import MagmaClmmSDK from '../main'\nimport { initMainnetSDK } from './mainnet'\nimport { initTestnetSDK } from './testnet'\n\ninterface InitMagmaSDKOptions {\n network: 'mainnet' | 'testnet'\n fullNodeUrl?: string\n simulationAccount?: string\n}\n\n/**\n * Helper function to initialize the Magma 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 simulationAccount - The simulation account address to use. If not provided,\n * the default simulation account `0x0000000000000000000000000000000000000000000000000000000000000000` will be used.\n * If you use the `preswap` method, you should set a simulation account and ensure that this address has sufficient input coins.\n * @returns The initialized Magma SDK.\n */\nexport function initMagmaSDK(options: InitMagmaSDKOptions): MagmaClmmSDK {\n const { network, fullNodeUrl, simulationAccount } = options\n return network === 'mainnet' ? initMainnetSDK(fullNodeUrl, simulationAccount) : initTestnetSDK(fullNodeUrl, simulationAccount)\n}\n","import { MagmaClmmSDK, SdkOptions } from './sdk'\n\nexport * from './utils'\nexport * from './math'\nexport * from './types'\nexport * from './modules'\nexport * from './config'\nexport { MagmaClmmSDK, SdkOptions }\nexport default MagmaClmmSDK\n"],"mappings":"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","names":["Transaction","BN","BN","BN","BN","ClmmPositionStatus","SwapDirection","BN","Decimal","BN","BN","BN","Decimal","BN","BN","BN","BN","structTag","BN","BN","BN","Decimal","totalWeightX","totalWeightY","kx","amountY","ky","amountX","k","amount","StrategyType","weights","Decimal","Decimal","Decimal","BN","AmountSpecified","PositionStatus","BN","SplitUnit","BN","Decimal","get_price_x128_from_real_id","BN","BN","BN","BN","Decimal","Decimal","BN","selectedCoinsResult","i","Transaction","Transaction","BN","Transaction","BN","Transaction","Transaction","params","item","object","BN","Transaction","Transaction","BN","BN","Transaction","BN","Transaction","BN","Transaction","paths","preSwapResult","onePath","BN","swapWithRouterParams","result","Transaction","BN","Decimal","Transaction","Decimal","Transaction","BN","Transaction","Transaction","item","Transaction","normalizeSuiObjectId","Transaction","item","normalizeSuiObjectId","BN","Decimal","Decimal","BN","normalizeSuiObjectId","Base64","normalizeSuiObjectId","Base64","Transaction","Transaction","Transaction","get_price_x128_from_real_id","get_real_id_from_price_x128","Decimal","Transaction","Decimal","get_price_x128_from_real_id","get_real_id_from_price_x128","pool","getFullnodeUrl","SDKConfig","getFullnodeUrl"]}
|