From 5ee3f82b83c0d2ec12ce1f73d5a19781f343d2f2 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 9 Jun 2021 14:50:14 +0200 Subject: [PATCH] tendermint-rpc: Support order_by param in Tendermint v0.34 tx search --- .../src/tendermint34/adaptor/requests.ts | 2 ++ .../src/tendermint34/requests.ts | 1 + .../tendermint34/tendermint34client.spec.ts | 35 +++++++++++++++++++ .../src/tendermint34/tendermint34client.ts | 10 +----- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/requests.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/requests.ts index c835bea1..89a15fce 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/requests.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/requests.ts @@ -89,6 +89,7 @@ interface RpcTxSearchParams { readonly prove?: boolean; readonly page?: string; readonly per_page?: string; + readonly order_by?: string; } function encodeTxSearchParams(params: requests.TxSearchParams): RpcTxSearchParams { return { @@ -96,6 +97,7 @@ function encodeTxSearchParams(params: requests.TxSearchParams): RpcTxSearchParam prove: params.prove, page: may(Integer.encode, params.page), per_page: may(Integer.encode, params.per_page), + order_by: params.order_by, }; } diff --git a/packages/tendermint-rpc/src/tendermint34/requests.ts b/packages/tendermint-rpc/src/tendermint34/requests.ts index 75690766..bc1e1146 100644 --- a/packages/tendermint-rpc/src/tendermint34/requests.ts +++ b/packages/tendermint-rpc/src/tendermint34/requests.ts @@ -174,6 +174,7 @@ export interface TxSearchParams { readonly prove?: boolean; readonly page?: number; readonly per_page?: number; + readonly order_by?: string; } export interface ValidatorsRequest { diff --git a/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts b/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts index 823dabe1..38272dc2 100644 --- a/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts +++ b/packages/tendermint-rpc/src/tendermint34/tendermint34client.spec.ts @@ -439,6 +439,41 @@ function defaultTestSuite(rpcFactory: () => RpcClient, expected: ExpectedValues) } }); + it("returns transactions in ascending order by default", async () => { + // NOTE: The Tendermint docs claim the default ordering is "desc" but it is actually "asc" + // Docs: https://docs.tendermint.com/master/rpc/#/Info/tx_search + // Code: https://github.com/tendermint/tendermint/blob/v0.34.10/rpc/core/tx.go#L89 + pendingWithoutTendermint(); + const client = await Tendermint34Client.create(rpcFactory()); + + const query = buildQuery({ tags: [{ key: "app.key", value: key }] }); + + const s = await client.txSearch({ query: query }); + + expect(s.totalCount).toEqual(3); + s.txs.slice(1).reduce((lastHeight, { height }) => { + expect(height).toBeGreaterThanOrEqual(lastHeight); + return height; + }, s.txs[0].height); + + client.disconnect(); + }); + + it("can set the order", async () => { + pendingWithoutTendermint(); + const client = await Tendermint34Client.create(rpcFactory()); + + const query = buildQuery({ tags: [{ key: "app.key", value: key }] }); + + const s1 = await client.txSearch({ query: query, order_by: "desc" }); + const s2 = await client.txSearch({ query: query, order_by: "asc" }); + + expect(s1.totalCount).toEqual(s2.totalCount); + expect([...s1.txs].reverse()).toEqual(s2.txs); + + client.disconnect(); + }); + it("can paginate over txSearch results", async () => { pendingWithoutTendermint(); const client = await Tendermint34Client.create(rpcFactory()); diff --git a/packages/tendermint-rpc/src/tendermint34/tendermint34client.ts b/packages/tendermint-rpc/src/tendermint34/tendermint34client.ts index 4650b7a9..05176d60 100644 --- a/packages/tendermint-rpc/src/tendermint34/tendermint34client.ts +++ b/packages/tendermint-rpc/src/tendermint34/tendermint34client.ts @@ -257,12 +257,7 @@ export class Tendermint34Client { */ public async txSearch(params: requests.TxSearchParams): Promise { const query: requests.TxSearchRequest = { params: params, method: requests.Method.TxSearch }; - const resp = await this.doCall(query, this.p.encodeTxSearch, this.r.decodeTxSearch); - return { - ...resp, - // make sure we sort by height, as tendermint may be sorting by string value of the height - txs: [...resp.txs].sort((a, b) => a.height - b.height), - }; + return this.doCall(query, this.p.encodeTxSearch, this.r.decodeTxSearch); } // this should paginate through all txSearch options to ensure it returns all results. @@ -281,9 +276,6 @@ export class Tendermint34Client { done = true; } } - // make sure we sort by height, as tendermint may be sorting by string value of the height - // and the earlier items may be in a higher page than the later items - txs.sort((a, b) => a.height - b.height); return { totalCount: txs.length,