diff --git a/CHANGELOG.md b/CHANGELOG.md index de59d35628..5f3f24c01f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,11 @@ and this project adheres to - @cosmjs/tendermint-rpc: Add `hash` field to `BroadcastTxAsyncResponse` ([#938]). +- @cosmjs/stargate: Add `denomMetadata` and `denomsMetadata` to `BankExtension` + ([#932]). [#938]: https://github.com/cosmos/cosmjs/issues/938 +[#932]: https://github.com/cosmos/cosmjs/issues/932 ### Fixed diff --git a/packages/stargate/src/queries/bank.spec.ts b/packages/stargate/src/queries/bank.spec.ts index e0fd0ae62b..724f35d736 100644 --- a/packages/stargate/src/queries/bank.spec.ts +++ b/packages/stargate/src/queries/bank.spec.ts @@ -143,4 +143,74 @@ describe("BankExtension", () => { tmClient.disconnect(); }); }); + + describe("denomMetadata", () => { + it("works for existent denom", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithBank(simapp.tendermintUrl); + + const metadata = await client.bank.denomMetadata("ucosm"); + expect(metadata).toEqual({ + description: "The fee token of this test chain", + denomUnits: [ + { + denom: "ucosm", + exponent: 0, + aliases: [], + }, + { + denom: "COSM", + exponent: 6, + aliases: [], + }, + ], + base: "ucosm", + display: "COSM", + name: "", + symbol: "", + }); + + tmClient.disconnect(); + }); + + it("works for non-existent denom", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithBank(simapp.tendermintUrl); + + await expectAsync(client.bank.denomMetadata("nothere")).toBeRejectedWithError(/code = NotFound/i); + + tmClient.disconnect(); + }); + }); + + describe("denomsMetadata", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithBank(simapp.tendermintUrl); + + const metadatas = await client.bank.denomsMetadata(); + expect(metadatas.length).toEqual(1); + expect(metadatas[0]).toEqual({ + description: "The fee token of this test chain", + denomUnits: [ + { + denom: "ucosm", + exponent: 0, + aliases: [], + }, + { + denom: "COSM", + exponent: 6, + aliases: [], + }, + ], + base: "ucosm", + display: "COSM", + name: "", + symbol: "", + }); + + tmClient.disconnect(); + }); + }); }); diff --git a/packages/stargate/src/queries/bank.ts b/packages/stargate/src/queries/bank.ts index 7e7c254e03..399a0b4e60 100644 --- a/packages/stargate/src/queries/bank.ts +++ b/packages/stargate/src/queries/bank.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { assert } from "@cosmjs/utils"; +import { Metadata } from "cosmjs-types/cosmos/bank/v1beta1/bank"; import { QueryClientImpl } from "cosmjs-types/cosmos/bank/v1beta1/query"; import { Coin } from "cosmjs-types/cosmos/base/v1beta1/coin"; @@ -12,6 +13,8 @@ export interface BankExtension { readonly allBalances: (address: string) => Promise; readonly totalSupply: () => Promise; readonly supplyOf: (denom: string) => Promise; + readonly denomMetadata: (denom: string) => Promise; + readonly denomsMetadata: () => Promise; }; } @@ -41,6 +44,17 @@ export function setupBankExtension(base: QueryClient): BankExtension { assert(amount); return amount; }, + denomMetadata: async (denom: string) => { + const { metadata } = await queryService.DenomMetadata({ denom }); + assert(metadata); + return metadata; + }, + denomsMetadata: async () => { + const { metadatas } = await queryService.DenomsMetadata({ + pagination: undefined, // Not implemented + }); + return metadatas; + }, }, }; }