From a7b4ed87f7fde30d3dab2659806f7d0713630ba1 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 27 Jan 2021 14:27:50 +0000 Subject: [PATCH 1/3] stargate: Add BondStatusString type to staking query extension --- packages/stargate/src/queries/staking.ts | 8 ++++++-- packages/stargate/types/queries/staking.d.ts | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/stargate/src/queries/staking.ts b/packages/stargate/src/queries/staking.ts index b5625087..0f40c036 100644 --- a/packages/stargate/src/queries/staking.ts +++ b/packages/stargate/src/queries/staking.ts @@ -20,8 +20,12 @@ type IQueryValidatorDelegationsResponse = cosmos.staking.v1beta1.IQueryValidator type IQueryValidatorsResponse = cosmos.staking.v1beta1.IQueryValidatorsResponse; type IQueryValidatorUnbondingDelegationsResponse = cosmos.staking.v1beta1.IQueryValidatorUnbondingDelegationsResponse; +// This needs to be exported otherwise TS won’t let you export BondStatusString +export const { BondStatus } = cosmos.staking.v1beta1; const { Query } = cosmos.staking.v1beta1; +export type BondStatusString = Exclude; + export interface StakingExtension { readonly staking: { readonly unverified: { @@ -60,7 +64,7 @@ export interface StakingExtension { validatorAddress: string, paginationKey?: Uint8Array, ) => Promise; - validators: (status: string, paginationKey?: Uint8Array) => Promise; + validators: (status: BondStatusString, paginationKey?: Uint8Array) => Promise; validatorUnbondingDelegations: ( validatorAddress: string, paginationKey?: Uint8Array, @@ -165,7 +169,7 @@ export function setupStakingExtension(base: QueryClient): StakingExtension { }); return toObject(response); }, - validators: async (status: string, paginationKey?: Uint8Array) => { + validators: async (status: BondStatusString, paginationKey?: Uint8Array) => { const response = await queryService.validators({ status: status, pagination: paginationKey ? { key: paginationKey } : undefined, diff --git a/packages/stargate/types/queries/staking.d.ts b/packages/stargate/types/queries/staking.d.ts index f9ab444c..beabec9d 100644 --- a/packages/stargate/types/queries/staking.d.ts +++ b/packages/stargate/types/queries/staking.d.ts @@ -14,6 +14,8 @@ declare type IQueryValidatorResponse = cosmos.staking.v1beta1.IQueryValidatorRes declare type IQueryValidatorDelegationsResponse = cosmos.staking.v1beta1.IQueryValidatorDelegationsResponse; declare type IQueryValidatorsResponse = cosmos.staking.v1beta1.IQueryValidatorsResponse; declare type IQueryValidatorUnbondingDelegationsResponse = cosmos.staking.v1beta1.IQueryValidatorUnbondingDelegationsResponse; +export declare const BondStatus: typeof cosmos.staking.v1beta1.BondStatus; +export declare type BondStatusString = Exclude; export interface StakingExtension { readonly staking: { readonly unverified: { @@ -52,7 +54,7 @@ export interface StakingExtension { validatorAddress: string, paginationKey?: Uint8Array, ) => Promise; - validators: (status: string, paginationKey?: Uint8Array) => Promise; + validators: (status: BondStatusString, paginationKey?: Uint8Array) => Promise; validatorUnbondingDelegations: ( validatorAddress: string, paginationKey?: Uint8Array, From 46b9c5522ea1e36f45d340427cf5a2c467216c3f Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 27 Jan 2021 14:28:33 +0000 Subject: [PATCH 2/3] stargate: Fill out tests for staking query extension --- packages/stargate/src/queries/staking.spec.ts | 207 ++++++++++++++++-- 1 file changed, 186 insertions(+), 21 deletions(-) diff --git a/packages/stargate/src/queries/staking.spec.ts b/packages/stargate/src/queries/staking.spec.ts index d8120eb2..363a7e71 100644 --- a/packages/stargate/src/queries/staking.spec.ts +++ b/packages/stargate/src/queries/staking.spec.ts @@ -2,19 +2,12 @@ import { coin, coins } from "@cosmjs/launchpad"; import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { adaptor34, Client as TendermintClient } from "@cosmjs/tendermint-rpc"; -import { assertDefinedAndNotNull, sleep } from "@cosmjs/utils"; +import { sleep } from "@cosmjs/utils"; import { cosmos } from "../codec"; import { SigningStargateClient } from "../signingstargateclient"; import { assertIsBroadcastTxSuccess } from "../stargateclient"; -import { - faucet, - nonNegativeIntegerMatcher, - pendingWithoutSimapp, - simapp, - simappEnabled, - validator, -} from "../testutils.spec"; +import { faucet, pendingWithoutSimapp, simapp, simappEnabled, validator } from "../testutils.spec"; import { QueryClient } from "./queryclient"; import { setupStakingExtension, StakingExtension } from "./staking"; @@ -82,18 +75,190 @@ describe("StakingExtension", () => { faucet.address0, validator.validatorAddress, ); - assertDefinedAndNotNull(response.delegationResponse); - assertDefinedAndNotNull(response.delegationResponse.delegation); - assertDefinedAndNotNull(response.delegationResponse.balance); - expect({ ...response.delegationResponse.delegation }).toEqual({ - delegatorAddress: faucet.address0, - validatorAddress: validator.validatorAddress, - shares: jasmine.stringMatching(nonNegativeIntegerMatcher), - }); - expect({ ...response.delegationResponse.balance }).toEqual({ - denom: "ustake", - amount: jasmine.stringMatching(nonNegativeIntegerMatcher), - }); + expect(response.delegationResponse).toBeDefined(); + expect(response.delegationResponse).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("delegatorDelegations", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.delegatorDelegations(faucet.address0); + expect(response.delegationResponses).toBeDefined(); + expect(response.delegationResponses).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("delegatorUnbondingDelegations", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.delegatorUnbondingDelegations(faucet.address0); + expect(response.unbondingResponses).toBeDefined(); + expect(response.unbondingResponses).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("delegatorValidator", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.delegatorValidator( + faucet.address0, + validator.validatorAddress, + ); + expect(response.validator).toBeDefined(); + expect(response.validator).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("delegatorValidators", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.delegatorValidators(faucet.address0); + expect(response.validators).toBeDefined(); + expect(response.validators).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("historicalInfo", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.historicalInfo(5); + expect(response.hist).toBeDefined(); + expect(response.hist).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("params", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.params(); + expect(response.params).toBeDefined(); + expect(response.params).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("pool", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.pool(); + expect(response.pool).toBeDefined(); + expect(response.pool).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("redelegations", () => { + it("works", async () => { + // TODO: Set up a result for this test + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + await expectAsync( + client.staking.unverified.redelegations( + faucet.address0, + validator.validatorAddress, + validator.validatorAddress, + ), + ).toBeRejectedWithError(/redelegation not found/i); + + tmClient.disconnect(); + }); + }); + + describe("unbondingDelegation", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.unbondingDelegation( + faucet.address0, + validator.validatorAddress, + ); + expect(response.unbond).toBeDefined(); + expect(response.unbond).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("validator", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.validator(validator.validatorAddress); + expect(response.validator).toBeDefined(); + expect(response.validator).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("validatorDelegations", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.validatorDelegations(validator.validatorAddress); + expect(response.delegationResponses).toBeDefined(); + expect(response.delegationResponses).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("validators", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.validators("BOND_STATUS_BONDED"); + expect(response.validators).toBeDefined(); + expect(response.validators).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("validatorUnbondingDelegations", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithStaking(simapp.tendermintUrl); + + const response = await client.staking.unverified.validatorUnbondingDelegations( + validator.validatorAddress, + ); + expect(response.unbondingResponses).toBeDefined(); + expect(response.unbondingResponses).not.toBeNull(); tmClient.disconnect(); }); From 707290d1b46771dfb120c40145d2471f352aadb4 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 27 Jan 2021 14:37:41 +0000 Subject: [PATCH 3/3] stargate: Fill out tests for distribution query extension --- .../stargate/src/queries/distribution.spec.ts | 119 +++++++++++++++++- 1 file changed, 116 insertions(+), 3 deletions(-) diff --git a/packages/stargate/src/queries/distribution.spec.ts b/packages/stargate/src/queries/distribution.spec.ts index c94841e1..8af17b0d 100644 --- a/packages/stargate/src/queries/distribution.spec.ts +++ b/packages/stargate/src/queries/distribution.spec.ts @@ -2,7 +2,7 @@ import { coin, coins } from "@cosmjs/launchpad"; import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; import { adaptor34, Client as TendermintClient } from "@cosmjs/tendermint-rpc"; -import { assertDefinedAndNotNull, sleep } from "@cosmjs/utils"; +import { sleep } from "@cosmjs/utils"; import { cosmos } from "../codec"; import { SigningStargateClient } from "../signingstargateclient"; @@ -55,11 +55,124 @@ describe("DistributionExtension", () => { const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); const response = await client.distribution.unverified.communityPool(); - assertDefinedAndNotNull(response.pool); - expect(response.pool.length).toBeGreaterThanOrEqual(1); + expect(response.pool).toBeDefined(); + expect(response.pool).not.toBeNull(); tmClient.disconnect(); }); }); }); + + describe("delegationRewards", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.delegationRewards( + faucet.address0, + validator.validatorAddress, + ); + expect(response.rewards).toBeDefined(); + expect(response.rewards).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("delegationTotalRewards", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.delegationTotalRewards(faucet.address0); + expect(response.rewards).toBeDefined(); + expect(response.rewards).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("delegatorValidators", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.delegatorValidators(faucet.address0); + expect(response.validators).toBeDefined(); + expect(response.validators).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("delegatorWithdrawAddress", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.delegatorWithdrawAddress(faucet.address0); + expect(response.withdrawAddress).toBeDefined(); + expect(response.withdrawAddress).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("params", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.params(); + expect(response.params).toBeDefined(); + expect(response.params).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("validatorCommission", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.validatorCommission(validator.validatorAddress); + expect(response.commission).toBeDefined(); + expect(response.commission).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("validatorOutstandingRewards", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.validatorOutstandingRewards( + validator.validatorAddress, + ); + expect(response.rewards).toBeDefined(); + expect(response.rewards).not.toBeNull(); + + tmClient.disconnect(); + }); + }); + + describe("validatorSlashes", () => { + it("works", async () => { + pendingWithoutSimapp(); + const [client, tmClient] = await makeClientWithDistribution(simapp.tendermintUrl); + + const response = await client.distribution.unverified.validatorSlashes( + validator.validatorAddress, + 1, + 5, + ); + expect(response.slashes).toBeDefined(); + expect(response.slashes).not.toBeNull(); + + tmClient.disconnect(); + }); + }); });