diff --git a/apps/ftso-data-provider/src/dto/data-provider-responses.dto.ts b/apps/ftso-data-provider/src/dto/data-provider-responses.dto.ts index b8725ae0..38dddd7d 100644 --- a/apps/ftso-data-provider/src/dto/data-provider-responses.dto.ts +++ b/apps/ftso-data-provider/src/dto/data-provider-responses.dto.ts @@ -1,5 +1,6 @@ // PDP (Protocol Data Provider) Response +import { RewardEpoch } from "../../../../libs/ftso-core/src/RewardEpoch"; import { AbiDataInput } from "../../../../libs/ftso-core/src/utils/ABICache"; import { FeedResultWithProof, TreeResult } from "../../../../libs/ftso-core/src/utils/MerkleTreeStructs"; import { MedianCalculationResult } from "../../../../libs/ftso-core/src/voting-types"; @@ -60,6 +61,25 @@ export type ExternalMedianResponse = | ExternalMedianResponseNotAvailable | ExternalMedianResponseTooEarly; +interface ExternalRewardEpochResponseOk { + status: ExternalResponseStatusEnum.OK; + rewardEpochId: number; + rewardEpochFeedConfiguration: RewardEpoch; +} + +interface ExternalRewardEpochResponseNotAvailable { + status: ExternalResponseStatusEnum.NOT_AVAILABLE; +} + +interface ExternalRewardEpochResponseTooEarly { + status: ExternalResponseStatusEnum.TOO_EARLY; +} + +export type ExternalRewardEpochResponse = + | ExternalRewardEpochResponseOk + | ExternalRewardEpochResponseNotAvailable + | ExternalRewardEpochResponseTooEarly; + export interface JSONAbiDefinition { abiName: string; data: AbiDataInput; diff --git a/apps/ftso-data-provider/src/ftso-data-provider.controller.ts b/apps/ftso-data-provider/src/ftso-data-provider.controller.ts index a61f2a06..916eb1c9 100644 --- a/apps/ftso-data-provider/src/ftso-data-provider.controller.ts +++ b/apps/ftso-data-provider/src/ftso-data-provider.controller.ts @@ -18,6 +18,7 @@ import { ExternalMedianResponse, ExternalResponse, ExternalResponseStatusEnum, + ExternalRewardEpochResponse, PDPResponse, PDPResponseStatusEnum, } from "./dto/data-provider-responses.dto"; @@ -177,6 +178,20 @@ export class FtsoDataProviderController implements BeforeApplicationShutdown { }; } + @ApiTags(ApiTagsEnum.EXTERNAL) + @Get("rewardEpochFeedConfiguration/:votingRoundId") + async rewardEpochConfiguration( + @Param("votingRoundId", ParseIntPipe) votingRoundId: number + ): Promise { + const data = await this.ftsoDataProviderService.getRewardEpoch(votingRoundId); + + return { + status: data ? ExternalResponseStatusEnum.OK : ExternalResponseStatusEnum.NOT_AVAILABLE, + rewardEpochId: data.rewardEpochId, + rewardEpochFeedConfiguration: data, + }; + } + async beforeApplicationShutdown() { this.shutdownInitiated = true; this.logger.log(`Shutdown initiated, voting round commits disabled.`); diff --git a/apps/ftso-data-provider/src/ftso-data-provider.service.ts b/apps/ftso-data-provider/src/ftso-data-provider.service.ts index ef624561..db55cc62 100644 --- a/apps/ftso-data-provider/src/ftso-data-provider.service.ts +++ b/apps/ftso-data-provider/src/ftso-data-provider.service.ts @@ -237,6 +237,12 @@ export class FtsoDataProviderService { ]; } + async getRewardEpoch(votingRoundId: number): Promise { + const rewardEpoch = await this.rewardEpochManager.getRewardEpochForVotingEpochId(votingRoundId); + + return rewardEpoch; + } + // Internal methods private async getFeedValuesForEpoch(votingRoundId: number, supportedFeeds: Feed[]): Promise {