From 14cdcd8f872bae3878c863421700c4bca29b8fd5 Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 17 Sep 2024 17:43:02 +0300 Subject: [PATCH 1/9] SERVICES-2592: add bulk getter method for farm token IDs - expose method in FarmAbiFactory --- .../farm/base-module/services/farm.abi.service.ts | 11 +++++++++++ .../farm/base-module/services/farm.base.service.ts | 6 +----- src/modules/farm/farm.abi.factory.ts | 4 ++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/modules/farm/base-module/services/farm.abi.service.ts b/src/modules/farm/base-module/services/farm.abi.service.ts index 846380ad5..0f98d6ebb 100644 --- a/src/modules/farm/base-module/services/farm.abi.service.ts +++ b/src/modules/farm/base-module/services/farm.abi.service.ts @@ -15,6 +15,7 @@ import { Constants } from '@multiversx/sdk-nestjs-common'; import { MXApiService } from 'src/services/multiversx-communication/mx.api.service'; import { IFarmAbiService } from './interfaces'; import { CacheService } from '@multiversx/sdk-nestjs-cache'; +import { getAllKeys } from 'src/utils/get.many.utils'; export class FarmAbiService extends GenericAbiService @@ -69,6 +70,16 @@ export class FarmAbiService return response.firstValue.valueOf().toString(); } + async getAllFarmTokenIds(farmAddresses: string[]): Promise { + return await getAllKeys( + this.cacheService, + farmAddresses, + 'farm.farmTokenID', + this.farmTokenID.bind(this), + CacheTtlInfo.Token, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) diff --git a/src/modules/farm/base-module/services/farm.base.service.ts b/src/modules/farm/base-module/services/farm.base.service.ts index 0d3c3a5e2..e959e8a2c 100644 --- a/src/modules/farm/base-module/services/farm.base.service.ts +++ b/src/modules/farm/base-module/services/farm.base.service.ts @@ -51,12 +51,8 @@ export abstract class FarmServiceBase { } async getAllFarmTokens(farmAddresses: string[]): Promise { - const farmTokenIDs = await getAllKeys( - this.cachingService, + const farmTokenIDs = await this.farmAbi.getAllFarmTokenIds( farmAddresses, - 'farm.farmTokenID', - this.farmAbi.farmTokenID.bind(this.farmAbi), - CacheTtlInfo.Token, ); return this.tokenService.getAllNftsCollectionMetadata(farmTokenIDs); } diff --git a/src/modules/farm/farm.abi.factory.ts b/src/modules/farm/farm.abi.factory.ts index 5b28c8504..91daf46c1 100644 --- a/src/modules/farm/farm.abi.factory.ts +++ b/src/modules/farm/farm.abi.factory.ts @@ -28,6 +28,10 @@ export class FarmAbiFactory { } } + async getAllFarmTokenIds(): Promise { + return await this.abiServiceV2.getAllFarmTokenIds(farmsAddresses()); + } + async isFarmToken(tokenID: string): Promise { for (const farmAddress of farmsAddresses()) { const farmTokenID = await this.useAbi(farmAddress).farmTokenID( From 5ee7a771f7ee7176dce812a88f39e0725df6fb00 Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 17 Sep 2024 18:03:50 +0300 Subject: [PATCH 2/9] SERVICES-2592: add pairs bulk getter methods to abi and compute services - refactor pair dataloaders to use bulk getter methods --- src/modules/pair/services/pair.abi.loader.ts | 8 +----- src/modules/pair/services/pair.abi.service.ts | 13 +++++++++ .../pair/services/pair.compute.loader.ts | 14 ++-------- .../pair/services/pair.compute.service.ts | 27 +++++++++++++++++++ 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/modules/pair/services/pair.abi.loader.ts b/src/modules/pair/services/pair.abi.loader.ts index 7852938a4..acb910e9f 100644 --- a/src/modules/pair/services/pair.abi.loader.ts +++ b/src/modules/pair/services/pair.abi.loader.ts @@ -40,13 +40,7 @@ export class PairAbiLoader { public readonly infoMetadataLoader = new DataLoader( async (addresses: string[]) => { - return getAllKeys( - this.cacheService, - addresses, - 'pair.pairInfoMetadata', - this.pairAbi.pairInfoMetadata.bind(this.pairAbi), - CacheTtlInfo.ContractBalance, - ); + return this.pairAbi.getAllPairsInfoMetadata(addresses); }, ); diff --git a/src/modules/pair/services/pair.abi.service.ts b/src/modules/pair/services/pair.abi.service.ts index 60be73edb..8c4864a35 100644 --- a/src/modules/pair/services/pair.abi.service.ts +++ b/src/modules/pair/services/pair.abi.service.ts @@ -29,6 +29,7 @@ import { CacheTtlInfo } from 'src/services/caching/cache.ttl.info'; import { Constants } from '@multiversx/sdk-nestjs-common'; import { CacheService } from '@multiversx/sdk-nestjs-cache'; import { IPairAbiService } from '../interfaces'; +import { getAllKeys } from 'src/utils/get.many.utils'; @Injectable() export class PairAbiService @@ -204,6 +205,18 @@ export class PairAbiService }); } + async getAllPairsInfoMetadata( + pairAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + pairAddresses, + 'pair.pairInfoMetadata', + this.pairInfoMetadata.bind(this), + CacheTtlInfo.ContractBalance, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) diff --git a/src/modules/pair/services/pair.compute.loader.ts b/src/modules/pair/services/pair.compute.loader.ts index 874c25de1..a5e289bf2 100644 --- a/src/modules/pair/services/pair.compute.loader.ts +++ b/src/modules/pair/services/pair.compute.loader.ts @@ -42,24 +42,14 @@ export class PairComputeLoader { public readonly firstTokenPriceUSDLoader = new DataLoader( async (addresses: string[]) => { - return await getAllKeys( - this.cacheService, - addresses, - 'pair.firstTokenPriceUSD', - this.pairCompute.firstTokenPriceUSD.bind(this.pairCompute), - CacheTtlInfo.Price, - ); + return await this.pairCompute.getAllFirstTokensPriceUSD(addresses); }, ); public readonly secondTokenPriceUSDLoader = new DataLoader( async (addresses: string[]) => { - return await getAllKeys( - this.cacheService, + return await this.pairCompute.getAllSecondTokensPricesUSD( addresses, - 'pair.secondTokenPriceUSD', - this.pairCompute.secondTokenPriceUSD.bind(this.pairCompute), - CacheTtlInfo.Price, ); }, ); diff --git a/src/modules/pair/services/pair.compute.service.ts b/src/modules/pair/services/pair.compute.service.ts index 56f11b3fb..972052073 100644 --- a/src/modules/pair/services/pair.compute.service.ts +++ b/src/modules/pair/services/pair.compute.service.ts @@ -25,6 +25,8 @@ import { FarmAbiServiceV2 } from 'src/modules/farm/v2/services/farm.v2.abi.servi import { TransactionStatus } from 'src/utils/transaction.utils'; import { FarmComputeServiceV2 } from 'src/modules/farm/v2/services/farm.v2.compute.service'; import { StakingComputeService } from 'src/modules/staking/services/staking.compute.service'; +import { CacheService } from '@multiversx/sdk-nestjs-cache'; +import { getAllKeys } from 'src/utils/get.many.utils'; @Injectable() export class PairComputeService implements IPairComputeService { @@ -46,6 +48,7 @@ export class PairComputeService implements IPairComputeService { private readonly apiService: MXApiService, private readonly farmCompute: FarmComputeServiceV2, private readonly stakingCompute: StakingComputeService, + private readonly cachingService: CacheService, ) {} async getTokenPrice(pairAddress: string, tokenID: string): Promise { @@ -218,6 +221,18 @@ export class PairComputeService implements IPairComputeService { ); } + async getAllFirstTokensPriceUSD( + pairAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + pairAddresses, + 'pair.firstTokenPriceUSD', + this.firstTokenPriceUSD.bind(this), + CacheTtlInfo.Price, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) @@ -254,6 +269,18 @@ export class PairComputeService implements IPairComputeService { ); } + async getAllSecondTokensPricesUSD( + pairAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + pairAddresses, + 'pair.secondTokenPriceUSD', + this.secondTokenPriceUSD.bind(this), + CacheTtlInfo.Price, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) From 07be8d7ddbae4a813446cf1b38c896523dedb2b0 Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 17 Sep 2024 18:05:02 +0300 Subject: [PATCH 3/9] SERVICES-2592: add pair bulk compute liquidity methods --- src/modules/pair/services/pair.service.ts | 59 +++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/src/modules/pair/services/pair.service.ts b/src/modules/pair/services/pair.service.ts index d82fb26ee..ee169abe8 100644 --- a/src/modules/pair/services/pair.service.ts +++ b/src/modules/pair/services/pair.service.ts @@ -21,6 +21,7 @@ import { RouterAbiService } from 'src/modules/router/services/router.abi.service import { TokenService } from 'src/modules/tokens/services/token.service'; import { getAllKeys } from 'src/utils/get.many.utils'; import { CacheTtlInfo } from 'src/services/caching/cache.ttl.info'; +import { PairInfoModel } from '../models/pair-info.model'; @Injectable() export class PairService { @@ -281,6 +282,13 @@ export class PairService { ): Promise { const pairInfo = await this.pairAbi.pairInfoMetadata(pairAddress); + return this.computeLiquidityPosition(pairInfo, amount); + } + + private computeLiquidityPosition( + pairInfo: PairInfoModel, + amount: string, + ): LiquidityPosition { const firstTokenAmount = getTokenForGivenPosition( amount, pairInfo.reserves0, @@ -298,6 +306,19 @@ export class PairService { }); } + async getAllLiquidityPositions( + pairAddresses: string[], + amounts: string[], + ): Promise { + const allPairsInfo = await this.pairAbi.getAllPairsInfoMetadata( + pairAddresses, + ); + + return allPairsInfo.map((pairInfo, index) => + this.computeLiquidityPosition(pairInfo, amounts[index]), + ); + } + async getLiquidityPositionUSD( pairAddress: string, amount: string, @@ -330,6 +351,38 @@ export class PairService { .toFixed(); } + async getAllLiquidityPositionsUSD( + pairAddresses: string[], + amounts: string[], + ): Promise { + const allFirstTokens = await this.getAllFirstTokens(pairAddresses); + const allSecondTokens = await this.getAllSecondTokens(pairAddresses); + const allFirstTokensPriceUSD = + await this.pairCompute.getAllFirstTokensPriceUSD(pairAddresses); + const allSecondTokensPriceUSD = + await this.pairCompute.getAllSecondTokensPricesUSD(pairAddresses); + const allLiquidityPositions = await this.getAllLiquidityPositions( + pairAddresses, + amounts, + ); + + return pairAddresses.map((_, index) => { + return computeValueUSD( + allLiquidityPositions[index].firstTokenAmount, + allFirstTokens[index].decimals, + allFirstTokensPriceUSD[index], + ) + .plus( + computeValueUSD( + allLiquidityPositions[index].secondTokenAmount, + allSecondTokens[index].decimals, + allSecondTokensPriceUSD[index], + ), + ) + .toFixed(); + }); + } + async getPairAddressByLpTokenID(tokenID: string): Promise { const cachedValue: string = await this.cachingService.get( `${tokenID}.pairAddress`, @@ -338,10 +391,8 @@ export class PairService { return cachedValue; } const pairsAddress = await this.routerAbi.pairsAddress(); - const promises = pairsAddress.map(async (pairAddress) => - this.pairAbi.lpTokenID(pairAddress), - ); - const lpTokenIDs = await Promise.all(promises); + const lpTokenIDs = await this.getAllLpTokensIds(pairsAddress); + let returnedData = null; for (let index = 0; index < lpTokenIDs.length; index++) { if (lpTokenIDs[index] === tokenID) { From ec2422c440a1b71be5e9a1c6d2ead25ad2b8c0d3 Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 17 Sep 2024 18:09:06 +0300 Subject: [PATCH 4/9] SERVICES-2592: more bulk get methods - bulk getter for price discovery : redeem token IDs - bulk getters for simple lock : lock token ids, lp token ids, farm proxy token ids - bulk getter for staking proxy : dual yield token IDs - bulk getter for staking abi : farm token IDs --- .../services/price.discovery.abi.service.ts | 19 +++++++- .../services/simple.lock.abi.service.ts | 43 ++++++++++++++++++- .../services/staking.proxy.abi.service.ts | 19 +++++++- .../staking/services/staking.abi.service.ts | 10 +++++ 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/modules/price-discovery/services/price.discovery.abi.service.ts b/src/modules/price-discovery/services/price.discovery.abi.service.ts index 6d43fcdbd..fdbfc1bb0 100644 --- a/src/modules/price-discovery/services/price.discovery.abi.service.ts +++ b/src/modules/price-discovery/services/price.discovery.abi.service.ts @@ -10,13 +10,18 @@ import { ErrorLoggerAsync } from '@multiversx/sdk-nestjs-common'; import { GetOrSetCache } from 'src/helpers/decorators/caching.decorator'; import { CacheTtlInfo } from 'src/services/caching/cache.ttl.info'; import { IPriceDiscoveryAbiService } from './interfaces'; +import { CacheService } from '@multiversx/sdk-nestjs-cache'; +import { getAllKeys } from 'src/utils/get.many.utils'; @Injectable() export class PriceDiscoveryAbiService extends GenericAbiService implements IPriceDiscoveryAbiService { - constructor(protected readonly mxProxy: MXProxyService) { + constructor( + protected readonly mxProxy: MXProxyService, + private readonly cachingService: CacheService, + ) { super(mxProxy); } @@ -93,6 +98,18 @@ export class PriceDiscoveryAbiService return response.firstValue.valueOf().toString(); } + async getAllRedeemTokenIds( + priceDiscoveryAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + priceDiscoveryAddresses, + 'priceDiscovery.redeemTokenID', + this.redeemTokenID.bind(this), + CacheTtlInfo.Token, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) diff --git a/src/modules/simple-lock/services/simple.lock.abi.service.ts b/src/modules/simple-lock/services/simple.lock.abi.service.ts index 35a76e46c..adcd9b74e 100644 --- a/src/modules/simple-lock/services/simple.lock.abi.service.ts +++ b/src/modules/simple-lock/services/simple.lock.abi.service.ts @@ -6,13 +6,18 @@ import { ErrorLoggerAsync } from '@multiversx/sdk-nestjs-common'; import { GetOrSetCache } from 'src/helpers/decorators/caching.decorator'; import { CacheTtlInfo } from 'src/services/caching/cache.ttl.info'; import { ISimpleLockAbiService } from './interfaces'; +import { CacheService } from '@multiversx/sdk-nestjs-cache'; +import { getAllKeys } from 'src/utils/get.many.utils'; @Injectable() export class SimpleLockAbiService extends GenericAbiService implements ISimpleLockAbiService { - constructor(protected readonly mxProxy: MXProxyService) { + constructor( + protected readonly mxProxy: MXProxyService, + private readonly cachingService: CacheService, + ) { super(mxProxy); } @@ -39,6 +44,18 @@ export class SimpleLockAbiService return response.firstValue.valueOf().toString(); } + async getAllLockedTokenIds( + simpleLockAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + simpleLockAddresses, + 'simpleLock.lockedTokenID', + this.lockedTokenID.bind(this), + CacheTtlInfo.Token, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) @@ -62,6 +79,18 @@ export class SimpleLockAbiService return response.firstValue.valueOf().toString(); } + async getAllLpProxyTokenIds( + simpleLockAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + simpleLockAddresses, + 'simpleLock.lpProxyTokenID', + this.lpProxyTokenID.bind(this), + CacheTtlInfo.Token, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) @@ -85,6 +114,18 @@ export class SimpleLockAbiService return response.firstValue.valueOf().toString(); } + async getAllFarmProxyTokenIds( + simpleLockAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + simpleLockAddresses, + 'simpleLock.farmProxyTokenID', + this.farmProxyTokenID.bind(this), + CacheTtlInfo.Token, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) diff --git a/src/modules/staking-proxy/services/staking.proxy.abi.service.ts b/src/modules/staking-proxy/services/staking.proxy.abi.service.ts index 4b7cbb989..d51cb68d6 100644 --- a/src/modules/staking-proxy/services/staking.proxy.abi.service.ts +++ b/src/modules/staking-proxy/services/staking.proxy.abi.service.ts @@ -7,13 +7,18 @@ import { GetOrSetCache } from 'src/helpers/decorators/caching.decorator'; import { CacheTtlInfo } from 'src/services/caching/cache.ttl.info'; import { Constants } from '@multiversx/sdk-nestjs-common'; import { IStakingProxyAbiService } from './interfaces'; +import { CacheService } from '@multiversx/sdk-nestjs-cache'; +import { getAllKeys } from 'src/utils/get.many.utils'; @Injectable() export class StakingProxyAbiService extends GenericAbiService implements IStakingProxyAbiService { - constructor(protected readonly mxProxy: MXProxyService) { + constructor( + protected readonly mxProxy: MXProxyService, + private readonly cachingService: CacheService, + ) { super(mxProxy); } @@ -147,6 +152,18 @@ export class StakingProxyAbiService return response.firstValue.valueOf().toString(); } + async getAllDualYieldTokenIds( + stakingProxyAddresses: string[], + ): Promise { + return await getAllKeys( + this.cachingService, + stakingProxyAddresses, + 'stakeProxy.dualYieldTokenID', + this.dualYieldTokenID.bind(this), + CacheTtlInfo.Token, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) diff --git a/src/modules/staking/services/staking.abi.service.ts b/src/modules/staking/services/staking.abi.service.ts index cdf8f83d0..490e96bc5 100644 --- a/src/modules/staking/services/staking.abi.service.ts +++ b/src/modules/staking/services/staking.abi.service.ts @@ -59,6 +59,16 @@ export class StakingAbiService return response.firstValue.valueOf().toString(); } + async getAllFarmTokenIds(stakeAddresses: string[]): Promise { + return await getAllKeys( + this.cachingService, + stakeAddresses, + 'stake.farmTokenID', + this.farmTokenID.bind(this), + CacheTtlInfo.Token, + ); + } + @ErrorLoggerAsync({ logArgs: true, }) From 61c5ae565e8192daf928144023e6a5b201a708a8 Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 17 Sep 2024 18:16:53 +0300 Subject: [PATCH 5/9] SERVICES-2592: compute user fungible tokens USD value using bulk methods --- .../user/services/esdt.compute.service.ts | 40 ++++++++ .../user/services/user.esdt.service.ts | 96 +++++++------------ 2 files changed, 76 insertions(+), 60 deletions(-) diff --git a/src/modules/user/services/esdt.compute.service.ts b/src/modules/user/services/esdt.compute.service.ts index e1884dc0d..010f36931 100644 --- a/src/modules/user/services/esdt.compute.service.ts +++ b/src/modules/user/services/esdt.compute.service.ts @@ -4,12 +4,14 @@ import { EsdtToken } from 'src/modules/tokens/models/esdtToken.model'; import { computeValueUSD } from 'src/utils/token.converters'; import { UserToken } from '../models/user.model'; import { PairComputeService } from 'src/modules/pair/services/pair.compute.service'; +import { TokenComputeService } from 'src/modules/tokens/services/token.compute.service'; @Injectable() export class UserEsdtComputeService { constructor( private readonly pairService: PairService, private readonly pairCompute: PairComputeService, + private readonly tokenCompute: TokenComputeService, ) {} async esdtTokenUSD(esdtToken: EsdtToken): Promise { @@ -26,6 +28,25 @@ export class UserEsdtComputeService { }); } + async allEsdtTokensUSD(esdtTokens: EsdtToken[]): Promise { + const allTokenPrices = + await this.tokenCompute.getAllTokensPriceDerivedUSD( + esdtTokens.map((esdtToken) => esdtToken.identifier), + ); + + return esdtTokens.map( + (esdtToken, index) => + new UserToken({ + ...esdtToken, + valueUSD: computeValueUSD( + esdtToken.balance, + esdtToken.decimals, + allTokenPrices[index], + ).toFixed(), + }), + ); + } + async lpTokenUSD( esdtToken: EsdtToken, pairAddress: string, @@ -40,4 +61,23 @@ export class UserEsdtComputeService { pairAddress, }); } + + async allLpTokensUSD( + esdtTokens: EsdtToken[], + pairAddresses: string[], + ): Promise { + const valuesUSD = await this.pairService.getAllLiquidityPositionsUSD( + pairAddresses, + esdtTokens.map((token) => token.balance), + ); + + return esdtTokens.map( + (esdtToken, index) => + new UserToken({ + ...esdtToken, + valueUSD: valuesUSD[index], + pairAddress: pairAddresses[index], + }), + ); + } } diff --git a/src/modules/user/services/user.esdt.service.ts b/src/modules/user/services/user.esdt.service.ts index 36bb62ee7..c8f44bb36 100644 --- a/src/modules/user/services/user.esdt.service.ts +++ b/src/modules/user/services/user.esdt.service.ts @@ -1,5 +1,4 @@ import { Injectable } from '@nestjs/common'; -import { Constants } from '@multiversx/sdk-nestjs-common'; import { PaginationArgs } from 'src/modules/dex.model'; import { PairService } from 'src/modules/pair/services/pair.service'; import { IEsdtToken } from 'src/modules/tokens/models/esdtToken.interface'; @@ -11,9 +10,7 @@ import { TokenService } from 'src/modules/tokens/services/token.service'; import { MXApiService } from 'src/services/multiversx-communication/mx.api.service'; import { UserToken } from '../models/user.model'; import { UserEsdtComputeService } from './esdt.compute.service'; -import { PairAbiService } from 'src/modules/pair/services/pair.abi.service'; import { RouterAbiService } from 'src/modules/router/services/router.abi.service'; -import { GetOrSetCache } from 'src/helpers/decorators/caching.decorator'; @Injectable() export class UserEsdtService { @@ -21,78 +18,57 @@ export class UserEsdtService { private readonly apiService: MXApiService, private readonly pairService: PairService, private readonly tokenService: TokenService, - private readonly pairAbi: PairAbiService, private readonly routerAbi: RouterAbiService, private readonly userEsdtCompute: UserEsdtComputeService, ) {} - @GetOrSetCache({ - baseKey: 'user', - remoteTtl: Constants.oneSecond() * 6, - }) - private async uniquePairTokens(): Promise { - return await this.getUniquePairTokensRaw(); - } - - private async getUniquePairTokensRaw(): Promise { - const promises = []; - const [pairsAddresses, uniquePairTokens] = await Promise.all([ - this.routerAbi.pairsAddress(), - this.tokenService.getUniqueTokenIDs(false), - ]); - - for (const address of pairsAddresses) { - promises.push(this.pairAbi.lpTokenID(address)); - } - - const lpTokensIDs = await Promise.all(promises); - uniquePairTokens.push(...lpTokensIDs); - - return uniquePairTokens; - } - async getAllEsdtTokens( userAddress: string, pagination: PaginationArgs, inputTokens?: IEsdtToken[], ): Promise { - const [userTokens, uniquePairTokens] = await Promise.all([ - inputTokens - ? Promise.resolve(inputTokens) - : this.apiService.getTokensForUser( - userAddress, - pagination.offset, - pagination.limit, - ), - this.uniquePairTokens(), - ]); - - const userPairEsdtTokens = userTokens.filter((token) => - uniquePairTokens.includes(token.identifier), + const [userTokens, uniquePairTokens, pairsAddresses] = + await Promise.all([ + inputTokens + ? Promise.resolve(inputTokens) + : this.apiService.getTokensForUser( + userAddress, + pagination.offset, + pagination.limit, + ), + this.tokenService.getUniqueTokenIDs(false), + this.routerAbi.pairsAddress(), + ]); + const lpTokensIDs = await this.pairService.getAllLpTokensIds( + pairsAddresses, ); - const promises = userPairEsdtTokens.map((token) => { - return this.getEsdtTokenDetails(new EsdtToken(token)); - }); - return await Promise.all(promises); - } + const userPairEsdtTokens = userTokens + .filter((token) => uniquePairTokens.includes(token.identifier)) + .map((token) => new EsdtToken(token)); - private async getEsdtTokenDetails(token: EsdtToken): Promise { - const pairAddress = await this.pairService.getPairAddressByLpTokenID( - token.identifier, - ); + const userLpEsdtTokens = userTokens + .filter((token) => lpTokensIDs.includes(token.identifier)) + .map((token) => new EsdtToken(token)); + + const orderedPairAddresses = []; + userLpEsdtTokens.forEach((token, index) => { + userLpEsdtTokens[index].type = EsdtTokenType.FungibleLpToken; - if (pairAddress) { - const userToken = await this.userEsdtCompute.lpTokenUSD( - token, - pairAddress, + const lpTokenIndex = lpTokensIDs.findIndex( + (elem) => elem === token.identifier, ); - userToken.type = EsdtTokenType.FungibleLpToken; + orderedPairAddresses.push(pairsAddresses[lpTokenIndex]); + }); - return userToken; - } - const userToken = await this.userEsdtCompute.esdtTokenUSD(token); + const detailedLpTokens = await this.userEsdtCompute.allLpTokensUSD( + userLpEsdtTokens, + orderedPairAddresses, + ); + const detailedEsdtTokens = await this.userEsdtCompute.allEsdtTokensUSD( + userPairEsdtTokens, + ); - return userToken; + return [...detailedEsdtTokens, ...detailedLpTokens]; } } From 47de833d853e125651fe5d189f267534db0691ac Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 17 Sep 2024 18:19:08 +0300 Subject: [PATCH 6/9] SERVICES-2592: use bulk getters in UserMetaEsdtService where possible --- .../user/services/user.metaEsdt.service.ts | 81 ++++++++----------- 1 file changed, 34 insertions(+), 47 deletions(-) diff --git a/src/modules/user/services/user.metaEsdt.service.ts b/src/modules/user/services/user.metaEsdt.service.ts index 776bdceb0..c3900bea4 100644 --- a/src/modules/user/services/user.metaEsdt.service.ts +++ b/src/modules/user/services/user.metaEsdt.service.ts @@ -16,7 +16,6 @@ import { Constants } from '@multiversx/sdk-nestjs-common'; import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston'; import { PaginationArgs } from '../../dex.model'; import { LockedAssetGetterService } from '../../locked-asset-factory/services/locked.asset.getter.service'; -import { farmsAddresses } from 'src/utils/farm.utils'; import { StakeFarmToken } from 'src/modules/tokens/models/stakeFarmToken.model'; import { DualYieldToken } from 'src/modules/tokens/models/dualYieldToken.model'; import { PriceDiscoveryService } from '../../price-discovery/services/price.discovery.service'; @@ -118,11 +117,7 @@ export class UserMetaEsdtService { pagination: PaginationArgs, calculateUSD = true, ): Promise { - const farmTokenIDs = await Promise.all( - farmsAddresses().map((address) => - this.farmAbi.useAbi(address).farmTokenID(address), - ), - ); + const farmTokenIDs = await this.farmAbi.getAllFarmTokenIds(); const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -254,11 +249,10 @@ export class UserMetaEsdtService { ): Promise { const stakingAddresses = await this.remoteConfigGetterService.getStakingAddresses(); - const stakingTokenIDs = await Promise.all( - stakingAddresses.map((address) => - this.stakingAbi.farmTokenID(address), - ), + const stakingTokenIDs = await this.stakingAbi.getAllFarmTokenIds( + stakingAddresses, ); + const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -289,11 +283,10 @@ export class UserMetaEsdtService { ): Promise { const stakingAddresses = await this.remoteConfigGetterService.getStakingAddresses(); - const stakingTokenIDs = await Promise.all( - stakingAddresses.map((address) => - this.stakingAbi.farmTokenID(address), - ), + const stakingTokenIDs = await this.stakingAbi.getAllFarmTokenIds( + stakingAddresses, ); + const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -324,11 +317,11 @@ export class UserMetaEsdtService { ): Promise { const stakingProxyAddresses = await this.remoteConfigGetterService.getStakingProxyAddresses(); - const dualYieldTokenIDs = await Promise.all( - stakingProxyAddresses.map((address) => - this.proxyStakeAbi.dualYieldTokenID(address), - ), - ); + const dualYieldTokenIDs = + await this.proxyStakeAbi.getAllDualYieldTokenIds( + stakingProxyAddresses, + ); + const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -352,11 +345,11 @@ export class UserMetaEsdtService { userAddress: string, pagination: PaginationArgs, ): Promise { - const redeemTokenIDs = await Promise.all( - scAddress.priceDiscovery.map((address: string) => - this.priceDiscoveryAbi.redeemTokenID(address), - ), - ); + const redeemTokenIDs = + await this.priceDiscoveryAbi.getAllRedeemTokenIds( + scAddress.priceDiscovery, + ); + const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -373,11 +366,11 @@ export class UserMetaEsdtService { userAddress: string, pagination: PaginationArgs, ): Promise { - const lockedEsdtTokenIDs = await Promise.all( - scAddress.simpleLockAddress.map((address: string) => - this.simpleLockAbi.lockedTokenID(address), - ), - ); + const lockedEsdtTokenIDs = + await this.simpleLockAbi.getAllLockedTokenIds( + scAddress.simpleLockAddress, + ); + const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -394,11 +387,11 @@ export class UserMetaEsdtService { userAddress: string, pagination: PaginationArgs, ): Promise { - const lockedSimpleLpTokenIDs = await Promise.all( - scAddress.simpleLockAddress.map((address: string) => - this.simpleLockAbi.lpProxyTokenID(address), - ), - ); + const lockedSimpleLpTokenIDs = + await this.simpleLockAbi.getAllLpProxyTokenIds( + scAddress.simpleLockAddress, + ); + const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -417,11 +410,11 @@ export class UserMetaEsdtService { userAddress: string, pagination: PaginationArgs, ): Promise { - const lockedSimpleFarmTokenIDs = await Promise.all( - scAddress.simpleLockAddress.map((address: string) => - this.simpleLockAbi.farmProxyTokenID(address), - ), - ); + const lockedSimpleFarmTokenIDs = + await this.simpleLockAbi.getAllFarmProxyTokenIds( + scAddress.simpleLockAddress, + ); + const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -676,18 +669,12 @@ export class UserMetaEsdtService { } } - let promises: Promise[] = []; - for (const farmAddress of farmsAddresses()) { - promises.push( - this.farmAbi.useAbi(farmAddress).farmTokenID(farmAddress), - ); - } - const farmTokenIDs = await Promise.all(promises); + const farmTokenIDs = await this.farmAbi.getAllFarmTokenIds(); if (farmTokenIDs.find((farmTokenID) => farmTokenID === tokenID)) { return NftTokenType.FarmToken; } - promises = []; + let promises: Promise[] = []; const staking = await this.remoteConfigGetterService.getStakingAddresses(); for (const address of staking) { From 749e3e2ddb986c7c815c251324365a7e29d52e44 Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 17 Sep 2024 18:19:38 +0300 Subject: [PATCH 7/9] SERVICES-2592: fix unit tests --- src/modules/farm/mocks/farm.abi.service.mock.ts | 5 +++++ src/modules/pair/mocks/pair.abi.service.mock.ts | 5 +++++ .../pair/mocks/pair.compute.service.mock.ts | 14 ++++++++++++++ .../tokens/mocks/token.compute.service.mock.ts | 3 +++ src/modules/tokens/mocks/token.service.mock.ts | 4 ++++ 5 files changed, 31 insertions(+) diff --git a/src/modules/farm/mocks/farm.abi.service.mock.ts b/src/modules/farm/mocks/farm.abi.service.mock.ts index c8f48a137..eaf64f57a 100644 --- a/src/modules/farm/mocks/farm.abi.service.mock.ts +++ b/src/modules/farm/mocks/farm.abi.service.mock.ts @@ -13,6 +13,11 @@ export class FarmAbiServiceMock implements IFarmAbiService { async farmTokenID(farmAddress: string): Promise { return farms.find((f) => f.address === farmAddress).farmTokenID; } + async getAllFarmTokenIds(farmsAddresses: string[]): Promise { + return farms + .filter((farm) => farmsAddresses.includes(farm.address)) + .map((farm) => farm.farmTokenID); + } async farmingTokenID(farmAddress: string): Promise { return farms.find((f) => f.address === farmAddress).farmingTokenID; } diff --git a/src/modules/pair/mocks/pair.abi.service.mock.ts b/src/modules/pair/mocks/pair.abi.service.mock.ts index d9e95a60b..061bcf213 100644 --- a/src/modules/pair/mocks/pair.abi.service.mock.ts +++ b/src/modules/pair/mocks/pair.abi.service.mock.ts @@ -32,6 +32,11 @@ export class PairAbiServiceMock implements IPairAbiService { async pairInfoMetadata(pairAddress: string): Promise { return PairsData(pairAddress).info; } + async getAllPairsInfoMetadata( + pairAddresses: string[], + ): Promise { + return pairAddresses.map((pairAddress) => PairsData(pairAddress).info); + } async totalFeePercent(pairAddress: string): Promise { return PairsData(pairAddress).totalFeePercent; } diff --git a/src/modules/pair/mocks/pair.compute.service.mock.ts b/src/modules/pair/mocks/pair.compute.service.mock.ts index 79859e77b..d20d10d31 100644 --- a/src/modules/pair/mocks/pair.compute.service.mock.ts +++ b/src/modules/pair/mocks/pair.compute.service.mock.ts @@ -55,6 +55,20 @@ export class PairComputeServiceMock implements IPairComputeService { async secondTokenPriceUSD(pairAddress: string): Promise { return PairsData(pairAddress).secondTokenPriceUSD; } + async getAllFirstTokensPriceUSD( + pairAddresses: string[], + ): Promise { + return pairAddresses.map( + (pairAddress) => PairsData(pairAddress).firstTokenPriceUSD, + ); + } + async getAllSecondTokensPricesUSD( + pairAddresses: string[], + ): Promise { + return pairAddresses.map( + (pairAddress) => PairsData(pairAddress).secondTokenPriceUSD, + ); + } async firstTokenLockedValueUSD(pairAddress: string): Promise { return PairsData(pairAddress).firstTokenLockedValueUSD; } diff --git a/src/modules/tokens/mocks/token.compute.service.mock.ts b/src/modules/tokens/mocks/token.compute.service.mock.ts index 38a6393c4..9f0770e7d 100644 --- a/src/modules/tokens/mocks/token.compute.service.mock.ts +++ b/src/modules/tokens/mocks/token.compute.service.mock.ts @@ -5,6 +5,9 @@ export class TokenComputeServiceMock { async tokenPriceDerivedEGLD(tokenID: string): Promise { return Tokens(tokenID).derivedEGLD; } + async getAllTokensPriceDerivedUSD(tokenIDs: string[]): Promise { + return tokenIDs.map((tokenID) => Tokens(tokenID).price); + } } export const TokenComputeServiceProvider = { diff --git a/src/modules/tokens/mocks/token.service.mock.ts b/src/modules/tokens/mocks/token.service.mock.ts index 804384460..9b1fcee09 100644 --- a/src/modules/tokens/mocks/token.service.mock.ts +++ b/src/modules/tokens/mocks/token.service.mock.ts @@ -21,6 +21,10 @@ export class TokenServiceMock { return [...new Set(tokenIDs)]; } + + async getAllTokensMetadata(tokenIDs: string[]): Promise { + return tokenIDs.map((tokenID) => Tokens(tokenID)); + } } export const TokenServiceProvider = { From 27fcf556e0377156fda5cf711be94a6a16c0ba29 Mon Sep 17 00:00:00 2001 From: hschiau Date: Thu, 19 Sep 2024 11:33:26 +0300 Subject: [PATCH 8/9] SERVICES-2592: fixes after review --- src/modules/farm/farm.abi.factory.ts | 4 -- src/modules/farm/farm.module.ts | 3 ++ .../services/simple.lock.abi.service.ts | 43 +------------------ .../user/services/user.metaEsdt.service.ts | 41 +++++++++++------- .../specs/user.energy.compute.service.spec.ts | 5 +++ src/modules/user/specs/user.service.spec.ts | 5 +++ 6 files changed, 39 insertions(+), 62 deletions(-) diff --git a/src/modules/farm/farm.abi.factory.ts b/src/modules/farm/farm.abi.factory.ts index 91daf46c1..5b28c8504 100644 --- a/src/modules/farm/farm.abi.factory.ts +++ b/src/modules/farm/farm.abi.factory.ts @@ -28,10 +28,6 @@ export class FarmAbiFactory { } } - async getAllFarmTokenIds(): Promise { - return await this.abiServiceV2.getAllFarmTokenIds(farmsAddresses()); - } - async isFarmToken(tokenID: string): Promise { for (const farmAddress of farmsAddresses()) { const farmTokenID = await this.useAbi(farmAddress).farmTokenID( diff --git a/src/modules/farm/farm.module.ts b/src/modules/farm/farm.module.ts index 4ad10bf8d..8ada82549 100644 --- a/src/modules/farm/farm.module.ts +++ b/src/modules/farm/farm.module.ts @@ -15,6 +15,7 @@ import { FarmTransactionFactory } from './farm.transaction.factory'; import { FarmComputeFactory } from './farm.compute.factory'; import { FarmAbiFactory } from './farm.abi.factory'; import { FarmSetterFactory } from './farm.setter.factory'; +import { FarmAbiService } from './base-module/services/farm.abi.service'; @Module({ imports: [ @@ -37,12 +38,14 @@ import { FarmSetterFactory } from './farm.setter.factory'; FarmTransactionFactory, FarmQueryResolver, FarmTransactionResolver, + FarmAbiService, ], exports: [ FarmFactoryService, FarmAbiFactory, FarmSetterFactory, FarmComputeFactory, + FarmAbiService, ], }) export class FarmModule {} diff --git a/src/modules/simple-lock/services/simple.lock.abi.service.ts b/src/modules/simple-lock/services/simple.lock.abi.service.ts index adcd9b74e..35a76e46c 100644 --- a/src/modules/simple-lock/services/simple.lock.abi.service.ts +++ b/src/modules/simple-lock/services/simple.lock.abi.service.ts @@ -6,18 +6,13 @@ import { ErrorLoggerAsync } from '@multiversx/sdk-nestjs-common'; import { GetOrSetCache } from 'src/helpers/decorators/caching.decorator'; import { CacheTtlInfo } from 'src/services/caching/cache.ttl.info'; import { ISimpleLockAbiService } from './interfaces'; -import { CacheService } from '@multiversx/sdk-nestjs-cache'; -import { getAllKeys } from 'src/utils/get.many.utils'; @Injectable() export class SimpleLockAbiService extends GenericAbiService implements ISimpleLockAbiService { - constructor( - protected readonly mxProxy: MXProxyService, - private readonly cachingService: CacheService, - ) { + constructor(protected readonly mxProxy: MXProxyService) { super(mxProxy); } @@ -44,18 +39,6 @@ export class SimpleLockAbiService return response.firstValue.valueOf().toString(); } - async getAllLockedTokenIds( - simpleLockAddresses: string[], - ): Promise { - return await getAllKeys( - this.cachingService, - simpleLockAddresses, - 'simpleLock.lockedTokenID', - this.lockedTokenID.bind(this), - CacheTtlInfo.Token, - ); - } - @ErrorLoggerAsync({ logArgs: true, }) @@ -79,18 +62,6 @@ export class SimpleLockAbiService return response.firstValue.valueOf().toString(); } - async getAllLpProxyTokenIds( - simpleLockAddresses: string[], - ): Promise { - return await getAllKeys( - this.cachingService, - simpleLockAddresses, - 'simpleLock.lpProxyTokenID', - this.lpProxyTokenID.bind(this), - CacheTtlInfo.Token, - ); - } - @ErrorLoggerAsync({ logArgs: true, }) @@ -114,18 +85,6 @@ export class SimpleLockAbiService return response.firstValue.valueOf().toString(); } - async getAllFarmProxyTokenIds( - simpleLockAddresses: string[], - ): Promise { - return await getAllKeys( - this.cachingService, - simpleLockAddresses, - 'simpleLock.farmProxyTokenID', - this.farmProxyTokenID.bind(this), - CacheTtlInfo.Token, - ); - } - @ErrorLoggerAsync({ logArgs: true, }) diff --git a/src/modules/user/services/user.metaEsdt.service.ts b/src/modules/user/services/user.metaEsdt.service.ts index c3900bea4..a64aab1ee 100644 --- a/src/modules/user/services/user.metaEsdt.service.ts +++ b/src/modules/user/services/user.metaEsdt.service.ts @@ -48,10 +48,12 @@ import { StakingProxyAbiService } from 'src/modules/staking-proxy/services/staki import { StakingAbiService } from 'src/modules/staking/services/staking.abi.service'; import { SimpleLockAbiService } from 'src/modules/simple-lock/services/simple.lock.abi.service'; import { PriceDiscoveryAbiService } from 'src/modules/price-discovery/services/price.discovery.abi.service'; -import { FarmAbiFactory } from 'src/modules/farm/farm.abi.factory'; import { GetOrSetCache } from 'src/helpers/decorators/caching.decorator'; import { ErrorLoggerAsync } from '@multiversx/sdk-nestjs-common'; import { ContextGetterService } from 'src/services/context/context.getter.service'; +import { FarmAbiService } from 'src/modules/farm/base-module/services/farm.abi.service'; +import { farmsAddresses } from 'src/utils/farm.utils'; + enum NftTokenType { FarmToken, LockedAssetToken, @@ -76,7 +78,7 @@ export class UserMetaEsdtService { private readonly apiService: MXApiService, private readonly proxyPairAbi: ProxyPairAbiService, private readonly proxyFarmAbi: ProxyFarmAbiService, - private readonly farmAbi: FarmAbiFactory, + private readonly farmAbi: FarmAbiService, private readonly lockedAssetGetter: LockedAssetGetterService, private readonly stakingAbi: StakingAbiService, private readonly proxyStakeAbi: StakingProxyAbiService, @@ -117,7 +119,9 @@ export class UserMetaEsdtService { pagination: PaginationArgs, calculateUSD = true, ): Promise { - const farmTokenIDs = await this.farmAbi.getAllFarmTokenIds(); + const farmTokenIDs = await this.farmAbi.getAllFarmTokenIds( + farmsAddresses(), + ); const nfts = await this.contextGetter.getNftsForUser( userAddress, pagination.offset, @@ -366,10 +370,11 @@ export class UserMetaEsdtService { userAddress: string, pagination: PaginationArgs, ): Promise { - const lockedEsdtTokenIDs = - await this.simpleLockAbi.getAllLockedTokenIds( - scAddress.simpleLockAddress, - ); + const lockedEsdtTokenIDs = await Promise.all( + scAddress.simpleLockAddress.map((address: string) => + this.simpleLockAbi.lockedTokenID(address), + ), + ); const nfts = await this.contextGetter.getNftsForUser( userAddress, @@ -387,10 +392,11 @@ export class UserMetaEsdtService { userAddress: string, pagination: PaginationArgs, ): Promise { - const lockedSimpleLpTokenIDs = - await this.simpleLockAbi.getAllLpProxyTokenIds( - scAddress.simpleLockAddress, - ); + const lockedSimpleLpTokenIDs = await Promise.all( + scAddress.simpleLockAddress.map((address: string) => + this.simpleLockAbi.lpProxyTokenID(address), + ), + ); const nfts = await this.contextGetter.getNftsForUser( userAddress, @@ -410,10 +416,11 @@ export class UserMetaEsdtService { userAddress: string, pagination: PaginationArgs, ): Promise { - const lockedSimpleFarmTokenIDs = - await this.simpleLockAbi.getAllFarmProxyTokenIds( - scAddress.simpleLockAddress, - ); + const lockedSimpleFarmTokenIDs = await Promise.all( + scAddress.simpleLockAddress.map((address: string) => + this.simpleLockAbi.farmProxyTokenID(address), + ), + ); const nfts = await this.contextGetter.getNftsForUser( userAddress, @@ -669,7 +676,9 @@ export class UserMetaEsdtService { } } - const farmTokenIDs = await this.farmAbi.getAllFarmTokenIds(); + const farmTokenIDs = await this.farmAbi.getAllFarmTokenIds( + farmsAddresses(), + ); if (farmTokenIDs.find((farmTokenID) => farmTokenID === tokenID)) { return NftTokenType.FarmToken; } diff --git a/src/modules/user/specs/user.energy.compute.service.spec.ts b/src/modules/user/specs/user.energy.compute.service.spec.ts index 1726a6253..69e38a30a 100644 --- a/src/modules/user/specs/user.energy.compute.service.spec.ts +++ b/src/modules/user/specs/user.energy.compute.service.spec.ts @@ -69,6 +69,7 @@ import { MetabondingAbiServiceMockProvider } from 'src/modules/metabonding/mocks import { AnalyticsQueryServiceProvider } from 'src/services/analytics/mocks/analytics.query.service.mock'; import { ElasticSearchModule } from 'src/services/elastic-search/elastic.search.module'; import { StakingProxyFilteringService } from 'src/modules/staking-proxy/services/staking.proxy.filtering.service'; +import { FarmAbiService } from 'src/modules/farm/base-module/services/farm.abi.service'; describe('UserEnergyComputeService', () => { let module: TestingModule; @@ -102,6 +103,10 @@ describe('UserEnergyComputeService', () => { provide: FarmAbiServiceV2, useClass: FarmAbiServiceMock, }, + { + provide: FarmAbiService, + useClass: FarmAbiServiceMock, + }, LockedTokenWrapperAbiServiceProvider, LockedAssetService, FarmAbiFactory, diff --git a/src/modules/user/specs/user.service.spec.ts b/src/modules/user/specs/user.service.spec.ts index cfb931a9b..4fff5c917 100644 --- a/src/modules/user/specs/user.service.spec.ts +++ b/src/modules/user/specs/user.service.spec.ts @@ -66,6 +66,7 @@ import { ApiConfigService } from 'src/helpers/api.config.service'; import winston from 'winston'; import { TokenComputeServiceProvider } from 'src/modules/tokens/mocks/token.compute.service.mock'; import { DynamicModuleUtils } from 'src/utils/dynamic.module.utils'; +import { FarmAbiService } from 'src/modules/farm/base-module/services/farm.abi.service'; describe('UserService', () => { let module: TestingModule; @@ -100,6 +101,10 @@ describe('UserService', () => { provide: FarmAbiServiceV2, useClass: FarmAbiServiceMock, }, + { + provide: FarmAbiService, + useClass: FarmAbiServiceMock, + }, FarmAbiFactory, LockedTokenWrapperAbiServiceProvider, ProxyService, From 01493787606a60926fc8e2b3dcc30273a76cee72 Mon Sep 17 00:00:00 2001 From: hschiau Date: Tue, 5 Nov 2024 16:40:12 +0200 Subject: [PATCH 9/9] SERVICES-2592: fix import in unit test --- .../user/specs/user.energy.transaction.service.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/modules/user/specs/user.energy.transaction.service.spec.ts b/src/modules/user/specs/user.energy.transaction.service.spec.ts index 5d8366101..e3f7daa40 100644 --- a/src/modules/user/specs/user.energy.transaction.service.spec.ts +++ b/src/modules/user/specs/user.energy.transaction.service.spec.ts @@ -69,6 +69,8 @@ import { UserEnergyTransactionService } from '../services/userEnergy/user.energy import { encodeTransactionData } from 'src/helpers/helpers'; import { TransactionModel } from 'src/models/transaction.model'; import { ContractType } from '../models/user.model'; +import { StakingComputeService } from 'src/modules/staking/services/staking.compute.service'; +import { FarmAbiService } from 'src/modules/farm/base-module/services/farm.abi.service'; describe('UserEnergyTransactionService', () => { let module: TestingModule; @@ -104,6 +106,7 @@ describe('UserEnergyTransactionService', () => { FarmComputeServiceV1_2, FarmComputeServiceV1_3, FarmComputeServiceV2, + FarmAbiService, FarmAbiServiceProviderV1_2, FarmAbiServiceProviderV1_3, LockedTokenWrapperService, @@ -128,6 +131,7 @@ describe('UserEnergyTransactionService', () => { SimpleLockService, StakingAbiServiceProvider, StakingServiceProvider, + StakingComputeService, PriceDiscoveryServiceProvider, PriceDiscoveryAbiServiceProvider, PriceDiscoveryComputeServiceProvider,