Merge pull request #378 from CosmWasm/create-query-client

Create query client
This commit is contained in:
mergify[bot] 2020-08-13 14:06:36 +00:00 committed by GitHub
commit 9ea4728747
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 1033 additions and 306 deletions

View File

@ -19,6 +19,7 @@
"format-text": "prettier --write --prose-wrap always --print-width 80 \"./*.md\"",
"lint": "eslint --max-warnings 0 \"**/*.{js,ts}\"",
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"start": "yarn build-or-skip && ./bin/cosmwasm-cli",

View File

@ -28,7 +28,9 @@
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"move-types": "shx rm -rf ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts && shx rm ./types/**/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test-node": "node jasmine-testrunner.js",
"test-firefox": "yarn pack-web && karma start --single-run --browsers Firefox",

View File

@ -38,7 +38,9 @@
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
},

View File

@ -37,7 +37,9 @@
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
},

View File

@ -27,7 +27,8 @@
"format-text": "prettier --write --prose-wrap always --print-width 80 \"./*.md\"",
"lint": "eslint --max-warnings 0 \"**/*.{js,ts}\"",
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"build": "shx rm -rf ./build && tsc",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test-node": "node jasmine-testrunner.js",
"test": "yarn build-or-skip && yarn test-node",

View File

@ -39,7 +39,9 @@
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && tsc -p tsconfig.workers.json && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc && tsc -p tsconfig.workers.json",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
},

View File

@ -31,7 +31,9 @@
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"move-types": "shx rm -rf ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts && shx rm ./types/**/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test-node": "node jasmine-testrunner.js",
"test-firefox": "yarn pack-web && karma start --single-run --browsers Firefox",

View File

@ -37,7 +37,9 @@
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
},

View File

@ -29,7 +29,9 @@
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"move-types": "shx rm -rf ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && shx mkdir -p build/generated && shx cp ./src/generated/*.js ./build/generated && shx mkdir -p ./build/types/generated && shx cp ./src/generated/*.d.ts ./build/types/generated && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc && shx mkdir -p build/generated && shx cp ./src/generated/*.js ./build/generated && shx mkdir -p ./build/types/generated && shx cp ./src/generated/*.d.ts ./build/types/generated",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test-node": "node jasmine-testrunner.js",
"test-firefox": "yarn pack-web && karma start --single-run --browsers Firefox",

View File

@ -1,13 +0,0 @@
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,
};
}

View File

@ -1,5 +1,4 @@
export { omitDefaults } from "./adr27";
export { decodeAny } from "./any";
export { Coin } from "./msgs";
export { cosmosField } from "./decorator";
export { Registry } from "./registry";

View File

