From de07ad311bfd002445e21c826d85a46dba5a305e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 10:55:17 +0200 Subject: [PATCH 01/13] Rename @cosmjs/sdk40 -> @cosmjs/stargate --- docs/stargate-dependencies.yml | 2 +- packages/sdk40/nonces/1593326040 | 0 packages/sdk40/nonces/1593614735 | 0 packages/sdk40/nonces/1595941909 | 0 packages/sdk40/nonces/1596020444 | 0 packages/sdk40/nonces/1596461867 | 0 packages/{sdk40 => stargate}/.eslintignore | 0 packages/{sdk40 => stargate}/.gitignore | 0 packages/{sdk40 => stargate}/.nycrc.yml | 0 packages/{sdk40 => stargate}/README.md | 4 ++-- packages/{sdk40 => stargate}/jasmine-testrunner.js | 0 packages/{sdk40 => stargate}/karma.conf.js | 0 packages/{sdk40 => stargate}/nonces/README.txt | 0 packages/{sdk40 => stargate}/package.json | 4 ++-- packages/{sdk40 => stargate}/src/index.spec.ts | 0 packages/{sdk40 => stargate}/src/index.ts | 0 packages/{sdk40 => stargate}/tsconfig.json | 0 packages/{sdk40 => stargate}/typedoc.js | 0 packages/{sdk40 => stargate}/types/index.d.ts | 0 packages/{sdk40 => stargate}/webpack.web.config.js | 0 20 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 packages/sdk40/nonces/1593326040 delete mode 100644 packages/sdk40/nonces/1593614735 delete mode 100644 packages/sdk40/nonces/1595941909 delete mode 100644 packages/sdk40/nonces/1596020444 delete mode 100644 packages/sdk40/nonces/1596461867 rename packages/{sdk40 => stargate}/.eslintignore (100%) rename packages/{sdk40 => stargate}/.gitignore (100%) rename packages/{sdk40 => stargate}/.nycrc.yml (100%) rename packages/{sdk40 => stargate}/README.md (67%) rename packages/{sdk40 => stargate}/jasmine-testrunner.js (100%) rename packages/{sdk40 => stargate}/karma.conf.js (100%) rename packages/{sdk40 => stargate}/nonces/README.txt (100%) rename packages/{sdk40 => stargate}/package.json (97%) rename packages/{sdk40 => stargate}/src/index.spec.ts (100%) rename packages/{sdk40 => stargate}/src/index.ts (100%) rename packages/{sdk40 => stargate}/tsconfig.json (100%) rename packages/{sdk40 => stargate}/typedoc.js (100%) rename packages/{sdk40 => stargate}/types/index.d.ts (100%) rename packages/{sdk40 => stargate}/webpack.web.config.js (100%) diff --git a/docs/stargate-dependencies.yml b/docs/stargate-dependencies.yml index 8bb6d13d..a1d7061c 100644 --- a/docs/stargate-dependencies.yml +++ b/docs/stargate-dependencies.yml @@ -1,7 +1,7 @@ # This is a hand written dependencies file for depsight # Render via `depsight --format png --output stargate-dependencies.png docs/stargate-dependencies.yml` -"@cosmjs/sdk40": +"@cosmjs/stargate": - "@cosmjs/tendermint-rpc" - "@cosmjs/proto-signing" diff --git a/packages/sdk40/nonces/1593326040 b/packages/sdk40/nonces/1593326040 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/sdk40/nonces/1593614735 b/packages/sdk40/nonces/1593614735 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/sdk40/nonces/1595941909 b/packages/sdk40/nonces/1595941909 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/sdk40/nonces/1596020444 b/packages/sdk40/nonces/1596020444 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/sdk40/nonces/1596461867 b/packages/sdk40/nonces/1596461867 deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/sdk40/.eslintignore b/packages/stargate/.eslintignore similarity index 100% rename from packages/sdk40/.eslintignore rename to packages/stargate/.eslintignore diff --git a/packages/sdk40/.gitignore b/packages/stargate/.gitignore similarity index 100% rename from packages/sdk40/.gitignore rename to packages/stargate/.gitignore diff --git a/packages/sdk40/.nycrc.yml b/packages/stargate/.nycrc.yml similarity index 100% rename from packages/sdk40/.nycrc.yml rename to packages/stargate/.nycrc.yml diff --git a/packages/sdk40/README.md b/packages/stargate/README.md similarity index 67% rename from packages/sdk40/README.md rename to packages/stargate/README.md index a6c7e882..8b113e03 100644 --- a/packages/sdk40/README.md +++ b/packages/stargate/README.md @@ -1,6 +1,6 @@ -# @cosmjs/sdk40 +# @cosmjs/stargate -[![npm version](https://img.shields.io/npm/v/@cosmjs/sdk40.svg)](https://www.npmjs.com/package/@cosmjs/sdk40) +[![npm version](https://img.shields.io/npm/v/@cosmjs/stargate.svg)](https://www.npmjs.com/package/@cosmjs/stargate) A client library for the Cosmos SDK 0.40. diff --git a/packages/sdk40/jasmine-testrunner.js b/packages/stargate/jasmine-testrunner.js similarity index 100% rename from packages/sdk40/jasmine-testrunner.js rename to packages/stargate/jasmine-testrunner.js diff --git a/packages/sdk40/karma.conf.js b/packages/stargate/karma.conf.js similarity index 100% rename from packages/sdk40/karma.conf.js rename to packages/stargate/karma.conf.js diff --git a/packages/sdk40/nonces/README.txt b/packages/stargate/nonces/README.txt similarity index 100% rename from packages/sdk40/nonces/README.txt rename to packages/stargate/nonces/README.txt diff --git a/packages/sdk40/package.json b/packages/stargate/package.json similarity index 97% rename from packages/sdk40/package.json rename to packages/stargate/package.json index 6f669b04..a26e5fe4 100644 --- a/packages/sdk40/package.json +++ b/packages/stargate/package.json @@ -1,5 +1,5 @@ { - "name": "@cosmjs/sdk40", + "name": "@cosmjs/stargate", "private": true, "version": "0.22.0", "description": "Utilities for Cosmos SDK 0.40", @@ -18,7 +18,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/CosmWasm/cosmjs/tree/master/packages/sdk40" + "url": "https://github.com/CosmWasm/cosmjs/tree/master/packages/stargate" }, "scripts": { "docs": "typedoc --options typedoc.js", diff --git a/packages/sdk40/src/index.spec.ts b/packages/stargate/src/index.spec.ts similarity index 100% rename from packages/sdk40/src/index.spec.ts rename to packages/stargate/src/index.spec.ts diff --git a/packages/sdk40/src/index.ts b/packages/stargate/src/index.ts similarity index 100% rename from packages/sdk40/src/index.ts rename to packages/stargate/src/index.ts diff --git a/packages/sdk40/tsconfig.json b/packages/stargate/tsconfig.json similarity index 100% rename from packages/sdk40/tsconfig.json rename to packages/stargate/tsconfig.json diff --git a/packages/sdk40/typedoc.js b/packages/stargate/typedoc.js similarity index 100% rename from packages/sdk40/typedoc.js rename to packages/stargate/typedoc.js diff --git a/packages/sdk40/types/index.d.ts b/packages/stargate/types/index.d.ts similarity index 100% rename from packages/sdk40/types/index.d.ts rename to packages/stargate/types/index.d.ts diff --git a/packages/sdk40/webpack.web.config.js b/packages/stargate/webpack.web.config.js similarity index 100% rename from packages/sdk40/webpack.web.config.js rename to packages/stargate/webpack.web.config.js From a8d8a0dfc227d8aa528946759faada398a53766f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 10:56:32 +0200 Subject: [PATCH 02/13] Fix WASMD_ENABLED -> SIMAPP_ENABLED --- packages/proto-signing/webpack.web.config.js | 2 +- packages/stargate/webpack.web.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/proto-signing/webpack.web.config.js b/packages/proto-signing/webpack.web.config.js index 7373cace..92be1e90 100644 --- a/packages/proto-signing/webpack.web.config.js +++ b/packages/proto-signing/webpack.web.config.js @@ -14,6 +14,6 @@ module.exports = [ path: distdir, filename: "tests.js", }, - plugins: [new webpack.EnvironmentPlugin(["WASMD_ENABLED"])], + plugins: [new webpack.EnvironmentPlugin(["SIMAPP_ENABLED"])], }, ]; diff --git a/packages/stargate/webpack.web.config.js b/packages/stargate/webpack.web.config.js index 7373cace..92be1e90 100644 --- a/packages/stargate/webpack.web.config.js +++ b/packages/stargate/webpack.web.config.js @@ -14,6 +14,6 @@ module.exports = [ path: distdir, filename: "tests.js", }, - plugins: [new webpack.EnvironmentPlugin(["WASMD_ENABLED"])], + plugins: [new webpack.EnvironmentPlugin(["SIMAPP_ENABLED"])], }, ]; From d393adf31aaeda56bf47d6e1aa21b02c1e0f1dd5 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 11:13:54 +0200 Subject: [PATCH 03/13] Add StargateClient --- packages/stargate/src/index.spec.ts | 5 ----- packages/stargate/src/index.ts | 1 + packages/stargate/src/stargateclient.spec.ts | 13 +++++++++++++ packages/stargate/src/stargateclient.ts | 18 ++++++++++++++++++ packages/stargate/src/testutils.spec.ts | 10 ++++++++++ packages/stargate/types/index.d.ts | 1 + packages/stargate/types/stargateclient.d.ts | 6 ++++++ 7 files changed, 49 insertions(+), 5 deletions(-) delete mode 100644 packages/stargate/src/index.spec.ts create mode 100644 packages/stargate/src/stargateclient.spec.ts create mode 100644 packages/stargate/src/stargateclient.ts create mode 100644 packages/stargate/src/testutils.spec.ts create mode 100644 packages/stargate/types/stargateclient.d.ts diff --git a/packages/stargate/src/index.spec.ts b/packages/stargate/src/index.spec.ts deleted file mode 100644 index 9d23c3f1..00000000 --- a/packages/stargate/src/index.spec.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe("dummy", () => { - it("has at least one test", () => { - expect(2).toEqual(2); - }); -}); diff --git a/packages/stargate/src/index.ts b/packages/stargate/src/index.ts index e69de29b..abb21525 100644 --- a/packages/stargate/src/index.ts +++ b/packages/stargate/src/index.ts @@ -0,0 +1 @@ +export { StargateClient } from "./stargateclient"; diff --git a/packages/stargate/src/stargateclient.spec.ts b/packages/stargate/src/stargateclient.spec.ts new file mode 100644 index 00000000..da09f08a --- /dev/null +++ b/packages/stargate/src/stargateclient.spec.ts @@ -0,0 +1,13 @@ +import { StargateClient } from "./stargateclient"; +import { pendingWithoutSimapp, simapp } from "./testutils.spec"; + +describe("StargateClient", () => { + describe("connect", () => { + it("works", async () => { + pendingWithoutSimapp(); + const client = await StargateClient.connect(simapp.tendermintUrl); + expect(client).toBeTruthy(); + client.disconnect(); + }); + }); +}); diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts new file mode 100644 index 00000000..40ea0342 --- /dev/null +++ b/packages/stargate/src/stargateclient.ts @@ -0,0 +1,18 @@ +import { Client as TendermintClient } from "@cosmjs/tendermint-rpc"; + +export class StargateClient { + private readonly tmClient: TendermintClient; + + public static async connect(endpoint: string): Promise { + const tmClient = await TendermintClient.connect(endpoint); + return new StargateClient(tmClient); + } + + private constructor(tmClient: TendermintClient) { + this.tmClient = tmClient; + } + + public disconnect(): void { + this.tmClient.disconnect(); + } +} diff --git a/packages/stargate/src/testutils.spec.ts b/packages/stargate/src/testutils.spec.ts new file mode 100644 index 00000000..b02e5526 --- /dev/null +++ b/packages/stargate/src/testutils.spec.ts @@ -0,0 +1,10 @@ +export function pendingWithoutSimapp(): void { + if (!process.env.SIMAPP_ENABLED) { + return pending("Set SIMAPP_ENABLED to enable Simapp based tests"); + } +} + +export const simapp = { + tendermintUrl: "localhost:26657", + chainId: "simd-testing", +}; diff --git a/packages/stargate/types/index.d.ts b/packages/stargate/types/index.d.ts index e69de29b..abb21525 100644 --- a/packages/stargate/types/index.d.ts +++ b/packages/stargate/types/index.d.ts @@ -0,0 +1 @@ +export { StargateClient } from "./stargateclient"; diff --git a/packages/stargate/types/stargateclient.d.ts b/packages/stargate/types/stargateclient.d.ts new file mode 100644 index 00000000..f65d2e29 --- /dev/null +++ b/packages/stargate/types/stargateclient.d.ts @@ -0,0 +1,6 @@ +export declare class StargateClient { + private readonly tmClient; + static connect(endpoint: string): Promise; + private constructor(); + disconnect(): void; +} From 484149a4277387162ce31dfac56cef064a4eaddb Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 11:22:21 +0200 Subject: [PATCH 04/13] Add decodeAny --- packages/proto-signing/src/any.ts | 13 +++++++++++++ packages/proto-signing/src/index.ts | 1 + packages/proto-signing/types/any.d.ts | 10 ++++++++++ packages/proto-signing/types/index.d.ts | 1 + 4 files changed, 25 insertions(+) create mode 100644 packages/proto-signing/src/any.ts create mode 100644 packages/proto-signing/src/index.ts create mode 100644 packages/proto-signing/types/any.d.ts create mode 100644 packages/proto-signing/types/index.d.ts diff --git a/packages/proto-signing/src/any.ts b/packages/proto-signing/src/any.ts new file mode 100644 index 00000000..27a49698 --- /dev/null +++ b/packages/proto-signing/src/any.ts @@ -0,0 +1,13 @@ +import { google } from "./generated/codecimpl"; + +/** + * Decodes a serialized [google.protobuf.Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto) + * and returns the components. + */ +export function decodeAny(serialized: Uint8Array): { readonly typeUrl: string; readonly value: Uint8Array } { + const envelope = google.protobuf.Any.decode(serialized); + return { + typeUrl: envelope.type_url, + value: envelope.value, + }; +} diff --git a/packages/proto-signing/src/index.ts b/packages/proto-signing/src/index.ts new file mode 100644 index 00000000..73ae35c4 --- /dev/null +++ b/packages/proto-signing/src/index.ts @@ -0,0 +1 @@ +export { decodeAny } from "./any"; diff --git a/packages/proto-signing/types/any.d.ts b/packages/proto-signing/types/any.d.ts new file mode 100644 index 00000000..c76a6b15 --- /dev/null +++ b/packages/proto-signing/types/any.d.ts @@ -0,0 +1,10 @@ +/** + * Decodes a serialized [google.protobuf.Any](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/any.proto) + * and returns the components. + */ +export declare function decodeAny( + serialized: Uint8Array, +): { + readonly typeUrl: string; + readonly value: Uint8Array; +}; diff --git a/packages/proto-signing/types/index.d.ts b/packages/proto-signing/types/index.d.ts new file mode 100644 index 00000000..73ae35c4 --- /dev/null +++ b/packages/proto-signing/types/index.d.ts @@ -0,0 +1 @@ +export { decodeAny } from "./any"; From dce43b3f87647e9d7adccbf517631f82b07223dc Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 11:45:25 +0200 Subject: [PATCH 05/13] Add StargateClient.getSequence --- packages/proto-signing/src/accounts.ts | 20 ++++++++++ packages/proto-signing/src/index.ts | 1 + packages/proto-signing/types/accounts.d.ts | 8 ++++ packages/proto-signing/types/index.d.ts | 1 + packages/stargate/package.json | 4 +- packages/stargate/src/stargateclient.spec.ts | 15 ++++++- packages/stargate/src/stargateclient.ts | 41 ++++++++++++++++++++ packages/stargate/src/testutils.spec.ts | 11 ++++++ packages/stargate/types/stargateclient.d.ts | 5 +++ 9 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 packages/proto-signing/src/accounts.ts create mode 100644 packages/proto-signing/types/accounts.d.ts diff --git a/packages/proto-signing/src/accounts.ts b/packages/proto-signing/src/accounts.ts new file mode 100644 index 00000000..2e359a94 --- /dev/null +++ b/packages/proto-signing/src/accounts.ts @@ -0,0 +1,20 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { Message } from "protobufjs"; + +import { cosmosField, cosmosMessage } from "./decorator"; +import { defaultRegistry } from "./msgs"; + +@cosmosMessage(defaultRegistry, "/cosmos.auth.BaseAccount") +export class BaseAccount extends Message { + @cosmosField.bytes(1) + public readonly address?: Uint8Array; + + @cosmosField.bytes(2) + public readonly pub_key?: Uint8Array; + + @cosmosField.uint64(3) + public readonly account_number?: Long | number; + + @cosmosField.uint64(4) + public readonly sequence?: Long | number; +} diff --git a/packages/proto-signing/src/index.ts b/packages/proto-signing/src/index.ts index 73ae35c4..c279effd 100644 --- a/packages/proto-signing/src/index.ts +++ b/packages/proto-signing/src/index.ts @@ -1 +1,2 @@ +export { BaseAccount } from "./accounts"; export { decodeAny } from "./any"; diff --git a/packages/proto-signing/types/accounts.d.ts b/packages/proto-signing/types/accounts.d.ts new file mode 100644 index 00000000..2c888633 --- /dev/null +++ b/packages/proto-signing/types/accounts.d.ts @@ -0,0 +1,8 @@ +/// +import { Message } from "protobufjs"; +export declare class BaseAccount extends Message { + readonly address?: Uint8Array; + readonly pub_key?: Uint8Array; + readonly account_number?: Long | number; + readonly sequence?: Long | number; +} diff --git a/packages/proto-signing/types/index.d.ts b/packages/proto-signing/types/index.d.ts index 73ae35c4..c279effd 100644 --- a/packages/proto-signing/types/index.d.ts +++ b/packages/proto-signing/types/index.d.ts @@ -1 +1,2 @@ +export { BaseAccount } from "./accounts"; export { decodeAny } from "./any"; diff --git a/packages/stargate/package.json b/packages/stargate/package.json index a26e5fe4..d9393348 100644 --- a/packages/stargate/package.json +++ b/packages/stargate/package.json @@ -38,7 +38,9 @@ "pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js" }, "dependencies": { + "@cosmjs/encoding": "^0.22.0", "@cosmjs/proto-signing": "^0.22.0", - "@cosmjs/tendermint-rpc": "^0.22.0" + "@cosmjs/tendermint-rpc": "^0.22.0", + "@cosmjs/utils": "^0.22.0" } } diff --git a/packages/stargate/src/stargateclient.spec.ts b/packages/stargate/src/stargateclient.spec.ts index da09f08a..6956aa71 100644 --- a/packages/stargate/src/stargateclient.spec.ts +++ b/packages/stargate/src/stargateclient.spec.ts @@ -1,5 +1,5 @@ import { StargateClient } from "./stargateclient"; -import { pendingWithoutSimapp, simapp } from "./testutils.spec"; +import { pendingWithoutSimapp, simapp, unused } from "./testutils.spec"; describe("StargateClient", () => { describe("connect", () => { @@ -10,4 +10,17 @@ describe("StargateClient", () => { client.disconnect(); }); }); + + describe("getSequence", () => { + it("works for unused account", async () => { + pendingWithoutSimapp(); + const client = await StargateClient.connect(simapp.tendermintUrl); + + const { accountNumber, sequence } = await client.getSequence(unused.address); + expect(accountNumber).toEqual(unused.accountNumber); + expect(sequence).toEqual(unused.sequence); + + client.disconnect(); + }); + }); }); diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 40ea0342..3affe0fc 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -1,4 +1,13 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { Bech32 } from "@cosmjs/encoding"; +import { BaseAccount, decodeAny } from "@cosmjs/proto-signing"; import { Client as TendermintClient } from "@cosmjs/tendermint-rpc"; +import { assert } from "@cosmjs/utils"; + +export interface GetSequenceResult { + readonly accountNumber: number; + readonly sequence: number; +} export class StargateClient { private readonly tmClient: TendermintClient; @@ -12,6 +21,38 @@ export class StargateClient { this.tmClient = tmClient; } + public async getSequence(address: string): Promise { + const binAddress = Bech32.decode(address).data; + + // https://github.com/cosmos/cosmos-sdk/blob/8cab43c8120fec5200c3459cbf4a92017bb6f287/x/auth/types/keys.go#L29-L32 + const accountKey = Uint8Array.from([0x01, ...binAddress]); + + const response = await this.tmClient.abciQuery({ + // we need the StoreKey for the module, not the module name + // https://github.com/cosmos/cosmos-sdk/blob/8cab43c8120fec5200c3459cbf4a92017bb6f287/x/auth/types/keys.go#L12 + path: "/store/acc/key", + data: accountKey, + prove: false, + }); + + const { typeUrl, value } = decodeAny(response.value); + + switch (typeUrl) { + case "/cosmos.auth.BaseAccount": { + const { account_number, sequence } = BaseAccount.decode(value); + assert(account_number !== undefined); + assert(sequence !== undefined); + return { + accountNumber: typeof account_number === "number" ? account_number : account_number.toNumber(), + sequence: typeof sequence === "number" ? sequence : sequence.toNumber(), + }; + } + + default: + throw new Error(`Unsupported type: ${typeUrl}`); + } + } + public disconnect(): void { this.tmClient.disconnect(); } diff --git a/packages/stargate/src/testutils.spec.ts b/packages/stargate/src/testutils.spec.ts index b02e5526..cfe1a60e 100644 --- a/packages/stargate/src/testutils.spec.ts +++ b/packages/stargate/src/testutils.spec.ts @@ -8,3 +8,14 @@ export const simapp = { tendermintUrl: "localhost:26657", chainId: "simd-testing", }; + +/** Unused account */ +export const unused = { + pubkey: { + type: "tendermint/PubKeySecp256k1", + value: "ArkCaFUJ/IH+vKBmNRCdUVl3mCAhbopk9jjW4Ko4OfRQ", + }, + address: "cosmos1cjsxept9rkggzxztslae9ndgpdyt2408lk850u", + accountNumber: 16, + sequence: 0, +}; diff --git a/packages/stargate/types/stargateclient.d.ts b/packages/stargate/types/stargateclient.d.ts index f65d2e29..7b5269d6 100644 --- a/packages/stargate/types/stargateclient.d.ts +++ b/packages/stargate/types/stargateclient.d.ts @@ -1,6 +1,11 @@ +export interface GetSequenceResult { + readonly accountNumber: number; + readonly sequence: number; +} export declare class StargateClient { private readonly tmClient; static connect(endpoint: string): Promise; private constructor(); + getSequence(address: string): Promise; disconnect(): void; } From c2e0efd158fdd92776fbe5a1f803b90e333ede38 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 11:50:29 +0200 Subject: [PATCH 06/13] Pull out uint64FromProto --- packages/stargate/package.json | 1 + packages/stargate/src/stargateclient.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/stargate/package.json b/packages/stargate/package.json index d9393348..647c715b 100644 --- a/packages/stargate/package.json +++ b/packages/stargate/package.json @@ -39,6 +39,7 @@ }, "dependencies": { "@cosmjs/encoding": "^0.22.0", + "@cosmjs/math": "^0.22.0", "@cosmjs/proto-signing": "^0.22.0", "@cosmjs/tendermint-rpc": "^0.22.0", "@cosmjs/utils": "^0.22.0" diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 3affe0fc..81aca4e1 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -1,14 +1,20 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { Bech32 } from "@cosmjs/encoding"; +import { Uint64 } from "@cosmjs/math"; import { BaseAccount, decodeAny } from "@cosmjs/proto-signing"; import { Client as TendermintClient } from "@cosmjs/tendermint-rpc"; import { assert } from "@cosmjs/utils"; +import Long from "long"; export interface GetSequenceResult { readonly accountNumber: number; readonly sequence: number; } +function uint64FromProto(input: number | Long): Uint64 { + return Uint64.fromString(input.toString()); +} + export class StargateClient { private readonly tmClient: TendermintClient; @@ -43,8 +49,8 @@ export class StargateClient { assert(account_number !== undefined); assert(sequence !== undefined); return { - accountNumber: typeof account_number === "number" ? account_number : account_number.toNumber(), - sequence: typeof sequence === "number" ? sequence : sequence.toNumber(), + accountNumber: uint64FromProto(account_number).toNumber(), + sequence: uint64FromProto(sequence).toNumber(), }; } From feb33aec3d9ea7a6582d76dffc60211c9d6591c4 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 13:05:39 +0200 Subject: [PATCH 07/13] Rename decorator cosmosMessage -> registered --- packages/proto-signing/src/accounts.ts | 4 ++-- packages/proto-signing/src/decorator.spec.ts | 6 +++--- packages/proto-signing/src/decorator.ts | 6 +++++- packages/proto-signing/src/magic.spec.ts | 6 +++--- packages/proto-signing/src/msgs.ts | 6 +++--- packages/proto-signing/types/decorator.d.ts | 6 +++++- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/proto-signing/src/accounts.ts b/packages/proto-signing/src/accounts.ts index 2e359a94..dd19ebdf 100644 --- a/packages/proto-signing/src/accounts.ts +++ b/packages/proto-signing/src/accounts.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { Message } from "protobufjs"; -import { cosmosField, cosmosMessage } from "./decorator"; +import { cosmosField, registered } from "./decorator"; import { defaultRegistry } from "./msgs"; -@cosmosMessage(defaultRegistry, "/cosmos.auth.BaseAccount") +@registered(defaultRegistry, "/cosmos.auth.BaseAccount") export class BaseAccount extends Message { @cosmosField.bytes(1) public readonly address?: Uint8Array; diff --git a/packages/proto-signing/src/decorator.spec.ts b/packages/proto-signing/src/decorator.spec.ts index dd63dbe7..0f18f152 100644 --- a/packages/proto-signing/src/decorator.spec.ts +++ b/packages/proto-signing/src/decorator.spec.ts @@ -2,7 +2,7 @@ import { assert } from "@cosmjs/utils"; import { Message } from "protobufjs"; -import { cosmosField, cosmosMessage } from "./decorator"; +import { cosmosField, registered } from "./decorator"; import { cosmos, google } from "./generated/codecimpl"; import { Registry } from "./registry"; @@ -15,13 +15,13 @@ describe("decorator demo", () => { const typeUrl = "/demo.MsgDemo"; const myRegistry = new Registry(); - @cosmosMessage(myRegistry, nestedTypeUrl) + @registered(myRegistry, nestedTypeUrl) class MsgNestedDemo extends Message { @cosmosField.string(1) public readonly foo?: string; } - @cosmosMessage(myRegistry, typeUrl) + @registered(myRegistry, typeUrl) // eslint-disable-next-line @typescript-eslint/no-unused-vars class MsgDemo extends Message { @cosmosField.boolean(1) diff --git a/packages/proto-signing/src/decorator.ts b/packages/proto-signing/src/decorator.ts index 2edfdadd..fd8245ef 100644 --- a/packages/proto-signing/src/decorator.ts +++ b/packages/proto-signing/src/decorator.ts @@ -7,7 +7,11 @@ function getTypeName(typeUrl: string): string { return parts[parts.length - 1]; } -export function cosmosMessage(registry: Registry, typeUrl: string): TypeDecorator { +/** + * A class decorator to register this type under the given type URL + * in the given registry. + */ +export function registered(registry: Registry, typeUrl: string): TypeDecorator { return (ctor: Constructor>) => { const typeName = getTypeName(typeUrl); const generatedType = util.decorateType(ctor, typeName); diff --git a/packages/proto-signing/src/magic.spec.ts b/packages/proto-signing/src/magic.spec.ts index 5c73bf31..f9f93271 100644 --- a/packages/proto-signing/src/magic.spec.ts +++ b/packages/proto-signing/src/magic.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { Message } from "protobufjs"; -import { cosmosField, cosmosMessage } from "./decorator"; +import { cosmosField, registered } from "./decorator"; import { Registry } from "./registry"; describe("registry magic demo", () => { @@ -10,13 +10,13 @@ describe("registry magic demo", () => { const typeUrl = "/demo.MsgMagic"; const myRegistry = new Registry(); - @cosmosMessage(myRegistry, nestedTypeUrl) + @registered(myRegistry, nestedTypeUrl) class MsgNestedMagic extends Message { @cosmosField.string(1) public readonly foo?: string; } - @cosmosMessage(myRegistry, typeUrl) + @registered(myRegistry, typeUrl) class MsgMagic extends Message { @cosmosField.boolean(1) public readonly booleanDemo?: boolean; diff --git a/packages/proto-signing/src/msgs.ts b/packages/proto-signing/src/msgs.ts index e7f5ccc6..b2774207 100644 --- a/packages/proto-signing/src/msgs.ts +++ b/packages/proto-signing/src/msgs.ts @@ -1,12 +1,12 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { Message } from "protobufjs"; -import { cosmosField, cosmosMessage } from "./decorator"; +import { cosmosField, registered } from "./decorator"; import { Registry } from "./registry"; export const defaultRegistry = new Registry(); -@cosmosMessage(defaultRegistry, "/cosmos.Coin") +@registered(defaultRegistry, "/cosmos.Coin") export class Coin extends Message { @cosmosField.string(1) public readonly denom?: string; @@ -15,7 +15,7 @@ export class Coin extends Message { public readonly amount?: string; } -@cosmosMessage(defaultRegistry, "/cosmos.bank.MsgSend") +@registered(defaultRegistry, "/cosmos.bank.MsgSend") export class MsgSend extends Message { @cosmosField.bytes(1) public readonly from_address?: Uint8Array; diff --git a/packages/proto-signing/types/decorator.d.ts b/packages/proto-signing/types/decorator.d.ts index 1b2095da..c59c9878 100644 --- a/packages/proto-signing/types/decorator.d.ts +++ b/packages/proto-signing/types/decorator.d.ts @@ -1,6 +1,10 @@ import { Constructor, Message, TypeDecorator } from "protobufjs"; import { Registry } from "./registry"; -export declare function cosmosMessage(registry: Registry, typeUrl: string): TypeDecorator; +/** + * A class decorator to register this type under the given type URL + * in the given registry. + */ +export declare function registered(registry: Registry, typeUrl: string): TypeDecorator; /** * Like PropertyDecorator from lib.es5.d.ts but without symbol support in propertyKey. */ From 0a2f72f4935a222a0825c92163cbfe05251ddd7d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 13:07:08 +0200 Subject: [PATCH 08/13] Unregister BaseAccount --- packages/proto-signing/src/accounts.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/proto-signing/src/accounts.ts b/packages/proto-signing/src/accounts.ts index dd19ebdf..c13d6728 100644 --- a/packages/proto-signing/src/accounts.ts +++ b/packages/proto-signing/src/accounts.ts @@ -1,10 +1,8 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { Message } from "protobufjs"; -import { cosmosField, registered } from "./decorator"; -import { defaultRegistry } from "./msgs"; +import { cosmosField } from "./decorator"; -@registered(defaultRegistry, "/cosmos.auth.BaseAccount") export class BaseAccount extends Message { @cosmosField.bytes(1) public readonly address?: Uint8Array; From 620785cc3ac7a12d1d7605561217c3017465b142 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 13:29:46 +0200 Subject: [PATCH 09/13] Pull out queryVerified --- packages/stargate/src/stargateclient.ts | 40 ++++++++++++++------- packages/stargate/types/stargateclient.d.ts | 1 + 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 81aca4e1..62a65356 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { Bech32 } from "@cosmjs/encoding"; +import { Bech32, toHex } from "@cosmjs/encoding"; import { Uint64 } from "@cosmjs/math"; import { BaseAccount, decodeAny } from "@cosmjs/proto-signing"; import { Client as TendermintClient } from "@cosmjs/tendermint-rpc"; @@ -29,20 +29,11 @@ export class StargateClient { public async getSequence(address: string): Promise { const binAddress = Bech32.decode(address).data; - // https://github.com/cosmos/cosmos-sdk/blob/8cab43c8120fec5200c3459cbf4a92017bb6f287/x/auth/types/keys.go#L29-L32 const accountKey = Uint8Array.from([0x01, ...binAddress]); + const responseData = await this.queryVerified("acc", accountKey); - const response = await this.tmClient.abciQuery({ - // we need the StoreKey for the module, not the module name - // https://github.com/cosmos/cosmos-sdk/blob/8cab43c8120fec5200c3459cbf4a92017bb6f287/x/auth/types/keys.go#L12 - path: "/store/acc/key", - data: accountKey, - prove: false, - }); - - const { typeUrl, value } = decodeAny(response.value); - + const { typeUrl, value } = decodeAny(responseData); switch (typeUrl) { case "/cosmos.auth.BaseAccount": { const { account_number, sequence } = BaseAccount.decode(value); @@ -53,7 +44,6 @@ export class StargateClient { sequence: uint64FromProto(sequence).toNumber(), }; } - default: throw new Error(`Unsupported type: ${typeUrl}`); } @@ -62,4 +52,28 @@ export class StargateClient { public disconnect(): void { this.tmClient.disconnect(); } + + private async queryVerified(store: string, key: Uint8Array): Promise { + const response = await this.tmClient.abciQuery({ + // we need the StoreKey for the module, not the module name + // https://github.com/cosmos/cosmos-sdk/blob/8cab43c8120fec5200c3459cbf4a92017bb6f287/x/auth/types/keys.go#L12 + path: `/store/${store}/key`, + data: key, + prove: true, + }); + + if (response.code) { + throw new Error(`Query failed with (${response.code}): ${response.log}`); + } + + // TODO: better way to compare? + if (toHex(response.key) !== toHex(key)) { + throw new Error(`Response key ${toHex(response.key)} doesn't match query key ${toHex(key)}`); + } + + // TODO: implement proof verification + // https://github.com/CosmWasm/cosmjs/issues/347 + + return response.value; + } } diff --git a/packages/stargate/types/stargateclient.d.ts b/packages/stargate/types/stargateclient.d.ts index 7b5269d6..55abe8c4 100644 --- a/packages/stargate/types/stargateclient.d.ts +++ b/packages/stargate/types/stargateclient.d.ts @@ -8,4 +8,5 @@ export declare class StargateClient { private constructor(); getSequence(address: string): Promise; disconnect(): void; + private queryVerified; } From b212e00cf7bcdd22483b67a251063c648a49ffe3 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 13:55:45 +0200 Subject: [PATCH 10/13] Implement StargateClient.getBalance --- packages/proto-signing/src/index.ts | 1 + packages/proto-signing/types/index.d.ts | 1 + packages/stargate/src/stargateclient.spec.ts | 30 +++++++++++++++++ packages/stargate/src/stargateclient.ts | 35 ++++++++++++++++++-- packages/stargate/types/stargateclient.d.ts | 7 ++++ 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/packages/proto-signing/src/index.ts b/packages/proto-signing/src/index.ts index c279effd..c52b350f 100644 --- a/packages/proto-signing/src/index.ts +++ b/packages/proto-signing/src/index.ts @@ -1,2 +1,3 @@ export { BaseAccount } from "./accounts"; export { decodeAny } from "./any"; +export { Coin } from "./msgs"; diff --git a/packages/proto-signing/types/index.d.ts b/packages/proto-signing/types/index.d.ts index c279effd..c52b350f 100644 --- a/packages/proto-signing/types/index.d.ts +++ b/packages/proto-signing/types/index.d.ts @@ -1,2 +1,3 @@ export { BaseAccount } from "./accounts"; export { decodeAny } from "./any"; +export { Coin } from "./msgs"; diff --git a/packages/stargate/src/stargateclient.spec.ts b/packages/stargate/src/stargateclient.spec.ts index 6956aa71..94ed22e0 100644 --- a/packages/stargate/src/stargateclient.spec.ts +++ b/packages/stargate/src/stargateclient.spec.ts @@ -23,4 +23,34 @@ describe("StargateClient", () => { client.disconnect(); }); }); + + describe("getBalance", () => { + it("works for different existing balances", async () => { + pendingWithoutSimapp(); + const client = await StargateClient.connect(simapp.tendermintUrl); + + const response1 = await client.getBalance(unused.address, "ucosm"); + expect(response1).toEqual({ + amount: "1000000000", + denom: "ucosm", + }); + const response2 = await client.getBalance(unused.address, "ustake"); + expect(response2).toEqual({ + amount: "1000000000", + denom: "ustake", + }); + + client.disconnect(); + }); + + it("returns null for non-existent balance", async () => { + pendingWithoutSimapp(); + const client = await StargateClient.connect(simapp.tendermintUrl); + + const response = await client.getBalance(unused.address, "gintonic"); + expect(response).toBeNull(); + + client.disconnect(); + }); + }); }); diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 62a65356..4b96bf19 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { Bech32, toHex } from "@cosmjs/encoding"; +import { Bech32, toAscii, toHex } from "@cosmjs/encoding"; import { Uint64 } from "@cosmjs/math"; -import { BaseAccount, decodeAny } from "@cosmjs/proto-signing"; +import { BaseAccount, Coin, decodeAny } from "@cosmjs/proto-signing"; import { Client as TendermintClient } from "@cosmjs/tendermint-rpc"; import { assert } from "@cosmjs/utils"; import Long from "long"; @@ -49,6 +49,37 @@ export class StargateClient { } } + public async getBalance( + address: string, + searchDenom: string, + ): Promise<{ + readonly denom: string; + readonly amount: string; + } | null> { + // balance key is a bit tricker, using some prefix stores + // https://github.com/cosmwasm/cosmos-sdk/blob/80f7ff62f79777a487d0c7a53c64b0f7e43c47b9/x/bank/keeper/view.go#L74-L77 + // ("balances", binAddress, denom) + // it seem like prefix stores just do a dumb concat with the keys (no tricks to avoid overlap) + // https://github.com/cosmos/cosmos-sdk/blob/2879c0702c87dc9dd828a8c42b9224dc054e28ad/store/prefix/store.go#L61-L64 + // https://github.com/cosmos/cosmos-sdk/blob/2879c0702c87dc9dd828a8c42b9224dc054e28ad/store/prefix/store.go#L37-L43 + const binAddress = Bech32.decode(address).data; + const bankKey = Uint8Array.from([...toAscii("balances"), ...binAddress, ...toAscii(searchDenom)]); + + const responseData = await this.queryVerified("bank", bankKey); + const { amount, denom } = Coin.decode(responseData); + assert(amount !== undefined); + assert(denom !== undefined); + + if (denom === "") { + return null; + } else { + return { + amount: amount, + denom: denom, + }; + } + } + public disconnect(): void { this.tmClient.disconnect(); } diff --git a/packages/stargate/types/stargateclient.d.ts b/packages/stargate/types/stargateclient.d.ts index 55abe8c4..85cafca9 100644 --- a/packages/stargate/types/stargateclient.d.ts +++ b/packages/stargate/types/stargateclient.d.ts @@ -7,6 +7,13 @@ export declare class StargateClient { static connect(endpoint: string): Promise; private constructor(); getSequence(address: string): Promise; + getBalance( + address: string, + searchDenom: string, + ): Promise<{ + readonly denom: string; + readonly amount: string; + } | null>; disconnect(): void; private queryVerified; } From bbee44da540ec8ab5584066752096f3ac2bf779c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 14:10:08 +0200 Subject: [PATCH 11/13] Pull out assertDefined --- packages/stargate/src/stargateclient.ts | 10 ++--- packages/utils/src/assert.spec.ts | 52 +++++++++++++++++++++++++ packages/utils/src/assert.ts | 6 +++ packages/utils/src/index.ts | 2 +- packages/utils/types/assert.d.ts | 1 + packages/utils/types/index.d.ts | 2 +- 6 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 packages/utils/src/assert.spec.ts diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 4b96bf19..ec23473c 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -3,7 +3,7 @@ import { Bech32, toAscii, toHex } from "@cosmjs/encoding"; import { Uint64 } from "@cosmjs/math"; import { BaseAccount, Coin, decodeAny } from "@cosmjs/proto-signing"; import { Client as TendermintClient } from "@cosmjs/tendermint-rpc"; -import { assert } from "@cosmjs/utils"; +import { assertDefined } from "@cosmjs/utils"; import Long from "long"; export interface GetSequenceResult { @@ -37,8 +37,8 @@ export class StargateClient { switch (typeUrl) { case "/cosmos.auth.BaseAccount": { const { account_number, sequence } = BaseAccount.decode(value); - assert(account_number !== undefined); - assert(sequence !== undefined); + assertDefined(account_number); + assertDefined(sequence); return { accountNumber: uint64FromProto(account_number).toNumber(), sequence: uint64FromProto(sequence).toNumber(), @@ -67,8 +67,8 @@ export class StargateClient { const responseData = await this.queryVerified("bank", bankKey); const { amount, denom } = Coin.decode(responseData); - assert(amount !== undefined); - assert(denom !== undefined); + assertDefined(amount); + assertDefined(denom); if (denom === "") { return null; diff --git a/packages/utils/src/assert.spec.ts b/packages/utils/src/assert.spec.ts new file mode 100644 index 00000000..4b6374cf --- /dev/null +++ b/packages/utils/src/assert.spec.ts @@ -0,0 +1,52 @@ +import { assertDefined } from "./assert"; + +describe("assert", () => { + describe("assertDefined", () => { + it("passes for simple values", () => { + { + const value: number | undefined = 123; + assertDefined(value); + expect(value).toEqual(123); + } + { + const value: string | undefined = "abc"; + assertDefined(value); + expect(value).toEqual("abc"); + } + }); + + it("passes for falsy values", () => { + { + const value: number | undefined = 0; + assertDefined(value); + expect(value).toEqual(0); + } + { + const value: string | undefined = ""; + assertDefined(value); + expect(value).toEqual(""); + } + { + const value: null | undefined = null; + assertDefined(value); + expect(value).toEqual(null); + } + }); + + it("throws for undefined values", () => { + { + const value: number | undefined = undefined; + expect(() => assertDefined(value)).toThrowError("value is undefined"); + } + { + let value: string | undefined; + expect(() => assertDefined(value)).toThrowError("value is undefined"); + } + }); + + it("throws with custom message", () => { + const value: number | undefined = undefined; + expect(() => assertDefined(value, "Bug in the data source")).toThrowError("Bug in the data source"); + }); + }); +}); diff --git a/packages/utils/src/assert.ts b/packages/utils/src/assert.ts index 1c35d1c0..3c86b353 100644 --- a/packages/utils/src/assert.ts +++ b/packages/utils/src/assert.ts @@ -4,3 +4,9 @@ export function assert(condition: any, msg?: string): asserts condition { throw new Error(msg || "condition is not truthy"); } } + +export function assertDefined(value: T | undefined, msg?: string): asserts value is T { + if (value === undefined) { + throw new Error(msg || "value is undefined"); + } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index ea096301..8d7c29d4 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,3 +1,3 @@ -export { assert } from "./assert"; +export { assert, assertDefined } from "./assert"; export { sleep } from "./sleep"; export { isNonNullObject, isUint8Array } from "./typechecks"; diff --git a/packages/utils/types/assert.d.ts b/packages/utils/types/assert.d.ts index 2e9da4bf..385fadf1 100644 --- a/packages/utils/types/assert.d.ts +++ b/packages/utils/types/assert.d.ts @@ -1 +1,2 @@ export declare function assert(condition: any, msg?: string): asserts condition; +export declare function assertDefined(value: T | undefined, msg?: string): asserts value is T; diff --git a/packages/utils/types/index.d.ts b/packages/utils/types/index.d.ts index ea096301..8d7c29d4 100644 --- a/packages/utils/types/index.d.ts +++ b/packages/utils/types/index.d.ts @@ -1,3 +1,3 @@ -export { assert } from "./assert"; +export { assert, assertDefined } from "./assert"; export { sleep } from "./sleep"; export { isNonNullObject, isUint8Array } from "./typechecks"; From 9170eb5ae19619828cbe25cd04ff64392ff59b6f Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 14:27:26 +0200 Subject: [PATCH 12/13] Use different balances for STAKE and COSM --- packages/stargate/src/stargateclient.spec.ts | 12 ++++++------ packages/stargate/src/testutils.spec.ts | 4 ++++ scripts/simapp/setup.sh | 16 +++++++++++----- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/stargate/src/stargateclient.spec.ts b/packages/stargate/src/stargateclient.spec.ts index 94ed22e0..a376253c 100644 --- a/packages/stargate/src/stargateclient.spec.ts +++ b/packages/stargate/src/stargateclient.spec.ts @@ -29,15 +29,15 @@ describe("StargateClient", () => { pendingWithoutSimapp(); const client = await StargateClient.connect(simapp.tendermintUrl); - const response1 = await client.getBalance(unused.address, "ucosm"); + const response1 = await client.getBalance(unused.address, simapp.denomFee); expect(response1).toEqual({ - amount: "1000000000", - denom: "ucosm", + amount: unused.balanceFee, + denom: simapp.denomFee, }); - const response2 = await client.getBalance(unused.address, "ustake"); + const response2 = await client.getBalance(unused.address, simapp.denomStaking); expect(response2).toEqual({ - amount: "1000000000", - denom: "ustake", + amount: unused.balanceStaking, + denom: simapp.denomStaking, }); client.disconnect(); diff --git a/packages/stargate/src/testutils.spec.ts b/packages/stargate/src/testutils.spec.ts index cfe1a60e..1abc4554 100644 --- a/packages/stargate/src/testutils.spec.ts +++ b/packages/stargate/src/testutils.spec.ts @@ -7,6 +7,8 @@ export function pendingWithoutSimapp(): void { export const simapp = { tendermintUrl: "localhost:26657", chainId: "simd-testing", + denomStaking: "ustake", + denomFee: "ucosm", }; /** Unused account */ @@ -18,4 +20,6 @@ export const unused = { address: "cosmos1cjsxept9rkggzxztslae9ndgpdyt2408lk850u", accountNumber: 16, sequence: 0, + balanceStaking: "10000000", // 10 STAKE + balanceFee: "1000000000", // 1000 COSM }; diff --git a/scripts/simapp/setup.sh b/scripts/simapp/setup.sh index 1f88f8d7..0a81a3ce 100644 --- a/scripts/simapp/setup.sh +++ b/scripts/simapp/setup.sh @@ -3,11 +3,16 @@ set -o errexit -o nounset command -v shellcheck > /dev/null && shellcheck "$0" PASSWORD=${PASSWORD:-1234567890} -STAKE=${STAKE_TOKEN:-ustake} -FEE=${FEE_TOKEN:-ucosm} CHAIN_ID=${CHAIN_ID:-simd-testing} MONIKER=${MONIKER:-simd-moniker} +# The staking and the fee tokens. The supply of the staking token is low compared to the fee token (factor 100). +STAKE=${STAKE_TOKEN:-ustake} +FEE=${FEE_TOKEN:-ucosm} + +# 10 STAKE and 1000 COSM +START_BALANCE="10000000$STAKE,1000000000$FEE" + echo "Creating genesis ..." simd init --chain-id "$CHAIN_ID" "$MONIKER" sed -i "s/\"stake\"/\"$STAKE\"/" "$HOME"/.simapp/config/genesis.json # staking/governance token is hardcoded in config, change this @@ -18,15 +23,16 @@ if ! simd keys show validator 2> /dev/null; then (echo "$PASSWORD"; echo "$PASSWORD") | simd keys add validator fi # hardcode the validator account for this instance -echo "$PASSWORD" | simd add-genesis-account validator "1000000000$STAKE,1000000000$FEE" +echo "$PASSWORD" | simd add-genesis-account validator "$START_BALANCE" echo "Setting up accounts ..." # (optionally) add a few more genesis accounts for addr in "$@"; do echo "$addr" - simd add-genesis-account "$addr" "1000000000$STAKE,1000000000$FEE" + simd add-genesis-account "$addr" "$START_BALANCE" done echo "Creating genesis tx ..." -(echo "$PASSWORD"; echo "$PASSWORD"; echo "$PASSWORD") | simd gentx validator --offline --amount "250000000$STAKE" --chain-id "$CHAIN_ID" --moniker="$MONIKER" +SELF_DELEGATION="3000000$STAKE" # 3 STAKE (leads to a voting power of 3) +(echo "$PASSWORD"; echo "$PASSWORD"; echo "$PASSWORD") | simd gentx validator --offline --amount "$SELF_DELEGATION" --chain-id "$CHAIN_ID" --moniker="$MONIKER" simd collect-gentxs From 26ae4e6a631144f4438c47f916aec0af4f9df7e8 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 6 Aug 2020 15:12:12 +0200 Subject: [PATCH 13/13] Regenerate genesis --- ...837c243073b389d7263684695becc03617.address | 1 - .../simapp/template/.simapp/config/app.toml | 32 +++++--- .../template/.simapp/config/genesis.json | 76 +++++++++---------- ...3cd9e2f88b70d57ffc8c28768b555b9acb5fc.json | 1 + ...44239a7cbbf5cdde8bbde243fcd9a4195eb70.json | 1 - .../template/.simapp/config/node_key.json | 2 +- .../.simapp/config/priv_validator_key.json | 6 +- ...78121d55d5ae0ddf74a53aeeef98f1e14d.address | 1 + scripts/simapp/template/.simapp/keyhash | 2 +- .../simapp/template/.simapp/validator.info | 2 +- scripts/simapp/template/setup.sh | 16 ++-- 11 files changed, 79 insertions(+), 61 deletions(-) delete mode 100644 scripts/simapp/template/.simapp/8a9fdd837c243073b389d7263684695becc03617.address create mode 100644 scripts/simapp/template/.simapp/config/gentx/gentx-d593cd9e2f88b70d57ffc8c28768b555b9acb5fc.json delete mode 100644 scripts/simapp/template/.simapp/config/gentx/gentx-dc544239a7cbbf5cdde8bbde243fcd9a4195eb70.json create mode 100644 scripts/simapp/template/.simapp/fb29f078121d55d5ae0ddf74a53aeeef98f1e14d.address diff --git a/scripts/simapp/template/.simapp/8a9fdd837c243073b389d7263684695becc03617.address b/scripts/simapp/template/.simapp/8a9fdd837c243073b389d7263684695becc03617.address deleted file mode 100644 index f6def662..00000000 --- a/scripts/simapp/template/.simapp/8a9fdd837c243073b389d7263684695becc03617.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0wNSAxMDoxOTo0Ni42NTgyNTg5ICswMDAwIFVUQyBtPSswLjE3NDU1MDUwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IlNXQmdBYzlDVkw2YVdFNloifQ.1WcD0GRVorQbC7411RbZwvZdtSG9ZcipAXCgXzMCORWq4tE4ke8lJA.UHmYdum53TSPA169.HW0l0KFZS4GQ9_ss_4tSt7d_cv3qjixehXxAtXEVUEUhAV8JViouQYD1-VELy1mtd7r5Ld1L9q6l0X6B2OGmc6I9bQZSB1G3KSH9WCvTvigiTnYeOrGwtTy8ZxkrC5vWj0rkaADqd3Hmc3hZsovxhlUqMcLxP7ZXET0NjNWu9auNVEevt_jgKyqttqc2zMEER3wYXVTVSm0vHo723vhFIRJNF6hp1p0u1KmyaZ7q1Di_2wb1fUrubxzU.dr7x1R5fIfDzjGgU-w7PAg \ No newline at end of file diff --git a/scripts/simapp/template/.simapp/config/app.toml b/scripts/simapp/template/.simapp/config/app.toml index 66618dd4..b964cce7 100644 --- a/scripts/simapp/template/.simapp/config/app.toml +++ b/scripts/simapp/template/.simapp/config/app.toml @@ -43,7 +43,7 @@ inter-block-cache = true [telemetry] -# Prefixed with keys to separate services +# Prefixed with keys to separate services. service-name = "" # Enabled enables the application telemetry functionality. When enabled, @@ -51,13 +51,13 @@ service-name = "" # other sinks such as Prometheus. enabled = false -# Enable prefixing gauge values with hostname +# Enable prefixing gauge values with hostname. enable-hostname = false -# Enable adding hostname to labels +# Enable adding hostname to labels. enable-hostname-label = false -# Enable adding service to labels +# Enable adding service to labels. enable-service-label = false # PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. @@ -83,20 +83,32 @@ enable = true # Swagger defines if swagger documentation should automatically be registered. swagger = false -# Address defines the API server to listen on +# Address defines the API server to listen on. address = "tcp://0.0.0.0:1317" -# MaxOpenConnections defines the number of maximum open connections +# MaxOpenConnections defines the number of maximum open connections. max-open-connections = 1000 -# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds) +# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). rpc-read-timeout = 10 -# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds) +# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). rpc-write-timeout = 0 -# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes) +# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). rpc-max-body-bytes = 1000000 -# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk) +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). enabled-unsafe-cors = true + +############################################################################### +### gRPC Configuration ### +############################################################################### + +[grpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the gRPC server address to bind to. +address = "0.0.0.0:9090" diff --git a/scripts/simapp/template/.simapp/config/genesis.json b/scripts/simapp/template/.simapp/config/genesis.json index 592b329f..25474b19 100644 --- a/scripts/simapp/template/.simapp/config/genesis.json +++ b/scripts/simapp/template/.simapp/config/genesis.json @@ -6,7 +6,7 @@ { "type": "cosmos-sdk/BaseAccount", "value": { - "address": "cosmos1320amqmuysc88vuf6unrdprft0kvqdshapg46s" + "address": "cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8" } }, { @@ -130,7 +130,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -143,7 +143,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -156,7 +156,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -169,7 +169,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -182,7 +182,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -195,7 +195,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -208,20 +208,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", - "denom": "ustake" - } - ] - }, - { - "address": "cosmos1320amqmuysc88vuf6unrdprft0kvqdshapg46s", - "coins": [ - { - "amount": "1000000000", - "denom": "ucosm" - }, - { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -234,7 +221,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -247,7 +234,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -260,7 +247,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -273,7 +260,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -286,7 +273,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -299,7 +286,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -312,7 +299,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -325,7 +312,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -338,7 +325,7 @@ "denom": "ucosm" }, { - "amount": "1000000000", + "amount": "10000000", "denom": "ustake" } ] @@ -350,8 +337,21 @@ "amount": "1000000000", "denom": "ucosm" }, + { + "amount": "10000000", + "denom": "ustake" + } + ] + }, + { + "address": "cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8", + "coins": [ { "amount": "1000000000", + "denom": "ucosm" + }, + { + "amount": "10000000", "denom": "ustake" } ] @@ -407,13 +407,13 @@ } }, "public_key": { - "secp256k1": "AmT77hhRkycGp9kUxEwOhlHsNl6owW7X7g+nJtrFTlQO" + "secp256k1": "A7bPBNzzcLkg9D6sSUIpq6qOhtWTKnJELef/5yZfr4xH" } } ] }, "body": { - "memo": "dc544239a7cbbf5cdde8bbde243fcd9a4195eb70@172.17.0.2:26656", + "memo": "d593cd9e2f88b70d57ffc8c28768b555b9acb5fc@172.17.0.3:26656", "messages": [ { "@type": "/cosmos.staking.MsgCreateValidator", @@ -422,22 +422,22 @@ "max_rate": "0.200000000000000000", "rate": "0.100000000000000000" }, - "delegator_address": "cosmos1320amqmuysc88vuf6unrdprft0kvqdshapg46s", + "delegator_address": "cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8", "description": { "moniker": "simd-moniker" }, "min_self_delegation": "1", - "pubkey": "cosmosvalconspub1zcjduepqeg7s6rcwmnsquupys6a8cd4402drnvzyv84nfakvyzdgzz6qzumqkavfer", - "validator_address": "cosmosvaloper1320amqmuysc88vuf6unrdprft0kvqdshc4uqkr", + "pubkey": "cosmosvalconspub1zcjduepqv3sruyer5xmurpxyptu4ll3efjan3lmaajf3fxg9axe895ppj9kqtyk2vf", + "validator_address": "cosmosvaloper1lv5lq7qjr42attsdma622whwa7v0rc2ds4afn5", "value": { - "amount": "250000000", + "amount": "3000000", "denom": "ustake" } } ] }, "signatures": [ - "yqsTm7NZStlzxEUnVQCFxZErdba2r5Slf2/Gf/DTpSNUg+EzhUqWD75c9ynAXPgDz4XSP9ys7PCATegvACkxEQ==" + "5gBipu7M14zMjn2t6pBxM+DprcDR44RW4Eylc1wVp4Ikem0duRVnvWDE+B0gZ9+LY0QrgPcEmm6aXzPGiN3SKQ==" ] } ] @@ -547,5 +547,5 @@ ] } }, - "genesis_time": "2020-08-05T10:19:46.2922652Z" + "genesis_time": "2020-08-06T13:08:49.5288713Z" } diff --git a/scripts/simapp/template/.simapp/config/gentx/gentx-d593cd9e2f88b70d57ffc8c28768b555b9acb5fc.json b/scripts/simapp/template/.simapp/config/gentx/gentx-d593cd9e2f88b70d57ffc8c28768b555b9acb5fc.json new file mode 100644 index 00000000..5fe648af --- /dev/null +++ b/scripts/simapp/template/.simapp/config/gentx/gentx-d593cd9e2f88b70d57ffc8c28768b555b9acb5fc.json @@ -0,0 +1 @@ +{"body":{"messages":[{"@type":"/cosmos.staking.MsgCreateValidator","description":{"moniker":"simd-moniker"},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos1lv5lq7qjr42attsdma622whwa7v0rc2d4pful8","validator_address":"cosmosvaloper1lv5lq7qjr42attsdma622whwa7v0rc2ds4afn5","pubkey":"cosmosvalconspub1zcjduepqv3sruyer5xmurpxyptu4ll3efjan3lmaajf3fxg9axe895ppj9kqtyk2vf","value":{"denom":"ustake","amount":"3000000"}}],"memo":"d593cd9e2f88b70d57ffc8c28768b555b9acb5fc@172.17.0.3:26656"},"auth_info":{"signer_infos":[{"public_key":{"secp256k1":"A7bPBNzzcLkg9D6sSUIpq6qOhtWTKnJELef/5yZfr4xH"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}}}],"fee":{"gas_limit":"200000"}},"signatures":["5gBipu7M14zMjn2t6pBxM+DprcDR44RW4Eylc1wVp4Ikem0duRVnvWDE+B0gZ9+LY0QrgPcEmm6aXzPGiN3SKQ=="]} diff --git a/scripts/simapp/template/.simapp/config/gentx/gentx-dc544239a7cbbf5cdde8bbde243fcd9a4195eb70.json b/scripts/simapp/template/.simapp/config/gentx/gentx-dc544239a7cbbf5cdde8bbde243fcd9a4195eb70.json deleted file mode 100644 index 2c69445a..00000000 --- a/scripts/simapp/template/.simapp/config/gentx/gentx-dc544239a7cbbf5cdde8bbde243fcd9a4195eb70.json +++ /dev/null @@ -1 +0,0 @@ -{"body":{"messages":[{"@type":"/cosmos.staking.MsgCreateValidator","description":{"moniker":"simd-moniker"},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos1320amqmuysc88vuf6unrdprft0kvqdshapg46s","validator_address":"cosmosvaloper1320amqmuysc88vuf6unrdprft0kvqdshc4uqkr","pubkey":"cosmosvalconspub1zcjduepqeg7s6rcwmnsquupys6a8cd4402drnvzyv84nfakvyzdgzz6qzumqkavfer","value":{"denom":"ustake","amount":"250000000"}}],"memo":"dc544239a7cbbf5cdde8bbde243fcd9a4195eb70@172.17.0.2:26656"},"auth_info":{"signer_infos":[{"public_key":{"secp256k1":"AmT77hhRkycGp9kUxEwOhlHsNl6owW7X7g+nJtrFTlQO"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}}}],"fee":{"gas_limit":"200000"}},"signatures":["yqsTm7NZStlzxEUnVQCFxZErdba2r5Slf2/Gf/DTpSNUg+EzhUqWD75c9ynAXPgDz4XSP9ys7PCATegvACkxEQ=="]} diff --git a/scripts/simapp/template/.simapp/config/node_key.json b/scripts/simapp/template/.simapp/config/node_key.json index 7d925c88..54bb2dfb 100644 --- a/scripts/simapp/template/.simapp/config/node_key.json +++ b/scripts/simapp/template/.simapp/config/node_key.json @@ -1 +1 @@ -{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"R89SQVGfuYzV/14lfUPXYCIMkNJW+EtnuHOCurizEFtu6xO3ooXongYxM4C6qYqBu9NnIDefYhOqWu6Yfm1/CA=="}} \ No newline at end of file +{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"GibkBGABoqDhct1gyZLYgUQ3q9afc7jSzBEZKYV3/Rql7r3LMmDVuXZgwdeDitunnWIm6KTJ9/yrdIbOnxGryg=="}} \ No newline at end of file diff --git a/scripts/simapp/template/.simapp/config/priv_validator_key.json b/scripts/simapp/template/.simapp/config/priv_validator_key.json index 803b3cab..aa3c08a7 100644 --- a/scripts/simapp/template/.simapp/config/priv_validator_key.json +++ b/scripts/simapp/template/.simapp/config/priv_validator_key.json @@ -1,11 +1,11 @@ { - "address": "B1CF8F1750F16AC21D47A6B601B60366C72D6453", + "address": "774A0C3FA22BFB35E7A62C33A1C58697CADE1427", "pub_key": { "type": "tendermint/PubKeyEd25519", - "value": "yj0NDw7c4A5wJIa6fDa1epo5sERh6zT2zCCagQtAFzY=" + "value": "ZGA+EyOht8GExAr5X/45TLs4/33skxSZBemyctAhkWw=" }, "priv_key": { "type": "tendermint/PrivKeyEd25519", - "value": "uOMarp66JsGXM7ZjNStlghSvEQ1ZIWyPif9c9OCTguvKPQ0PDtzgDnAkhrp8NrV6mjmwRGHrNPbMIJqBC0AXNg==" + "value": "4rVHumai2XQZ+hSsUphYlJNkcjQCTguaZ2e7LPXNoCZkYD4TI6G3wYTECvlf/jlMuzj/feyTFJkF6bJy0CGRbA==" } } \ No newline at end of file diff --git a/scripts/simapp/template/.simapp/fb29f078121d55d5ae0ddf74a53aeeef98f1e14d.address b/scripts/simapp/template/.simapp/fb29f078121d55d5ae0ddf74a53aeeef98f1e14d.address new file mode 100644 index 00000000..9a7a9c56 --- /dev/null +++ b/scripts/simapp/template/.simapp/fb29f078121d55d5ae0ddf74a53aeeef98f1e14d.address @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0wNiAxMzowODo1MC40MzYzMjQ2ICswMDAwIFVUQyBtPSswLjUzMzMxNTYwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjlYak9JRDJHMkZMM2VXcDkifQ.ZVjb1WogjVvyIXk5IkrZclppwwc0MExREIrkRFqxkjyE4k0V68APMQ.NJdR86VIEOZ0cVLL.7PukY7zG6I0gDzhjvkY8QbQfofLAVJEcVFjRkxodcrxH4UNiCkURbklOuyOgcKEJcY12TYSBXUjoWUMy15i0_O4uMhWwx_xVWgaTRyjBB6UVC6fchYpwHiYnJStrMTsTTIEd_PMg01M2G8IR4QyhJtDju9W3AEbnnBdKktDuseAe0hyr7BwJHFXm9CU-sXU3JzFQ62szLpu-CaUBV_7xJusFjwDosfyom4r-keH3Y7CmPqF_-W3VY8DU.HMvilHIyoRuJGKvKNsfX3A \ No newline at end of file diff --git a/scripts/simapp/template/.simapp/keyhash b/scripts/simapp/template/.simapp/keyhash index 1e58f4e4..2bef510a 100755 --- a/scripts/simapp/template/.simapp/keyhash +++ b/scripts/simapp/template/.simapp/keyhash @@ -1 +1 @@ -$2a$10$ErqhOjVIXPK3JrM8uP0sNeaknxSAfD4pfcjJx3IITELAHeWcU06b. \ No newline at end of file +$2a$10$.3rbMOvLm5FQrKE5eNnNB.GC6N8/klYIQpJjLIl2K6DsBkGPkytWe \ No newline at end of file diff --git a/scripts/simapp/template/.simapp/validator.info b/scripts/simapp/template/.simapp/validator.info index e0ac9e43..6d339ede 100644 --- a/scripts/simapp/template/.simapp/validator.info +++ b/scripts/simapp/template/.simapp/validator.info @@ -1 +1 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0wNSAxMDoxOTo0Ni42NDYyNDUyICswMDAwIFVUQyBtPSswLjE2MjUzNTgwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IlB3X1RBYkRxR2tXZWZHU0kifQ.HtxQbkSoUXhddjkf94sYO3CmLbPXn2FonMQZrsLJJqKgZb_4Ghm5kg.ky6uwdJhGhAhBMDD.6FCMDj06Lk6xVT1Lpz2ls-gpWDT_F5kOAB_KNeef6zhXbjDEa0VGWY97R_Yy-_NXOFkxz4juQKrPm2IDsFucmhWrtk4A2DzKQ81FP5Ev8K9_a2vDoS5eL28EWm0h5eIoPhVbbDx5mw04lKwD_8mBX5KqvacWCJo0GrD3B1W2ts_n_osHI_Pts6FolMRM5Hp3X3BEJiN1qshE39-0q2MWkh3b2VP4Wn2UE5sFR2UA0ChBRLzVl4Ie5YuPOJMSDL7xFsRFhVNVp5BNn6bv03gHyz2fX2qwOC1xMUu9memlc_Auj818WrLNWxVUqIfKvVuwtNVTpLTBoK7Lqo17dNy44WDt_Wn-eA6wtkP7j2bu2Dq2iwZu.QoGCOja4LFZ90nZJUcUNzA \ No newline at end of file +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMC0wOC0wNiAxMzowODo1MC40MTQ5MTA1ICswMDAwIFVUQyBtPSswLjUxMTkwMjAwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IkxiNS1RblpLdlFBaDVmUHEifQ.shxbGlGbejxdwAuUWE729l71nOLUtBqnE-1nDqc3bf-qzZ-ZvFP6rg.B-M7fYzRF9A91x4q.XWjXdGvP-CsRxFwrolUdq6bY5cz2i5lqSggCPdUyYuXn6WVglEEdsxbyl_Et7fZ8ppAgFsWaj19ELxYr4ewwvA4r2TReShcDk51jz8tFLTO6aCOh2F6rjn-fi5DUfcimfsipzu-x-FvCSKpQ3XB6PlwfJ5lLkoSoeqX_WJS6Zq0v7VI9D_WvSD5Q6FX1LnhrchndlZ33sBVwCjsp0GbEAOeDaYnnRexfh05k90_jc7DXHdKNI3o8a8q5pQR3CfnkHpIVlRairnrt68GEWMrCT-DhILGUP7KVJsYIadfODU_rOUqkJaAmlAMHPoWOncWaaCnk2hASwfbG8yNyREJ9UxdaXhih8ZwT1IWSTp2NkHcb1uZf.aXzyufH2vuWPQms3wVMuug \ No newline at end of file diff --git a/scripts/simapp/template/setup.sh b/scripts/simapp/template/setup.sh index 1f88f8d7..0a81a3ce 100755 --- a/scripts/simapp/template/setup.sh +++ b/scripts/simapp/template/setup.sh @@ -3,11 +3,16 @@ set -o errexit -o nounset command -v shellcheck > /dev/null && shellcheck "$0" PASSWORD=${PASSWORD:-1234567890} -STAKE=${STAKE_TOKEN:-ustake} -FEE=${FEE_TOKEN:-ucosm} CHAIN_ID=${CHAIN_ID:-simd-testing} MONIKER=${MONIKER:-simd-moniker} +# The staking and the fee tokens. The supply of the staking token is low compared to the fee token (factor 100). +STAKE=${STAKE_TOKEN:-ustake} +FEE=${FEE_TOKEN:-ucosm} + +# 10 STAKE and 1000 COSM +START_BALANCE="10000000$STAKE,1000000000$FEE" + echo "Creating genesis ..." simd init --chain-id "$CHAIN_ID" "$MONIKER" sed -i "s/\"stake\"/\"$STAKE\"/" "$HOME"/.simapp/config/genesis.json # staking/governance token is hardcoded in config, change this @@ -18,15 +23,16 @@ if ! simd keys show validator 2> /dev/null; then (echo "$PASSWORD"; echo "$PASSWORD") | simd keys add validator fi # hardcode the validator account for this instance -echo "$PASSWORD" | simd add-genesis-account validator "1000000000$STAKE,1000000000$FEE" +echo "$PASSWORD" | simd add-genesis-account validator "$START_BALANCE" echo "Setting up accounts ..." # (optionally) add a few more genesis accounts for addr in "$@"; do echo "$addr" - simd add-genesis-account "$addr" "1000000000$STAKE,1000000000$FEE" + simd add-genesis-account "$addr" "$START_BALANCE" done echo "Creating genesis tx ..." -(echo "$PASSWORD"; echo "$PASSWORD"; echo "$PASSWORD") | simd gentx validator --offline --amount "250000000$STAKE" --chain-id "$CHAIN_ID" --moniker="$MONIKER" +SELF_DELEGATION="3000000$STAKE" # 3 STAKE (leads to a voting power of 3) +(echo "$PASSWORD"; echo "$PASSWORD"; echo "$PASSWORD") | simd gentx validator --offline --amount "$SELF_DELEGATION" --chain-id "$CHAIN_ID" --moniker="$MONIKER" simd collect-gentxs