From 5620bb3d80462f4e74ec5531d300919dad6bef82 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 12 Aug 2020 15:25:19 +0200 Subject: [PATCH] Use autogenerated typed queries --- packages/stargate/src/queries/bank.ts | 28 +++++++++++++++-------- packages/stargate/src/stargateclient.ts | 4 ++-- packages/stargate/types/queries/bank.d.ts | 4 +++- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/stargate/src/queries/bank.ts b/packages/stargate/src/queries/bank.ts index 8bd8b97e..29f4629d 100644 --- a/packages/stargate/src/queries/bank.ts +++ b/packages/stargate/src/queries/bank.ts @@ -6,11 +6,24 @@ import { QueryClient } from "../queryclient"; export interface BankExtension { readonly bank: { readonly balance: (address: string, denom: string) => Promise; - readonly balances: (address: string) => Promise; + readonly unverified: { + readonly balances: (address: string) => Promise; + }; }; } export function setupBankExtension(base: QueryClient): BankExtension { + // Use this service to get easy typed access to query methods + // This cannot be used to for proof verification + const queryService = cosmos.bank.Query.create((method: any, requestData, callback) => { + // Parts of the path are unavailable, so we hardcode them here. See https://github.com/protobufjs/protobuf.js/issues/1229 + const path = `/cosmos.bank.Query/${method.name}`; + base + .queryUnverified(path, requestData) + .then((response) => callback(null, response)) + .catch((error) => callback(error)); + }); + return { bank: { balance: async (address: string, denom: string) => { @@ -25,14 +38,11 @@ export function setupBankExtension(base: QueryClient): BankExtension { const responseData = await base.queryVerified("bank", bankKey); return cosmos.Coin.decode(responseData); }, - balances: async (address: string) => { - const path = "/cosmos.bank.Query/AllBalances"; - const request = cosmos.bank.QueryAllBalancesRequest.encode({ - address: Bech32.decode(address).data, - }).finish(); - const responseData = await base.queryUnverified(path, request); - const response = cosmos.bank.QueryAllBalancesResponse.decode(responseData); - return response.balances; + unverified: { + balances: async (address: string) => { + const response = await queryService.allBalances({ address: Bech32.decode(address).data }); + return response.balances; + }, }, }, }; diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 61563561..6354e302 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -194,7 +194,7 @@ export class StargateClient { public async getBalance(address: string, searchDenom: string): Promise { const balance = await this.queryClient.bank.balance(address, searchDenom); - if (!balance.denom) { + if (!balance?.denom) { return null; } else { return coinFromProto(balance); @@ -208,7 +208,7 @@ export class StargateClient { * proofs from such a method. */ public async getAllBalancesUnverified(address: string): Promise { - const balances = await this.queryClient.bank.balances(address); + const balances = await this.queryClient.bank.unverified.balances(address); return balances.map(coinFromProto); } diff --git a/packages/stargate/types/queries/bank.d.ts b/packages/stargate/types/queries/bank.d.ts index fd6fb445..4e626954 100644 --- a/packages/stargate/types/queries/bank.d.ts +++ b/packages/stargate/types/queries/bank.d.ts @@ -3,7 +3,9 @@ import { QueryClient } from "../queryclient"; export interface BankExtension { readonly bank: { readonly balance: (address: string, denom: string) => Promise; - readonly balances: (address: string) => Promise; + readonly unverified: { + readonly balances: (address: string) => Promise; + }; }; } export declare function setupBankExtension(base: QueryClient): BankExtension;