@ -1,10 +0,0 @@
/**
* 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;
};

View File

@ -1,5 +1,4 @@
export { omitDefaults } from "./adr27";
export { decodeAny } from "./any";
export { Coin } from "./msgs";
export { cosmosField } from "./decorator";
export { Registry } from "./registry";

View File

@ -39,7 +39,9 @@
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
},

View File

@ -26,9 +26,11 @@
"format-text": "prettier --write --prose-wrap always --print-width 80 \"./*.md\"",
"lint": "eslint --max-warnings 0 \"**/*.{js,ts}\"",
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"move-types": "shx rm -rf ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"move-types": "shx rm -rf ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts && shx rm ./types/**/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && shx mkdir -p build/generated && shx cp ./src/generated/*.js ./build/generated && shx mkdir -p ./build/types/generated && shx cp ./src/generated/*.d.ts ./build/types/generated && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc && shx mkdir -p build/codec/generated && shx cp ./src/codec/generated/*.js ./build/codec/generated",
"postbuild": "shx mkdir -p ./build/types/codec/generated && shx cp ./src/codec/generated/*.d.ts ./build/types/codec/generated && yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test-node": "node jasmine-testrunner.js",
"test-firefox": "yarn pack-web && karma start --single-run --browsers Firefox",

View File

@ -19,6 +19,7 @@ yarn pbjs \
--no-delimited \
--no-verify \
--no-convert \
--force-long \
"$COSMOS_PROTO_DIR/cosmos.proto" \
"$COSMOS_PROTO_DIR/auth/{auth,query}.proto" \
"$COSMOS_PROTO_DIR/bank/{bank,query}.proto" \

View File

@ -231,10 +231,10 @@ export namespace cosmos {
/** Properties of a GasInfo. */
interface IGasInfo {
/** GasInfo gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** GasInfo gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
}
/** Represents a GasInfo. */
@ -246,10 +246,10 @@ export namespace cosmos {
constructor(p?: cosmos.IGasInfo);
/** GasInfo gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** GasInfo gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/**
* Creates a new GasInfo instance using the specified properties.
@ -476,7 +476,7 @@ export namespace cosmos {
/** Properties of a TxResponse. */
interface ITxResponse {
/** TxResponse height */
height?: number | Long | null;
height?: Long | null;
/** TxResponse txhash */
txhash?: string | null;
@ -500,10 +500,10 @@ export namespace cosmos {
info?: string | null;
/** TxResponse gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** TxResponse gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
/** TxResponse tx */
tx?: google.protobuf.IAny | null;
@ -521,7 +521,7 @@ export namespace cosmos {
constructor(p?: cosmos.ITxResponse);
/** TxResponse height. */
public height: number | Long;
public height: Long;
/** TxResponse txhash. */
public txhash: string;
@ -545,10 +545,10 @@ export namespace cosmos {
public info: string;
/** TxResponse gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** TxResponse gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/** TxResponse tx. */
public tx?: google.protobuf.IAny | null;
@ -746,10 +746,10 @@ export namespace cosmos {
pubKey?: Uint8Array | null;
/** BaseAccount accountNumber */
accountNumber?: number | Long | null;
accountNumber?: Long | null;
/** BaseAccount sequence */
sequence?: number | Long | null;
sequence?: Long | null;
}
/** Represents a BaseAccount. */
@ -767,10 +767,10 @@ export namespace cosmos {
public pubKey: Uint8Array;
/** BaseAccount accountNumber. */
public accountNumber: number | Long;
public accountNumber: Long;
/** BaseAccount sequence. */
public sequence: number | Long;
public sequence: Long;
/**
* Creates a new BaseAccount instance using the specified properties.
@ -856,19 +856,19 @@ export namespace cosmos {
/** Properties of a Params. */
interface IParams {
/** Params maxMemoCharacters */
maxMemoCharacters?: number | Long | null;
maxMemoCharacters?: Long | null;
/** Params txSigLimit */
txSigLimit?: number | Long | null;
txSigLimit?: Long | null;
/** Params txSizeCostPerByte */
txSizeCostPerByte?: number | Long | null;
txSizeCostPerByte?: Long | null;
/** Params sigVerifyCostEd25519 */
sigVerifyCostEd25519?: number | Long | null;
sigVerifyCostEd25519?: Long | null;
/** Params sigVerifyCostSecp256k1 */
sigVerifyCostSecp256k1?: number | Long | null;
sigVerifyCostSecp256k1?: Long | null;
}
/** Represents a Params. */
@ -880,19 +880,19 @@ export namespace cosmos {
constructor(p?: cosmos.auth.IParams);
/** Params maxMemoCharacters. */
public maxMemoCharacters: number | Long;
public maxMemoCharacters: Long;
/** Params txSigLimit. */
public txSigLimit: number | Long;
public txSigLimit: Long;
/** Params txSizeCostPerByte. */
public txSizeCostPerByte: number | Long;
public txSizeCostPerByte: Long;
/** Params sigVerifyCostEd25519. */
public sigVerifyCostEd25519: number | Long;
public sigVerifyCostEd25519: Long;
/** Params sigVerifyCostSecp256k1. */
public sigVerifyCostSecp256k1: number | Long;
public sigVerifyCostSecp256k1: Long;
/**
* Creates a new Params instance using the specified properties.
@ -2360,10 +2360,10 @@ export namespace cosmos {
key?: Uint8Array | null;
/** PageRequest offset */
offset?: number | Long | null;
offset?: Long | null;
/** PageRequest limit */
limit?: number | Long | null;
limit?: Long | null;
/** PageRequest countTotal */
countTotal?: boolean | null;
@ -2381,10 +2381,10 @@ export namespace cosmos {
public key: Uint8Array;
/** PageRequest offset. */
public offset: number | Long;
public offset: Long;
/** PageRequest limit. */
public limit: number | Long;
public limit: Long;
/** PageRequest countTotal. */
public countTotal: boolean;
@ -2421,7 +2421,7 @@ export namespace cosmos {
nextKey?: Uint8Array | null;
/** PageResponse total */
total?: number | Long | null;
total?: Long | null;
}
/** Represents a PageResponse. */
@ -2436,7 +2436,7 @@ export namespace cosmos {
public nextKey: Uint8Array;
/** PageResponse total. */
public total: number | Long;
public total: Long;
/**
* Creates a new PageResponse instance using the specified properties.
@ -2589,10 +2589,10 @@ export namespace cosmos {
chainId?: string | null;
/** SignDoc accountNumber */
accountNumber?: number | Long | null;
accountNumber?: Long | null;
/** SignDoc accountSequence */
accountSequence?: number | Long | null;
accountSequence?: Long | null;
}
/** Represents a SignDoc. */
@ -2613,10 +2613,10 @@ export namespace cosmos {
public chainId: string;
/** SignDoc accountNumber. */
public accountNumber: number | Long;
public accountNumber: Long;
/** SignDoc accountSequence. */
public accountSequence: number | Long;
public accountSequence: Long;
/**
* Creates a new SignDoc instance using the specified properties.
@ -2653,7 +2653,7 @@ export namespace cosmos {
memo?: string | null;
/** TxBody timeoutHeight */
timeoutHeight?: number | Long | null;
timeoutHeight?: Long | null;
/** TxBody extensionOptions */
extensionOptions?: google.protobuf.IAny[] | null;
@ -2677,7 +2677,7 @@ export namespace cosmos {
public memo: string;
/** TxBody timeoutHeight. */
public timeoutHeight: number | Long;
public timeoutHeight: Long;
/** TxBody extensionOptions. */
public extensionOptions: google.protobuf.IAny[];
@ -2961,7 +2961,7 @@ export namespace cosmos {
amount?: cosmos.ICoin[] | null;
/** Fee gasLimit */
gasLimit?: number | Long | null;
gasLimit?: Long | null;
}
/** Represents a Fee. */
@ -2976,7 +2976,7 @@ export namespace cosmos {
public amount: cosmos.ICoin[];
/** Fee gasLimit. */
public gasLimit: number | Long;
public gasLimit: Long;
/**
* Creates a new Fee instance using the specified properties.
@ -3519,10 +3519,10 @@ export namespace tendermint {
version?: string | null;
/** RequestInfo blockVersion */
blockVersion?: number | Long | null;
blockVersion?: Long | null;
/** RequestInfo p2pVersion */
p2pVersion?: number | Long | null;
p2pVersion?: Long | null;
}
/** Represents a RequestInfo. */
@ -3537,10 +3537,10 @@ export namespace tendermint {
public version: string;
/** RequestInfo blockVersion. */
public blockVersion: number | Long;
public blockVersion: Long;
/** RequestInfo p2pVersion. */
public p2pVersion: number | Long;
public p2pVersion: Long;
/**
* Creates a new RequestInfo instance using the specified properties.
@ -3711,7 +3711,7 @@ export namespace tendermint {
path?: string | null;
/** RequestQuery height */
height?: number | Long | null;
height?: Long | null;
/** RequestQuery prove */
prove?: boolean | null;
@ -3732,7 +3732,7 @@ export namespace tendermint {
public path: string;
/** RequestQuery height. */
public height: number | Long;
public height: Long;
/** RequestQuery prove. */
public prove: boolean;
@ -3954,7 +3954,7 @@ export namespace tendermint {
/** Properties of a RequestEndBlock. */
interface IRequestEndBlock {
/** RequestEndBlock height */
height?: number | Long | null;
height?: Long | null;
}
/** Represents a RequestEndBlock. */
@ -3966,7 +3966,7 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IRequestEndBlock);
/** RequestEndBlock height. */
public height: number | Long;
public height: Long;
/**
* Creates a new RequestEndBlock instance using the specified properties.
@ -4318,10 +4318,10 @@ export namespace tendermint {
version?: string | null;
/** ResponseInfo appVersion */
appVersion?: number | Long | null;
appVersion?: Long | null;
/** ResponseInfo lastBlockHeight */
lastBlockHeight?: number | Long | null;
lastBlockHeight?: Long | null;
/** ResponseInfo lastBlockAppHash */
lastBlockAppHash?: Uint8Array | null;
@ -4342,10 +4342,10 @@ export namespace tendermint {
public version: string;
/** ResponseInfo appVersion. */
public appVersion: number | Long;
public appVersion: Long;
/** ResponseInfo lastBlockHeight. */
public lastBlockHeight: number | Long;
public lastBlockHeight: Long;
/** ResponseInfo lastBlockAppHash. */
public lastBlockAppHash: Uint8Array;
@ -4513,7 +4513,7 @@ export namespace tendermint {
info?: string | null;
/** ResponseQuery index */
index?: number | Long | null;
index?: Long | null;
/** ResponseQuery key */
key?: Uint8Array | null;
@ -4525,7 +4525,7 @@ export namespace tendermint {
proof?: tendermint.crypto.merkle.IProof | null;
/** ResponseQuery height */
height?: number | Long | null;
height?: Long | null;
/** ResponseQuery codespace */
codespace?: string | null;
@ -4549,7 +4549,7 @@ export namespace tendermint {
public info: string;
/** ResponseQuery index. */
public index: number | Long;
public index: Long;
/** ResponseQuery key. */
public key: Uint8Array;
@ -4561,7 +4561,7 @@ export namespace tendermint {
public proof?: tendermint.crypto.merkle.IProof | null;
/** ResponseQuery height. */
public height: number | Long;
public height: Long;
/** ResponseQuery codespace. */
public codespace: string;
@ -4663,10 +4663,10 @@ export namespace tendermint {
info?: string | null;
/** ResponseCheckTx gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** ResponseCheckTx gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
/** ResponseCheckTx events */
events?: tendermint.abci.types.IEvent[] | null;
@ -4696,10 +4696,10 @@ export namespace tendermint {
public info: string;
/** ResponseCheckTx gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** ResponseCheckTx gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/** ResponseCheckTx events. */
public events: tendermint.abci.types.IEvent[];
@ -4756,10 +4756,10 @@ export namespace tendermint {
info?: string | null;
/** ResponseDeliverTx gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** ResponseDeliverTx gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
/** ResponseDeliverTx events */
events?: tendermint.abci.types.IEvent[] | null;
@ -4789,10 +4789,10 @@ export namespace tendermint {
public info: string;
/** ResponseDeliverTx gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** ResponseDeliverTx gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/** ResponseDeliverTx events. */
public events: tendermint.abci.types.IEvent[];
@ -5014,10 +5014,10 @@ export namespace tendermint {
/** Properties of a BlockParams. */
interface IBlockParams {
/** BlockParams maxBytes */
maxBytes?: number | Long | null;
maxBytes?: Long | null;
/** BlockParams maxGas */
maxGas?: number | Long | null;
maxGas?: Long | null;
}
/** Represents a BlockParams. */
@ -5029,10 +5029,10 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IBlockParams);
/** BlockParams maxBytes. */
public maxBytes: number | Long;
public maxBytes: Long;
/** BlockParams maxGas. */
public maxGas: number | Long;
public maxGas: Long;
/**
* Creates a new BlockParams instance using the specified properties.
@ -5065,7 +5065,7 @@ export namespace tendermint {
/** Properties of an EvidenceParams. */
interface IEvidenceParams {
/** EvidenceParams maxAgeNumBlocks */
maxAgeNumBlocks?: number | Long | null;
maxAgeNumBlocks?: Long | null;
/** EvidenceParams maxAgeDuration */
maxAgeDuration?: google.protobuf.IDuration | null;
@ -5080,7 +5080,7 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IEvidenceParams);
/** EvidenceParams maxAgeNumBlocks. */
public maxAgeNumBlocks: number | Long;
public maxAgeNumBlocks: Long;
/** EvidenceParams maxAgeDuration. */
public maxAgeDuration?: google.protobuf.IDuration | null;
@ -5285,7 +5285,7 @@ export namespace tendermint {
chainId?: string | null;
/** Header height */
height?: number | Long | null;
height?: Long | null;
/** Header time */
time?: google.protobuf.ITimestamp | null;
@ -5336,7 +5336,7 @@ export namespace tendermint {
public chainId: string;
/** Header height. */
public height: number | Long;
public height: Long;
/** Header time. */
public time?: google.protobuf.ITimestamp | null;
@ -5400,10 +5400,10 @@ export namespace tendermint {
/** Properties of a Version. */
interface IVersion {
/** Version Block */
Block?: number | Long | null;
Block?: Long | null;
/** Version App */
App?: number | Long | null;
App?: Long | null;
}
/** Represents a Version. */
@ -5415,10 +5415,10 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IVersion);
/** Version Block. */
public Block: number | Long;
public Block: Long;
/** Version App. */
public App: number | Long;
public App: Long;
/**
* Creates a new Version instance using the specified properties.
@ -5555,7 +5555,7 @@ export namespace tendermint {
address?: Uint8Array | null;
/** Validator power */
power?: number | Long | null;
power?: Long | null;
}
/** Represents a Validator. */
@ -5570,7 +5570,7 @@ export namespace tendermint {
public address: Uint8Array;
/** Validator power. */
public power: number | Long;
public power: Long;
/**
* Creates a new Validator instance using the specified properties.
@ -5604,7 +5604,7 @@ export namespace tendermint {
pubKey?: tendermint.abci.types.IPubKey | null;
/** ValidatorUpdate power */
power?: number | Long | null;
power?: Long | null;
}
/** Represents a ValidatorUpdate. */
@ -5619,7 +5619,7 @@ export namespace tendermint {
public pubKey?: tendermint.abci.types.IPubKey | null;
/** ValidatorUpdate power. */
public power: number | Long;
public power: Long;
/**
* Creates a new ValidatorUpdate instance using the specified properties.
@ -5762,13 +5762,13 @@ export namespace tendermint {
validator?: tendermint.abci.types.IValidator | null;
/** Evidence height */
height?: number | Long | null;
height?: Long | null;
/** Evidence time */
time?: google.protobuf.ITimestamp | null;
/** Evidence totalVotingPower */
totalVotingPower?: number | Long | null;
totalVotingPower?: Long | null;
}
/** Represents an Evidence. */
@ -5786,13 +5786,13 @@ export namespace tendermint {
public validator?: tendermint.abci.types.IValidator | null;
/** Evidence height. */
public height: number | Long;
public height: Long;
/** Evidence time. */
public time?: google.protobuf.ITimestamp | null;
/** Evidence totalVotingPower. */
public totalVotingPower: number | Long;
public totalVotingPower: Long;
/**
* Creates a new Evidence instance using the specified properties.
@ -6313,7 +6313,7 @@ export namespace tendermint {
key?: Uint8Array | null;
/** KI64Pair value */
value?: number | Long | null;
value?: Long | null;
}
/** Represents a KI64Pair. */
@ -6328,7 +6328,7 @@ export namespace tendermint {
public key: Uint8Array;
/** KI64Pair value. */
public value: number | Long;
public value: Long;
/**
* Creates a new KI64Pair instance using the specified properties.
@ -6415,7 +6415,7 @@ export namespace google {
/** Properties of a Timestamp. */
interface ITimestamp {
/** Timestamp seconds */
seconds?: number | Long | null;
seconds?: Long | null;
/** Timestamp nanos */
nanos?: number | null;
@ -6430,7 +6430,7 @@ export namespace google {
constructor(p?: google.protobuf.ITimestamp);
/** Timestamp seconds. */
public seconds: number | Long;
public seconds: Long;
/** Timestamp nanos. */
public nanos: number;
@ -6464,7 +6464,7 @@ export namespace google {
/** Properties of a Duration. */
interface IDuration {
/** Duration seconds */
seconds?: number | Long | null;
seconds?: Long | null;
/** Duration nanos */
nanos?: number | null;
@ -6479,7 +6479,7 @@ export namespace google {
constructor(p?: google.protobuf.IDuration);
/** Duration seconds. */
public seconds: number | Long;
public seconds: Long;
/** Duration nanos. */
public nanos: number;

View File

@ -0,0 +1,9 @@
import Long from "long";
import protobuf from "protobufjs/minimal";
// Ensure the protobuf module has a Long implementation, which otherwise only works
// in Node.js (see https://github.com/protobufjs/protobuf.js/issues/921#issuecomment-334925145)
protobuf.util.Long = Long;
protobuf.configure();
export * from "./generated/codecimpl";

View File

@ -0,0 +1,108 @@
import { encodeAminoPubkey } from "@cosmjs/launchpad";
import { Client as TendermintClient } from "@cosmjs/tendermint-rpc";
import { assert } from "@cosmjs/utils";
import Long from "long";
import { nonExistentAddress, pendingWithoutSimapp, simapp, unused, validator } from "../testutils.spec";
import { AuthExtension, setupAuthExtension } from "./auth";
import { QueryClient } from "./queryclient";
import { toAccAddress } from "./utils";
async function makeAuthClient(rpcUrl: string): Promise<[QueryClient & AuthExtension, TendermintClient]> {
const tmClient = await TendermintClient.connect(rpcUrl);
return [QueryClient.withExtensions(tmClient, setupAuthExtension), tmClient];
}
describe("AuthExtension", () => {
describe("account", () => {
it("works for unused account", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeAuthClient(simapp.tendermintUrl);
const account = await client.auth.account(unused.address);
assert(account);
expect(account).toEqual({
address: toAccAddress(unused.address),
// pubKey not set
accountNumber: Long.fromNumber(unused.accountNumber, true),
// sequence not set
});
tmClient.disconnect();
});
it("works for account with pubkey and non-zero sequence", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeAuthClient(simapp.tendermintUrl);
const account = await client.auth.account(validator.address);
assert(account);
expect(account).toEqual({
address: toAccAddress(validator.address),
pubKey: encodeAminoPubkey(validator.pubkey),
// accountNumber not set
sequence: Long.fromNumber(validator.sequence, true),
});
tmClient.disconnect();
});
it("returns null for non-existent address", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeAuthClient(simapp.tendermintUrl);
const account = await client.auth.account(nonExistentAddress);
expect(account).toBeNull();
tmClient.disconnect();
});
});
describe("unverified", () => {
describe("account", () => {
it("works for unused account", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeAuthClient(simapp.tendermintUrl);
const account = await client.auth.unverified.account(unused.address);
assert(account);
expect(account).toEqual({
address: toAccAddress(unused.address),
// pubKey not set
accountNumber: Long.fromNumber(unused.accountNumber, true),
// sequence not set
});
tmClient.disconnect();
});
it("works for account with pubkey and non-zero sequence", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeAuthClient(simapp.tendermintUrl);
const account = await client.auth.unverified.account(validator.address);
assert(account);
expect(account).toEqual({
address: toAccAddress(validator.address),
pubKey: encodeAminoPubkey(validator.pubkey),
// accountNumber not set
sequence: Long.fromNumber(validator.sequence, true),
});
tmClient.disconnect();
});
it("returns null for non-existent address", async () => {
pending("This fails with Error: Query failed with (1): internal");
pendingWithoutSimapp();
const [client, tmClient] = await makeAuthClient(simapp.tendermintUrl);
const account = await client.auth.unverified.account(nonExistentAddress);
expect(account).toBeNull();
tmClient.disconnect();
});
});
});
});

View File

@ -0,0 +1,60 @@
import { assert } from "@cosmjs/utils";
import { cosmos, google } from "../codec";
import { QueryClient } from "./queryclient";
import { toAccAddress, toObject } from "./utils";
export interface AuthExtension {
readonly auth: {
readonly account: (address: string) => Promise<cosmos.auth.IBaseAccount | null>;
readonly unverified: {
readonly account: (address: string) => Promise<cosmos.auth.IBaseAccount | null>;
};
};
}
export function setupAuthExtension(base: QueryClient): AuthExtension {
// Use this service to get easy typed access to query methods
// This cannot be used to for proof verification
const queryService = cosmos.auth.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.auth.Query/${method.name}`;
base
.queryUnverified(path, requestData)
.then((response) => callback(null, response))
.catch((error) => callback(error));
});
return {
auth: {
account: async (address: string) => {
// https://github.com/cosmos/cosmos-sdk/blob/8cab43c8120fec5200c3459cbf4a92017bb6f287/x/auth/types/keys.go#L29-L32
const key = Uint8Array.from([0x01, ...toAccAddress(address)]);
const responseData = await base.queryVerified("acc", key);
if (responseData.length === 0) return null;
const account = google.protobuf.Any.decode(responseData);
switch (account.type_url) {
case "/cosmos.auth.BaseAccount": {
return toObject(cosmos.auth.BaseAccount.decode(account.value));
}
default:
throw new Error(`Unsupported type: '${account.type_url}'`);
}
},
unverified: {
account: async (address: string) => {
const { account } = await queryService.account({ address: toAccAddress(address) });
if (!account) return null;
switch (account.type_url) {
case "/cosmos.auth.BaseAccount": {
assert(account.value);
return toObject(cosmos.auth.BaseAccount.decode(account.value));
}
default:
throw new Error(`Unsupported type: '${account.type_url}'`);
}
},
},
},
};
}

View File

@ -0,0 +1,186 @@
import { Client as TendermintClient } from "@cosmjs/tendermint-rpc";
import {
nonExistentAddress,
nonNegativeIntegerMatcher,
pendingWithoutSimapp,
simapp,
unused,
} from "../testutils.spec";
import { BankExtension, setupBankExtension } from "./bank";
import { QueryClient } from "./queryclient";
async function makeBankClient(rpcUrl: string): Promise<[QueryClient & BankExtension, TendermintClient]> {
const tmClient = await TendermintClient.connect(rpcUrl);
return [QueryClient.withExtensions(tmClient, setupBankExtension), tmClient];
}
describe("BankExtension", () => {
describe("balance", () => {
it("works for different existing balances", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response1 = await client.bank.balance(unused.address, simapp.denomFee);
expect(response1).toEqual({
amount: unused.balanceFee,
denom: simapp.denomFee,
});
const response2 = await client.bank.balance(unused.address, simapp.denomStaking);
expect(response2).toEqual({
amount: unused.balanceStaking,
denom: simapp.denomStaking,
});
tmClient.disconnect();
});
it("returns null for non-existent balance", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response = await client.bank.balance(unused.address, "gintonic");
expect(response).toBeNull();
tmClient.disconnect();
});
it("returns null for non-existent address", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response = await client.bank.balance(nonExistentAddress, simapp.denomFee);
expect(response).toBeNull();
tmClient.disconnect();
});
});
describe("unverified", () => {
describe("balance", () => {
it("works for different existing balances", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response1 = await client.bank.unverified.balance(unused.address, simapp.denomFee);
expect(response1).toEqual({
amount: unused.balanceFee,
denom: simapp.denomFee,
});
const response2 = await client.bank.unverified.balance(unused.address, simapp.denomStaking);
expect(response2).toEqual({
amount: unused.balanceStaking,
denom: simapp.denomStaking,
});
tmClient.disconnect();
});
it("returns zero for non-existent balance", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response = await client.bank.unverified.balance(unused.address, "gintonic");
expect(response).toEqual({
amount: "0",
denom: "gintonic",
});
tmClient.disconnect();
});
it("returns zero for non-existent address", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response = await client.bank.unverified.balance(nonExistentAddress, simapp.denomFee);
expect(response).toEqual({
amount: "0",
denom: simapp.denomFee,
});
tmClient.disconnect();
});
});
describe("allBalances", () => {
it("returns all balances for unused account", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const balances = await client.bank.unverified.allBalances(unused.address);
expect(balances).toEqual([
{
amount: unused.balanceFee,
denom: simapp.denomFee,
},
{
amount: unused.balanceStaking,
denom: simapp.denomStaking,
},
]);
tmClient.disconnect();
});
it("returns an empty list for non-existent account", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const balances = await client.bank.unverified.allBalances(nonExistentAddress);
expect(balances).toEqual([]);
tmClient.disconnect();
});
});
describe("totalSupply", () => {
it("works", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response = await client.bank.unverified.totalSupply();
expect(response).toEqual([
{
amount: "18000000000",
denom: simapp.denomFee,
},
{
amount: jasmine.stringMatching(nonNegativeIntegerMatcher),
denom: simapp.denomStaking,
},
]);
tmClient.disconnect();
});
});
describe("supplyOf", () => {
it("works for existing denom", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response = await client.bank.unverified.supplyOf(simapp.denomFee);
expect(response).toEqual({
amount: "18000000000",
denom: simapp.denomFee,
});
tmClient.disconnect();
});
it("returns zero for non-existent denom", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeBankClient(simapp.tendermintUrl);
const response = await client.bank.unverified.supplyOf("gintonic");
expect(response).toEqual({
amount: "0",
denom: "gintonic",
});
tmClient.disconnect();
});
});
});
});

View File

@ -0,0 +1,67 @@
import { toAscii } from "@cosmjs/encoding";
import { assert } from "@cosmjs/utils";
import { cosmos } from "../codec";
import { QueryClient } from "./queryclient";
import { toAccAddress, toObject } from "./utils";
export interface BankExtension {
readonly bank: {
readonly balance: (address: string, denom: string) => Promise<cosmos.ICoin | null>;
readonly unverified: {
readonly balance: (address: string, denom: string) => Promise<cosmos.ICoin>;
readonly allBalances: (address: string) => Promise<cosmos.ICoin[]>;
readonly totalSupply: () => Promise<cosmos.ICoin[]>;
readonly supplyOf: (denom: 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) => {
// 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 key = Uint8Array.from([...toAscii("balances"), ...toAccAddress(address), ...toAscii(denom)]);
const responseData = await base.queryVerified("bank", key);
return responseData.length ? toObject(cosmos.Coin.decode(responseData)) : null;
},
unverified: {
balance: async (address: string, denom: string) => {
const { balance } = await queryService.balance({ address: toAccAddress(address), denom: denom });
assert(balance);
return toObject(balance);
},
allBalances: async (address: string) => {
const { balances } = await queryService.allBalances({ address: toAccAddress(address) });
return balances.map(toObject);
},
totalSupply: async () => {
const { supply } = await queryService.totalSupply({});
return supply.map(toObject);
},
supplyOf: async (denom: string) => {
const { amount } = await queryService.supplyOf({ denom: denom });
assert(amount);
return toObject(amount);
},
},
},
};
}

View File

@ -0,0 +1,8 @@
// Base symbols
export { QueryClient } from "./queryclient";
// Extensions
export { AuthExtension, setupAuthExtension } from "./auth";
export { BankExtension, setupBankExtension } from "./bank";

View File

@ -0,0 +1,183 @@
/* eslint-disable no-dupe-class-members, @typescript-eslint/ban-types, @typescript-eslint/naming-convention */
import { toHex } from "@cosmjs/encoding";
import { Client as TendermintClient } from "@cosmjs/tendermint-rpc";
import { arrayContentEquals, assert, isNonNullObject } from "@cosmjs/utils";
type QueryExtensionSetup<P> = (base: QueryClient) => P;
export class QueryClient {
/** Constructs a QueryClient with 0 extensions */
public static withExtensions(tmClient: TendermintClient): QueryClient;
/** Constructs a QueryClient with 1 extension */
public static withExtensions<A extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
): QueryClient & A;
/** Constructs a QueryClient with 2 extensions */
public static withExtensions<A extends object, B extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
): QueryClient & A & B;
/** Constructs a QueryClient with 3 extensions */
public static withExtensions<A extends object, B extends object, C extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
): QueryClient & A & B & C;
/** Constructs a QueryClient with 4 extensions */
public static withExtensions<A extends object, B extends object, C extends object, D extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
): QueryClient & A & B & C & D;
/** Constructs a QueryClient with 5 extensions */
public static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
): QueryClient & A & B & C & D & E;
/** Constructs a QueryClient with 6 extensions */
public static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object,
F extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
setupExtensionF: QueryExtensionSetup<F>,
): QueryClient & A & B & C & D & E & F;
/** Constructs a QueryClient with 7 extensions */
public static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object,
F extends object,
G extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
setupExtensionF: QueryExtensionSetup<F>,
setupExtensionG: QueryExtensionSetup<G>,
): QueryClient & A & B & C & D & E & F & G;
/** Constructs a QueryClient with 8 extensions */
public static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object,
F extends object,
G extends object,
H extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
setupExtensionF: QueryExtensionSetup<F>,
setupExtensionG: QueryExtensionSetup<G>,
setupExtensionH: QueryExtensionSetup<H>,
): QueryClient & A & B & C & D & E & F & G & H;
public static withExtensions(
tmClient: TendermintClient,
...extensionSetups: Array<QueryExtensionSetup<object>>
): any {
const client = new QueryClient(tmClient);
const extensions = extensionSetups.map((setupExtension) => setupExtension(client));
for (const extension of extensions) {
assert(isNonNullObject(extension), `Extension must be a non-null object`);
for (const [moduleKey, moduleValue] of Object.entries(extension)) {
assert(
isNonNullObject(moduleValue),
`Module must be a non-null object. Found type ${typeof moduleValue} for module "${moduleKey}".`,
);
const current = (client as any)[moduleKey] || {};
(client as any)[moduleKey] = {
...current,
...moduleValue,
};
}
}
return client;
}
private readonly tmClient: TendermintClient;
public constructor(tmClient: TendermintClient) {
this.tmClient = tmClient;
}
public async queryVerified(store: string, key: Uint8Array): Promise<Uint8Array> {
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}`);
}
if (!arrayContentEquals(response.key, 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;
}
public async queryUnverified(path: string, request: Uint8Array): Promise<Uint8Array> {
const response = await this.tmClient.abciQuery({
path: path,
data: request,
prove: false,
});
if (response.code) {
throw new Error(`Query failed with (${response.code}): ${response.log}`);
}
return response.value;
}
}

View File

@ -0,0 +1,19 @@
import { Bech32 } from "@cosmjs/encoding";
/**
* Takes a bech32 encoded address and returns the data part. The prefix is ignored and discarded.
* This is called AccAddress in Cosmos SDK, which is basically an alias for raw binary data.
* The result is typically 20 bytes long but not restricted to that.
*/
export function toAccAddress(address: string): Uint8Array {
return Bech32.decode(address).data;
}
/**
* Use this to convert a protobuf.js class to the interface (e.g. Coin to ICoin)
* in a ways that makes Jasmine's toEqual happy.
*/
// eslint-disable-next-line @typescript-eslint/ban-types
export function toObject<I extends object>(thing: I): Omit<I, never> {
return { ...thing };
}

View File

@ -3,8 +3,9 @@ import { Bech32, fromBase64 } from "@cosmjs/encoding";
import { Coin, coins, Secp256k1Wallet } from "@cosmjs/launchpad";
import { makeSignBytes, omitDefaults, Registry } from "@cosmjs/proto-signing";
import { assert } from "@cosmjs/utils";
import Long from "long";
import { cosmos } from "./generated/codecimpl";
import { cosmos } from "./codec";
import {
BroadcastTxResponse,
isBroadcastTxFailure,
@ -68,7 +69,7 @@ async function sendTokens(
},
],
fee: {
gasLimit: 200000,
gasLimit: Long.fromNumber(200000),
},
};
const authInfoBytes = Uint8Array.from(AuthInfo.encode(authInfo).finish());

View File

@ -3,9 +3,10 @@ import { Bech32, fromBase64 } from "@cosmjs/encoding";
import { Secp256k1Wallet } from "@cosmjs/launchpad";
import { makeSignBytes, omitDefaults, Registry } from "@cosmjs/proto-signing";
import { assert, sleep } from "@cosmjs/utils";
import Long from "long";
import { ReadonlyDate } from "readonly-date";
import { cosmos } from "./generated/codecimpl";
import { cosmos } from "./codec";
import { assertIsBroadcastTxSuccess, PrivateStargateClient, StargateClient } from "./stargateclient";
import {
faucet,
@ -290,7 +291,7 @@ describe("StargateClient", () => {
},
],
fee: {
gasLimit: 200000,
gasLimit: Long.fromNumber(200000),
},
};
const authInfoBytes = Uint8Array.from(AuthInfo.encode(authInfo).finish());

View File

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/naming-convention */
import { Bech32, toAscii, toHex } from "@cosmjs/encoding";
import { Bech32, toHex } from "@cosmjs/encoding";
import {
Block,
Coin,
@ -11,12 +11,12 @@ import {
SearchTxQuery,
} from "@cosmjs/launchpad";
import { Uint53, Uint64 } from "@cosmjs/math";
import { decodeAny } from "@cosmjs/proto-signing";
import { broadcastTxCommitSuccess, Client as TendermintClient, QueryString } from "@cosmjs/tendermint-rpc";
import { arrayContentEquals, assert, assertDefined } from "@cosmjs/utils";
import { assert, assertDefined } from "@cosmjs/utils";
import Long from "long";
import { cosmos } from "./generated/codecimpl";
import { cosmos } from "./codec";
import { AuthExtension, BankExtension, QueryClient, setupAuthExtension, setupBankExtension } from "./queries";
/** A transaction that is indexed as part of the transaction history */
export interface IndexedTx {
@ -80,14 +80,16 @@ export function assertIsBroadcastTxSuccess(
}
}
function uint64FromProto(input: number | Long): Uint64 {
function uint64FromProto(input: number | Long | null | undefined): Uint64 {
if (!input) return Uint64.fromNumber(0);
return Uint64.fromString(input.toString());
}
function decodeBaseAccount(data: Uint8Array, prefix: string): Account {
const { address, pubKey, accountNumber, sequence } = cosmos.auth.BaseAccount.decode(data);
function accountFromProto(input: cosmos.auth.IBaseAccount, prefix: string): Account {
const { address, pubKey, accountNumber, sequence } = input;
// Pubkey is still Amino-encoded in BaseAccount (https://github.com/cosmos/cosmos-sdk/issues/6886)
const pubkey = pubKey.length ? decodeAminoPubkey(pubKey) : null;
const pubkey = pubKey && pubKey.length ? decodeAminoPubkey(pubKey) : null;
assert(address);
return {
address: Bech32.encode(prefix, address),
pubkey: pubkey,
@ -114,6 +116,7 @@ export interface PrivateStargateClient {
export class StargateClient {
private readonly tmClient: TendermintClient;
private readonly queryClient: QueryClient & AuthExtension & BankExtension;
private chainId: string | undefined;
public static async connect(endpoint: string): Promise<StargateClient> {
@ -123,6 +126,7 @@ export class StargateClient {
private constructor(tmClient: TendermintClient) {
this.tmClient = tmClient;
this.queryClient = QueryClient.withExtensions(tmClient, setupAuthExtension, setupBankExtension);
}
public async getChainId(): Promise<string> {
@ -142,21 +146,10 @@ export class StargateClient {
}
public async getAccount(searchAddress: string): Promise<Account | null> {
const { prefix, data: binAddress } = Bech32.decode(searchAddress);
// 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 { prefix } = Bech32.decode(searchAddress);
if (responseData.length === 0) return null;
const { typeUrl, value } = decodeAny(responseData);
switch (typeUrl) {
case "/cosmos.auth.BaseAccount": {
return decodeBaseAccount(value, prefix);
}
default:
throw new Error(`Unsupported type: '${typeUrl}'`);
}
const account = await this.queryClient.auth.account(searchAddress);
return account ? accountFromProto(account, prefix) : null;
}
public async getSequence(address: string): Promise<SequenceResponse | null> {
@ -189,25 +182,8 @@ export class StargateClient {
}
public async getBalance(address: string, searchDenom: string): Promise<Coin | 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 } = cosmos.Coin.decode(responseData);
if (denom === "") {
return null;
} else {
return {
amount: amount,
denom: denom,
};
}
const balance = await this.queryClient.bank.balance(address, searchDenom);
return balance ? coinFromProto(balance) : null;
}
/**
@ -217,13 +193,8 @@ export class StargateClient {
* proofs from such a method.
*/
public async getAllBalancesUnverified(address: string): Promise<readonly Coin[]> {
const path = "/cosmos.bank.Query/AllBalances";
const request = cosmos.bank.QueryAllBalancesRequest.encode({
address: Bech32.decode(address).data,
}).finish();
const responseData = await this.queryUnverified(path, request);
const response = cosmos.bank.QueryAllBalancesResponse.decode(responseData);
return response.balances.map(coinFromProto);
const balances = await this.queryClient.bank.unverified.allBalances(address);
return balances.map(coinFromProto);
}
public async searchTx(query: SearchTxQuery, filter: SearchTxFilter = {}): Promise<readonly IndexedTx[]> {
@ -280,43 +251,6 @@ export class StargateClient {
};
}
private async queryVerified(store: string, key: Uint8Array): Promise<Uint8Array> {
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}`);
}
if (!arrayContentEquals(response.key, 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;
}
private async queryUnverified(path: string, request: Uint8Array): Promise<Uint8Array> {
const response = await this.tmClient.abciQuery({
path: path,
data: request,
prove: false,
});
if (response.code) {
throw new Error(`Query failed with (${response.code}): ${response.log}`);
}
return response.value;
}
private async txsQuery(query: string): Promise<readonly IndexedTx[]> {
const params = {
query: query as QueryString,

View File

@ -64,4 +64,5 @@ export const validator = {
export const nonExistentAddress = "cosmos1p79apjaufyphcmsn4g07cynqf0wyjuezqu84hd";
export const nonNegativeIntegerMatcher = /^[0-9]+$/;
export const tendermintIdMatcher = /^[0-9A-F]{64}$/;

View File

@ -231,10 +231,10 @@ export namespace cosmos {
/** Properties of a GasInfo. */
interface IGasInfo {
/** GasInfo gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** GasInfo gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
}
/** Represents a GasInfo. */
@ -246,10 +246,10 @@ export namespace cosmos {
constructor(p?: cosmos.IGasInfo);
/** GasInfo gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** GasInfo gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/**
* Creates a new GasInfo instance using the specified properties.
@ -476,7 +476,7 @@ export namespace cosmos {
/** Properties of a TxResponse. */
interface ITxResponse {
/** TxResponse height */
height?: number | Long | null;
height?: Long | null;
/** TxResponse txhash */
txhash?: string | null;
@ -500,10 +500,10 @@ export namespace cosmos {
info?: string | null;
/** TxResponse gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** TxResponse gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
/** TxResponse tx */
tx?: google.protobuf.IAny | null;
@ -521,7 +521,7 @@ export namespace cosmos {
constructor(p?: cosmos.ITxResponse);
/** TxResponse height. */
public height: number | Long;
public height: Long;
/** TxResponse txhash. */
public txhash: string;
@ -545,10 +545,10 @@ export namespace cosmos {
public info: string;
/** TxResponse gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** TxResponse gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/** TxResponse tx. */
public tx?: google.protobuf.IAny | null;
@ -746,10 +746,10 @@ export namespace cosmos {
pubKey?: Uint8Array | null;
/** BaseAccount accountNumber */
accountNumber?: number | Long | null;
accountNumber?: Long | null;
/** BaseAccount sequence */
sequence?: number | Long | null;
sequence?: Long | null;
}
/** Represents a BaseAccount. */
@ -767,10 +767,10 @@ export namespace cosmos {
public pubKey: Uint8Array;
/** BaseAccount accountNumber. */
public accountNumber: number | Long;
public accountNumber: Long;
/** BaseAccount sequence. */
public sequence: number | Long;
public sequence: Long;
/**
* Creates a new BaseAccount instance using the specified properties.
@ -856,19 +856,19 @@ export namespace cosmos {
/** Properties of a Params. */
interface IParams {
/** Params maxMemoCharacters */
maxMemoCharacters?: number | Long | null;
maxMemoCharacters?: Long | null;
/** Params txSigLimit */
txSigLimit?: number | Long | null;
txSigLimit?: Long | null;
/** Params txSizeCostPerByte */
txSizeCostPerByte?: number | Long | null;
txSizeCostPerByte?: Long | null;
/** Params sigVerifyCostEd25519 */
sigVerifyCostEd25519?: number | Long | null;
sigVerifyCostEd25519?: Long | null;
/** Params sigVerifyCostSecp256k1 */
sigVerifyCostSecp256k1?: number | Long | null;
sigVerifyCostSecp256k1?: Long | null;
}
/** Represents a Params. */
@ -880,19 +880,19 @@ export namespace cosmos {
constructor(p?: cosmos.auth.IParams);
/** Params maxMemoCharacters. */
public maxMemoCharacters: number | Long;
public maxMemoCharacters: Long;
/** Params txSigLimit. */
public txSigLimit: number | Long;
public txSigLimit: Long;
/** Params txSizeCostPerByte. */
public txSizeCostPerByte: number | Long;
public txSizeCostPerByte: Long;
/** Params sigVerifyCostEd25519. */
public sigVerifyCostEd25519: number | Long;
public sigVerifyCostEd25519: Long;
/** Params sigVerifyCostSecp256k1. */
public sigVerifyCostSecp256k1: number | Long;
public sigVerifyCostSecp256k1: Long;
/**
* Creates a new Params instance using the specified properties.
@ -2360,10 +2360,10 @@ export namespace cosmos {
key?: Uint8Array | null;
/** PageRequest offset */
offset?: number | Long | null;
offset?: Long | null;
/** PageRequest limit */
limit?: number | Long | null;
limit?: Long | null;
/** PageRequest countTotal */
countTotal?: boolean | null;
@ -2381,10 +2381,10 @@ export namespace cosmos {
public key: Uint8Array;
/** PageRequest offset. */
public offset: number | Long;
public offset: Long;
/** PageRequest limit. */
public limit: number | Long;
public limit: Long;
/** PageRequest countTotal. */
public countTotal: boolean;
@ -2421,7 +2421,7 @@ export namespace cosmos {
nextKey?: Uint8Array | null;
/** PageResponse total */
total?: number | Long | null;
total?: Long | null;
}
/** Represents a PageResponse. */
@ -2436,7 +2436,7 @@ export namespace cosmos {
public nextKey: Uint8Array;
/** PageResponse total. */
public total: number | Long;
public total: Long;
/**
* Creates a new PageResponse instance using the specified properties.
@ -2589,10 +2589,10 @@ export namespace cosmos {
chainId?: string | null;
/** SignDoc accountNumber */
accountNumber?: number | Long | null;
accountNumber?: Long | null;
/** SignDoc accountSequence */
accountSequence?: number | Long | null;
accountSequence?: Long | null;
}
/** Represents a SignDoc. */
@ -2613,10 +2613,10 @@ export namespace cosmos {
public chainId: string;
/** SignDoc accountNumber. */
public accountNumber: number | Long;
public accountNumber: Long;
/** SignDoc accountSequence. */
public accountSequence: number | Long;
public accountSequence: Long;
/**
* Creates a new SignDoc instance using the specified properties.
@ -2653,7 +2653,7 @@ export namespace cosmos {
memo?: string | null;
/** TxBody timeoutHeight */
timeoutHeight?: number | Long | null;
timeoutHeight?: Long | null;
/** TxBody extensionOptions */
extensionOptions?: google.protobuf.IAny[] | null;
@ -2677,7 +2677,7 @@ export namespace cosmos {
public memo: string;
/** TxBody timeoutHeight. */
public timeoutHeight: number | Long;
public timeoutHeight: Long;
/** TxBody extensionOptions. */
public extensionOptions: google.protobuf.IAny[];
@ -2961,7 +2961,7 @@ export namespace cosmos {
amount?: cosmos.ICoin[] | null;
/** Fee gasLimit */
gasLimit?: number | Long | null;
gasLimit?: Long | null;
}
/** Represents a Fee. */
@ -2976,7 +2976,7 @@ export namespace cosmos {
public amount: cosmos.ICoin[];
/** Fee gasLimit. */
public gasLimit: number | Long;
public gasLimit: Long;
/**
* Creates a new Fee instance using the specified properties.
@ -3519,10 +3519,10 @@ export namespace tendermint {
version?: string | null;
/** RequestInfo blockVersion */
blockVersion?: number | Long | null;
blockVersion?: Long | null;
/** RequestInfo p2pVersion */
p2pVersion?: number | Long | null;
p2pVersion?: Long | null;
}
/** Represents a RequestInfo. */
@ -3537,10 +3537,10 @@ export namespace tendermint {
public version: string;
/** RequestInfo blockVersion. */
public blockVersion: number | Long;
public blockVersion: Long;
/** RequestInfo p2pVersion. */
public p2pVersion: number | Long;
public p2pVersion: Long;
/**
* Creates a new RequestInfo instance using the specified properties.
@ -3711,7 +3711,7 @@ export namespace tendermint {
path?: string | null;
/** RequestQuery height */
height?: number | Long | null;
height?: Long | null;
/** RequestQuery prove */
prove?: boolean | null;
@ -3732,7 +3732,7 @@ export namespace tendermint {
public path: string;
/** RequestQuery height. */
public height: number | Long;
public height: Long;
/** RequestQuery prove. */
public prove: boolean;
@ -3954,7 +3954,7 @@ export namespace tendermint {
/** Properties of a RequestEndBlock. */
interface IRequestEndBlock {
/** RequestEndBlock height */
height?: number | Long | null;
height?: Long | null;
}
/** Represents a RequestEndBlock. */
@ -3966,7 +3966,7 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IRequestEndBlock);
/** RequestEndBlock height. */
public height: number | Long;
public height: Long;
/**
* Creates a new RequestEndBlock instance using the specified properties.
@ -4318,10 +4318,10 @@ export namespace tendermint {
version?: string | null;
/** ResponseInfo appVersion */
appVersion?: number | Long | null;
appVersion?: Long | null;
/** ResponseInfo lastBlockHeight */
lastBlockHeight?: number | Long | null;
lastBlockHeight?: Long | null;
/** ResponseInfo lastBlockAppHash */
lastBlockAppHash?: Uint8Array | null;
@ -4342,10 +4342,10 @@ export namespace tendermint {
public version: string;
/** ResponseInfo appVersion. */
public appVersion: number | Long;
public appVersion: Long;
/** ResponseInfo lastBlockHeight. */
public lastBlockHeight: number | Long;
public lastBlockHeight: Long;
/** ResponseInfo lastBlockAppHash. */
public lastBlockAppHash: Uint8Array;
@ -4513,7 +4513,7 @@ export namespace tendermint {
info?: string | null;
/** ResponseQuery index */
index?: number | Long | null;
index?: Long | null;
/** ResponseQuery key */
key?: Uint8Array | null;
@ -4525,7 +4525,7 @@ export namespace tendermint {
proof?: tendermint.crypto.merkle.IProof | null;
/** ResponseQuery height */
height?: number | Long | null;
height?: Long | null;
/** ResponseQuery codespace */
codespace?: string | null;
@ -4549,7 +4549,7 @@ export namespace tendermint {
public info: string;
/** ResponseQuery index. */
public index: number | Long;
public index: Long;
/** ResponseQuery key. */
public key: Uint8Array;
@ -4561,7 +4561,7 @@ export namespace tendermint {
public proof?: tendermint.crypto.merkle.IProof | null;
/** ResponseQuery height. */
public height: number | Long;
public height: Long;
/** ResponseQuery codespace. */
public codespace: string;
@ -4663,10 +4663,10 @@ export namespace tendermint {
info?: string | null;
/** ResponseCheckTx gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** ResponseCheckTx gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
/** ResponseCheckTx events */
events?: tendermint.abci.types.IEvent[] | null;
@ -4696,10 +4696,10 @@ export namespace tendermint {
public info: string;
/** ResponseCheckTx gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** ResponseCheckTx gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/** ResponseCheckTx events. */
public events: tendermint.abci.types.IEvent[];
@ -4756,10 +4756,10 @@ export namespace tendermint {
info?: string | null;
/** ResponseDeliverTx gasWanted */
gasWanted?: number | Long | null;
gasWanted?: Long | null;
/** ResponseDeliverTx gasUsed */
gasUsed?: number | Long | null;
gasUsed?: Long | null;
/** ResponseDeliverTx events */
events?: tendermint.abci.types.IEvent[] | null;
@ -4789,10 +4789,10 @@ export namespace tendermint {
public info: string;
/** ResponseDeliverTx gasWanted. */
public gasWanted: number | Long;
public gasWanted: Long;
/** ResponseDeliverTx gasUsed. */
public gasUsed: number | Long;
public gasUsed: Long;
/** ResponseDeliverTx events. */
public events: tendermint.abci.types.IEvent[];
@ -5014,10 +5014,10 @@ export namespace tendermint {
/** Properties of a BlockParams. */
interface IBlockParams {
/** BlockParams maxBytes */
maxBytes?: number | Long | null;
maxBytes?: Long | null;
/** BlockParams maxGas */
maxGas?: number | Long | null;
maxGas?: Long | null;
}
/** Represents a BlockParams. */
@ -5029,10 +5029,10 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IBlockParams);
/** BlockParams maxBytes. */
public maxBytes: number | Long;
public maxBytes: Long;
/** BlockParams maxGas. */
public maxGas: number | Long;
public maxGas: Long;
/**
* Creates a new BlockParams instance using the specified properties.
@ -5065,7 +5065,7 @@ export namespace tendermint {
/** Properties of an EvidenceParams. */
interface IEvidenceParams {
/** EvidenceParams maxAgeNumBlocks */
maxAgeNumBlocks?: number | Long | null;
maxAgeNumBlocks?: Long | null;
/** EvidenceParams maxAgeDuration */
maxAgeDuration?: google.protobuf.IDuration | null;
@ -5080,7 +5080,7 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IEvidenceParams);
/** EvidenceParams maxAgeNumBlocks. */
public maxAgeNumBlocks: number | Long;
public maxAgeNumBlocks: Long;
/** EvidenceParams maxAgeDuration. */
public maxAgeDuration?: google.protobuf.IDuration | null;
@ -5285,7 +5285,7 @@ export namespace tendermint {
chainId?: string | null;
/** Header height */
height?: number | Long | null;
height?: Long | null;
/** Header time */
time?: google.protobuf.ITimestamp | null;
@ -5336,7 +5336,7 @@ export namespace tendermint {
public chainId: string;
/** Header height. */
public height: number | Long;
public height: Long;
/** Header time. */
public time?: google.protobuf.ITimestamp | null;
@ -5400,10 +5400,10 @@ export namespace tendermint {
/** Properties of a Version. */
interface IVersion {
/** Version Block */
Block?: number | Long | null;
Block?: Long | null;
/** Version App */
App?: number | Long | null;
App?: Long | null;
}
/** Represents a Version. */
@ -5415,10 +5415,10 @@ export namespace tendermint {
constructor(p?: tendermint.abci.types.IVersion);
/** Version Block. */
public Block: number | Long;
public Block: Long;
/** Version App. */
public App: number | Long;
public App: Long;
/**
* Creates a new Version instance using the specified properties.
@ -5555,7 +5555,7 @@ export namespace tendermint {
address?: Uint8Array | null;
/** Validator power */
power?: number | Long | null;
power?: Long | null;
}
/** Represents a Validator. */
@ -5570,7 +5570,7 @@ export namespace tendermint {
public address: Uint8Array;
/** Validator power. */
public power: number | Long;
public power: Long;
/**
* Creates a new Validator instance using the specified properties.
@ -5604,7 +5604,7 @@ export namespace tendermint {
pubKey?: tendermint.abci.types.IPubKey | null;
/** ValidatorUpdate power */
power?: number | Long | null;
power?: Long | null;
}
/** Represents a ValidatorUpdate. */
@ -5619,7 +5619,7 @@ export namespace tendermint {
public pubKey?: tendermint.abci.types.IPubKey | null;
/** ValidatorUpdate power. */
public power: number | Long;
public power: Long;
/**
* Creates a new ValidatorUpdate instance using the specified properties.
@ -5762,13 +5762,13 @@ export namespace tendermint {
validator?: tendermint.abci.types.IValidator | null;
/** Evidence height */
height?: number | Long | null;
height?: Long | null;
/** Evidence time */
time?: google.protobuf.ITimestamp | null;
/** Evidence totalVotingPower */
totalVotingPower?: number | Long | null;
totalVotingPower?: Long | null;
}
/** Represents an Evidence. */
@ -5786,13 +5786,13 @@ export namespace tendermint {
public validator?: tendermint.abci.types.IValidator | null;
/** Evidence height. */
public height: number | Long;
public height: Long;
/** Evidence time. */
public time?: google.protobuf.ITimestamp | null;
/** Evidence totalVotingPower. */
public totalVotingPower: number | Long;
public totalVotingPower: Long;
/**
* Creates a new Evidence instance using the specified properties.
@ -6313,7 +6313,7 @@ export namespace tendermint {
key?: Uint8Array | null;
/** KI64Pair value */
value?: number | Long | null;
value?: Long | null;
}
/** Represents a KI64Pair. */
@ -6328,7 +6328,7 @@ export namespace tendermint {
public key: Uint8Array;
/** KI64Pair value. */
public value: number | Long;
public value: Long;
/**
* Creates a new KI64Pair instance using the specified properties.
@ -6415,7 +6415,7 @@ export namespace google {
/** Properties of a Timestamp. */
interface ITimestamp {
/** Timestamp seconds */
seconds?: number | Long | null;
seconds?: Long | null;
/** Timestamp nanos */
nanos?: number | null;
@ -6430,7 +6430,7 @@ export namespace google {
constructor(p?: google.protobuf.ITimestamp);
/** Timestamp seconds. */
public seconds: number | Long;
public seconds: Long;
/** Timestamp nanos. */
public nanos: number;
@ -6464,7 +6464,7 @@ export namespace google {
/** Properties of a Duration. */
interface IDuration {
/** Duration seconds */
seconds?: number | Long | null;
seconds?: Long | null;
/** Duration nanos */
nanos?: number | null;
@ -6479,7 +6479,7 @@ export namespace google {
constructor(p?: google.protobuf.IDuration);
/** Duration seconds. */
public seconds: number | Long;
public seconds: Long;
/** Duration nanos. */
public nanos: number;

View File

@ -0,0 +1 @@
export * from "./generated/codecimpl";

View File

@ -0,0 +1,11 @@
import { cosmos } from "../codec";
import { QueryClient } from "./queryclient";
export interface AuthExtension {
readonly auth: {
readonly account: (address: string) => Promise<cosmos.auth.IBaseAccount | null>;
readonly unverified: {
readonly account: (address: string) => Promise<cosmos.auth.IBaseAccount | null>;
};
};
}
export declare function setupAuthExtension(base: QueryClient): AuthExtension;

View File

@ -0,0 +1,14 @@
import { cosmos } from "../codec";
import { QueryClient } from "./queryclient";
export interface BankExtension {
readonly bank: {
readonly balance: (address: string, denom: string) => Promise<cosmos.ICoin | null>;
readonly unverified: {
readonly balance: (address: string, denom: string) => Promise<cosmos.ICoin>;
readonly allBalances: (address: string) => Promise<cosmos.ICoin[]>;
readonly totalSupply: () => Promise<cosmos.ICoin[]>;
readonly supplyOf: (denom: string) => Promise<cosmos.ICoin>;
};
};
}
export declare function setupBankExtension(base: QueryClient): BankExtension;

View File

@ -0,0 +1,3 @@
export { QueryClient } from "./queryclient";
export { AuthExtension, setupAuthExtension } from "./auth";
export { BankExtension, setupBankExtension } from "./bank";

View File

@ -0,0 +1,109 @@
import { Client as TendermintClient } from "@cosmjs/tendermint-rpc";
declare type QueryExtensionSetup<P> = (base: QueryClient) => P;
export declare class QueryClient {
/** Constructs a QueryClient with 0 extensions */
static withExtensions(tmClient: TendermintClient): QueryClient;
/** Constructs a QueryClient with 1 extension */
static withExtensions<A extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
): QueryClient & A;
/** Constructs a QueryClient with 2 extensions */
static withExtensions<A extends object, B extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
): QueryClient & A & B;
/** Constructs a QueryClient with 3 extensions */
static withExtensions<A extends object, B extends object, C extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
): QueryClient & A & B & C;
/** Constructs a QueryClient with 4 extensions */
static withExtensions<A extends object, B extends object, C extends object, D extends object>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
): QueryClient & A & B & C & D;
/** Constructs a QueryClient with 5 extensions */
static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
): QueryClient & A & B & C & D & E;
/** Constructs a QueryClient with 6 extensions */
static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object,
F extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
setupExtensionF: QueryExtensionSetup<F>,
): QueryClient & A & B & C & D & E & F;
/** Constructs a QueryClient with 7 extensions */
static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object,
F extends object,
G extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
setupExtensionF: QueryExtensionSetup<F>,
setupExtensionG: QueryExtensionSetup<G>,
): QueryClient & A & B & C & D & E & F & G;
/** Constructs a QueryClient with 8 extensions */
static withExtensions<
A extends object,
B extends object,
C extends object,
D extends object,
E extends object,
F extends object,
G extends object,
H extends object
>(
tmClient: TendermintClient,
setupExtensionA: QueryExtensionSetup<A>,
setupExtensionB: QueryExtensionSetup<B>,
setupExtensionC: QueryExtensionSetup<C>,
setupExtensionD: QueryExtensionSetup<D>,
setupExtensionE: QueryExtensionSetup<E>,
setupExtensionF: QueryExtensionSetup<F>,
setupExtensionG: QueryExtensionSetup<G>,
setupExtensionH: QueryExtensionSetup<H>,
): QueryClient & A & B & C & D & E & F & G & H;
private readonly tmClient;
constructor(tmClient: TendermintClient);
queryVerified(store: string, key: Uint8Array): Promise<Uint8Array>;
queryUnverified(path: string, request: Uint8Array): Promise<Uint8Array>;
}
export {};

View File

@ -0,0 +1,11 @@
/**
* Takes a bech32 encoded address and returns the data part. The prefix is ignored and discarded.
* This is called AccAddress in Cosmos SDK, which is basically an alias for raw binary data.
* The result is typically 20 bytes long but not restricted to that.
*/
export declare function toAccAddress(address: string): Uint8Array;
/**
* Use this to convert a protobuf.js class to the interface (e.g. Coin to ICoin)
* in a ways that makes Jasmine's toEqual happy.
*/
export declare function toObject<I extends object>(thing: I): Omit<I, never>;

View File

@ -49,6 +49,7 @@ export interface PrivateStargateClient {
}
export declare class StargateClient {
private readonly tmClient;
private readonly queryClient;
private chainId;
static connect(endpoint: string): Promise<StargateClient>;
private constructor();
@ -68,7 +69,5 @@ export declare class StargateClient {
searchTx(query: SearchTxQuery, filter?: SearchTxFilter): Promise<readonly IndexedTx[]>;
disconnect(): void;
broadcastTx(tx: Uint8Array): Promise<BroadcastTxResponse>;
private queryVerified;
private queryUnverified;
private txsQuery;
}

View File

@ -39,7 +39,9 @@
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
},

View File

@ -39,7 +39,9 @@
"coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts && shx rm ./types/**/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"pack-web": "yarn build-or-skip && webpack --mode development --config webpack.web.config.js"
},

View File

@ -30,7 +30,9 @@
"lint-fix": "eslint --max-warnings 0 \"**/*.{js,ts}\" --fix",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && rm -rf ./types/testdata && shx rm -f ./types/*.spec.d.ts",
"format-types": "prettier --write --loglevel warn \"./types/**/*.d.ts\"",
"build": "shx rm -rf ./build && tsc && yarn move-types && yarn format-types",
"prebuild": "shx rm -rf ./build",
"build": "tsc",
"postbuild": "yarn move-types && yarn format-types",
"build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build",
"test-node": "node jasmine-testrunner.js",
"test": "yarn build-or-skip && yarn test-node",