From 208ac8e8fc43148616676abf861aba4f23c73414 Mon Sep 17 00:00:00 2001 From: arobsn <87387688+arobsn@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:54:44 -0300 Subject: [PATCH] `Fix `Header#votes` encoding` --- .changeset/mean-yaks-lay.md | 5 +++ .../ergo-graphql/ergoGraphQLProvider.spec.ts | 2 +- .../src/ergo-graphql/ergoGraphQLProvider.ts | 35 +++++++++++-------- .../src/utils/graphql.spec.ts | 14 +------- .../blockchain-providers/src/utils/graphql.ts | 4 --- 5 files changed, 28 insertions(+), 32 deletions(-) create mode 100644 .changeset/mean-yaks-lay.md diff --git a/.changeset/mean-yaks-lay.md b/.changeset/mean-yaks-lay.md new file mode 100644 index 0000000..5e4ba64 --- /dev/null +++ b/.changeset/mean-yaks-lay.md @@ -0,0 +1,5 @@ +--- +"@fleet-sdk/blockchain-providers": patch +--- + +Fix `Header#votes` encoding diff --git a/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.spec.ts b/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.spec.ts index e359489..89e07af 100644 --- a/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.spec.ts +++ b/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.spec.ts @@ -674,7 +674,7 @@ describe("ergo-graphql provider", () => { id: header.headerId, nBits: Number(header.nBits), timestamp: Number(header.timestamp), - votes: header.votes.join("") + votes: "000000" })) ); expect(fetchSpy).toHaveBeenCalledOnce(); diff --git a/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.ts b/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.ts index 8ef04b8..633f641 100644 --- a/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.ts +++ b/packages/blockchain-providers/src/ergo-graphql/ergoGraphQLProvider.ts @@ -12,18 +12,20 @@ import type { import { type Base58String, type BlockHeader, - ensureDefaults, type HexString, + type SignedTransaction, + ensureDefaults, isEmpty, isUndefined, NotSupportedError, orderBy, - type SignedTransaction, some, uniq, - uniqBy + uniqBy, + chunk } from "@fleet-sdk/common"; import { ErgoAddress } from "@fleet-sdk/core"; +import { hex } from "@fleet-sdk/crypto"; import type { BoxQuery, BoxWhere, @@ -39,12 +41,11 @@ import type { UnconfirmedTransactionWhere } from "../types/blockchainProvider"; import { - createGqlOperation, type GraphQLOperation, type GraphQLRequestOptions, type GraphQLSuccessResponse, type GraphQLVariables, - isRequestParam + createGqlOperation } from "../utils"; import { ALL_BOXES_QUERY, @@ -56,7 +57,6 @@ import { UNCONF_BOXES_QUERY, UNCONF_TX_QUERY } from "./queries"; -import { chunk } from "packages/common/src"; export type GraphQLBoxWhere = BoxWhere & { /** Base16-encoded ErgoTrees */ @@ -79,7 +79,7 @@ export type GraphQLUnconfirmedTransactionWhere = UnconfirmedTransactionWhere & { export type GraphQLBoxQuery = BoxQuery; export type ErgoGraphQLRequestOptions = Omit< GraphQLRequestOptions, - "throwOnNonNetworkError" + "throwOnNonNetworkErrors" >; type ConfirmedBoxesResponse = { boxes: GQLBox[] }; @@ -92,7 +92,10 @@ type CheckTransactionResponse = { checkTransaction: string }; type TransactionSubmissionResponse = { submitTransaction: string }; type SignedTxArgsResp = { signedTransaction: SignedTransaction }; -type GraphQLThrowableOptions = GraphQLRequestOptions & { throwOnNonNetworkErrors: true }; +type GraphQLThrowableOptions = ErgoGraphQLRequestOptions & { + throwOnNonNetworkErrors: true; +}; + type OP = GraphQLOperation, V>; type BiMapper = (value: string) => T; @@ -284,12 +287,12 @@ export class ErgoGraphQLProvider implements IBlockchainProvider { const response = await this.#getHeaders(query); return ( - response.data?.blockHeaders.map((header) => ({ - ...header, - id: header.headerId, - timestamp: Number(header.timestamp), - nBits: Number(header.nBits), - votes: header.votes.join("") + response.data?.blockHeaders.map((h) => ({ + ...h, + id: h.headerId, + timestamp: Number(h.timestamp), + nBits: Number(h.nBits), + votes: hex.encode(Uint8Array.from(h.votes)) })) ?? [] ); } @@ -479,3 +482,7 @@ function mapConfirmedTransaction( confirmed: true }; } + +export function isRequestParam(obj: unknown): obj is ErgoGraphQLRequestOptions { + return typeof obj === "object" && (obj as ErgoGraphQLRequestOptions).url !== undefined; +} diff --git a/packages/blockchain-providers/src/utils/graphql.spec.ts b/packages/blockchain-providers/src/utils/graphql.spec.ts index 4f1f3da..70839df 100644 --- a/packages/blockchain-providers/src/utils/graphql.spec.ts +++ b/packages/blockchain-providers/src/utils/graphql.spec.ts @@ -9,8 +9,7 @@ import { gql, type GraphQLOperation, type GraphQLSuccessResponse, - type GraphQLVariables, - isRequestParam + type GraphQLVariables } from "./graphql"; describe("GraphQL query builder", () => { @@ -255,14 +254,3 @@ describe("Operation name extraction", () => { expect(getOpName(" query ($take: Int) { boxes { boxId } }")).to.be.undefined; }); }); - -describe("Request param handler", () => { - it("should return true for valid request params", () => { - expect(isRequestParam({ url: "https://gql.example.com/" })).to.be.true; - }); - - it("should return false for invalid request params", () => { - expect(isRequestParam({})).to.be.false; - expect(isRequestParam(3)).to.be.false; - }); -}); diff --git a/packages/blockchain-providers/src/utils/graphql.ts b/packages/blockchain-providers/src/utils/graphql.ts index bbe53a0..b8c6260 100644 --- a/packages/blockchain-providers/src/utils/graphql.ts +++ b/packages/blockchain-providers/src/utils/graphql.ts @@ -118,7 +118,3 @@ export function gql(query: TemplateStringsArray): string { export function getOpName(query: string): string | undefined { return OP_NAME_REGEX.exec(query)?.at(2); } - -export function isRequestParam(obj: unknown): obj is GraphQLRequestOptions { - return typeof obj === "object" && (obj as GraphQLRequestOptions).url !== undefined; -}