Merge pull request #1564 from cosmos/wasmd-0.50

Adapt codebase to work with wasmd 0.50 (Cosmos SDK 0.50)
This commit is contained in:
Simon Warta 2024-03-08 13:00:10 +01:00 committed by GitHub
commit f94b2309f6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 230 additions and 207 deletions

View File

@ -19,11 +19,20 @@ and this project adheres to
import { parseCoins } from "@cosmjs/amino";
```
- @cosmjs/stargate: Let `parseRawLog` gracefully handle empty strings to better
support Cosmos SDK 0.50 inputs. ([#1564])
[#1564]: https://github.com/cosmos/cosmjs/pull/1564
### Fixed
- @cosmjs/encoding: Avoid using replacement character in doc comment to make
external tools happy. ([#1570])
- @cosmjs/cosmwasm-stargate: Use events instead of log parsing to receive
information in SigningCosmWasmClient. This is required to support Cosmos SDK
0.50+ where the `rawLog` field is empty. ([#1564])
[#1564]: https://github.com/cosmos/cosmjs/pull/1564
[#1570]: https://github.com/cosmos/cosmjs/pull/1570
## [0.32.2] - 2023-12-19

View File

@ -46,7 +46,7 @@ async function main(hackatomWasmPath: string) {
// Execute contract
const executeFee = calculateFee(300_000, gasPrice);
const result = await client.execute(alice.address0, contractAddress, { release: {} }, executeFee);
const wasmEvent = result.logs[0].events.find((e) => e.type === "wasm");
const wasmEvent = result.events.find((e) => e.type === "wasm");
console.info("The `wasm` event emitted by the contract execution:", wasmEvent);
}

View File

@ -10,7 +10,7 @@ import {
Registry,
TxBodyEncodeObject,
} from "@cosmjs/proto-signing";
import { assertIsDeliverTxSuccess, coins, logs, MsgSendEncodeObject, StdFee } from "@cosmjs/stargate";
import { assertIsDeliverTxSuccess, coins, MsgSendEncodeObject, StdFee } from "@cosmjs/stargate";
import { assert, sleep } from "@cosmjs/utils";
import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx";
import { ReadonlyDate } from "readonly-date";
@ -188,7 +188,6 @@ describe("CosmWasmClient", () => {
amount: coins(5000, "ucosm"),
gas: "890000",
};
const chainId = await client.getChainId();
const sequenceResponse = await client.getSequence(alice.address0);
assert(sequenceResponse);
@ -222,8 +221,11 @@ describe("CosmWasmClient", () => {
const signedTx = Uint8Array.from(TxRaw.encode(txRaw).finish());
const result = await client.broadcastTx(signedTx);
assertIsDeliverTxSuccess(result);
const amountAttr = logs.findAttribute(logs.parseRawLog(result.rawLog), "transfer", "amount");
expect(amountAttr.value).toEqual("1234567ucosm");
const amountAttrs = result.events
.filter((e) => e.type == "transfer")
.flatMap((e) => e.attributes.filter((a) => a.key == "amount"));
expect(amountAttrs[0].value).toEqual("5000ucosm"); // fee
expect(amountAttrs[1].value).toEqual("1234567ucosm"); // MsgSend amount
expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/);
});
});

View File

@ -7,7 +7,6 @@ import {
coin,
coins,
DeliverTxResponse,
logs,
SigningStargateClient,
StdFee,
} from "@cosmjs/stargate";
@ -15,7 +14,7 @@ import { assert, assertDefined } from "@cosmjs/utils";
import { MsgExecuteContract, MsgInstantiateContract, MsgStoreCode } from "cosmjs-types/cosmwasm/wasm/v1/tx";
import { AbsoluteTxPosition, ContractCodeHistoryOperationType } from "cosmjs-types/cosmwasm/wasm/v1/types";
import { SigningCosmWasmClient } from "../../signingcosmwasmclient";
import { findAttribute, SigningCosmWasmClient } from "../../signingcosmwasmclient";
import {
alice,
bech32AddressMatcher,
@ -385,12 +384,11 @@ describe("WasmExtension", () => {
{
const result = await uploadContract(wallet, getHackatom());
assertIsDeliverTxSuccess(result);
const parsedLogs = logs.parseLogs(logs.parseRawLog(result.rawLog));
const codeIdAttr = logs.findAttribute(parsedLogs, "store_code", "code_id");
const codeIdAttr = findAttribute(result.events, "store_code", "code_id");
codeId = Number.parseInt(codeIdAttr.value, 10);
expect(codeId).toBeGreaterThanOrEqual(1);
expect(codeId).toBeLessThanOrEqual(200);
const actionAttr = logs.findAttribute(parsedLogs, "message", "module");
const actionAttr = findAttribute(result.events, "message", "module");
expect(actionAttr.value).toEqual("wasm");
}
@ -400,12 +398,14 @@ describe("WasmExtension", () => {
{
const result = await instantiateContract(wallet, codeId, beneficiaryAddress, funds);
assertIsDeliverTxSuccess(result);
const parsedLogs = logs.parseLogs(logs.parseRawLog(result.rawLog));
const contractAddressAttr = logs.findAttribute(parsedLogs, "instantiate", "_contract_address");
const contractAddressAttr = findAttribute(result.events, "instantiate", "_contract_address");
contractAddress = contractAddressAttr.value;
const amountAttr = logs.findAttribute(parsedLogs, "transfer", "amount");
expect(amountAttr.value).toEqual("1234ucosm,321ustake");
const actionAttr = logs.findAttribute(parsedLogs, "message", "module");
const amountAttrs = result.events
.filter((e) => e.type == "transfer")
.flatMap((e) => e.attributes.filter((a) => a.key == "amount"));
expect(amountAttrs[0].value).toEqual("5000000ucosm"); // fee
expect(amountAttrs[1].value).toEqual("1234ucosm,321ustake"); // instantiate funds
const actionAttr = findAttribute(result.events, "message", "module");
expect(actionAttr.value).toEqual("wasm");
const balanceUcosm = await client.bank.balance(contractAddress, "ucosm");
@ -418,8 +418,7 @@ describe("WasmExtension", () => {
{
const result = await executeContract(wallet, contractAddress, { release: {} });
assertIsDeliverTxSuccess(result);
const parsedLogs = logs.parseLogs(logs.parseRawLog(result.rawLog));
const wasmEvent = parsedLogs.find(() => true)?.events.find((e) => e.type === "wasm");
const wasmEvent = result.events.find((e) => e.type === "wasm");
assert(wasmEvent, "Event of type wasm expected");
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
expect(wasmEvent.attributes).toContain({

View File

@ -128,6 +128,7 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer access type", async () => {
pendingWithoutWasmd();
pending("wasmd 0.50 does not work with Amino JSON signing");
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);
@ -263,6 +264,7 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer", async () => {
pendingWithoutWasmd();
pending("wasmd 0.50 does not work with Amino JSON signing");
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
@ -313,7 +315,7 @@ describe("SigningCosmWasmClient", () => {
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 salt = Random.getBytes(64); // different salt every time we run the test to avoid address collision erors
const wasm = getHackatom().data;
const msg = {
verifier: alice.address0,
@ -346,6 +348,7 @@ describe("SigningCosmWasmClient", () => {
it("works with Amino JSON signing", async () => {
pendingWithoutWasmd();
pending("wasmd 0.50 does not work with Amino JSON signing");
const aminoJsonWallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, {
prefix: wasmd.prefix,
});
@ -527,6 +530,7 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer", async () => {
pendingWithoutWasmd();
pending("wasmd 0.50 does not work with Amino JSON signing");
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
@ -607,7 +611,7 @@ describe("SigningCosmWasmClient", () => {
expect(result.height).toBeGreaterThan(0);
expect(result.gasWanted).toBeGreaterThan(0);
expect(result.gasUsed).toBeGreaterThan(0);
const wasmEvent = result.logs[0].events.find((e) => e.type === "wasm");
const wasmEvent = result.events.find((e) => e.type === "wasm");
assert(wasmEvent, "Event of type wasm expected");
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
expect(wasmEvent.attributes).toContain({
@ -630,6 +634,7 @@ describe("SigningCosmWasmClient", () => {
it("works with legacy Amino signer", async () => {
pendingWithoutWasmd();
pending("wasmd 0.50 does not work with Amino JSON signing");
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
const client = await SigningCosmWasmClient.connectWithSigner(
wasmd.endpoint,
@ -660,7 +665,7 @@ describe("SigningCosmWasmClient", () => {
{ release: {} },
defaultExecuteFee,
);
const wasmEvent = result.logs[0].events.find((e) => e.type === "wasm");
const wasmEvent = result.events.find((e) => e.type === "wasm");
assert(wasmEvent, "Event of type wasm expected");
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
expect(wasmEvent.attributes).toContain({
@ -727,16 +732,17 @@ describe("SigningCosmWasmClient", () => {
],
"auto",
);
expect(result.logs.length).toEqual(2);
const wasmEvent1 = result.logs[0].events.find((e) => e.type === "wasm");
assert(wasmEvent1, "Event of type wasm expected");
const { events } = result;
const wasmEvents = events.filter((e) => e.type == "wasm");
expect(wasmEvents.length).toEqual(2);
const [wasmEvent1, wasmEvent2] = wasmEvents;
expect(wasmEvent1.type).toEqual("wasm");
expect(wasmEvent1.attributes).toContain({ key: "action", value: "release" });
expect(wasmEvent1.attributes).toContain({
key: "destination",
value: beneficiaryAddress1,
});
const wasmEvent2 = result.logs[1].events.find((e) => e.type === "wasm");
assert(wasmEvent2, "Event of type wasm expected");
expect(wasmEvent2.type).toEqual("wasm");
expect(wasmEvent2.attributes).toContain({ key: "action", value: "release" });
expect(wasmEvent2.attributes).toContain({
key: "destination",
@ -777,7 +783,8 @@ describe("SigningCosmWasmClient", () => {
memo,
);
assertIsDeliverTxSuccess(result);
expect(result.rawLog).toBeTruthy();
expect(result.rawLog).toEqual(""); // empty for wasmd >= 0.50.0 (https://github.com/cosmos/cosmos-sdk/pull/15845)
expect(result.events.length).toBeGreaterThanOrEqual(1);
// got tokens
const after = await client.getBalance(beneficiaryAddress, "ucosm");
@ -816,7 +823,8 @@ describe("SigningCosmWasmClient", () => {
memo,
);
assertIsDeliverTxSuccess(result);
expect(result.rawLog).toBeTruthy();
expect(result.rawLog).toEqual(""); // empty for wasmd >= 0.50.0 (https://github.com/cosmos/cosmos-sdk/pull/15845)
expect(result.events.length).toBeGreaterThanOrEqual(1);
// got tokens
const after = await client.getBalance(beneficiaryAddress, "ucosm");

View File

@ -15,6 +15,7 @@ import {
} from "@cosmjs/proto-signing";
import {
AminoTypes,
Attribute,
calculateFee,
Coin,
createDefaultAminoConverters,
@ -72,6 +73,7 @@ export interface UploadResult {
readonly compressedSize: number;
/** The ID of the code asigned by the chain */
readonly codeId: number;
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
readonly logs: readonly logs.Log[];
/** Block height in which the transaction is included */
readonly height: number;
@ -106,6 +108,7 @@ export interface InstantiateOptions {
export interface InstantiateResult {
/** The address of the newly instantiated contract */
readonly contractAddress: string;
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
readonly logs: readonly logs.Log[];
/** Block height in which the transaction is included */
readonly height: number;
@ -120,6 +123,7 @@ export interface InstantiateResult {
* Result type of updateAdmin and clearAdmin
*/
export interface ChangeAdminResult {
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
readonly logs: readonly logs.Log[];
/** Block height in which the transaction is included */
readonly height: number;
@ -131,6 +135,7 @@ export interface ChangeAdminResult {
}
export interface MigrateResult {
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
readonly logs: readonly logs.Log[];
/** Block height in which the transaction is included */
readonly height: number;
@ -148,6 +153,7 @@ export interface ExecuteInstruction {
}
export interface ExecuteResult {
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
readonly logs: readonly logs.Log[];
/** Block height in which the transaction is included */
readonly height: number;
@ -158,6 +164,24 @@ export interface ExecuteResult {
readonly gasUsed: bigint;
}
/**
* Searches in events for an event of the given event type which contains an
* attribute for with the given key.
*
* Throws if the attribute was not found.
*/
export function findAttribute(events: readonly Event[], eventType: string, attrKey: string): Attribute {
// all attributes from events with the right event type
const attributes = events.filter((event) => event.type === eventType).flatMap((e) => e.attributes);
const out = attributes.find((attr) => attr.key === attrKey);
if (!out) {
throw new Error(
`Could not find attribute '${attrKey}' in first event of type '${eventType}' in first log.`,
);
}
return out;
}
function createDeliverTxResponseErrorMessage(result: DeliverTxResponse): string {
return `Error when broadcasting tx ${result.transactionHash} at height ${result.height}. Code: ${result.code}; Raw log: ${result.rawLog}`;
}
@ -288,14 +312,13 @@ export class SigningCosmWasmClient extends CosmWasmClient {
if (isDeliverTxFailure(result)) {
throw new Error(createDeliverTxResponseErrorMessage(result));
}
const parsedLogs = logs.parseRawLog(result.rawLog);
const codeIdAttr = logs.findAttribute(parsedLogs, "store_code", "code_id");
const codeIdAttr = findAttribute(result.events, "store_code", "code_id");
return {
checksum: toHex(sha256(wasmCode)),
originalSize: wasmCode.length,
compressedSize: compressed.length,
codeId: Number.parseInt(codeIdAttr.value, 10),
logs: parsedLogs,
logs: logs.parseRawLog(result.rawLog),
height: result.height,
transactionHash: result.transactionHash,
events: result.events,
@ -327,11 +350,10 @@ export class SigningCosmWasmClient extends CosmWasmClient {
if (isDeliverTxFailure(result)) {
throw new Error(createDeliverTxResponseErrorMessage(result));
}
const parsedLogs = logs.parseRawLog(result.rawLog);
const contractAddressAttr = logs.findAttribute(parsedLogs, "instantiate", "_contract_address");
const contractAddressAttr = findAttribute(result.events, "instantiate", "_contract_address");
return {
contractAddress: contractAddressAttr.value,
logs: parsedLogs,
logs: logs.parseRawLog(result.rawLog),
height: result.height,
transactionHash: result.transactionHash,
events: result.events,
@ -366,11 +388,10 @@ export class SigningCosmWasmClient extends CosmWasmClient {
if (isDeliverTxFailure(result)) {
throw new Error(createDeliverTxResponseErrorMessage(result));
}
const parsedLogs = logs.parseRawLog(result.rawLog);
const contractAddressAttr = logs.findAttribute(parsedLogs, "instantiate", "_contract_address");
const contractAddressAttr = findAttribute(result.events, "instantiate", "_contract_address");
return {
contractAddress: contractAddressAttr.value,
logs: parsedLogs,
logs: logs.parseRawLog(result.rawLog),
height: result.height,
transactionHash: result.transactionHash,
events: result.events,

View File

@ -101,18 +101,12 @@ export const unused = {
};
export const validator = {
/**
* delegator_address from /cosmos.staking.v1beta1.MsgCreateValidator in scripts/wasmd/template/.wasmd/config/genesis.json
*
* `jq ".app_state.genutil.gen_txs[0].body.messages[0].delegator_address" scripts/wasmd/template/.wasmd/config/genesis.json`
*/
delegatorAddress: "wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj",
/**
* validator_address from /cosmos.staking.v1beta1.MsgCreateValidator in scripts/wasmd/template/.wasmd/config/genesis.json
*
* `jq ".app_state.genutil.gen_txs[0].body.messages[0].validator_address" scripts/wasmd/template/.wasmd/config/genesis.json`
*/
validatorAddress: "wasmvaloper1g6kvj7w4c8g0vhl35kjgpe3jmuauet0ephx9zg",
validatorAddress: "wasmvaloper1k2vfqeu2upskfv7awn29g5kvxxnmugkzy6rch0",
accountNumber: 0,
sequence: 1,
};

View File

@ -54,7 +54,10 @@ export function parseLogs(input: unknown): readonly Log[] {
return input.map(parseLog);
}
export function parseRawLog(input = "[]"): readonly Log[] {
export function parseRawLog(input: string | undefined): readonly Log[] {
// Cosmos SDK >= 0.50 gives us an empty string here. This should be handled like undefined.
if (!input) return [];
const logsToParse = JSON.parse(input).map(({ events }: { events: readonly unknown[] }, i: number) => ({
msg_index: i,
events,

View File

@ -126,6 +126,7 @@ describe("SigningStargateClient", () => {
} else {
expect(result.rawLog).toBeTruthy();
}
expect(result.events.length).toBeGreaterThanOrEqual(1);
// got tokens
const after = await client.getBalance(beneficiaryAddress, "ucosm");
@ -167,6 +168,7 @@ describe("SigningStargateClient", () => {
} else {
expect(result.rawLog).toBeTruthy();
}
expect(result.events.length).toBeGreaterThanOrEqual(1);
// got tokens
const after = await client.getBalance(beneficiaryAddress, "ucosm");

View File

@ -1,5 +1,5 @@
# Choose from https://hub.docker.com/r/cosmwasm/wasmd/tags
REPOSITORY="cosmwasm/wasmd"
VERSION="v0.40.2"
VERSION="v0.50.0"
CONTAINER_NAME="wasmd"

View File

@ -1 +0,0 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNS0zMSAxMzo0ODoyNS43NzY1OTU0MjIgKzAwMDAgVVRDIG09KzEuMjc2NTU2NzEwIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTFF1S3A4bG8yT3RkY2hjWSJ9.Azznc81jL876uGDNiGip1RbCsrKkwyQJb9eOqrAR03YmyHsNPVo56Q.z4LQEsxqYwWrPtc8.8Snx2HnDn9A6psM53b8jRtEcWBfc_ApHqeuZqbn3QVl5NZVLPznCBWIBMJZg530ny2EzUany-VCNcDo_fSEWMsVPu_BX1NdDbeQ71GdWQ1WlrNFjGtUtUF6NUs__q_Hk2jcUSC4wDc9VWIFhOQYu3AF3vbI1KtRG8R0NlVHlqyxKWXWCit4yh6l6bxG33jtSfr-cwhmbQDDg9nZqGfjFVJE3r-1StULrMWuBC7Ed8LeQT6PwLVeQH9aq.4cBIKu90PjNLhbVk28sUnw

View File

@ -0,0 +1 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyNC0wMi0yOCAxODoxNzoyOS43ODc3NDk0NjYgKzAwMDAgVVRDIG09KzAuNTQwNzc0NDE3IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiZFFyTlZBTlNyQjJwT0pyMyJ9.G3rn25Mtxkjn2zn8Absf38F9TCC313z7AE6k6RvO2IowEICeNL5qUw.c8ThJWOUbji8octY.wU0YPWyr8_I7JaU91u4ssl0yu-TTvcTmgPY1aLWHs_J69qslsm0ZG1TuAO4zHBF0D0ekl0DelXWb_1brctaZ8tg1Xwtwukf2hdE4vXjlvOk9kjGGQ1ZtRiRiji1QHrVozRja0tF2NQr7Tl0mt_iyvNLN82Poqvv61bYo7bd4OJ2sGZS7QduZmFGIGj58MPL7IiUAwstzKT3UZ4pK-QGNaCTuEyBDAWNW1HjlJSFRkB4SI09ZgnYhJyyE.k-7pkLpK1JOmKZPMWMbakg

View File

@ -10,6 +10,10 @@
# specified in this config (e.g. 0.25token1;0.0001token2).
minimum-gas-prices = "0stake"
# The maximum gas a query coming over rest/grpc may consume.
# If this is set to zero, the query can consume an unbounded amount of gas.
query-gas-limit = "0"
# default: the last 362880 states are kept, pruning at 10 block intervals
# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node)
# everything: 2 latest states will be kept; pruning at 10 block intervals.
@ -35,15 +39,15 @@ halt-time = 0
# MinRetainBlocks defines the minimum block height offset from the current
# block being committed, such that all blocks past this offset are pruned
# from Tendermint. It is used as part of the process of determining the
# from CometBFT. It is used as part of the process of determining the
# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates
# that no blocks should be pruned.
#
# This configuration value is only responsible for pruning Tendermint blocks.
# This configuration value is only responsible for pruning CometBFT blocks.
# It has no bearing on application state pruning which is determined by the
# "pruning-*" configurations.
#
# Note: Tendermint block pruning is dependant on this parameter in conunction
# Note: CometBFT block pruning is dependant on this parameter in conjunction
# with the unbonding (safety threshold) period, state pruning and state sync
# snapshot parameters to determine the correct minimum value of
# ResponseCommit.RetainHeight.
@ -53,7 +57,7 @@ min-retain-blocks = 0
inter-block-cache = true
# IndexEvents defines the set of events in the form {eventType}.{attributeKey},
# which informs Tendermint what to index. If empty, all events will be indexed.
# which informs CometBFT what to index. If empty, all events will be indexed.
#
# Example:
# ["message.sender", "message.recipient"]
@ -66,14 +70,9 @@ iavl-cache-size = 781250
# Default is false.
iavl-disable-fastnode = false
# IAVLLazyLoading enable/disable the lazy loading of iavl store.
# Default is false.
iavl-lazy-loading = false
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
# An empty string indicates that a fallback will be used.
# First fallback is the deprecated compile-time types.DBBackend value.
# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml.
# The fallback is the db_backend value set in CometBFT's config.toml.
app-db-backend = ""
###############################################################################
@ -123,59 +122,23 @@ enable = true
swagger = false
# Address defines the API server to listen on.
address = "tcp://0.0.0.0:1317"
address = "tcp://localhost:1317"
# MaxOpenConnections defines the number of maximum open connections.
max-open-connections = 1000
# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds).
# RPCReadTimeout defines the CometBFT RPC read timeout (in seconds).
rpc-read-timeout = 10
# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds).
# RPCWriteTimeout defines the CometBFT RPC write timeout (in seconds).
rpc-write-timeout = 0
# RPCMaxBodyBytes defines the Tendermint maximum request body (in bytes).
# RPCMaxBodyBytes defines the CometBFT maximum request body (in bytes).
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
# EnableDefaultSuggestedFee defines if the server should suggest fee by default.
# If 'construction/medata' is called without gas limit and gas price,
# suggested fee based on gas-to-suggest and denom-to-suggest will be given.
enable-fee-suggestion = false
# GasToSuggest defines gas limit when calculating the fee
gas-to-suggest = 200000
# DenomToSuggest defines the defult denom for fee suggestion.
# Price must be in minimum-gas-prices.
denom-to-suggest = "uatom"
###############################################################################
### gRPC Configuration ###
###############################################################################
@ -204,14 +167,9 @@ max-send-msg-size = "2147483647"
# GRPCWebEnable defines if the gRPC-web should be enabled.
# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op.
# NOTE: gRPC-Web uses the same address as the API server.
enable = true
# Address defines the gRPC-web server address to bind to.
address = "localhost:9091"
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
enable-unsafe-cors = false
###############################################################################
### State Sync Configuration ###
###############################################################################
@ -228,27 +186,30 @@ snapshot-interval = 0
snapshot-keep-recent = 2
###############################################################################
### Store / State Streaming ###
### State Streaming ###
###############################################################################
[store]
streamers = []
# Streaming allows nodes to stream state to external systems.
[streaming]
[streamers]
[streamers.file]
keys = ["*", ]
write_dir = ""
prefix = ""
# streaming.abci specifies the configuration for the ABCI Listener streaming service.
[streaming.abci]
# output-metadata specifies if output the metadata file which includes the abci request/responses
# during processing the block.
output-metadata = "true"
# List of kv store keys to stream out via gRPC.
# The store key names MUST match the module's StoreKey name.
#
# Example:
# ["acc", "bank", "gov", "staking", "mint"[,...]]
# ["*"] to expose all keys.
keys = []
# stop-node-on-error specifies if propagate the file streamer errors to consensus state machine.
stop-node-on-error = "true"
# The plugin name used for streaming via gRPC.
# Streaming is only enabled if this is set.
# Supported plugins: abci
plugin = ""
# fsync specifies if call fsync after writing the files.
fsync = "false"
# stop-node-on-err specifies whether to stop the node on message delivery error.
stop-node-on-err = true
###############################################################################
### Mempool ###
@ -261,7 +222,7 @@ fsync = "false"
#
# Note, this configuration only applies to SDK built-in app-side mempool
# implementations.
max-txs = "5000"
max-txs = 5000
[wasm]
# Smart query gas limit is the max gas to be used in a smart query contract call

View File

@ -6,12 +6,12 @@
###############################################################################
# The network chain ID
chain-id = "testing"
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
# <host>:<port> to CometBFT RPC interface for this chain
node = "tcp://localhost:26657"
# Transaction broadcasting mode (sync|async)
broadcast-mode = "sync"

View File

@ -6,6 +6,10 @@
# "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable
# or --home cmd flag.
# The version of the CometBFT binary that created or
# last modified the config file. Do not modify this.
version = "0.38.1"
#######################################################################
### Main Base Config Options ###
#######################################################################
@ -17,14 +21,6 @@ proxy_app = "tcp://127.0.0.1:26658"
# A custom human readable name for this node
moniker = "node001"
# If this node is many blocks behind the tip of the chain, BlockSync
# allows them to catchup quickly by downloading blocks in parallel
# and verifying their commits
#
# Deprecated: this key will be removed and BlockSync will be enabled
# unconditionally in the next major release.
block_sync = true
# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb
# * goleveldb (github.com/syndtr/goleveldb - most popular implementation)
# - pure go
@ -204,11 +200,9 @@ pprof_laddr = "localhost:6060"
# Address to listen for incoming connections
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. ip and port are required
# example: 159.89.10.97: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 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
@ -217,9 +211,6 @@ seeds = ""
# Comma separated list of nodes to keep persistent connections to
persistent_peers = ""
# UPNP port forwarding
upnp = false
# Path to address book
addr_book_file = "config/addrbook.json"
@ -275,13 +266,24 @@ dial_timeout = "3s"
#######################################################
[mempool]
# Mempool version to use:
# 1) "v0" - (default) FIFO mempool.
# 2) "v1" - prioritized mempool (deprecated; will be removed in the next release).
version = "v0"
# Recheck (default: true) defines whether CometBFT should recheck the
# validity for all remaining transaction in the mempool after a block.
# Since a block affects the application state, some transactions in the
# mempool may become invalid. If this does not apply to your application,
# you can disable rechecking.
recheck = true
# Broadcast (default: true) defines whether the mempool should relay
# transactions to other peers. Setting this to false will stop the mempool
# from relaying transactions to other peers until they are included in a
# block. In other words, if Broadcast is disabled, only the peer you send
# the tx to will see it until it is included in a block.
broadcast = true
# WalPath (default: "") configures the location of the Write Ahead Log
# (WAL) for the mempool. The WAL is disabled by default. To enable, set
# WalPath to where you want the WAL to be written (e.g.
# "data/mempool.wal").
wal_dir = ""
# Maximum number of transactions in the mempool
@ -309,21 +311,19 @@ max_tx_bytes = 1048576
# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796
max_batch_bytes = 0
# ttl-duration, if non-zero, defines the maximum amount of time a transaction
# can exist for in the mempool.
#
# Note, if ttl-num-blocks is also defined, a transaction will be removed if it
# has existed in the mempool at least ttl-num-blocks number of blocks or if it's
# insertion time into the mempool is beyond ttl-duration.
ttl-duration = "0s"
# ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction
# can exist for in the mempool.
#
# Note, if ttl-duration is also defined, a transaction will be removed if it
# has existed in the mempool at least ttl-num-blocks number of blocks or if
# it's insertion time into the mempool is beyond ttl-duration.
ttl-num-blocks = 0
# Experimental parameters to limit gossiping txs to up to the specified number of peers.
# We use two independent upper values for persistent peers and for non-persistent peers.
# Unconditional peers are not affected by this feature.
# If we are connected to more than the specified number of persistent peers, only send txs to
# the first experimental_max_gossip_connections_to_persistent_peers of them. If one of those
# persistent peers disconnects, activate another persistent peer. Similarly for non-persistent
# peers, with an upper limit of experimental_max_gossip_connections_to_non_persistent_peers.
# If set to 0, the feature is disabled for the corresponding group of peers, that is, the
# number of active connections to that group of peers is not bounded.
# For non-persistent peers, if enabled, a value of 10 is recommended based on experimental
# performance results using the default P2P configuration.
experimental_max_gossip_connections_to_persistent_peers = 0
experimental_max_gossip_connections_to_non_persistent_peers = 0
#######################################################
### State Sync Configuration Options ###
@ -367,7 +367,7 @@ chunk_fetchers = "4"
[blocksync]
# Block Sync version to use:
#
#
# In v0.37, v1 and v2 of the block sync protocols were deprecated.
# Please use v0 instead.
#

View File

@ -1,5 +1,6 @@
{
"app_hash": "",
"app_hash": null,
"app_name": "wasmd",
"app_state": {
"07-tendermint": null,
"auth": {
@ -7,7 +8,7 @@
{
"@type": "/cosmos.auth.v1beta1.BaseAccount",
"account_number": "0",
"address": "wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj",
"address": "wasm1k2vfqeu2upskfv7awn29g5kvxxnmugkz3xkye4",
"pub_key": null,
"sequence": "0"
},
@ -338,19 +339,6 @@
}
]
},
{
"address": "wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj",
"coins": [
{
"amount": "1000000000",
"denom": "ucosm"
},
{
"amount": "1000000000",
"denom": "ustake"
}
]
},
{
"address": "wasm1f3pws3ztnp3s4nn5zxqdrl9vlqv5avkq3rjfe7",
"coins": [
@ -455,6 +443,19 @@
}
]
},
{
"address": "wasm1k2vfqeu2upskfv7awn29g5kvxxnmugkz3xkye4",
"coins": [
{
"amount": "1000000000",
"denom": "ucosm"
},
{
"amount": "1000000000",
"denom": "ustake"
}
]
},
{
"address": "wasm1hsm76p4ahyhl5yh3ve9ur49r5kemhp2r93f89d",
"coins": [
@ -620,6 +621,10 @@
"index": "1",
"owners": []
},
"circuit": {
"account_permissions": [],
"disabled_type_urls": []
},
"consensus": null,
"crisis": {
"constant_fee": {
@ -678,7 +683,7 @@
},
"public_key": {
"@type": "/cosmos.crypto.secp256k1.PubKey",
"key": "AuFzwOjmNa2qCjK5SyaWwu2DH8tpIcqhm2EdwoWeZVs1"
"key": "A1PeWP+eFZg8bYxgYzUyaeGWZgHIqRARDLKeb2MTJ3+W"
},
"sequence": "0"
}
@ -687,7 +692,7 @@
},
"body": {
"extension_options": [],
"memo": "219053a07bda81b7669c126f8308c668fe0b217a@172.17.0.2:26656",
"memo": "d762d7e639a8733cfe121cd1a431cf19aac4970a@172.17.0.4:26656",
"messages": [
{
"@type": "/cosmos.staking.v1beta1.MsgCreateValidator",
@ -696,7 +701,7 @@
"max_rate": "0.200000000000000000",
"rate": "0.100000000000000000"
},
"delegator_address": "wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj",
"delegator_address": "",
"description": {
"details": "",
"identity": "",
@ -707,9 +712,9 @@
"min_self_delegation": "1",
"pubkey": {
"@type": "/cosmos.crypto.ed25519.PubKey",
"key": "Wl41mDACwzdenqf7Ehq9jvDGRJ3AyFp0J9N6jAbnV3s="
"key": "Hg7F1/5m61tUBvTppqh/cFq4Og09pZH5iEf+d9eAzb0="
},
"validator_address": "wasmvaloper1g6kvj7w4c8g0vhl35kjgpe3jmuauet0ephx9zg",
"validator_address": "wasmvaloper1k2vfqeu2upskfv7awn29g5kvxxnmugkzy6rch0",
"value": {
"amount": "250000000",
"denom": "ustake"
@ -720,18 +725,27 @@
"timeout_height": "0"
},
"signatures": [
"xBiKWraC8m+L0KCtBGWnQlD0eEKEqcwPdjDY02YNefsTr52v1xwoFieFuUbfuLkUEBQXWp/cRNwBFR9qTkV0rA=="
"fEgp9HnUJAhLkkLJr/WesljZe/aGPHQj8LGluaCXXf5xO7oc1ldS6HdcHpleLQ8Gefghu0JpcKE+W3w3rWvHDg=="
]
}
]
},
"gov": {
"constitution": "",
"deposit_params": null,
"deposits": [],
"params": {
"burn_proposal_deposit_prevote": false,
"burn_vote_quorum": false,
"burn_vote_veto": true,
"expedited_min_deposit": [
{
"amount": "50000000",
"denom": "ustake"
}
],
"expedited_threshold": "0.667000000000000000",
"expedited_voting_period": "86400s",
"max_deposit_period": "172800s",
"min_deposit": [
{
@ -739,7 +753,10 @@
"denom": "ustake"
}
],
"min_deposit_ratio": "0.010000000000000000",
"min_initial_deposit_ratio": "0.000000000000000000",
"proposal_cancel_dest": "",
"proposal_cancel_ratio": "0.500000000000000000",
"quorum": "0.334000000000000000",
"threshold": "0.500000000000000000",
"veto_threshold": "0.334000000000000000",
@ -781,7 +798,8 @@
"params": {
"allowed_clients": [
"06-solomachine",
"07-tendermint"
"07-tendermint",
"09-localhost"
]
}
},
@ -868,7 +886,8 @@
"receive_enabled": true,
"send_enabled": true
},
"port_id": "transfer"
"port_id": "transfer",
"total_escrowed": []
},
"upgrade": {},
"vesting": {},
@ -877,7 +896,6 @@
"contracts": [],
"params": {
"code_upload_access": {
"address": "",
"addresses": [],
"permission": "Everybody"
},
@ -886,26 +904,32 @@
"sequences": []
}
},
"app_version": "0.50.0",
"chain_id": "testing",
"consensus_params": {
"block": {
"max_bytes": "22020096",
"max_gas": "-1"
},
"evidence": {
"max_age_duration": "172800000000000",
"max_age_num_blocks": "100000",
"max_bytes": "1048576"
},
"validator": {
"pub_key_types": [
"ed25519"
]
},
"version": {
"app": "0"
"consensus": {
"params": {
"abci": {
"vote_extensions_enable_height": "0"
},
"block": {
"max_bytes": "22020096",
"max_gas": "-1"
},
"evidence": {
"max_age_duration": "172800000000000",
"max_age_num_blocks": "100000",
"max_bytes": "1048576"
},
"validator": {
"pub_key_types": [
"ed25519"
]
},
"version": {
"app": "0"
}
}
},
"genesis_time": "2023-05-31T13:48:23.278155129Z",
"initial_height": "1"
"genesis_time": "2024-02-28T18:17:28.773922633Z",
"initial_height": 1
}

View File

@ -1 +0,0 @@
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"node001","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj","validator_address":"wasmvaloper1g6kvj7w4c8g0vhl35kjgpe3jmuauet0ephx9zg","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Wl41mDACwzdenqf7Ehq9jvDGRJ3AyFp0J9N6jAbnV3s="},"value":{"denom":"ustake","amount":"250000000"}}],"memo":"219053a07bda81b7669c126f8308c668fe0b217a@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":"AuFzwOjmNa2qCjK5SyaWwu2DH8tpIcqhm2EdwoWeZVs1"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""},"tip":null},"signatures":["xBiKWraC8m+L0KCtBGWnQlD0eEKEqcwPdjDY02YNefsTr52v1xwoFieFuUbfuLkUEBQXWp/cRNwBFR9qTkV0rA=="]}

View File

@ -0,0 +1 @@
{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"node001","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"","validator_address":"wasmvaloper1k2vfqeu2upskfv7awn29g5kvxxnmugkzy6rch0","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"Hg7F1/5m61tUBvTppqh/cFq4Og09pZH5iEf+d9eAzb0="},"value":{"denom":"ustake","amount":"250000000"}}],"memo":"d762d7e639a8733cfe121cd1a431cf19aac4970a@172.17.0.4:26656","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A1PeWP+eFZg8bYxgYzUyaeGWZgHIqRARDLKeb2MTJ3+W"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""},"tip":null},"signatures":["fEgp9HnUJAhLkkLJr/WesljZe/aGPHQj8LGluaCXXf5xO7oc1ldS6HdcHpleLQ8Gefghu0JpcKE+W3w3rWvHDg=="]}

View File

@ -1 +1 @@
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"A6ZsZSk2zdZL3YeCiem6mL8pBlI++ETuaoWX45/5/rUN/QglRAokL1S2EBWyl6t5B0CZ5ilRy/vdzcywgdhS5A=="}}
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"tn2knzIzO3GsIfcOjrgsHhbnLwQYz3aMkw4oGtTa6Ykbzg0HWwqhLOyLcO/v76CbQ8ab/MDUmg6UP82ZHyQkqA=="}}

View File

@ -1,11 +1,11 @@
{
"address": "A705A5DDB2B289539B3FC9023274D19A807F52DD",
"address": "FE3F55B7F2338218467C07F12B9374FDACC2DB12",
"pub_key": {
"type": "tendermint/PubKeyEd25519",
"value": "Wl41mDACwzdenqf7Ehq9jvDGRJ3AyFp0J9N6jAbnV3s="
"value": "Hg7F1/5m61tUBvTppqh/cFq4Og09pZH5iEf+d9eAzb0="
},
"priv_key": {
"type": "tendermint/PrivKeyEd25519",
"value": "yXLB65vCSDp7MnaXiP4CR4h1T8u0PoTNx9oaZ+pV7I5aXjWYMALDN16ep/sSGr2O8MZEncDIWnQn03qMBudXew=="
"value": "lzpks1F8BO9CKR5PUcPn74PFnGwpqajU9r7NpWv7YggeDsXX/mbrW1QG9OmmqH9wWrg6DT2lkfmIR/5314DNvQ=="
}
}

2
scripts/wasmd/template/.wasmd/keyhash Executable file → Normal file
View File

@ -1 +1 @@
$2a$10$Mbw.f93oEBpmvaOBQyyUR.TdPqVGmQVDeOEcF6nYj8UNvQqzXyOze
$2a$10$cxUpxoR9u6Kssy4YiYFuYus/OLYlGbyQ5M0uNp5Fpc/husRw7Aeca

View File

@ -1 +1 @@
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNS0zMSAxMzo0ODoyNS43MzkxNTE3MTQgKzAwMDAgVVRDIG09KzEuMjM5MTEyOTYwIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiZHBTeDBLLUpnbGRfelFVLSJ9.rt9aldqmQvbubYRm-WrkP2wFkrD-Iw6UaF1rubXbdUQYTKcMauoofw.80DUPvcF4gmT1g7W.1Q-DGKR718nIVyOLgFDQZBbbCjNcjXyTTzt5W_3wi9gaiGyq4y1pU-KIyl7VCP9x5ccdM3sTRofVzhoCa4jthwPJT1uzx80_qiCazTwBqrcb6tdCbBQUNDAvXteOIjxqaow3dYufD6LvJ0hszAnydSKU_25dk9qzW8d0Kqv4U1KkwJMq7ryQLJrWv_wtXVcrd4Gwfz4qszbA3WiGgpsxr5nB5mIxEoIzFdRhaX6hBoZ5Cy8vas_DQpVO0eMU_z9vmcwxV0qqk8jOkVGh2pjSIfeZcKdSlRiIoThaaoA4KG660tfOwuoUii1LxZmCsEQN7TnPu6yvbS7C3zQUMmbE0eReR0z3lF8XQE5gJpQ3kdZA-9UWOI7_KoLTF0VMafd18DD3mMUU3XZW3gQ1xpSgYjeXj3MCQT3_ZWaL5z9c8lMPoJeyHJgo-6T51p4h3H1rQPraHs0x27U.pLqlPlIHGb4rU8rQ5Wm7OQ
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyNC0wMi0yOCAxODoxNzoyOS43Nzk1NjM3MTYgKzAwMDAgVVRDIG09KzAuNTMyNTg4NTg0IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoicnBTNXpacjYzRU1VQ2I3VyJ9.PIPyi1iULR8fyzDz3O_NX93QiCN1okXNLcer4lfPzcckSmbOQQ8Hlg.yXi7NEdt49jEf1Tr.Gtwi8uAidqO7UJzXQFxNoTEG-XdT_vHRwYxkAJUbkUb-2m58BtLvsYPNfLHQcK4Blm7TemlHo5BHlg4MFfN7UgLLPx1YjHLgG8Ijjr9YfF30NnP9cAAW7112-qObjSnUBXpzEkb0dauDxsZVSTWxCsZqgUKEmjNYmeuu5SFbJCj6cQYCMsw3P8UvMkrO-WOCi5-6cibP5e-7H85fR_txY_7Oyhh0G2KYnBxedGbE6WMJsrUxV0FU0GcU-xAGcXEa5IRs_2g0TemuAtDz89s9Ut8W4ddCMVZxZSBWnjnyZahWl0P-sVOS_K7TXdxcJI8HSNOJ6syr5ZYAVOhRRfVZbg4QxNrSoy02ASyCY8y9-f1q0YGZnm65a1IozJmYN2-ItkFktt-cy9o-5DbhNr0-iJgWxgjc4PgFAfM3-tkmUvopUVA-kdsX3XWcPXN929b_EK95Gyqc-XE.g-CDOO0z4_tsXy4En8bqgQ