Merge branch 'main' into nabla/improve-sign_dx

This commit is contained in:
Davide Segullo
2023-05-24 19:06:49 +02:00
committed by GitHub
173 changed files with 5863 additions and 2186 deletions
+3 -1
View File
@@ -28,7 +28,7 @@ workflows:
- build
matrix:
parameters:
simapp: ["simapp44", "simapp46"]
simapp: ["simapp44", "simapp46", "simapp47"]
- test-node:
requires:
- build
@@ -159,6 +159,7 @@ jobs:
command: |
[ "<< parameters.simapp >>" = "simapp44" ] && export SIMAPP44_ENABLED=1 SLOW_SIMAPP44_ENABLED=1
[ "<< parameters.simapp >>" = "simapp46" ] && export SIMAPP46_ENABLED=1 SLOW_SIMAPP46_ENABLED=1
[ "<< parameters.simapp >>" = "simapp47" ] && export SIMAPP47_ENABLED=1 SLOW_SIMAPP47_ENABLED=1
yarn test --stream
- run:
name: Run CLI selftest
@@ -178,6 +179,7 @@ jobs:
command: |
[ "<< parameters.simapp >>" = "simapp44" ] && export SIMAPP44_ENABLED=1 SLOW_SIMAPP44_ENABLED=1
[ "<< parameters.simapp >>" = "simapp46" ] && export SIMAPP46_ENABLED=1 SLOW_SIMAPP46_ENABLED=1
[ "<< parameters.simapp >>" = "simapp47" ] && export SIMAPP47_ENABLED=1 SLOW_SIMAPP47_ENABLED=1
./run_examples.sh
- run:
name: Stop chains
Generated
+482 -161
View File
File diff suppressed because it is too large Load Diff
+16 -13
View File
@@ -9,7 +9,8 @@ const SAFE_TIME = 456789e3;
const PortablePath = {
root: `/`,
dot: `.`
dot: `.`,
parent: `..`
};
const npath = Object.create(path);
const ppath = Object.create(path.posix);
@@ -1327,6 +1328,12 @@ class VirtualFS extends ProxiedFS {
}
}
const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10));
const HAS_CONSOLIDATED_HOOKS = major > 16 || major === 16 && minor >= 12;
const HAS_UNFLAGGED_JSON_MODULES = major > 17 || major === 17 && minor >= 5 || major === 16 && minor >= 15;
const HAS_JSON_IMPORT_ASSERTION_REQUIREMENT = major > 17 || major === 17 && minor >= 1 || major === 16 && minor > 14;
const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13;
const builtinModules = new Set(Module.builtinModules || Object.keys(process.binding(`natives`)));
const isBuiltinModule = (request) => request.startsWith(`node:`) || builtinModules.has(request);
function readPackageScope(checkPath) {
@@ -1354,11 +1361,6 @@ function readPackage(requestPath) {
return JSON.parse(fs.readFileSync(jsonPath, `utf8`));
}
const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10));
const HAS_CONSOLIDATED_HOOKS = major > 16 || major === 16 && minor >= 12;
const HAS_UNFLAGGED_JSON_MODULES = major > 17 || major === 17 && minor >= 5 || major === 16 && minor >= 15;
const HAS_JSON_IMPORT_ASSERTION_REQUIREMENT = major > 17 || major === 17 && minor >= 1 || major === 16 && minor > 14;
async function tryReadFile$1(path2) {
try {
return await fs.promises.readFile(path2, `utf8`);
@@ -1457,12 +1459,13 @@ async function load$1(urlString, context, nextLoad) {
throw err;
}
if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) {
const pathToSend = pathToFileURL(
npath.fromPortablePath(
VirtualFS.resolveVirtual(npath.toPortablePath(filePath))
)
).href;
process.send({
"watch:import": pathToFileURL(
npath.fromPortablePath(
VirtualFS.resolveVirtual(npath.toPortablePath(filePath))
)
).href
"watch:import": WATCH_MODE_MESSAGE_USES_ARRAYS ? [pathToSend] : pathToSend
});
}
return {
@@ -1943,7 +1946,7 @@ async function resolvePrivateRequest(specifier, issuer, context, nextResolve) {
conditions: new Set(context.conditions),
readFileSyncFn: tryReadFile
});
if (resolved instanceof URL) {
if (resolved instanceof URL$1) {
return { url: resolved.href, shortCircuit: true };
} else {
if (resolved.startsWith(`#`))
@@ -1974,7 +1977,7 @@ async function resolve$1(originalSpecifier, context, nextResolve) {
let allowLegacyResolve = false;
if (dependencyNameMatch) {
const [, dependencyName, subPath] = dependencyNameMatch;
if (subPath === ``) {
if (subPath === `` && dependencyName !== `pnpapi`) {
const resolved = pnpapi.resolveToUnqualified(`${dependencyName}/package.json`, issuer);
if (resolved) {
const content = await tryReadFile$1(resolved);
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-801
View File
File diff suppressed because one or more lines are too long
+873
View File
File diff suppressed because one or more lines are too long
+2
View File
@@ -109,6 +109,8 @@ const moduleWrapper = tsserver => {
str = `zip:${str}`;
} break;
}
} else {
str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`);
}
}
+2
View File
@@ -109,6 +109,8 @@ const moduleWrapper = tsserver => {
str = `zip:${str}`;
} break;
}
} else {
str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`);
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "typescript",
"version": "4.6.4-sdk",
"version": "4.9.5-sdk",
"main": "./lib/typescript.js",
"type": "commonjs"
}
+1 -1
View File
@@ -13,4 +13,4 @@ plugins:
pnpMode: loose
yarnPath: .yarn/releases/yarn-3.2.4.cjs
yarnPath: .yarn/releases/yarn-3.5.0.cjs
+34
View File
@@ -6,6 +6,40 @@ and this project adheres to
## [Unreleased]
### Added
- @cosmjs/cosmwasm-stargate: Add `SigningCosmWasmClient.instantiate2` ([#1407]).
- @cosmjs/stargate: `IndexedTx` and `DeliverTxResponse` now have a
`msgResponses` field ([#1305]).
[#1305]: https://github.com/cosmos/cosmjs/issues/1305
[#1407]: https://github.com/cosmos/cosmjs/pull/1407
### Changed
- all: upgrade cosmjs-types to 0.8.0 to include Cosmos SDK 0.46/0.47 and IBC v7
types.
- @cosmjs/cosmwasm-stargate: Implement auto-detection for Tendermint 0.34/37
([#1411]).
- @cosmjs/cosmwasm-stargate: Remove structured `searchTx` queries. Only raw
query strings and key/value pairs are now supported. ([#1411])
- @cosmjs/cosmwasm-stargate: Let `searchTx` return non-readonly array. The
caller owns this array and can mutate it as they want. ([#1411])
- @cosmjs/cosmwasm-stargate: In `UploadResult` (result from
`SigningCosmWasmClient.upload`), rename `originalChecksum` to `checksum` and
remove `compressedChecksum` ([#1409]).
- @cosmjs/stargate: Implement auto-detection for Tendermint 0.34/37 ([#1411]).
- @cosmjs/stargate: Remove structured `searchTx` queries. Only raw query strings
and key/value pairs are now supported. ([#1411])
- @cosmjs/stargate: Let `searchTx` return non-readonly array. The caller owns
this array and can mutate it as they want. ([#1411])
- @cosmjs/stargate: Remove `QueryClient.queryUnverified` and
`QueryClient.queryVerified`. Please use `QueryClient.queryAbci` and
`QueryClient.queryStoreVerified` instead.
[#1409]: https://github.com/cosmos/cosmjs/issues/1409
[#1411]: https://github.com/cosmos/cosmjs/pull/1411
## [0.30.1] - 2023-03-22
### Fixed
+1
View File
@@ -116,6 +116,7 @@ order to avoid conflicts. Here is an overview of the ports used:
| 9090 | simapp gRPC | Manual Stargate debugging |
| 11134 | Standalone Tendermint 0.34 RPC | @cosmjs/tendermint-rpc tests |
| 11135 | Standalone Tendermint 0.35 RPC | @cosmjs/tendermint-rpc tests |
| 11137 | Standalone Tendermint 0.37 RPC | @cosmjs/tendermint-rpc tests |
| 26658 | simapp Tendermint RPC | Stargate client tests |
| 26659 | wasmd Tendermint RPC | @cosmjs/cosmwasm-stargate tests |
| 26660 | simapp slow Tendermint RPC | Stargate client tests |
+2 -2
View File
@@ -48,7 +48,7 @@
"@cosmjs/stargate": "workspace:^",
"eslint": "^7.5",
"prettier": "^2.8.1",
"typescript": "~4.6"
"typescript": "~4.9"
},
"packageManager": "yarn@3.2.4"
"packageManager": "yarn@3.5.0"
}
+2 -2
View File
@@ -74,8 +74,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+1 -1
View File
@@ -29,7 +29,7 @@ const msg: MsgDelegateEncodeObject = {
delegatorAddress: signerAddress,
// To get the proper validator address, start the demo chain (./scripts/simapp44/start.sh), then run:
// curl http://localhost:1318/staking/validators | jq '.result[0].operator_address'
validatorAddress: "cosmosvaloper1urk9gy7cfws0ak9x5nu7lx4un9n6gqkrp230jk",
validatorAddress: "cosmosvaloper12nt2hqjps8r065wc02qks88tvqzdeua06e982h",
amount: coin(300000, "ustake"),
},
};
+3 -3
View File
@@ -54,11 +54,11 @@
"axios": "^0.21.2",
"babylon": "^6.18.0",
"chalk": "^4",
"cosmjs-types": "^0.7.1",
"cosmjs-types": "^0.8.0",
"diff": "^4",
"recast": "^0.20",
"ts-node": "^8",
"typescript": "~4.6",
"typescript": "~4.9",
"yargs": "^15.3.1"
},
"devDependencies": {
@@ -67,7 +67,7 @@
"@types/diff": "^4",
"@types/eslint-plugin-prettier": "^3",
"@types/jasmine": "^4",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@types/yargs": "^15.0.4",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
+4 -4
View File
@@ -46,7 +46,7 @@
"@cosmjs/stargate": "workspace:^",
"@cosmjs/tendermint-rpc": "workspace:^",
"@cosmjs/utils": "workspace:^",
"cosmjs-types": "^0.7.1",
"cosmjs-types": "^0.8.0",
"long": "^4.0.0",
"pako": "^2.0.2"
},
@@ -58,7 +58,7 @@
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/long": "^4.0.1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@types/pako": "^1.0.1",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
@@ -84,8 +84,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
@@ -196,12 +196,12 @@ describe("CosmWasmClient.getTx and .searchTx", () => {
});
});
describe("with SearchByHeightQuery", () => {
describe("searchTx", () => {
it("can search successful tx by height", async () => {
pendingWithoutWasmd();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await CosmWasmClient.connect(wasmd.endpoint);
const result = await client.searchTx({ height: sendSuccessful.height });
const result = await client.searchTx(`tx.height=${sendSuccessful.height}`);
expect(result.length).toBeGreaterThanOrEqual(1);
expect(result).toContain(
jasmine.objectContaining({
@@ -218,7 +218,7 @@ describe("CosmWasmClient.getTx and .searchTx", () => {
pendingWithoutWasmd();
assert(sendUnsuccessful, "value must be set in beforeAll()");
const client = await CosmWasmClient.connect(wasmd.endpoint);
const result = await client.searchTx({ height: sendUnsuccessful.height });
const result = await client.searchTx(`tx.height=${sendUnsuccessful.height}`);
expect(result.length).toBeGreaterThanOrEqual(1);
expect(result).toContain(
jasmine.objectContaining({
@@ -230,14 +230,13 @@ describe("CosmWasmClient.getTx and .searchTx", () => {
}),
);
});
});
describe("with SearchBySentFromOrToQuery", () => {
it("can search by sender", async () => {
pendingWithoutWasmd();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await CosmWasmClient.connect(wasmd.endpoint);
const results = await client.searchTx({ sentFromOrTo: sendSuccessful.sender });
const query = `message.action = '/cosmos.bank.v1beta1.MsgSend' AND message.sender = '${sendSuccessful.sender}'`;
const results = await client.searchTx(query);
expect(results.length).toBeGreaterThanOrEqual(1);
// Check basic structure of all results
@@ -266,7 +265,7 @@ describe("CosmWasmClient.getTx and .searchTx", () => {
pendingWithoutWasmd();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await CosmWasmClient.connect(wasmd.endpoint);
const results = await client.searchTx({ sentFromOrTo: sendSuccessful.recipient });
const results = await client.searchTx(`transfer.recipient='${sendSuccessful.recipient}'`);
expect(results.length).toBeGreaterThanOrEqual(1);
// Check basic structure of all results
@@ -290,69 +289,11 @@ describe("CosmWasmClient.getTx and .searchTx", () => {
);
});
it("can search by recipient and filter by minHeight", async () => {
pendingWithoutWasmd();
assert(sendSuccessful);
const client = await CosmWasmClient.connect(wasmd.endpoint);
const query = { sentFromOrTo: sendSuccessful.recipient };
{
const result = await client.searchTx(query, { minHeight: 0 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { minHeight: sendSuccessful.height - 1 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { minHeight: sendSuccessful.height });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { minHeight: sendSuccessful.height + 1 });
expect(result.length).toEqual(0);
}
});
it("can search by recipient and filter by maxHeight", async () => {
pendingWithoutWasmd();
assert(sendSuccessful);
const client = await CosmWasmClient.connect(wasmd.endpoint);
const query = { sentFromOrTo: sendSuccessful.recipient };
{
const result = await client.searchTx(query, { maxHeight: 9999999999999 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { maxHeight: sendSuccessful.height + 1 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { maxHeight: sendSuccessful.height });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { maxHeight: sendSuccessful.height - 1 });
expect(result.length).toEqual(0);
}
});
});
describe("with SearchByTagsQuery", () => {
it("can search by transfer.recipient", async () => {
it("works with tags", async () => {
pendingWithoutWasmd();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await CosmWasmClient.connect(wasmd.endpoint);
const results = await client.searchTx({
tags: [{ key: "transfer.recipient", value: sendSuccessful.recipient }],
});
const results = await client.searchTx([{ key: "transfer.recipient", value: sendSuccessful.recipient }]);
expect(results.length).toBeGreaterThanOrEqual(1);
// Check basic structure of all results
@@ -12,11 +12,7 @@ import {
DeliverTxResponse,
fromTendermintEvent,
IndexedTx,
isSearchByHeightQuery,
isSearchBySentFromOrToQuery,
isSearchByTagsQuery,
QueryClient,
SearchTxFilter,
SearchTxQuery,
SequenceResponse,
setupAuthExtension,
@@ -28,10 +24,12 @@ import {
import {
HttpEndpoint,
Tendermint34Client,
Tendermint37Client,
TendermintClient,
toRfc3339WithNanoseconds,
} from "@cosmjs/tendermint-rpc";
import { assert, sleep } from "@cosmjs/utils";
import { TxMsgData } from "cosmjs-types/cosmos/base/abci/v1beta1/abci";
import {
CodeInfoResponse,
QueryCodesResponse,
@@ -99,11 +97,22 @@ export class CosmWasmClient {
/**
* Creates an instance by connecting to the given Tendermint RPC endpoint.
*
* For now this uses the Tendermint 0.34 client. If you need Tendermint 0.37
* support, see `create`.
* This uses auto-detection to decide between a Tendermint 0.37 and 0.34 client.
* To set the Tendermint client explicitly, use `create`.
*/
public static async connect(endpoint: string | HttpEndpoint): Promise<CosmWasmClient> {
const tmClient = await Tendermint34Client.connect(endpoint);
// Tendermint/CometBFT 0.34/0.37 auto-detection. Starting with 0.37 we seem to get reliable versions again 🎉
// Using 0.34 as the fallback.
let tmClient: TendermintClient;
const tm37Client = await Tendermint37Client.connect(endpoint);
const version = (await tm37Client.status()).nodeInfo.version;
if (version.startsWith("0.37.")) {
tmClient = tm37Client;
} else {
tm37Client.disconnect();
tmClient = await Tendermint34Client.connect(endpoint);
}
return CosmWasmClient.create(tmClient);
}
@@ -221,42 +230,16 @@ export class CosmWasmClient {
return results[0] ?? null;
}
public async searchTx(query: SearchTxQuery, filter: SearchTxFilter = {}): Promise<readonly IndexedTx[]> {
const minHeight = filter.minHeight || 0;
const maxHeight = filter.maxHeight || Number.MAX_SAFE_INTEGER;
if (maxHeight < minHeight) return []; // optional optimization
function withFilters(originalQuery: string): string {
return `${originalQuery} AND tx.height>=${minHeight} AND tx.height<=${maxHeight}`;
}
let txs: readonly IndexedTx[];
if (isSearchByHeightQuery(query)) {
txs =
query.height >= minHeight && query.height <= maxHeight
? await this.txsQuery(`tx.height=${query.height}`)
: [];
} else if (isSearchBySentFromOrToQuery(query)) {
const sentQuery = withFilters(`message.module='bank' AND transfer.sender='${query.sentFromOrTo}'`);
const receivedQuery = withFilters(
`message.module='bank' AND transfer.recipient='${query.sentFromOrTo}'`,
);
const [sent, received] = await Promise.all(
[sentQuery, receivedQuery].map((rawQuery) => this.txsQuery(rawQuery)),
);
const sentHashes = sent.map((t) => t.hash);
txs = [...sent, ...received.filter((t) => !sentHashes.includes(t.hash))];
} else if (isSearchByTagsQuery(query)) {
const rawQuery = withFilters(query.tags.map((t) => `${t.key}='${t.value}'`).join(" AND "));
txs = await this.txsQuery(rawQuery);
public async searchTx(query: SearchTxQuery): Promise<IndexedTx[]> {
let rawQuery: string;
if (typeof query === "string") {
rawQuery = query;
} else if (Array.isArray(query)) {
rawQuery = query.map((t) => `${t.key}='${t.value}'`).join(" AND ");
} else {
throw new Error("Unknown query type");
throw new Error("Got unsupported query type. See CosmJS 0.31 CHANGELOG for API breaking changes here.");
}
const filtered = txs.filter((tx) => tx.height >= minHeight && tx.height <= maxHeight);
return filtered;
return this.txsQuery(rawQuery);
}
public disconnect(): void {
@@ -305,6 +288,7 @@ export class CosmWasmClient {
rawLog: result.rawLog,
transactionHash: txId,
events: result.events,
msgResponses: result.msgResponses,
gasUsed: result.gasUsed,
gasWanted: result.gasWanted,
}
@@ -497,9 +481,10 @@ export class CosmWasmClient {
}
}
private async txsQuery(query: string): Promise<readonly IndexedTx[]> {
private async txsQuery(query: string): Promise<IndexedTx[]> {
const results = await this.forceGetTmClient().txSearchAll({ query: query });
return results.txs.map((tx) => {
return results.txs.map((tx): IndexedTx => {
const txMsgData = TxMsgData.decode(tx.result.data ?? new Uint8Array());
return {
height: tx.height,
txIndex: tx.index,
@@ -508,6 +493,7 @@ export class CosmWasmClient {
events: tx.result.events.map(fromTendermintEvent),
rawLog: tx.result.log || "",
tx: tx.tx,
msgResponses: txMsgData.msgResponses,
gasUsed: tx.result.gasUsed,
gasWanted: tx.result.gasWanted,
};
+2
View File
@@ -5,6 +5,7 @@ export {
createWasmAminoConverters,
isMsgClearAdminEncodeObject,
isMsgExecuteEncodeObject,
isMsgInstantiateContract2EncodeObject,
isMsgInstantiateContractEncodeObject,
isMsgMigrateEncodeObject,
isMsgStoreCodeEncodeObject,
@@ -12,6 +13,7 @@ export {
JsonObject,
MsgClearAdminEncodeObject,
MsgExecuteContractEncodeObject,
MsgInstantiateContract2EncodeObject,
MsgInstantiateContractEncodeObject,
MsgMigrateContractEncodeObject,
MsgStoreCodeEncodeObject,
@@ -65,5 +65,8 @@ export function instantiate2Address(
salt: Uint8Array,
prefix: string,
): string {
return _instantiate2AddressIntermediate(checksum, creator, salt, null, prefix).address;
// Non-empty msg values are discouraged.
// See https://medium.com/cosmwasm/dev-note-3-limitations-of-instantiate2-and-how-to-deal-with-them-a3f946874230.
const msg = null;
return _instantiate2AddressIntermediate(checksum, creator, salt, msg, prefix).address;
}
@@ -10,12 +10,14 @@ export {
export {
isMsgClearAdminEncodeObject,
isMsgExecuteEncodeObject,
isMsgInstantiateContract2EncodeObject,
isMsgInstantiateContractEncodeObject,
isMsgMigrateEncodeObject,
isMsgStoreCodeEncodeObject,
isMsgUpdateAdminEncodeObject,
MsgClearAdminEncodeObject,
MsgExecuteContractEncodeObject,
MsgInstantiateContract2EncodeObject,
MsgInstantiateContractEncodeObject,
MsgMigrateContractEncodeObject,
MsgStoreCodeEncodeObject,
@@ -3,6 +3,7 @@ import {
MsgClearAdmin,
MsgExecuteContract,
MsgInstantiateContract,
MsgInstantiateContract2,
MsgMigrateContract,
MsgStoreCode,
MsgUpdateAdmin,
@@ -14,6 +15,7 @@ export const wasmTypes: ReadonlyArray<[string, GeneratedType]> = [
["/cosmwasm.wasm.v1.MsgMigrateContract", MsgMigrateContract],
["/cosmwasm.wasm.v1.MsgStoreCode", MsgStoreCode],
["/cosmwasm.wasm.v1.MsgInstantiateContract", MsgInstantiateContract],
["/cosmwasm.wasm.v1.MsgInstantiateContract2", MsgInstantiateContract2],
["/cosmwasm.wasm.v1.MsgUpdateAdmin", MsgUpdateAdmin],
];
@@ -39,6 +41,19 @@ export function isMsgInstantiateContractEncodeObject(
);
}
export interface MsgInstantiateContract2EncodeObject extends EncodeObject {
readonly typeUrl: "/cosmwasm.wasm.v1.MsgInstantiateContract2";
readonly value: Partial<MsgInstantiateContract2>;
}
export function isMsgInstantiateContract2EncodeObject(
object: EncodeObject,
): object is MsgInstantiateContract2EncodeObject {
return (
(object as MsgInstantiateContract2EncodeObject).typeUrl === "/cosmwasm.wasm.v1.MsgInstantiateContract2"
);
}
export interface MsgUpdateAdminEncodeObject extends EncodeObject {
readonly typeUrl: "/cosmwasm.wasm.v1.MsgUpdateAdmin";
readonly value: Partial<MsgUpdateAdmin>;
@@ -24,8 +24,9 @@ import Long from "long";
import pako from "pako";
import protobuf from "protobufjs/minimal";
import { instantiate2Address } from "./instantiate2";
import { MsgExecuteContractEncodeObject, MsgStoreCodeEncodeObject } from "./modules";
import { SigningCosmWasmClient } from "./signingcosmwasmclient";
import { SigningCosmWasmClient, SigningCosmWasmClientOptions } from "./signingcosmwasmclient";
import {
alice,
defaultClearAdminFee,
@@ -66,7 +67,10 @@ describe("SigningCosmWasmClient", () => {
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic);
const registry = new Registry();
registry.register("/custom.MsgCustom", MsgSend);
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix, registry: registry };
const options: SigningCosmWasmClientOptions = {
...defaultSigningClientOptions,
registry: registry,
};
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
expect(client.registry.lookupType("/custom.MsgCustom")).toEqual(MsgSend);
client.disconnect();
@@ -77,8 +81,11 @@ describe("SigningCosmWasmClient", () => {
it("works", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const executeContractMsg: MsgExecuteContractEncodeObject = {
typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract",
@@ -101,14 +108,19 @@ describe("SigningCosmWasmClient", () => {
it("works", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const wasm = getHackatom().data;
const { codeId, originalChecksum, originalSize, compressedChecksum, compressedSize } =
await client.upload(alice.address0, wasm, defaultUploadFee);
expect(originalChecksum).toEqual(toHex(sha256(wasm)));
const { codeId, checksum, originalSize, compressedSize } = await client.upload(
alice.address0,
wasm,
defaultUploadFee,
);
expect(checksum).toEqual(toHex(sha256(wasm)));
expect(originalSize).toEqual(wasm.length);
expect(compressedChecksum).toMatch(/^[0-9a-f]{64}$/);
expect(compressedSize).toBeLessThan(wasm.length * 0.5);
expect(codeId).toBeGreaterThanOrEqual(1);
client.disconnect();
@@ -119,8 +131,11 @@ describe("SigningCosmWasmClient", () => {
it("works with transfer amount", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const funds = [coin(1234, "ucosm"), coin(321, "ustake")];
const beneficiaryAddress = makeRandomAddress();
@@ -152,8 +167,11 @@ describe("SigningCosmWasmClient", () => {
it("works with admin", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const beneficiaryAddress = makeRandomAddress();
const { contractAddress, height, gasWanted, gasUsed } = await client.instantiate(
@@ -180,8 +198,11 @@ describe("SigningCosmWasmClient", () => {
it("can instantiate one code multiple times", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const {
contractAddress: address1,
@@ -218,8 +239,11 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer", async () => {
pendingWithoutWasmd();
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
// With admin
await client.instantiate(
@@ -250,12 +274,61 @@ describe("SigningCosmWasmClient", () => {
});
});
describe("instantiate2", () => {
it("can instantiate with predictable address", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, {
prefix: wasmd.prefix,
});
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const funds = [coin(1234, "ucosm"), coin(321, "ustake")];
const beneficiaryAddress = makeRandomAddress();
const salt = Uint8Array.from([0x01]);
const wasm = getHackatom().data;
const msg = {
verifier: alice.address0,
beneficiary: beneficiaryAddress,
};
const expectedAddress = instantiate2Address(sha256(wasm), alice.address0, salt, wasmd.prefix);
const { contractAddress } = await client.instantiate2(
alice.address0,
codeId,
salt,
msg,
"My cool label--",
defaultInstantiateFee,
{
memo: "Let's see if the memo is used",
funds: funds,
},
);
const wasmClient = await makeWasmClient(wasmd.endpoint);
const ucosmBalance = await wasmClient.bank.balance(contractAddress, "ucosm");
const ustakeBalance = await wasmClient.bank.balance(contractAddress, "ustake");
expect(ucosmBalance).toEqual(funds[0]);
expect(ustakeBalance).toEqual(funds[1]);
expect(contractAddress).toEqual(expectedAddress);
client.disconnect();
});
});
describe("updateAdmin", () => {
it("can update an admin", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const beneficiaryAddress = makeRandomAddress();
const { contractAddress } = await client.instantiate(
@@ -297,8 +370,11 @@ describe("SigningCosmWasmClient", () => {
it("can clear an admin", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const beneficiaryAddress = makeRandomAddress();
const { contractAddress } = await client.instantiate(
@@ -338,8 +414,11 @@ describe("SigningCosmWasmClient", () => {
it("works", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId: codeId1 } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const { codeId: codeId2 } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const beneficiaryAddress = makeRandomAddress();
@@ -385,8 +464,11 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer", async () => {
pendingWithoutWasmd();
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId: codeId1 } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const { codeId: codeId2 } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
const beneficiaryAddress = makeRandomAddress();
@@ -429,8 +511,11 @@ describe("SigningCosmWasmClient", () => {
it("works", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
// instantiate
const funds = [coin(233444, "ucosm"), coin(5454, "ustake")];
@@ -482,8 +567,11 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer", async () => {
pendingWithoutWasmd();
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
// instantiate
const funds = [coin(233444, "ucosm"), coin(5454, "ustake")];
@@ -534,8 +622,11 @@ describe("SigningCosmWasmClient", () => {
it("works", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
// instantiate
const funds = [coin(233444, "ucosm"), coin(5454, "ustake")];
@@ -596,8 +687,11 @@ describe("SigningCosmWasmClient", () => {
it("works with direct signer", async () => {
pendingWithoutWasmd();
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const amount = coins(7890, "ucosm");
const beneficiaryAddress = makeRandomAddress();
@@ -632,8 +726,11 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer", async () => {
pendingWithoutWasmd();
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
wallet,
defaultSigningClientOptions,
);
const amount = coins(7890, "ucosm");
const beneficiaryAddress = makeRandomAddress();
@@ -933,9 +1030,8 @@ describe("SigningCosmWasmClient", () => {
}),
},
});
const options = {
const options: SigningCosmWasmClientOptions = {
...defaultSigningClientOptions,
prefix: wasmd.prefix,
registry: customRegistry,
aminoTypes: customAminoTypes,
};
@@ -1222,7 +1318,7 @@ describe("SigningCosmWasmClient", () => {
}),
},
});
const options = {
const options: SigningCosmWasmClientOptions = {
...defaultSigningClientOptions,
registry: customRegistry,
aminoTypes: customAminoTypes,
@@ -31,7 +31,12 @@ import {
SignerData,
StdFee,
} from "@cosmjs/stargate";
import { HttpEndpoint, Tendermint34Client, TendermintClient } from "@cosmjs/tendermint-rpc";
import {
HttpEndpoint,
Tendermint34Client,
Tendermint37Client,
TendermintClient,
} from "@cosmjs/tendermint-rpc";
import { assert, assertDefined } from "@cosmjs/utils";
import { MsgWithdrawDelegatorReward } from "cosmjs-types/cosmos/distribution/v1beta1/tx";
import { MsgDelegate, MsgUndelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx";
@@ -41,6 +46,7 @@ import {
MsgClearAdmin,
MsgExecuteContract,
MsgInstantiateContract,
MsgInstantiateContract2,
MsgMigrateContract,
MsgStoreCode,
MsgUpdateAdmin,
@@ -54,6 +60,7 @@ import {
JsonObject,
MsgClearAdminEncodeObject,
MsgExecuteContractEncodeObject,
MsgInstantiateContract2EncodeObject,
MsgInstantiateContractEncodeObject,
MsgMigrateContractEncodeObject,
MsgStoreCodeEncodeObject,
@@ -62,14 +69,12 @@ import {
} from "./modules";
export interface UploadResult {
/** A hex encoded sha256 checksum of the original Wasm code (that is stored on chain) */
readonly checksum: string;
/** Size of the original wasm code in bytes */
readonly originalSize: number;
/** A hex encoded sha256 checksum of the original wasm code (that is stored on chain) */
readonly originalChecksum: string;
/** Size of the compressed wasm code in bytes */
readonly compressedSize: number;
/** A hex encoded sha256 checksum of the compressed wasm code (that stored in the transaction) */
readonly compressedChecksum: string;
/** The ID of the code asigned by the chain */
readonly codeId: number;
readonly logs: readonly logs.Log[];
@@ -83,7 +88,7 @@ export interface UploadResult {
}
/**
* The options of an .instantiate() call.
* The options of .instantiate() and .instantiate2() call.
* All properties are optional.
*/
export interface InstantiateOptions {
@@ -182,15 +187,26 @@ export class SigningCosmWasmClient extends CosmWasmClient {
/**
* Creates an instance by connecting to the given Tendermint RPC endpoint.
*
* For now this uses the Tendermint 0.34 client. If you need Tendermint 0.37
* support, see `createWithSigner`.
* This uses auto-detection to decide between a Tendermint 0.37 and 0.34 client.
* To set the Tendermint client explicitly, use `createWithSigner`.
*/
public static async connectWithSigner(
endpoint: string | HttpEndpoint,
signer: OfflineSigner,
options: SigningCosmWasmClientOptions = {},
): Promise<SigningCosmWasmClient> {
const tmClient = await Tendermint34Client.connect(endpoint);
// Tendermint/CometBFT 0.34/0.37 auto-detection. Starting with 0.37 we seem to get reliable versions again 🎉
// Using 0.34 as the fallback.
let tmClient: TendermintClient;
const tm37Client = await Tendermint37Client.connect(endpoint);
const version = (await tm37Client.status()).nodeInfo.version;
if (version.startsWith("0.37.")) {
tmClient = tm37Client;
} else {
tm37Client.disconnect();
tmClient = await Tendermint34Client.connect(endpoint);
}
return SigningCosmWasmClient.createWithSigner(tmClient, signer, options);
}
@@ -285,10 +301,9 @@ export class SigningCosmWasmClient extends CosmWasmClient {
const parsedLogs = logs.parseRawLog(result.rawLog);
const codeIdAttr = logs.findAttribute(parsedLogs, "store_code", "code_id");
return {
checksum: toHex(sha256(wasmCode)),
originalSize: wasmCode.length,
originalChecksum: toHex(sha256(wasmCode)),
compressedSize: compressed.length,
compressedChecksum: toHex(sha256(compressed)),
codeId: Number.parseInt(codeIdAttr.value, 10),
logs: parsedLogs,
height: result.height,
@@ -335,6 +350,45 @@ export class SigningCosmWasmClient extends CosmWasmClient {
};
}
public async instantiate2(
senderAddress: string,
codeId: number,
salt: Uint8Array,
msg: JsonObject,
label: string,
fee: StdFee | "auto" | number,
options: InstantiateOptions = {},
): Promise<InstantiateResult> {
const instantiateContract2Msg: MsgInstantiateContract2EncodeObject = {
typeUrl: "/cosmwasm.wasm.v1.MsgInstantiateContract2",
value: MsgInstantiateContract2.fromPartial({
sender: senderAddress,
codeId: Long.fromString(new Uint53(codeId).toString()),
label: label,
msg: toUtf8(JSON.stringify(msg)),
funds: [...(options.funds || [])],
admin: options.admin,
salt: salt,
fixMsg: false,
}),
};
const result = await this.signAndBroadcast(senderAddress, [instantiateContract2Msg], fee, options.memo);
if (isDeliverTxFailure(result)) {
throw new Error(createDeliverTxResponseErrorMessage(result));
}
const parsedLogs = logs.parseRawLog(result.rawLog);
const contractAddressAttr = logs.findAttribute(parsedLogs, "instantiate", "_contract_address");
return {
contractAddress: contractAddressAttr.value,
logs: parsedLogs,
height: result.height,
transactionHash: result.transactionHash,
events: result.events,
gasWanted: result.gasWanted,
gasUsed: result.gasUsed,
};
}
public async updateAdmin(
senderAddress: string,
contractAddress: string,
+3 -3
View File
@@ -59,7 +59,7 @@
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/libsodium-wrappers": "^0.7.7",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"buffer": "^6.0.3",
@@ -83,8 +83,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+3 -3
View File
@@ -52,7 +52,7 @@
"@types/karma-firefox-launcher": "^2",
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"eslint": "^7.5",
@@ -75,8 +75,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+3 -3
View File
@@ -49,7 +49,7 @@
"@types/karma-firefox-launcher": "^2",
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"eslint": "^7.5",
@@ -72,8 +72,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+1 -1
View File
@@ -74,7 +74,7 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typescript": "~4.6",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+2 -2
View File
@@ -7,8 +7,8 @@ import { Faucet } from "./faucet";
import { TokenConfiguration } from "./tokenmanager";
function pendingWithoutSimapp(): void {
if (!process.env.SIMAPP44_ENABLED && !process.env.SIMAPP46_ENABLED) {
return pending("Set SIMAPP{44,46}_ENABLED to enabled Stargate node-based tests");
if (!process.env.SIMAPP44_ENABLED && !process.env.SIMAPP46_ENABLED && !process.env.SIMAPP47_ENABLED) {
return pending("Set SIMAPP{44,46,47}_ENABLED to enabled Stargate node-based tests");
}
}
+2 -2
View File
@@ -74,8 +74,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+2 -2
View File
@@ -74,8 +74,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+2 -2
View File
@@ -19,12 +19,12 @@ export function pendingWithoutLedger(): void {
}
export function simappEnabled(): boolean {
return !!process.env.SIMAPP44_ENABLED || !!process.env.SIMAPP46_ENABLED;
return !!process.env.SIMAPP44_ENABLED || !!process.env.SIMAPP46_ENABLED || !!process.env.SIMAPP47_ENABLED;
}
export function pendingWithoutSimapp(): void {
if (!simappEnabled()) {
return pending("Set SIMAPP{44,46}_ENABLED to enable Simapp-based tests");
return pending("Set SIMAPP{44,46,47}_ENABLED to enable Simapp-based tests");
}
}
+2 -2
View File
@@ -73,8 +73,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+4 -4
View File
@@ -44,7 +44,7 @@
"@cosmjs/encoding": "workspace:^",
"@cosmjs/math": "workspace:^",
"@cosmjs/utils": "workspace:^",
"cosmjs-types": "^0.7.1",
"cosmjs-types": "^0.8.0",
"long": "^4.0.0"
},
"devDependencies": {
@@ -55,7 +55,7 @@
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/long": "^4.0.1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"eslint": "^7.5",
@@ -79,8 +79,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+2 -2
View File
@@ -33,7 +33,7 @@ describe("decode", () => {
const decoded = decodeTxRaw(fromHex(testVector.outputs.signedTxBytes));
expect(decoded).toEqual({
authInfo: {
authInfo: jasmine.objectContaining({
signerInfos: [
{
publicKey: {
@@ -55,7 +55,7 @@ describe("decode", () => {
granter: "",
amount: [{ amount: "2000", denom: "ucosm" }],
},
},
}),
body: {
memo: "",
timeoutHeight: Long.UZERO,
+2 -2
View File
@@ -77,8 +77,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+4 -4
View File
@@ -46,7 +46,7 @@
"@cosmjs/stream": "workspace:^",
"@cosmjs/tendermint-rpc": "workspace:^",
"@cosmjs/utils": "workspace:^",
"cosmjs-types": "^0.7.1",
"cosmjs-types": "^0.8.0",
"long": "^4.0.0",
"protobufjs": "~6.11.3",
"xstream": "^11.14.0"
@@ -60,7 +60,7 @@
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/long": "^4.0.1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"eslint": "^7.5",
@@ -84,8 +84,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+1 -10
View File
@@ -112,16 +112,7 @@ export {
QueryClient,
QueryStoreResponse,
} from "./queryclient";
export {
isSearchByHeightQuery,
isSearchBySentFromOrToQuery,
isSearchByTagsQuery,
SearchByHeightQuery,
SearchBySentFromOrToQuery,
SearchByTagsQuery,
SearchTxFilter,
SearchTxQuery,
} from "./search";
export { SearchByHeightQuery, SearchBySentFromOrToQuery, SearchTxQuery } from "./search";
export {
createDefaultAminoConverters,
defaultRegistryTypes,
@@ -11,11 +11,10 @@ import {
defaultSigningClientOptions,
faucet,
makeRandomAddress,
pendingWithoutSimapp44Or46,
pendingWithoutSimapp46,
pendingWithoutSimapp,
pendingWithoutSimapp46OrHigher,
simapp,
simapp44Enabled,
simapp46Enabled,
simappEnabled,
} from "../../testutils.spec";
import { AuthzExtension, setupAuthzExtension } from "./queries";
@@ -37,7 +36,7 @@ describe("AuthzExtension", () => {
const grantedMsg = "/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward";
beforeAll(async () => {
if (simapp44Enabled() || simapp46Enabled()) {
if (simappEnabled()) {
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic, {
// Use address 1 and 2 instead of 0 to avoid conflicts with other delegation tests
// This must match `voterAddress` above.
@@ -81,7 +80,7 @@ describe("AuthzExtension", () => {
describe("grants", () => {
it("works", async () => {
pendingWithoutSimapp44Or46();
pendingWithoutSimapp();
const [client, tmClient] = await makeClientWithAuthz(simapp.tendermintUrl);
const response = await client.authz.grants(granter1Address, grantee1Address, "");
expect(response.grants.length).toEqual(1);
@@ -105,11 +104,14 @@ describe("AuthzExtension", () => {
describe("granter grants", () => {
it("works", async () => {
pendingWithoutSimapp46();
pendingWithoutSimapp46OrHigher();
const [client, tmClient] = await makeClientWithAuthz(simapp.tendermintUrl);
const response = await client.authz.granterGrants(granter1Address);
expect(response.grants.length).toEqual(1);
const grant = response.grants[0];
expect(response.grants.length).toBeGreaterThanOrEqual(1);
const grant = response.grants.find(
(g) => g.granter == granter1Address && g.grantee === grantee1Address,
);
assertDefined(grant, "Grant not found");
// Needs to respond with a grant
assertDefined(grant.authorization);
@@ -133,7 +135,7 @@ describe("AuthzExtension", () => {
describe("grantee grants", () => {
it("works", async () => {
pendingWithoutSimapp46();
pendingWithoutSimapp46OrHigher();
const [client, tmClient] = await makeClientWithAuthz(simapp.tendermintUrl);
const response = await client.authz.granteeGrants(grantee1Address);
expect(response.grants.length).toEqual(1);
@@ -150,25 +150,27 @@ describe("BankExtension", () => {
const [client, tmClient] = await makeClientWithBank(simapp.tendermintUrl);
const metadata = await client.bank.denomMetadata("ucosm");
expect(metadata).toEqual({
description: "The fee token of this test chain",
denomUnits: [
{
denom: "ucosm",
exponent: 0,
aliases: [],
},
{
denom: "COSM",
exponent: 6,
aliases: [],
},
],
base: "ucosm",
display: "COSM",
name: "",
symbol: "",
});
expect(metadata).toEqual(
jasmine.objectContaining({
description: "The fee token of this test chain",
denomUnits: [
{
denom: "ucosm",
exponent: 0,
aliases: [],
},
{
denom: "COSM",
exponent: 6,
aliases: [],
},
],
base: "ucosm",
display: "COSM",
name: "",
symbol: "",
}),
);
tmClient.disconnect();
});
@@ -190,25 +192,27 @@ describe("BankExtension", () => {
const metadatas = await client.bank.denomsMetadata();
expect(metadatas.length).toEqual(1);
expect(metadatas[0]).toEqual({
description: "The fee token of this test chain",
denomUnits: [
{
denom: "ucosm",
exponent: 0,
aliases: [],
},
{
denom: "COSM",
exponent: 6,
aliases: [],
},
],
base: "ucosm",
display: "COSM",
name: "",
symbol: "",
});
expect(metadatas[0]).toEqual(
jasmine.objectContaining({
description: "The fee token of this test chain",
denomUnits: [
{
denom: "ucosm",
exponent: 0,
aliases: [],
},
{
denom: "COSM",
exponent: 6,
aliases: [],
},
],
base: "ucosm",
display: "COSM",
name: "",
symbol: "",
}),
);
tmClient.disconnect();
});
@@ -12,7 +12,6 @@ import {
faucet,
nonNegativeIntegerMatcher,
pendingWithoutSimapp,
pendingWithoutSimapp44Or46,
simapp,
simappEnabled,
validator,
@@ -171,7 +170,7 @@ describe("gov messages", () => {
describe("MsgVoteWeighted", () => {
it("works", async () => {
pendingWithoutSimapp44Or46(); // MsgVoteWeighted does not yet exist in Cosmos SDK 0.42
pendingWithoutSimapp();
assert(voterWallet);
assert(proposalId, "Missing proposal ID");
const client = await SigningStargateClient.connectWithSigner(simapp.tendermintUrl, voterWallet);
@@ -204,7 +203,7 @@ describe("gov messages", () => {
});
it("works with Amino JSON sign mode", async () => {
pendingWithoutSimapp44Or46(); // MsgVoteWeighted does not yet exist in Cosmos SDK 0.42
pendingWithoutSimapp();
assert(voterWalletAmino);
assert(proposalId, "Missing proposal ID");
const client = await SigningStargateClient.connectWithSigner(simapp.tendermintUrl, voterWalletAmino);
@@ -10,7 +10,7 @@ import {
faucet,
makeRandomAddress,
pendingWithoutSimapp,
pendingWithoutSimapp46,
pendingWithoutSimapp46OrHigher,
simapp,
} from "../../testutils.spec";
@@ -47,7 +47,7 @@ describe("vesting messages", () => {
});
it("works with Amino JSON sign mode", async () => {
pendingWithoutSimapp46(); // Amino JSON broken on chain before Cosmos SDK 0.46
pendingWithoutSimapp46OrHigher(); // Amino JSON broken on chain before Cosmos SDK 0.46
const wallet = await Secp256k1HdWallet.fromMnemonic(faucet.mnemonic);
const client = await SigningStargateClient.connectWithSigner(
simapp.tendermintUrl,
@@ -92,83 +92,6 @@ describe("QueryClient", () => {
});
});
describe("queryUnverified", () => {
it("works via WebSockets", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeClient(simapp.tendermintUrlWs);
const requestData = Uint8Array.from(
QueryAllBalancesRequest.encode({ address: unused.address }).finish(),
);
const data = await client.queryUnverified(`/cosmos.bank.v1beta1.Query/AllBalances`, requestData);
const response = QueryAllBalancesResponse.decode(data);
expect(response.balances.length).toEqual(2);
tmClient.disconnect();
});
it("works via http", async () => {
pendingWithoutSimapp();
const [client, tmClient] = await makeClient(simapp.tendermintUrlHttp);
const requestData = Uint8Array.from(
QueryAllBalancesRequest.encode({ address: unused.address }).finish(),
);
const data = await client.queryUnverified(`/cosmos.bank.v1beta1.Query/AllBalances`, requestData);
const response = QueryAllBalancesResponse.decode(data);
expect(response.balances.length).toEqual(2);
tmClient.disconnect();
});
it("works for height", async () => {
pendingWithoutSimapp();
const [queryClient, tmClient] = await makeClient(simapp.tendermintUrlHttp);
const joe = makeRandomAddress();
const h1 = (await tmClient.status()).syncInfo.latestBlockHeight;
// Send tokens to `recipient`
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic);
const client = await SigningStargateClient.connectWithSigner(
simapp.tendermintUrlHttp,
wallet,
defaultSigningClientOptions,
);
const amount = coin(332211, simapp.denomFee);
await client.sendTokens(faucet.address0, joe, [amount], "auto");
const h2 = (await tmClient.status()).syncInfo.latestBlockHeight;
assert(h1 < h2);
// Query with no height
{
const requestData = QueryBalanceRequest.encode({ address: joe, denom: simapp.denomFee }).finish();
const data = await queryClient.queryUnverified(`/cosmos.bank.v1beta1.Query/Balance`, requestData);
const response = QueryBalanceResponse.decode(data);
expect(response.balance).toEqual(amount);
}
// Query at h2 (after send)
{
const requestData = QueryBalanceRequest.encode({ address: joe, denom: simapp.denomFee }).finish();
const data = await queryClient.queryUnverified(`/cosmos.bank.v1beta1.Query/Balance`, requestData, h2);
const response = QueryBalanceResponse.decode(data);
expect(response.balance).toEqual(amount);
}
// Query at h1 (before send)
{
const requestData = QueryBalanceRequest.encode({ address: joe, denom: simapp.denomFee }).finish();
const data = await queryClient.queryUnverified(`/cosmos.bank.v1beta1.Query/Balance`, requestData, h1);
const response = QueryBalanceResponse.decode(data);
expect(response.balance).toEqual({ amount: "0", denom: simapp.denomFee });
}
tmClient.disconnect();
});
});
describe("queryAbci", () => {
it("works via WebSockets", async () => {
pendingWithoutSimapp();
@@ -512,18 +512,6 @@ export class QueryClient {
this.tmClient = tmClient;
}
/**
* @deprecated use queryStoreVerified instead
*/
public async queryVerified(
store: string,
queryKey: Uint8Array,
desiredHeight?: number,
): Promise<Uint8Array> {
const { value } = await this.queryStoreVerified(store, queryKey, desiredHeight);
return value;
}
/**
* Queries the database store with a proof, which is then verified.
*
@@ -608,20 +596,6 @@ export class QueryClient {
};
}
/**
* Performs an ABCI query to Tendermint without requesting a proof.
*
* @deprecated use queryAbci instead
*/
public async queryUnverified(
path: string,
request: Uint8Array,
desiredHeight?: number,
): Promise<Uint8Array> {
const response = await this.queryAbci(path, request, desiredHeight);
return response.value;
}
/**
* Performs an ABCI query to Tendermint without requesting a proof.
*
+7 -24
View File
@@ -7,28 +7,11 @@ export interface SearchBySentFromOrToQuery {
}
/**
* This query type allows you to pass arbitrary key/value pairs to the backend. It is
* more powerful and slightly lower level than the other search options.
* This query type allows you to pass arbitrary key/value pairs to the backend.
*/
export interface SearchByTagsQuery {
readonly tags: ReadonlyArray<{ readonly key: string; readonly value: string }>;
}
export type SearchTxQuery = SearchByHeightQuery | SearchBySentFromOrToQuery | SearchByTagsQuery;
export function isSearchByHeightQuery(query: SearchTxQuery): query is SearchByHeightQuery {
return (query as SearchByHeightQuery).height !== undefined;
}
export function isSearchBySentFromOrToQuery(query: SearchTxQuery): query is SearchBySentFromOrToQuery {
return (query as SearchBySentFromOrToQuery).sentFromOrTo !== undefined;
}
export function isSearchByTagsQuery(query: SearchTxQuery): query is SearchByTagsQuery {
return (query as SearchByTagsQuery).tags !== undefined;
}
export interface SearchTxFilter {
readonly minHeight?: number;
readonly maxHeight?: number;
}
export type SearchTxQuery =
| string
| ReadonlyArray<{
readonly key: string;
readonly value: string;
}>;
@@ -29,7 +29,11 @@ import {
setupFeegrantExtension,
} from "./modules";
import { QueryClient } from "./queryclient";
import { PrivateSigningStargateClient, SigningStargateClient } from "./signingstargateclient";
import {
PrivateSigningStargateClient,
SigningStargateClient,
SigningStargateClientOptions,
} from "./signingstargateclient";
import { assertIsDeliverTxFailure, assertIsDeliverTxSuccess, isDeliverTxFailure } from "./stargateclient";
import {
defaultGasPrice,
@@ -51,7 +55,7 @@ describe("SigningStargateClient", () => {
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic);
const registry = new Registry();
registry.register("/custom.MsgCustom", MsgSend);
const options = { ...defaultSigningClientOptions, registry: registry };
const options: SigningStargateClientOptions = { ...defaultSigningClientOptions, registry: registry };
const client = await SigningStargateClient.connectWithSigner(simapp.tendermintUrl, wallet, options);
const openedClient = client as unknown as PrivateSigningStargateClient;
expect(openedClient.registry.lookupType("/custom.MsgCustom")).toEqual(MsgSend);
@@ -204,7 +208,8 @@ describe("SigningStargateClient", () => {
allowance: allowance,
}),
};
const grantResult = await client.signAndBroadcast(payer, [grantMsg], "auto", "Create allowance");
const fee = 1.5; // See https://github.com/cosmos/cosmos-sdk/issues/16020
const grantResult = await client.signAndBroadcast(payer, [grantMsg], fee, "Create allowance");
assertIsDeliverTxSuccess(grantResult);
}
@@ -621,7 +626,7 @@ describe("SigningStargateClient", () => {
}),
},
});
const options = {
const options: SigningStargateClientOptions = {
...defaultSigningClientOptions,
registry: customRegistry,
aminoTypes: customAminoTypes,
@@ -901,7 +906,7 @@ describe("SigningStargateClient", () => {
}),
},
});
const options = {
const options: SigningStargateClientOptions = {
...defaultSigningClientOptions,
registry: customRegistry,
aminoTypes: customAminoTypes,
+20 -4
View File
@@ -12,7 +12,12 @@ import {
Registry,
TxBodyEncodeObject,
} from "@cosmjs/proto-signing";
import { HttpEndpoint, Tendermint34Client, TendermintClient } from "@cosmjs/tendermint-rpc";
import {
HttpEndpoint,
Tendermint34Client,
Tendermint37Client,
TendermintClient,
} from "@cosmjs/tendermint-rpc";
import { assert, assertDefined } from "@cosmjs/utils";
import { Coin } from "cosmjs-types/cosmos/base/v1beta1/coin";
import { MsgWithdrawDelegatorReward } from "cosmjs-types/cosmos/distribution/v1beta1/tx";
@@ -113,15 +118,26 @@ export class SigningStargateClient extends StargateClient {
/**
* Creates an instance by connecting to the given Tendermint RPC endpoint.
*
* For now this uses the Tendermint 0.34 client. If you need Tendermint 0.37
* support, see `createWithSigner`.
* This uses auto-detection to decide between a Tendermint 0.37 and 0.34 client.
* To set the Tendermint client explicitly, use `createWithSigner`.
*/
public static async connectWithSigner(
endpoint: string | HttpEndpoint,
signer: OfflineSigner,
options: SigningStargateClientOptions = {},
): Promise<SigningStargateClient> {
const tmClient = await Tendermint34Client.connect(endpoint);
// Tendermint/CometBFT 0.34/0.37 auto-detection. Starting with 0.37 we seem to get reliable versions again 🎉
// Using 0.34 as the fallback.
let tmClient: TendermintClient;
const tm37Client = await Tendermint37Client.connect(endpoint);
const version = (await tm37Client.status()).nodeInfo.version;
if (version.startsWith("0.37.")) {
tmClient = tm37Client;
} else {
tm37Client.disconnect();
tmClient = await Tendermint34Client.connect(endpoint);
}
return SigningStargateClient.createWithSigner(tmClient, signer, options);
}
@@ -10,6 +10,7 @@ import {
TxBodyEncodeObject,
} from "@cosmjs/proto-signing";
import { assert, sleep } from "@cosmjs/utils";
import { MsgSendResponse } from "cosmjs-types/cosmos/bank/v1beta1/tx";
import { Coin } from "cosmjs-types/cosmos/base/v1beta1/coin";
import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx";
@@ -22,6 +23,7 @@ import {
makeRandomAddress,
pendingWithoutSimapp,
simapp,
simapp44Enabled,
simappEnabled,
} from "./testutils.spec";
@@ -156,6 +158,7 @@ describe("StargateClient.getTx and .searchTx", () => {
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await StargateClient.connect(simapp.tendermintUrl);
const result = await client.getTx(sendSuccessful.hash);
assert(result);
expect(result).toEqual(
jasmine.objectContaining({
height: sendSuccessful.height,
@@ -164,6 +167,14 @@ describe("StargateClient.getTx and .searchTx", () => {
tx: sendSuccessful.tx,
}),
);
// works on SDK 0.46+
if (!simapp44Enabled()) {
expect(result.msgResponses.length).toEqual(1);
expect(result.msgResponses[0].typeUrl).toEqual("/cosmos.bank.v1beta1.MsgSendResponse");
const _response = MsgSendResponse.decode(result.msgResponses[0].value);
// MsgSendResponse has no fields to check 🤷‍♂️
}
});
it("can get unsuccessful tx by ID", async () => {
@@ -171,6 +182,7 @@ describe("StargateClient.getTx and .searchTx", () => {
assert(sendUnsuccessful, "value must be set in beforeAll()");
const client = await StargateClient.connect(simapp.tendermintUrl);
const result = await client.getTx(sendUnsuccessful.hash);
assert(result);
expect(result).toEqual(
jasmine.objectContaining({
height: sendUnsuccessful.height,
@@ -179,6 +191,12 @@ describe("StargateClient.getTx and .searchTx", () => {
tx: sendUnsuccessful.tx,
}),
);
// works on SDK 0.46+
if (!simapp44Enabled()) {
// unsuccessful tx should not have responses
expect(result.msgResponses.length).toEqual(0);
}
});
it("can get by ID (non existent)", async () => {
@@ -190,12 +208,12 @@ describe("StargateClient.getTx and .searchTx", () => {
});
});
describe("with SearchByHeightQuery", () => {
describe("searchTx", () => {
it("can search successful tx by height", async () => {
pendingWithoutSimapp();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await StargateClient.connect(simapp.tendermintUrl);
const result = await client.searchTx({ height: sendSuccessful.height });
const result = await client.searchTx(`tx.height=${sendSuccessful.height}`);
expect(result.length).toBeGreaterThanOrEqual(1);
expect(result).toContain(
jasmine.objectContaining({
@@ -205,13 +223,21 @@ describe("StargateClient.getTx and .searchTx", () => {
tx: sendSuccessful.tx,
}),
);
// works on SDK 0.46+
if (!simapp44Enabled()) {
expect(result[0].msgResponses.length).toEqual(1);
expect(result[0].msgResponses[0].typeUrl).toEqual("/cosmos.bank.v1beta1.MsgSendResponse");
const _response = MsgSendResponse.decode(result[0].msgResponses[0].value);
// MsgSendResponse has no fields to check 🤷‍♂️
}
});
it("can search unsuccessful tx by height", async () => {
pendingWithoutSimapp();
assert(sendUnsuccessful, "value must be set in beforeAll()");
const client = await StargateClient.connect(simapp.tendermintUrl);
const result = await client.searchTx({ height: sendUnsuccessful.height });
const result = await client.searchTx(`tx.height=${sendUnsuccessful.height}`);
expect(result.length).toBeGreaterThanOrEqual(1);
expect(result).toContain(
jasmine.objectContaining({
@@ -222,14 +248,14 @@ describe("StargateClient.getTx and .searchTx", () => {
}),
);
});
});
describe("with SearchBySentFromOrToQuery", () => {
it("can search by sender", async () => {
pendingWithoutSimapp();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await StargateClient.connect(simapp.tendermintUrl);
const results = await client.searchTx({ sentFromOrTo: sendSuccessful.sender });
// Since Cosmos SDK 0.47 we can only combine attributes of a single event
const query = `message.action = '/cosmos.bank.v1beta1.MsgSend' AND message.sender = '${sendSuccessful.sender}'`;
const results = await client.searchTx(query);
expect(results.length).toBeGreaterThanOrEqual(1);
// Check basic structure of all results
@@ -257,7 +283,7 @@ describe("StargateClient.getTx and .searchTx", () => {
pendingWithoutSimapp();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await StargateClient.connect(simapp.tendermintUrl);
const results = await client.searchTx({ sentFromOrTo: sendSuccessful.recipient });
const results = await client.searchTx(`transfer.recipient='${sendSuccessful.recipient}'`);
expect(results.length).toBeGreaterThanOrEqual(1);
// Check basic structure of all results
@@ -281,69 +307,11 @@ describe("StargateClient.getTx and .searchTx", () => {
);
});
it("can search by recipient and filter by minHeight", async () => {
pendingWithoutSimapp();
assert(sendSuccessful);
const client = await StargateClient.connect(simapp.tendermintUrl);
const query = { sentFromOrTo: sendSuccessful.recipient };
{
const result = await client.searchTx(query, { minHeight: 0 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { minHeight: sendSuccessful.height - 1 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { minHeight: sendSuccessful.height });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { minHeight: sendSuccessful.height + 1 });
expect(result.length).toEqual(0);
}
});
it("can search by recipient and filter by maxHeight", async () => {
pendingWithoutSimapp();
assert(sendSuccessful);
const client = await StargateClient.connect(simapp.tendermintUrl);
const query = { sentFromOrTo: sendSuccessful.recipient };
{
const result = await client.searchTx(query, { maxHeight: 9999999999999 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { maxHeight: sendSuccessful.height + 1 });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { maxHeight: sendSuccessful.height });
expect(result.length).toEqual(1);
}
{
const result = await client.searchTx(query, { maxHeight: sendSuccessful.height - 1 });
expect(result.length).toEqual(0);
}
});
});
describe("with SearchByTagsQuery", () => {
it("can search by transfer.recipient", async () => {
it("works with tags", async () => {
pendingWithoutSimapp();
assert(sendSuccessful, "value must be set in beforeAll()");
const client = await StargateClient.connect(simapp.tendermintUrl);
const results = await client.searchTx({
tags: [{ key: "transfer.recipient", value: sendSuccessful.recipient }],
});
const results = await client.searchTx([{ key: "transfer.recipient", value: sendSuccessful.recipient }]);
expect(results.length).toBeGreaterThanOrEqual(1);
// Check basic structure of all results
@@ -45,6 +45,7 @@ const resultFailure: DeliverTxResponse = {
"failed to execute message; message index: 0: 1855527000ufct is smaller than 20000000000000000000000ufct: insufficient funds",
transactionHash: "FDC4FB701AABD465935F7D04AE490D1EF5F2BD4B227601C4E98B57EB077D9B7D",
events: [],
msgResponses: [],
gasUsed: 54396,
gasWanted: 200000,
};
@@ -56,6 +57,7 @@ const resultSuccess: DeliverTxResponse = {
'[{"events":[{"type":"message","attributes":[{"key":"action","value":"send"},{"key":"sender","value":"firma1trqyle9m2nvyafc2n25frkpwed2504y6avgfzr"},{"key":"module","value":"bank"}]},{"type":"transfer","attributes":[{"key":"recipient","value":"firma12er8ls2sf5zess3jgjxz59xat9xtf8hz0hk6n4"},{"key":"sender","value":"firma1trqyle9m2nvyafc2n25frkpwed2504y6avgfzr"},{"key":"amount","value":"2000000ufct"}]}]}]',
transactionHash: "C0B416CA868C55C2B8C1BBB8F3CFA233854F13A5CB15D3E9599F50CAF7B3D161",
events: [],
msgResponses: [],
gasUsed: 61556,
gasWanted: 200000,
};
+43 -47
View File
@@ -5,11 +5,12 @@ import { Uint53 } from "@cosmjs/math";
import {
HttpEndpoint,
Tendermint34Client,
Tendermint37Client,
TendermintClient,
toRfc3339WithNanoseconds,
} from "@cosmjs/tendermint-rpc";
import { assert, sleep } from "@cosmjs/utils";
import { MsgData } from "cosmjs-types/cosmos/base/abci/v1beta1/abci";
import { MsgData, TxMsgData } from "cosmjs-types/cosmos/base/abci/v1beta1/abci";
import { Coin } from "cosmjs-types/cosmos/base/v1beta1/coin";
import { QueryDelegatorDelegationsResponse } from "cosmjs-types/cosmos/staking/v1beta1/query";
import { DelegationResponse } from "cosmjs-types/cosmos/staking/v1beta1/staking";
@@ -27,13 +28,7 @@ import {
TxExtension,
} from "./modules";
import { QueryClient } from "./queryclient";
import {
isSearchByHeightQuery,
isSearchBySentFromOrToQuery,
isSearchByTagsQuery,
SearchTxFilter,
SearchTxQuery,
} from "./search";
import { SearchTxQuery } from "./search";
export class TimeoutError extends Error {
public readonly txId: string;
@@ -96,6 +91,12 @@ export interface IndexedTx {
* Use `decodeTxRaw` from @cosmjs/proto-signing to decode this.
*/
readonly tx: Uint8Array;
/**
* The message responses of the [TxMsgData](https://github.com/cosmos/cosmos-sdk/blob/v0.46.3/proto/cosmos/base/abci/v1beta1/abci.proto#L128-L140)
* as `Any`s.
* This field is an empty list for chains running Cosmos SDK < 0.46.
*/
readonly msgResponses: Array<{ readonly typeUrl: string; readonly value: Uint8Array }>;
readonly gasUsed: number;
readonly gasWanted: number;
}
@@ -125,7 +126,14 @@ export interface DeliverTxResponse {
* field instead.
*/
readonly rawLog?: string;
/** @deprecated Use `msgResponses` instead. */
readonly data?: readonly MsgData[];
/**
* The message responses of the [TxMsgData](https://github.com/cosmos/cosmos-sdk/blob/v0.46.3/proto/cosmos/base/abci/v1beta1/abci.proto#L128-L140)
* as `Any`s.
* This field is an empty list for chains running Cosmos SDK < 0.46.
*/
readonly msgResponses: Array<{ readonly typeUrl: string; readonly value: Uint8Array }>;
readonly gasUsed: number;
readonly gasWanted: number;
}
@@ -198,14 +206,25 @@ export class StargateClient {
/**
* Creates an instance by connecting to the given Tendermint RPC endpoint.
*
* For now this uses the Tendermint 0.34 client. If you need Tendermint 0.37
* support, see `create`.
* This uses auto-detection to decide between a Tendermint 0.37 and 0.34 client.
* To set the Tendermint client explicitly, use `create`.
*/
public static async connect(
endpoint: string | HttpEndpoint,
options: StargateClientOptions = {},
): Promise<StargateClient> {
const tmClient = await Tendermint34Client.connect(endpoint);
// Tendermint/CometBFT 0.34/0.37 auto-detection. Starting with 0.37 we seem to get reliable versions again 🎉
// Using 0.34 as the fallback.
let tmClient: TendermintClient;
const tm37Client = await Tendermint37Client.connect(endpoint);
const version = (await tm37Client.status()).nodeInfo.version;
if (version.startsWith("0.37.")) {
tmClient = tm37Client;
} else {
tm37Client.disconnect();
tmClient = await Tendermint34Client.connect(endpoint);
}
return StargateClient.create(tmClient, options);
}
@@ -382,42 +401,16 @@ export class StargateClient {
return results[0] ?? null;
}
public async searchTx(query: SearchTxQuery, filter: SearchTxFilter = {}): Promise<readonly IndexedTx[]> {
const minHeight = filter.minHeight || 0;
const maxHeight = filter.maxHeight || Number.MAX_SAFE_INTEGER;
if (maxHeight < minHeight) return []; // optional optimization
function withFilters(originalQuery: string): string {
return `${originalQuery} AND tx.height>=${minHeight} AND tx.height<=${maxHeight}`;
}
let txs: readonly IndexedTx[];
if (isSearchByHeightQuery(query)) {
txs =
query.height >= minHeight && query.height <= maxHeight
? await this.txsQuery(`tx.height=${query.height}`)
: [];
} else if (isSearchBySentFromOrToQuery(query)) {
const sentQuery = withFilters(`message.module='bank' AND transfer.sender='${query.sentFromOrTo}'`);
const receivedQuery = withFilters(
`message.module='bank' AND transfer.recipient='${query.sentFromOrTo}'`,
);
const [sent, received] = await Promise.all(
[sentQuery, receivedQuery].map((rawQuery) => this.txsQuery(rawQuery)),
);
const sentHashes = sent.map((t) => t.hash);
txs = [...sent, ...received.filter((t) => !sentHashes.includes(t.hash))];
} else if (isSearchByTagsQuery(query)) {
const rawQuery = withFilters(query.tags.map((t) => `${t.key}='${t.value}'`).join(" AND "));
txs = await this.txsQuery(rawQuery);
public async searchTx(query: SearchTxQuery): Promise<IndexedTx[]> {
let rawQuery: string;
if (typeof query === "string") {
rawQuery = query;
} else if (Array.isArray(query)) {
rawQuery = query.map((t) => `${t.key}='${t.value}'`).join(" AND ");
} else {
throw new Error("Unknown query type");
throw new Error("Got unsupported query type. See CosmJS 0.31 CHANGELOG for API breaking changes here.");
}
const filtered = txs.filter((tx) => tx.height >= minHeight && tx.height <= maxHeight);
return filtered;
return this.txsQuery(rawQuery);
}
public disconnect(): void {
@@ -464,6 +457,7 @@ export class StargateClient {
events: result.events,
rawLog: result.rawLog,
transactionHash: txId,
msgResponses: result.msgResponses,
gasUsed: result.gasUsed,
gasWanted: result.gasWanted,
}
@@ -511,9 +505,10 @@ export class StargateClient {
return transactionId;
}
private async txsQuery(query: string): Promise<readonly IndexedTx[]> {
private async txsQuery(query: string): Promise<IndexedTx[]> {
const results = await this.forceGetTmClient().txSearchAll({ query: query });
return results.txs.map((tx) => {
return results.txs.map((tx): IndexedTx => {
const txMsgData = TxMsgData.decode(tx.result.data ?? new Uint8Array());
return {
height: tx.height,
txIndex: tx.index,
@@ -522,6 +517,7 @@ export class StargateClient {
events: tx.result.events.map(fromTendermintEvent),
rawLog: tx.result.log || "",
tx: tx.tx,
msgResponses: txMsgData.msgResponses,
gasUsed: tx.result.gasUsed,
gasWanted: tx.result.gasWanted,
};
+18 -16
View File
@@ -23,35 +23,37 @@ export function simapp46Enabled(): boolean {
return !!process.env.SIMAPP46_ENABLED;
}
export function simapp47Enabled(): boolean {
return !!process.env.SIMAPP47_ENABLED;
}
export function simappEnabled(): boolean {
return simapp44Enabled() || simapp46Enabled();
return simapp44Enabled() || simapp46Enabled() || simapp47Enabled();
}
export function pendingWithoutSimapp44Or46(): void {
if (!simapp44Enabled() && !simapp46Enabled()) {
return pending("Set SIMAPP{44,46}_ENABLED to enable Simapp based tests");
}
}
export function pendingWithoutSimapp46(): void {
if (!simapp46Enabled()) {
return pending("Set SIMAPP46_ENABLED to enable Simapp based tests");
export function pendingWithoutSimapp46OrHigher(): void {
if (!simapp46Enabled() && !simapp47Enabled()) {
return pending("Set SIMAPP46_ENABLED or SIMAPP47_ENABLED to enable Simapp based tests");
}
}
export function pendingWithoutSimapp(): void {
if (!simappEnabled()) {
return pending("Set SIMAPP{44,46}_ENABLED to enable Simapp based tests");
return pending("Set SIMAPP{44,46,47}_ENABLED to enable Simapp based tests");
}
}
export function slowSimappEnabled(): boolean {
return !!process.env.SLOW_SIMAPP44_ENABLED || !!process.env.SLOW_SIMAPP46_ENABLED;
return (
!!process.env.SLOW_SIMAPP44_ENABLED ||
!!process.env.SLOW_SIMAPP46_ENABLED ||
!!process.env.SLOW_SIMAPP47_ENABLED
);
}
export function pendingWithoutSlowSimapp(): void {
if (!slowSimappEnabled()) {
return pending("Set SLOW_SIMAPP{44,46}_ENABLED to enable slow Simapp based tests");
return pending("Set SLOW_SIMAPP{44,46,47}_ENABLED to enable slow Simapp based tests");
}
}
@@ -155,7 +157,7 @@ export const validator = {
*/
pubkey: {
type: "tendermint/PubKeySecp256k1",
value: "AtDcuH4cX1eaxZrJ5shheLG3tXPAoV4awoIZmNQtQxmf",
value: "A0RZ3+xLf9xJiySHQxQsQtW8HJYEcniJKbFxG2R9ZEQv",
},
/**
* delegator_address from /cosmos.staking.v1beta1.MsgCreateValidator in scripts/simapp44/template/.simapp/config/genesis.json
@@ -164,7 +166,7 @@ export const validator = {
* jq ".app_state.genutil.gen_txs[0].body.messages[0].delegator_address" scripts/simapp44/template/.simapp/config/genesis.json
* ```
*/
delegatorAddress: "cosmos1urk9gy7cfws0ak9x5nu7lx4un9n6gqkry79679",
delegatorAddress: "cosmos12nt2hqjps8r065wc02qks88tvqzdeua0ld3jxy",
/**
* validator_address from /cosmos.staking.v1beta1.MsgCreateValidator in scripts/simapp44/template/.simapp/config/genesis.json
*
@@ -172,7 +174,7 @@ export const validator = {
* jq ".app_state.genutil.gen_txs[0].body.messages[0].validator_address" scripts/simapp44/template/.simapp/config/genesis.json
* ```
*/
validatorAddress: "cosmosvaloper1urk9gy7cfws0ak9x5nu7lx4un9n6gqkrp230jk",
validatorAddress: "cosmosvaloper12nt2hqjps8r065wc02qks88tvqzdeua06e982h",
accountNumber: 0,
sequence: 1,
};
+2
View File
@@ -21,6 +21,8 @@ module.exports = [
SLOW_SIMAPP44_ENABLED: "",
SIMAPP46_ENABLED: "",
SLOW_SIMAPP46_ENABLED: "",
SIMAPP47_ENABLED: "",
SLOW_SIMAPP47_ENABLED: "",
}),
new webpack.ProvidePlugin({
Buffer: ["buffer", "Buffer"],
+3 -3
View File
@@ -51,7 +51,7 @@
"@types/karma-firefox-launcher": "^2",
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"eslint": "^7.5",
@@ -74,8 +74,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+3 -3
View File
@@ -60,7 +60,7 @@
"@types/karma-firefox-launcher": "^2",
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"eslint": "^7.5",
@@ -83,8 +83,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+3 -3
View File
@@ -46,7 +46,7 @@
"@types/karma-firefox-launcher": "^2",
"@types/karma-jasmine": "^4",
"@types/karma-jasmine-html-reporter": "^1",
"@types/node": "^15.0.1",
"@types/node": "^18",
"@typescript-eslint/eslint-plugin": "^5.54.0",
"@typescript-eslint/parser": "^5.54.0",
"buffer": "^6.0.3",
@@ -70,8 +70,8 @@
"ses": "^0.11.0",
"source-map-support": "^0.5.19",
"ts-node": "^8",
"typedoc": "^0.22",
"typescript": "~4.6",
"typedoc": "^0.23",
"typescript": "~4.9",
"webpack": "^5.76.0",
"webpack-cli": "^4.6.0"
}
+45 -42
View File
@@ -11,56 +11,59 @@ cd scripts/simapp44
## Preset accounts
1. **Faucet**<br>
economy stock theory fatal elder harbor betray wasp final emotion task crumble siren bottom lizard educate guess current outdoor pair theory focus wife stone<br>
Address 0: cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6<br>
Address 1: cosmos10dyr9899g6t0pelew4nvf4j5c3jcgv0r73qga5<br>
Address 2: cosmos1xy4yqngt0nlkdcenxymg8tenrghmek4nmqm28k<br>
Address 3: cosmos142u9fgcjdlycfcez3lw8x6x5h7rfjlnfhpw2lx<br>
Address 4: cosmos1hsm76p4ahyhl5yh3ve9ur49r5kemhp2r0dcjvx<br>
Pubkey 0: A08EGB7ro1ORuFhjOnZcSgwYlpe0DSFjVNUIkNNQxwKQ<br>
Pubkey 1: AiDosfIbBi54XJ1QjCeApumcy/FjdtF+YhywPf3DKTx7<br>
Pubkey 2: AzQg33JZqH7vSsm09esZY5bZvmzYwE/SY78cA0iLxpD7<br>
Pubkey 3: A3gOAlB6aiRTCPvWMQg2+ZbGYNsLd8qlvV28m8p2UhY2<br>
1. **Faucet**\
economy stock theory fatal elder harbor betray wasp final emotion task crumble
siren bottom lizard educate guess current outdoor pair theory focus wife stone\
Address 0: cosmos1pkptre7fdkl6gfrzlesjjvhxhlc3r4gmmk8rs6\
Address 1: cosmos10dyr9899g6t0pelew4nvf4j5c3jcgv0r73qga5\
Address 2: cosmos1xy4yqngt0nlkdcenxymg8tenrghmek4nmqm28k\
Address 3: cosmos142u9fgcjdlycfcez3lw8x6x5h7rfjlnfhpw2lx\
Address 4: cosmos1hsm76p4ahyhl5yh3ve9ur49r5kemhp2r0dcjvx\
Pubkey 0: A08EGB7ro1ORuFhjOnZcSgwYlpe0DSFjVNUIkNNQxwKQ\
Pubkey 1: AiDosfIbBi54XJ1QjCeApumcy/FjdtF+YhywPf3DKTx7\
Pubkey 2: AzQg33JZqH7vSsm09esZY5bZvmzYwE/SY78cA0iLxpD7\
Pubkey 3: A3gOAlB6aiRTCPvWMQg2+ZbGYNsLd8qlvV28m8p2UhY2\
Pubkey 4: Aum2063ub/ErUnIUB36sK55LktGUStgcbSiaAnL1wadu
2. **Alice**: Test account for the cosmwasm package that can run in parallel with faucet without sequence conflicts<br>
enlist hip relief stomach skate base shallow young switch frequent cry park<br>
Address 0: cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada<br>
Address 1: cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0<br>
Address 2: cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5<br>
Address 3: cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta<br>
Address 4: cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce<br>
Pubkey 0: A9cXhWb8ZpqCzkA8dQCPV29KdeRLV3rUYxrkHudLbQtS<br>
Pubkey 1: A4XluzvcUx0ViLF0DjYW5/noArGwpltDstoUUZo+g1b0<br>
Pubkey 2: A5TKr1NKc/MKRJ7+EHDD9PlzmGaPD/di/6hzZyBwxoy5<br>
Pubkey 3: A/HSABDUqMB2qDy+PA7fiuuuA+hfrco2VwwiThMiTzUx<br>
2. **Alice**: Test account for the cosmwasm package that can run in parallel
with faucet without sequence conflicts\
enlist hip relief stomach skate base shallow young switch frequent cry park\
Address 0: cosmos14qemq0vw6y3gc3u3e0aty2e764u4gs5le3hada\
Address 1: cosmos1hhg2rlu9jscacku2wwckws7932qqqu8x3gfgw0\
Address 2: cosmos1xv9tklw7d82sezh9haa573wufgy59vmwe6xxe5\
Address 3: cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta\
Address 4: cosmos1f7j7ryulwjfe9ljplvhtcaxa6wqgula3etktce\
Pubkey 0: A9cXhWb8ZpqCzkA8dQCPV29KdeRLV3rUYxrkHudLbQtS\
Pubkey 1: A4XluzvcUx0ViLF0DjYW5/noArGwpltDstoUUZo+g1b0\
Pubkey 2: A5TKr1NKc/MKRJ7+EHDD9PlzmGaPD/di/6hzZyBwxoy5\
Pubkey 3: A/HSABDUqMB2qDy+PA7fiuuuA+hfrco2VwwiThMiTzUx\
Pubkey 4: A7usTiqgqfxL/WKhoephDUSCHBQlLagtwI/qTmEteTRM
3. **Bob**: Test account (unused for now)<br>
remain fragile remove stamp quiz bus country dress critic mammal office need<br>
Address 0: cosmos1lvrwcvrqlc5ktzp2c4t22xgkx29q3y83lktgzl<br>
Address 1: cosmos1vkv9sfwaak76weyamqx0flmng2vuquxqcuqukh<br>
Address 2: cosmos106jwym4s9aujcmes26myzzwqsccw09sdm0v5au<br>
Address 3: cosmos1c7wpeen2uv8thayf7g8q2rgpm29clj0dgrdtzw<br>
Address 4: cosmos1mjxpv9ft30wer7ma7kwfxhm42l379xutplrdk6<br>
Pubkey 0: A0d/GxY+UALE+miWJP0qyq4/EayG1G6tsg24v+cbD6By<br>
Pubkey 1: Agqd6njsVEQD1CR+F2aqEb8hil5NXZ06mjKgetaNC12t<br>
Pubkey 2: A6e9ElvKaM0DKWh1bIdK3bgB14dyEDgIXYMA0Lbs1GoQ<br>
Pubkey 3: AkAK5PQaucieWMb0+tTRY01feYI+upRnoNK556eD0Ibb<br>
3. **Bob**: Test account (unused for now)\
remain fragile remove stamp quiz bus country dress critic mammal office need\
Address 0: cosmos1lvrwcvrqlc5ktzp2c4t22xgkx29q3y83lktgzl\
Address 1: cosmos1vkv9sfwaak76weyamqx0flmng2vuquxqcuqukh\
Address 2: cosmos106jwym4s9aujcmes26myzzwqsccw09sdm0v5au\
Address 3: cosmos1c7wpeen2uv8thayf7g8q2rgpm29clj0dgrdtzw\
Address 4: cosmos1mjxpv9ft30wer7ma7kwfxhm42l379xutplrdk6\
Pubkey 0: A0d/GxY+UALE+miWJP0qyq4/EayG1G6tsg24v+cbD6By\
Pubkey 1: Agqd6njsVEQD1CR+F2aqEb8hil5NXZ06mjKgetaNC12t\
Pubkey 2: A6e9ElvKaM0DKWh1bIdK3bgB14dyEDgIXYMA0Lbs1GoQ\
Pubkey 3: AkAK5PQaucieWMb0+tTRY01feYI+upRnoNK556eD0Ibb\
Pubkey 4: A5HMVEAJsupdQWItbZv5Z1xZifDixQi6tjU/hJpZY1bF
4. **Unused**: for testing account state; this account never changes balances or sequences<br>
oyster design unusual machine spread century engine gravity focus cave carry slot<br>
ArkCaFUJ/IH+vKBmNRCdUVl3mCAhbopk9jjW4Ko4OfRQ<br>
4. **Unused**: for testing account state; this account never changes balances or
sequences\
oyster design unusual machine spread century engine gravity focus cave carry slot\
ArkCaFUJ/IH+vKBmNRCdUVl3mCAhbopk9jjW4Ko4OfRQ\
cosmos1cjsxept9rkggzxztslae9ndgpdyt2408lk850u
5. **Guest**: account for manual testing<br>
degree tackle suggest window test behind mesh extra cover prepare oak script<br>
Am/+YV0LaeqQPu7BDJuDHV7J8y68ptkGs10YS+9s71Nq<br>
5. **Guest**: account for manual testing\
degree tackle suggest window test behind mesh extra cover prepare oak script\
Am/+YV0LaeqQPu7BDJuDHV7J8y68ptkGs10YS+9s71Nq\
cosmos17d0jcz59jf68g52vq38tuuncmwwjk42u6mcxej
### Multisig accounts
1. 1/5 threshold multisig of the first 5 faucet accounts<br>
1. 1/5 threshold multisig of the first 5 faucet accounts\
cosmos1v75snhly7wfndk83ud4daygh397vcmkta8rlzq
2. 2/5 threshold multisig of the first 5 faucet accounts<br>
2. 2/5 threshold multisig of the first 5 faucet accounts\
cosmos1h90ml36rcu7yegwduzgzderj2jmq49hcpfclw9
3. 3/5 threshold multisig of the first 5 faucet accounts<br>
3. 3/5 threshold multisig of the first 5 faucet accounts\
cosmos1d2mg2euvus3tu2tprfwrfzeal4xu7kygugjxjc
+5 -3
View File
@@ -23,12 +23,14 @@ echo "Setting up validator ..."
if ! simd keys show validator 2>/dev/null; then
echo "Validator does not yet exist. Creating it ..."
(
# Constant key to get the same validator operator address (cosmosvaloper1...) every time
echo "gather series sample skin gate mask gossip between equip knife total stereo"
echo "$PASSWORD"
echo "$PASSWORD"
) | simd keys add validator
) | simd keys add myvalidator --recover
fi
# hardcode the validator account for this instance
echo "$PASSWORD" | simd add-genesis-account validator "$START_BALANCE"
echo "$PASSWORD" | simd add-genesis-account myvalidator "$START_BALANCE"
echo "Setting up accounts ..."
# (optionally) add a few more genesis accounts
@@ -43,5 +45,5 @@ SELF_DELEGATION="3000000$STAKE" # 3 STAKE (leads to a voting power of 3)
echo "$PASSWORD"
echo "$PASSWORD"
echo "$PASSWORD"
) | simd gentx validator "$SELF_DELEGATION" --offline --chain-id "$CHAIN_ID" --moniker="$MONIKER"
) | simd gentx myvalidator "$SELF_DELEGATION" --offline --chain-id "$CHAIN_ID" --moniker="$MONIKER"
simd collect-gentxs
@@ -0,0 +1 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0wNiAxNTo1Njo1Ny45MjYzNzk4ODIgKzAwMDAgVVRDIG09KzAuNTkyMzI0NTQzIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTDFlYmQwa3ctVUZYN0NibSJ9.hIuLIr8AdbU8xnyNgHZ5MsG6srKoKZz9VJtVN2fc8y7vF77aArSpSw.Ak-8Jsy32o2ORSvZ.aQhvsd6kiOs_qvaLGS5sZAdg2k3UXwWKkZYqfLdGXT62m0f5hkOtzfaRGcVNDbQLawLig3PQlhZumPC776uUYN-OrlRQu1pcpforJRgWdtL8f2wj_paSMaxBWpOQ-qDHnumTLgIGbweDHg_eWVBNt4BOC6DNebA4snWJz1tlTr_2X54E8wpPd-p4oLwKGIrBKQnzVoGW-SfoXmrPeEWI9FIy2biqOqdDR9QTCmH5r7ejdng_XfWSnyLNSmC5zQ.fxxKnbD0FBqjjeBMUgHERQ
@@ -8,7 +8,7 @@
# The minimum gas prices a validator is willing to accept for processing a
# transaction. A transaction's fees must meet the minimum of any denomination
# specified in this config (e.g. 0.25token1;0.0001token2).
minimum-gas-prices = ""
minimum-gas-prices = "0stake"
# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals
# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node)
@@ -124,6 +124,30 @@ rpc-max-body-bytes = 1000000
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enabled-unsafe-cors = true
###############################################################################
### Rosetta Configuration ###
###############################################################################
[rosetta]
# Enable defines if the Rosetta API server should be enabled.
enable = true
# Address defines the Rosetta API server to listen on.
address = ":8080"
# Network defines the name of the blockchain that will be returned by Rosetta.
blockchain = "app"
# Network defines the name of the network that will be returned by Rosetta.
network = "network"
# Retries defines the number of retries when connecting to the node before failing.
retries = 3
# Offline defines if Rosetta server should run in offline mode.
offline = false
###############################################################################
### gRPC Configuration ###
###############################################################################
@@ -136,6 +160,22 @@ enable = true
# Address defines the gRPC server address to bind to.
address = "0.0.0.0:9090"
###############################################################################
### gRPC Web Configuration ###
###############################################################################
[grpc-web]
# GRPCWebEnable defines if the gRPC-web should be enabled.
# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op.
enable = true
# Address defines the gRPC-web server address to bind to.
address = "0.0.0.0:9091"
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enable-unsafe-cors = false
###############################################################################
### State Sync Configuration ###
###############################################################################
@@ -150,3 +190,10 @@ snapshot-interval = 0
# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all).
snapshot-keep-recent = 2
[wasm]
# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries
query_gas_limit = 300000
# This is the number of wasm vm instances we keep cached in memory for speed-up
# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally
lru_size = 0
@@ -0,0 +1,17 @@
# This is a TOML config file.
# For more information, see https://github.com/toml-lang/toml
###############################################################################
### Client Configuration ###
###############################################################################
# The network chain ID
chain-id = ""
# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory)
keyring-backend = "os"
# CLI output format (text|json)
output = "text"
# <host>:<port> to Tendermint RPC interface for this chain
node = "tcp://localhost:26657"
# Transaction broadcasting mode (sync|async|block)
broadcast-mode = "sync"
@@ -177,7 +177,8 @@ laddr = "tcp://0.0.0.0:26656"
# Address to advertise to peers for them to dial
# If empty, will use the same port as the laddr,
# and will introspect on the listener or use UPnP
# to figure out the address.
# to figure out the address. ip and port are required
# example: 159.89.10.97:26656
external_address = ""
# Comma separated list of seed nodes to connect to
@@ -302,6 +303,13 @@ discovery_time = "15s"
# Will create a new, randomly named directory within, and remove it when done.
temp_dir = ""
# The timeout duration before re-requesting a chunk, possibly from a different
# peer (default: 1 minute).
chunk_request_timeout = "10s"
# The number of concurrent chunk fetchers to run (default: 1).
chunk_fetchers = "4"
#######################################################
### Fast Sync Configuration Connections ###
#######################################################
@@ -6,7 +6,7 @@
{
"@type": "/cosmos.auth.v1beta1.BaseAccount",
"account_number": "0",
"address": "cosmos1urk9gy7cfws0ak9x5nu7lx4un9n6gqkry79679",
"address": "cosmos12nt2hqjps8r065wc02qks88tvqzdeua0ld3jxy",
"pub_key": null,
"sequence": "0"
},
@@ -159,6 +159,9 @@
"tx_size_cost_per_byte": "10"
}
},
"authz": {
"authorization": []
},
"bank": {
"balances": [
{
@@ -213,6 +216,19 @@
}
]
},
{
"address": "cosmos12nt2hqjps8r065wc02qks88tvqzdeua0ld3jxy",
"coins": [
{
"amount": "1000000000",
"denom": "ucosm"
},
{
"amount": "2000000000",
"denom": "ustake"
}
]
},
{
"address": "cosmos1vkv9sfwaak76weyamqx0flmng2vuquxqcuqukh",
"coins": [
@@ -382,19 +398,6 @@
}
]
},
{
"address": "cosmos1urk9gy7cfws0ak9x5nu7lx4un9n6gqkry79679",
"coins": [
{
"amount": "1000000000",
"denom": "ucosm"
},
{
"amount": "2000000000",
"denom": "ustake"
}
]
},
{
"address": "cosmos17yg9mssjenmc3jkqth6ulcwj9cxujrxxzezwta",
"coins": [
@@ -501,6 +504,9 @@
"evidence": {
"evidence": []
},
"feegrant": {
"allowances": []
},
"genutil": {
"gen_txs": [
{
@@ -520,7 +526,7 @@
},
"public_key": {
"@type": "/cosmos.crypto.secp256k1.PubKey",
"key": "AtDcuH4cX1eaxZrJ5shheLG3tXPAoV4awoIZmNQtQxmf"
"key": "A0RZ3+xLf9xJiySHQxQsQtW8HJYEcniJKbFxG2R9ZEQv"
},
"sequence": "0"
}
@@ -528,7 +534,7 @@
},
"body": {
"extension_options": [],
"memo": "ad7cdbcfe545eaaaea99378bc70bf22eef3401a4@172.17.0.2:26656",
"memo": "0dbb06d8489ba6958ef0f77ab797a674ef2451a2@172.17.0.3:26656",
"messages": [
{
"@type": "/cosmos.staking.v1beta1.MsgCreateValidator",
@@ -537,7 +543,7 @@
"max_rate": "0.200000000000000000",
"rate": "0.100000000000000000"
},
"delegator_address": "cosmos1urk9gy7cfws0ak9x5nu7lx4un9n6gqkry79679",
"delegator_address": "cosmos12nt2hqjps8r065wc02qks88tvqzdeua0ld3jxy",
"description": {
"details": "",
"identity": "",
@@ -548,9 +554,9 @@
"min_self_delegation": "1",
"pubkey": {
"@type": "/cosmos.crypto.ed25519.PubKey",
"key": "cUJRDwHyty8ZMO3ctSqPvezcOP2SYp1SDCHd1/SpAuU="
"key": "RbdkQ5nm1sv1P9UkAucotnK9sUTjzGfMMsVLOGEBqx0="
},
"validator_address": "cosmosvaloper1urk9gy7cfws0ak9x5nu7lx4un9n6gqkrp230jk",
"validator_address": "cosmosvaloper12nt2hqjps8r065wc02qks88tvqzdeua06e982h",
"value": {
"amount": "3000000",
"denom": "ustake"
@@ -561,7 +567,7 @@
"timeout_height": "0"
},
"signatures": [
"XCvdrkjv/gl819FCH0rnfDiBm6xIc3Kj1EiN3c3tI/MSekAEEBqNT4FuFFtjVOgs5WT6RZTY75h1JxvHmMfm4g=="
"FUhoV9O/pb16AIvsWJ7bCBzktp9zq7iV/hF2PdcaDwpgc0+nsNX7lOv37EcaBrScDi1TBUGETjEzG80jD+L0zA=="
]
}
]
@@ -631,14 +637,6 @@
"unbonding_delegations": [],
"validators": []
},
"transfer": {
"denom_traces": [],
"params": {
"receive_enabled": true,
"send_enabled": true
},
"port_id": "transfer"
},
"upgrade": {},
"vesting": {}
},
@@ -661,6 +659,6 @@
},
"version": {}
},
"genesis_time": "2021-07-27T15:14:14.2361126Z",
"genesis_time": "2023-04-06T15:56:56.752766256Z",
"initial_height": "1"
}
@@ -0,0 +1 @@
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"simd-moniker","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos12nt2hqjps8r065wc02qks88tvqzdeua0ld3jxy","validator_address":"cosmosvaloper12nt2hqjps8r065wc02qks88tvqzdeua06e982h","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"RbdkQ5nm1sv1P9UkAucotnK9sUTjzGfMMsVLOGEBqx0="},"value":{"denom":"ustake","amount":"3000000"}}],"memo":"0dbb06d8489ba6958ef0f77ab797a674ef2451a2@172.17.0.3:26656","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A0RZ3+xLf9xJiySHQxQsQtW8HJYEcniJKbFxG2R9ZEQv"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":["FUhoV9O/pb16AIvsWJ7bCBzktp9zq7iV/hF2PdcaDwpgc0+nsNX7lOv37EcaBrScDi1TBUGETjEzG80jD+L0zA=="]}
@@ -1 +0,0 @@
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"simd-moniker","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos1urk9gy7cfws0ak9x5nu7lx4un9n6gqkry79679","validator_address":"cosmosvaloper1urk9gy7cfws0ak9x5nu7lx4un9n6gqkrp230jk","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"cUJRDwHyty8ZMO3ctSqPvezcOP2SYp1SDCHd1/SpAuU="},"value":{"denom":"ustake","amount":"3000000"}}],"memo":"ad7cdbcfe545eaaaea99378bc70bf22eef3401a4@172.17.0.2:26656","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AtDcuH4cX1eaxZrJ5shheLG3tXPAoV4awoIZmNQtQxmf"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":["XCvdrkjv/gl819FCH0rnfDiBm6xIc3Kj1EiN3c3tI/MSekAEEBqNT4FuFFtjVOgs5WT6RZTY75h1JxvHmMfm4g=="]}
@@ -1 +1 @@
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"VJWbZaD0jAkAh4VBLS9I2FDFwAKhbCYjs/ycVEDRNW6teVZgaxLnZ+mW3sMhvdIKY99DaD55h9L1MXkx8WsQ+g=="}}
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"F5Kf9O8/zSJIllRI0IWdHnKflvaJyAI2EBKwlFDwgsZDOXoICISKQUmSuvCrAMyJOWh6xY37DjbeQP29XboSgA=="}}
@@ -1,11 +1,11 @@
{
"address": "30AF3420A11D7357C54EB716B209D4C3707D1BF3",
"address": "05FD2790155E3F5827FA30C00CD0E7240160CC39",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "cUJRDwHyty8ZMO3ctSqPvezcOP2SYp1SDCHd1/SpAuU="
"value": "RbdkQ5nm1sv1P9UkAucotnK9sUTjzGfMMsVLOGEBqx0="
},
"priv_key": {
"type": "tendermint/PrivKeyEd25519",
"value": "H/y/XQLnbLKzR3Ey6VCCw0tu87VbA3GO4goA+PPz7VRxQlEPAfK3Lxkw7dy1Ko+97Nw4/ZJinVIMId3X9KkC5Q=="
"value": "sZurlJ9J5pjwmHRRbfl2bbNjXC0wd+TsdECAl1FSsLhFt2RDmebWy/U/1SQC5yi2cr2xROPMZ8wyxUs4YQGrHQ=="
}
}
@@ -2,4 +2,4 @@
"height": "0",
"round": 0,
"step": 0
}
}
@@ -1 +0,0 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMS0wNy0yNyAxNToxNDoxNC42ODc0MDc3ICswMDAwIFVUQyBtPSswLjIyNTIwMDMwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjgtN0l6TXhWUmhrMGlBM2kifQ.9c48lG_ZZDrQ5esu0Tw45oacS4V22SLEIChtqW14z17rJtZuS7XYuw.aVNkJGer3Dv--lIR.ulhj65STVqG5ciBObgXc-oyYndKuOzvp03PH9wnh3WTg77SSjwxpEkIMwd9DpkcfBSL0qBvN7aXLAFEG59ydL5GamUTOU94xFISet6dKjxSWbkBmq4_zWmUbe0Qas4eVvPsb6U5w0PIyVTkZwAHDeMtdaEXthBU1JE4biOoi0uICCJkFyqO01q5nrbN7d45EE8vijdPusxfn-abtvSvXLUTcr50nt_w5_YbxsSZnG52Ty2TiV_fjn_Wq.Aj72rrWgBh9fHj1CIoJ7lA
+1 -1
View File
@@ -1 +1 @@
$2a$10$PUzdQ9WON1SgvDtewSKIUerA9LxW51qGoHj2EGZ5TT6oKfHXU7hcK
$2a$10$9MgTtGMoSpMZgGyxZnSA4uZL3J6x0ABdCHi1w9JhOVGUtFMMBe2mO
@@ -0,0 +1 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0wNiAxNTo1Njo1Ny44OTE0ODEzNCArMDAwMCBVVEMgbT0rMC41NTc0MjU4NzciLCJlbmMiOiJBMjU2R0NNIiwicDJjIjo4MTkyLCJwMnMiOiJNRTFoZW54WkNyaUpfdmxvIn0.WvNOuNRR6MLvrKI6mm2kTPMUKErQwAYSnBIPVO1_XikyYLdfxvtPKg.hcGTDIQB2rJxtwga.TZ4LEwk65Zj5i9PFrVbKJdx1jF0myj4HXuZOR1nslFVvKaFy22t3t073DFogapi27RZzyzUwenDSOY2RsQ5a7NPxfIBQPZ0tjxO9W2c4j-HJod-O3ViFgec3x2AXHP1XYlOdGXiBhq6cDRAoIVd10-ANCL3-ijpXTqGFde0-JmlKkd242QZzNIrg68shhspIgUMho2jzzGfMw5-yPJeoqkJTgdu9vBkpbP4I-Ey3LLyQ48UCQuSS3_5EGPHIdjqm_L6OInMl6jB_dOT2TlsjSLSuk_r4eFr4v7B82IifBFsy-o1VdLc_CqdYhbJJjFvPBUI5ZOdHybxZE-BBoFbCvGsEnK7xHdLozjanMuszuI1Dr3YMnRw.63JsRzaYAOe04zXkbMVAdw
@@ -1 +0,0 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMS0wNy0yNyAxNToxNDoxNC42Njk0MzQ3ICswMDAwIFVUQyBtPSswLjIwNzI1MDUwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjB4YU1QYjR4RVVHS29JeW4ifQ.jLK0jNefYAdHELJr3MPhajfSFJfTAre0yBzqnvS1rhzxou2ZMyMJ3w.4h0CQ8NAekW0lshZ.Cusi2aIkUmPlVKdkzjK7SpgrN8xrFcm_L3mf1zTNFfS1GEKHIjMd7a-c7XVOM06hXF_MuIvdCrlHRsWAzX9HgSPQ_T4aQDx8dzdj6iRxv0rwAKjSVLMpuqT3ASSENuPkP21niOuPCnKohVYACq0hpsrYoEt0wMSqnUF7Smz7-hbYmp4EleCEcvwas4qs2LM_hZWvAEFnNdDGFWeyGrNTXXbwXBpCFnWXH-F9FHVtexlwo0OCTJscWFazn8LVGOepO4mQRnsQQ4XMG6WL18Yclz7TmPi3WKkOHOdyhydu7KX_tAISy-jVpMX41kb5OLABuxXYSM6Q1wnyY4SUHvExJ1b41lSER11tIopHbh_Au6ifRRtD.kbUtqwd5x8QH52nHddfwcA
+5 -3
View File
@@ -23,12 +23,14 @@ echo "Setting up validator ..."
if ! simd keys show validator 2>/dev/null; then
echo "Validator does not yet exist. Creating it ..."
(
# Constant key to get the same validator operator address (cosmosvaloper1...) every time
echo "gather series sample skin gate mask gossip between equip knife total stereo"
echo "$PASSWORD"
echo "$PASSWORD"
) | simd keys add validator
) | simd keys add myvalidator --recover
fi
# hardcode the validator account for this instance
echo "$PASSWORD" | simd add-genesis-account validator "$START_BALANCE"
echo "$PASSWORD" | simd add-genesis-account myvalidator "$START_BALANCE"
echo "Setting up accounts ..."
# (optionally) add a few more genesis accounts
@@ -43,5 +45,5 @@ SELF_DELEGATION="3000000$STAKE" # 3 STAKE (leads to a voting power of 3)
echo "$PASSWORD"
echo "$PASSWORD"
echo "$PASSWORD"
) | simd gentx validator "$SELF_DELEGATION" --offline --chain-id "$CHAIN_ID" --moniker="$MONIKER"
) | simd gentx myvalidator "$SELF_DELEGATION" --offline --chain-id "$CHAIN_ID" --moniker="$MONIKER"
simd collect-gentxs
@@ -0,0 +1 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0wNiAxNTo1Njo1Ny45MjYzNzk4ODIgKzAwMDAgVVRDIG09KzAuNTkyMzI0NTQzIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTDFlYmQwa3ctVUZYN0NibSJ9.hIuLIr8AdbU8xnyNgHZ5MsG6srKoKZz9VJtVN2fc8y7vF77aArSpSw.Ak-8Jsy32o2ORSvZ.aQhvsd6kiOs_qvaLGS5sZAdg2k3UXwWKkZYqfLdGXT62m0f5hkOtzfaRGcVNDbQLawLig3PQlhZumPC776uUYN-OrlRQu1pcpforJRgWdtL8f2wj_paSMaxBWpOQ-qDHnumTLgIGbweDHg_eWVBNt4BOC6DNebA4snWJz1tlTr_2X54E8wpPd-p4oLwKGIrBKQnzVoGW-SfoXmrPeEWI9FIy2biqOqdDR9QTCmH5r7ejdng_XfWSnyLNSmC5zQ.fxxKnbD0FBqjjeBMUgHERQ
@@ -8,7 +8,7 @@
# The minimum gas prices a validator is willing to accept for processing a
# transaction. A transaction's fees must meet the minimum of any denomination
# specified in this config (e.g. 0.25token1;0.0001token2).
minimum-gas-prices = ""
minimum-gas-prices = "0stake"
# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals
# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node)
@@ -124,6 +124,30 @@ rpc-max-body-bytes = 1000000
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enabled-unsafe-cors = true
###############################################################################
### Rosetta Configuration ###
###############################################################################
[rosetta]
# Enable defines if the Rosetta API server should be enabled.
enable = true
# Address defines the Rosetta API server to listen on.
address = ":8080"
# Network defines the name of the blockchain that will be returned by Rosetta.
blockchain = "app"
# Network defines the name of the network that will be returned by Rosetta.
network = "network"
# Retries defines the number of retries when connecting to the node before failing.
retries = 3
# Offline defines if Rosetta server should run in offline mode.
offline = false
###############################################################################
### gRPC Configuration ###
###############################################################################
@@ -136,6 +160,22 @@ enable = true
# Address defines the gRPC server address to bind to.
address = "0.0.0.0:9090"
###############################################################################
### gRPC Web Configuration ###
###############################################################################
[grpc-web]
# GRPCWebEnable defines if the gRPC-web should be enabled.
# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op.
enable = true
# Address defines the gRPC-web server address to bind to.
address = "0.0.0.0:9091"
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enable-unsafe-cors = false
###############################################################################
### State Sync Configuration ###
###############################################################################
@@ -150,3 +190,10 @@ snapshot-interval = 0
# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all).
snapshot-keep-recent = 2
[wasm]
# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries
query_gas_limit = 300000
# This is the number of wasm vm instances we keep cached in memory for speed-up
# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally
lru_size = 0

Some files were not shown because too many files have changed in this diff Show More