From 07b7bb7ec5fe06eee1dd1e6776210b6fbde6ad26 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Tue, 27 Jul 2021 15:37:36 +0200 Subject: [PATCH] Add gov extension --- CHANGELOG.md | 1 + packages/stargate/src/index.ts | 4 + packages/stargate/src/queries/gov.spec.ts | 0 packages/stargate/src/queries/gov.ts | 105 ++++++++++++++++++++++ packages/stargate/src/queries/index.ts | 1 + packages/stargate/src/queries/utils.ts | 10 +++ 6 files changed, 121 insertions(+) create mode 100644 packages/stargate/src/queries/gov.spec.ts create mode 100644 packages/stargate/src/queries/gov.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 04645cf8..7b0ffa0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to - @cosmjs/faucet: Add new configuration variable `FAUCET_PATH_PATTERN` to configure the HD path of the faucet accounts ([#832]). - @cosmjs/cosmwasm-stargate: Add field `ibcPortId` to `Contract` ([#836]). +- @cosmjs/stargate: Add `GovExtension` for query client. [#832]: https://github.com/cosmos/cosmjs/issues/832 [#836]: https://github.com/cosmos/cosmjs/issues/836 diff --git a/packages/stargate/src/index.ts b/packages/stargate/src/index.ts index fc01db0b..807c35bb 100644 --- a/packages/stargate/src/index.ts +++ b/packages/stargate/src/index.ts @@ -60,12 +60,16 @@ export { createPagination, createProtobufRpcClient, DistributionExtension, + GovExtension, + GovParamsType, + GovProposalId, IbcExtension, ProtobufRpcClient, QueryClient, setupAuthExtension, setupBankExtension, setupDistributionExtension, + setupGovExtension, setupIbcExtension, setupStakingExtension, StakingExtension, diff --git a/packages/stargate/src/queries/gov.spec.ts b/packages/stargate/src/queries/gov.spec.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/stargate/src/queries/gov.ts b/packages/stargate/src/queries/gov.ts new file mode 100644 index 00000000..cb37bc22 --- /dev/null +++ b/packages/stargate/src/queries/gov.ts @@ -0,0 +1,105 @@ +import { Uint64 } from "@cosmjs/math"; +import { ProposalStatus } from "cosmjs-types/cosmos/gov/v1beta1/gov"; +import { + QueryClientImpl, + QueryDepositResponse, + QueryDepositsResponse, + QueryParamsResponse, + QueryProposalResponse, + QueryProposalsResponse, + QueryTallyResultResponse, + QueryVoteResponse, + QueryVotesResponse, +} from "cosmjs-types/cosmos/gov/v1beta1/query"; +import Long from "long"; + +import { QueryClient } from "./queryclient"; +import { createProtobufRpcClient, longify } from "./utils"; + +export type GovParamsType = "deposit" | "tallying" | "voting"; + +export type GovProposalId = string | number | Long | Uint64; + +export interface GovExtension { + readonly gov: { + readonly params: (parametersType: GovParamsType) => Promise; + readonly proposals: ( + proposalStatus: ProposalStatus, + depositor: string, + voter: string, + ) => Promise; + readonly proposal: (proposalId: GovProposalId) => Promise; + readonly deposits: (proposalId: GovProposalId) => Promise; + readonly deposit: (proposalId: GovProposalId, depositorAddress: string) => Promise; + readonly tally: (proposalId: GovProposalId) => Promise; + readonly votes: (proposalId: GovProposalId) => Promise; + readonly vote: (proposalId: GovProposalId, voterAddress: string) => Promise; + }; +} + +export function setupGovExtension(base: QueryClient): GovExtension { + const rpc = createProtobufRpcClient(base); + + // Use this service to get easy typed access to query methods + // This cannot be used for proof verification + const queryService = new QueryClientImpl(rpc); + + return { + gov: { + params: async (parametersType: GovParamsType) => { + const response = await queryService.Params({ paramsType: parametersType }); + return response; + }, + proposals: async (proposalStatus: ProposalStatus, depositorAddress: string, voterAddress: string) => { + // TODO: pagination + const response = await queryService.Proposals({ + proposalStatus, + depositor: depositorAddress, + voter: voterAddress, + pagination: undefined, + }); + return response; + }, + proposal: async (proposalId: GovProposalId) => { + const response = await queryService.Proposal({ proposalId: longify(proposalId) }); + return response; + }, + deposits: async (proposalId: GovProposalId) => { + // TODO: pagination + const response = await queryService.Deposits({ + proposalId: longify(proposalId), + pagination: undefined, + }); + return response; + }, + deposit: async (proposalId: GovProposalId, depositorAddress: string) => { + const response = await queryService.Deposit({ + proposalId: longify(proposalId), + depositor: depositorAddress, + }); + return response; + }, + tally: async (proposalId: GovProposalId) => { + const response = await queryService.TallyResult({ + proposalId: longify(proposalId), + }); + return response; + }, + votes: async (proposalId: GovProposalId) => { + // TODO: pagination + const response = await queryService.Votes({ + proposalId: longify(proposalId), + pagination: undefined, + }); + return response; + }, + vote: async (proposalId: GovProposalId, voterAddress: string) => { + const response = await queryService.Vote({ + proposalId: longify(proposalId), + voter: voterAddress, + }); + return response; + }, + }, + }; +} diff --git a/packages/stargate/src/queries/index.ts b/packages/stargate/src/queries/index.ts index 31d220bb..cc8b1609 100644 --- a/packages/stargate/src/queries/index.ts +++ b/packages/stargate/src/queries/index.ts @@ -7,6 +7,7 @@ export { QueryClient } from "./queryclient"; export { AuthExtension, setupAuthExtension } from "./auth"; export { BankExtension, setupBankExtension } from "./bank"; export { DistributionExtension, setupDistributionExtension } from "./distribution"; +export { setupGovExtension, GovExtension, GovProposalId, GovParamsType } from "./gov"; export { IbcExtension, setupIbcExtension } from "./ibc"; export { setupStakingExtension, StakingExtension } from "./staking"; export { createPagination, createProtobufRpcClient, ProtobufRpcClient } from "./utils"; diff --git a/packages/stargate/src/queries/utils.ts b/packages/stargate/src/queries/utils.ts index fe8144bf..247446a6 100644 --- a/packages/stargate/src/queries/utils.ts +++ b/packages/stargate/src/queries/utils.ts @@ -1,4 +1,5 @@ import { Bech32 } from "@cosmjs/encoding"; +import { Uint64 } from "@cosmjs/math"; import { PageRequest } from "cosmjs-types/cosmos/base/query/v1beta1/pagination"; import Long from "long"; @@ -36,3 +37,12 @@ export function createProtobufRpcClient(base: QueryClient): ProtobufRpcClient { }, }; } + +/** + * Takes a uint64 value as string, number, Long or Uint64 and returns an unsigned Long instance + * of it. + */ +export function longify(value: string | number | Long | Uint64): Long { + const checkedValue = Uint64.fromString(value.toString()); + return Long.fromBytesBE([...checkedValue.toBytesBigEndian()], true); +}