Use autogenerated typed queries

This commit is contained in:
Simon Warta 2020-08-12 15:25:19 +02:00
parent d7efe229e5
commit 5620bb3d80
3 changed files with 24 additions and 12 deletions

View File

@ -6,11 +6,24 @@ import { QueryClient } from "../queryclient";
export interface BankExtension {
readonly bank: {
readonly balance: (address: string, denom: string) => Promise<cosmos.ICoin>;
readonly balances: (address: string) => Promise<cosmos.ICoin[]>;
readonly unverified: {
readonly balances: (address: string) => Promise<cosmos.ICoin[]>;
};
};
}
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;
},
},
},
};

View File

@ -194,7 +194,7 @@ export class StargateClient {
public async getBalance(address: string, searchDenom: string): Promise<Coin | null> {
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<readonly Coin[]> {
const balances = await this.queryClient.bank.balances(address);
const balances = await this.queryClient.bank.unverified.balances(address);
return balances.map(coinFromProto);
}

View File

@ -3,7 +3,9 @@ import { QueryClient } from "../queryclient";
export interface BankExtension {
readonly bank: {
readonly balance: (address: string, denom: string) => Promise<cosmos.ICoin>;
readonly balances: (address: string) => Promise<cosmos.ICoin[]>;
readonly unverified: {
readonly balances: (address: string) => Promise<cosmos.ICoin[]>;
};
};
}
export declare function setupBankExtension(base: QueryClient): BankExtension;