From a23172005ced63e51af9a8ac1379b2932be1c874 Mon Sep 17 00:00:00 2001 From: Jimmy Date: Wed, 8 May 2024 15:46:34 -0600 Subject: [PATCH 1/2] add unencoded voting round data endpoint for easier data visualization --- .../src/dto/data-provider-responses.dto.ts | 31 +++++++++++++++++++ .../src/ftso-data-provider.controller.ts | 17 +++++++++- .../src/ftso-data-provider.service.ts | 8 +++++ 3 files changed, 55 insertions(+), 1 deletion(-) 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 a7c819a6..a98aa868 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,7 +1,18 @@ // PDP (Protocol Data Provider) Response import { AbiDataInput } from "../../../../libs/ftso-core/src/utils/ABICache"; +import { MerkleTree } from "../../../../libs/ftso-core/src/utils/MerkleTree"; import { TreeResult } from "../../../../libs/ftso-core/src/utils/MerkleTreeStructs"; +import { MedianCalculationResult, RandomCalculationResult } from "../../../../libs/ftso-core/src/voting-types"; + +export interface BigInt { + toJSON: () => string; +} +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +BigInt.prototype.toJSON = function () { + return this.toString(); +}; export enum PDPResponseStatusEnum { OK = "OK", @@ -40,6 +51,26 @@ interface ExternalResponseNotAvailable { export type ExternalResponse = ExternalResponseOk | ExternalResponseTooEarly | ExternalResponseNotAvailable; +interface UnencodedResultDataOk { + status: ExternalResponseStatusEnum.OK; + votingRoundId: number; + medianData: MedianCalculationResult[]; + randomData: RandomCalculationResult; + merkleTree: MerkleTree; +} +interface UnencodedResultDataTooEarly { + status: ExternalResponseStatusEnum.TOO_EARLY; +} + +interface UnencodedResultDataNotAvailable { + status: ExternalResponseStatusEnum.NOT_AVAILABLE; +} + +export type UnencodedResultDataResponse = + | UnencodedResultDataOk + | UnencodedResultDataTooEarly + | UnencodedResultDataNotAvailable; + 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 69c3f7bf..1ac59847 100644 --- a/apps/ftso-data-provider/src/ftso-data-provider.controller.ts +++ b/apps/ftso-data-provider/src/ftso-data-provider.controller.ts @@ -6,6 +6,7 @@ import { ExternalResponseStatusEnum, PDPResponse, PDPResponseStatusEnum, + UnencodedResultDataResponse, } from "./dto/data-provider-responses.dto"; import { FtsoDataProviderService } from "./ftso-data-provider.service"; import { ProtocolMessageMerkleRoot } from "../../../libs/fsp-utils/src/ProtocolMessageMerkleRoot"; @@ -97,7 +98,7 @@ export class FtsoDataProviderController { @ApiTags(ApiTagsEnum.EXTERNAL) @Get("data/:votingRoundId") async merkleTree(@Param("votingRoundId", ParseIntPipe) votingRoundId: number): Promise { - // TODO: handle to early response as it is more informative, for now we respond with not available for to early cases + // TODO: handle to early response as it is more informative, for now we respond with not available for too early cases const data = await this.ftsoDataProviderService.getFullMerkleTree(votingRoundId); return { status: data ? ExternalResponseStatusEnum.OK : ExternalResponseStatusEnum.NOT_AVAILABLE, @@ -105,6 +106,20 @@ export class FtsoDataProviderController { }; } + @ApiTags(ApiTagsEnum.EXTERNAL) + @Get("results/:votingRoundId") + async getResultsForVotingRound( + @Param("votingRoundId", ParseIntPipe) votingRoundId: number + ): Promise { + // TODO: handle to early response as it is more informative, for now we respond with not available for too early cases + this.logger.log(`Calling GET on results with param: votingRoundId ${votingRoundId}`); + const data = await this.ftsoDataProviderService.getUnencodedResultData(votingRoundId); + return { + status: data ? ExternalResponseStatusEnum.OK : ExternalResponseStatusEnum.NOT_AVAILABLE, + ...data, + }; + } + @ApiTags(ApiTagsEnum.EXTERNAL) @Get("data-abis") async treeAbis(): Promise { 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 03c6d5d8..5af55bed 100644 --- a/apps/ftso-data-provider/src/ftso-data-provider.service.ts +++ b/apps/ftso-data-provider/src/ftso-data-provider.service.ts @@ -142,6 +142,14 @@ export class FtsoDataProviderService { return message; } + async getUnencodedResultData(votingRoundId: number): Promise { + const result = await this.prepareCalculationResultData(votingRoundId); + if (result === undefined) { + return undefined; + } + return result; + } + async getFullMerkleTree(votingRoundId: number): Promise { const result = await this.prepareCalculationResultData(votingRoundId); if (result === undefined) { From d3749ae77bbdddc2e41e3327b43abd48acf5878b Mon Sep 17 00:00:00 2001 From: Jimmy Date: Mon, 20 May 2024 13:53:43 -0600 Subject: [PATCH 2/2] remove redundant check --- apps/ftso-data-provider/src/ftso-data-provider.service.ts | 3 --- 1 file changed, 3 deletions(-) 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 5af55bed..62cf6cc1 100644 --- a/apps/ftso-data-provider/src/ftso-data-provider.service.ts +++ b/apps/ftso-data-provider/src/ftso-data-provider.service.ts @@ -144,9 +144,6 @@ export class FtsoDataProviderService { async getUnencodedResultData(votingRoundId: number): Promise { const result = await this.prepareCalculationResultData(votingRoundId); - if (result === undefined) { - return undefined; - } return result; }