Skip to content

Commit

Permalink
Merge pull request #1461 from multiversx/SERVICES-2577-staking-farms-…
Browse files Browse the repository at this point in the history
…filter-for-depleted-rewards

[SERVICES-2577] Staking farms filter by depleted rewards
  • Loading branch information
mad2sm0key authored Sep 11, 2024
2 parents 040c5fc + 8a09f04 commit e4ba03b
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 4 deletions.
2 changes: 2 additions & 0 deletions src/modules/staking/models/staking.args.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ export class ClaimRewardsWithNewValueArgs extends GenericStakeFarmArgs {
export class StakingFarmsFilter {
@Field(() => String, { nullable: true })
searchToken?: string;
@Field({ nullable: true })
rewardsEnded?: boolean;
}

@InputType()
Expand Down
43 changes: 43 additions & 0 deletions src/modules/staking/services/staking.abi.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import { CacheTtlInfo } from 'src/services/caching/cache.ttl.info';
import { IStakingAbiService } from './interfaces';
import { BoostedYieldsFactors } from 'src/modules/farm/models/farm.v2.model';
import { MXApiService } from 'src/services/multiversx-communication/mx.api.service';
import { CacheService } from '@multiversx/sdk-nestjs-cache';
import { getAllKeys } from 'src/utils/get.many.utils';

@Injectable()
export class StakingAbiService
Expand All @@ -30,6 +32,7 @@ export class StakingAbiService
protected readonly mxProxy: MXProxyService,
private readonly gatewayService: MXGatewayService,
private readonly apiService: MXApiService,
private readonly cachingService: CacheService,
) {
super(mxProxy);
}
Expand Down Expand Up @@ -78,6 +81,15 @@ export class StakingAbiService
return response.firstValue.valueOf().toString();
}

async getAllFarmingTokensIds(stakeAddresses: string[]): Promise<string[]> {
return await getAllKeys<string>(
this.cachingService,
stakeAddresses,
'stake.farmingTokenID',
this.farmingTokenID.bind(this),
);
}

@ErrorLoggerAsync({
logArgs: true,
})
Expand Down Expand Up @@ -166,6 +178,17 @@ export class StakingAbiService
return response.firstValue.valueOf().toFixed();
}

async getAllAccumulatedRewards(
stakeAddresses: string[],
): Promise<string[]> {
return await getAllKeys<string>(
this.cachingService,
stakeAddresses,
'stake.accumulatedRewards',
this.accumulatedRewards.bind(this),
);
}

@ErrorLoggerAsync({
logArgs: true,
})
Expand All @@ -188,6 +211,15 @@ export class StakingAbiService
return response.firstValue.valueOf().toFixed();
}

async getAllRewardCapacity(stakeAddresses: string[]): Promise<string[]> {
return await getAllKeys<string>(
this.cachingService,
stakeAddresses,
'stake.rewardCapacity',
this.rewardCapacity.bind(this),
);
}

@ErrorLoggerAsync({
logArgs: true,
})
Expand Down Expand Up @@ -318,6 +350,17 @@ export class StakingAbiService
return response === '01';
}

async getAllProduceRewardsEnabled(
stakeAddresses: string[],
): Promise<boolean[]> {
return await getAllKeys<boolean>(
this.cachingService,
stakeAddresses,
'stake.produceRewardsEnabled',
this.produceRewardsEnabled.bind(this),
);
}

@ErrorLoggerAsync({
logArgs: true,
})
Expand Down
38 changes: 34 additions & 4 deletions src/modules/staking/services/staking.filtering.service.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { Inject, Injectable, forwardRef } from '@nestjs/common';
import { StakingFarmsFilter } from '../models/staking.args';
import { StakingService } from './staking.service';
import { StakingAbiService } from './staking.abi.service';

@Injectable()
export class StakingFilteringService {
constructor(
@Inject(forwardRef(() => StakingService))
private readonly stakingService: StakingService,
private readonly stakingAbi: StakingAbiService,
) {}

async stakingFarmsByToken(
Expand All @@ -22,10 +24,8 @@ export class StakingFilteringService {

const searchTerm = stakingFilter.searchToken.toUpperCase().trim();

const farmingTokens = await Promise.all(
stakeAddresses.map((address) =>
this.stakingService.getFarmingToken(address),
),
const farmingTokens = await this.stakingService.getAllFarmingTokens(
stakeAddresses,
);

const filteredAddresses: string[] = [];
Expand All @@ -43,4 +43,34 @@ export class StakingFilteringService {

return filteredAddresses;
}

async stakingFarmsByRewardsDepleted(
stakingFilter: StakingFarmsFilter,
stakeAddresses: string[],
): Promise<string[]> {
if (
typeof stakingFilter.rewardsEnded === 'undefined' ||
stakingFilter.rewardsEnded === null
) {
return stakeAddresses;
}

const allProduceRewardsEnabled =
await this.stakingAbi.getAllProduceRewardsEnabled(stakeAddresses);
const allAccumulatedRewards =
await this.stakingAbi.getAllAccumulatedRewards(stakeAddresses);
const allRewardCapacity = await this.stakingAbi.getAllRewardCapacity(
stakeAddresses,
);

const rewardsDepleted = stakeAddresses.map(
(_, index) =>
allAccumulatedRewards[index] === allRewardCapacity[index] ||
!allProduceRewardsEnabled[index],
);

return stakeAddresses.filter(
(_, index) => rewardsDepleted[index] === stakingFilter.rewardsEnded,
);
}
}
14 changes: 14 additions & 0 deletions src/modules/staking/services/staking.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,12 @@ export class StakingService {
farmsStakingAddresses,
);

farmsStakingAddresses =
await this.stakingFilteringService.stakingFarmsByRewardsDepleted(
filters,
farmsStakingAddresses,
);

if (sorting) {
farmsStakingAddresses = await this.sortFarms(
farmsStakingAddresses,
Expand Down Expand Up @@ -121,6 +127,14 @@ export class StakingService {
return await this.tokenService.tokenMetadata(farmingTokenID);
}

async getAllFarmingTokens(stakeAddresses: string[]): Promise<EsdtToken[]> {
const farmingTokenIDs = await this.stakingAbi.getAllFarmingTokensIds(
stakeAddresses,
);

return await this.tokenService.getAllTokensMetadata(farmingTokenIDs);
}

async getRewardToken(stakeAddress: string): Promise<EsdtToken> {
const rewardTokenID = await this.stakingAbi.rewardTokenID(stakeAddress);
return await this.tokenService.tokenMetadata(rewardTokenID);
Expand Down

0 comments on commit e4ba03b

Please sign in to comment.