mirror of
https://github.com/cosmos/cosmjs.git
synced 2025-03-10 21:49:15 +00:00
Merge branch 'main' into feat/add-staking-cancel-unbond-msg
This commit is contained in:
commit
eab213610d
42
.pnp.cjs
generated
42
.pnp.cjs
generated
@ -16420,7 +16420,8 @@ class ZipFS extends BasePortableFakeFS {
|
|||||||
stream$1.destroy();
|
stream$1.destroy();
|
||||||
},
|
},
|
||||||
bytesRead: 0,
|
bytesRead: 0,
|
||||||
path: p
|
path: p,
|
||||||
|
pending: false
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
const immediate = setImmediate(async () => {
|
const immediate = setImmediate(async () => {
|
||||||
@ -16461,11 +16462,12 @@ class ZipFS extends BasePortableFakeFS {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
bytesWritten: 0,
|
|
||||||
path: p,
|
|
||||||
close() {
|
close() {
|
||||||
stream$1.destroy();
|
stream$1.destroy();
|
||||||
}
|
},
|
||||||
|
bytesWritten: 0,
|
||||||
|
path: p,
|
||||||
|
pending: false
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
stream$1.on(`data`, (chunk) => {
|
stream$1.on(`data`, (chunk) => {
|
||||||
@ -17405,18 +17407,10 @@ class ProxiedFS extends FakeFS {
|
|||||||
return this.baseFs.symlinkSync(mappedTarget, mappedP, type);
|
return this.baseFs.symlinkSync(mappedTarget, mappedP, type);
|
||||||
}
|
}
|
||||||
async readFilePromise(p, encoding) {
|
async readFilePromise(p, encoding) {
|
||||||
if (encoding === `utf8`) {
|
|
||||||
return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding);
|
return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding);
|
||||||
} else {
|
|
||||||
return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
readFileSync(p, encoding) {
|
readFileSync(p, encoding) {
|
||||||
if (encoding === `utf8`) {
|
|
||||||
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
||||||
} else {
|
|
||||||
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
async readdirPromise(p, opts) {
|
async readdirPromise(p, opts) {
|
||||||
return this.baseFs.readdirPromise(this.mapToBase(p), opts);
|
return this.baseFs.readdirPromise(this.mapToBase(p), opts);
|
||||||
@ -18142,24 +18136,14 @@ class ZipOpenFS extends BasePortableFakeFS {
|
|||||||
}
|
}
|
||||||
async readFilePromise(p, encoding) {
|
async readFilePromise(p, encoding) {
|
||||||
return this.makeCallPromise(p, async () => {
|
return this.makeCallPromise(p, async () => {
|
||||||
switch (encoding) {
|
|
||||||
case `utf8`:
|
|
||||||
return await this.baseFs.readFilePromise(p, encoding);
|
return await this.baseFs.readFilePromise(p, encoding);
|
||||||
default:
|
|
||||||
return await this.baseFs.readFilePromise(p, encoding);
|
|
||||||
}
|
|
||||||
}, async (zipFs, { subPath }) => {
|
}, async (zipFs, { subPath }) => {
|
||||||
return await zipFs.readFilePromise(subPath, encoding);
|
return await zipFs.readFilePromise(subPath, encoding);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
readFileSync(p, encoding) {
|
readFileSync(p, encoding) {
|
||||||
return this.makeCallSync(p, () => {
|
return this.makeCallSync(p, () => {
|
||||||
switch (encoding) {
|
|
||||||
case `utf8`:
|
|
||||||
return this.baseFs.readFileSync(p, encoding);
|
return this.baseFs.readFileSync(p, encoding);
|
||||||
default:
|
|
||||||
return this.baseFs.readFileSync(p, encoding);
|
|
||||||
}
|
|
||||||
}, (zipFs, { subPath }) => {
|
}, (zipFs, { subPath }) => {
|
||||||
return zipFs.readFileSync(subPath, encoding);
|
return zipFs.readFileSync(subPath, encoding);
|
||||||
});
|
});
|
||||||
@ -18851,16 +18835,7 @@ function patchFs(patchedFs, fakeFs) {
|
|||||||
patchedFs.realpathSync.native = patchedFs.realpathSync;
|
patchedFs.realpathSync.native = patchedFs.realpathSync;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const origEmitWarning = process.emitWarning;
|
const patchedFsPromises = patchedFs.promises;
|
||||||
process.emitWarning = () => {
|
|
||||||
};
|
|
||||||
let patchedFsPromises;
|
|
||||||
try {
|
|
||||||
patchedFsPromises = patchedFs.promises;
|
|
||||||
} finally {
|
|
||||||
process.emitWarning = origEmitWarning;
|
|
||||||
}
|
|
||||||
if (typeof patchedFsPromises !== `undefined`) {
|
|
||||||
for (const fnName of ASYNC_IMPLEMENTATIONS) {
|
for (const fnName of ASYNC_IMPLEMENTATIONS) {
|
||||||
const origName = fnName.replace(/Promise$/, ``);
|
const origName = fnName.replace(/Promise$/, ``);
|
||||||
if (typeof patchedFsPromises[origName] === `undefined`)
|
if (typeof patchedFsPromises[origName] === `undefined`)
|
||||||
@ -18883,7 +18858,6 @@ function patchFs(patchedFs, fakeFs) {
|
|||||||
return new FileHandle(fd, fakeFs);
|
return new FileHandle(fd, fakeFs);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
{
|
{
|
||||||
patchedFs.read[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => {
|
patchedFs.read[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => {
|
||||||
const res = fakeFs.readPromise(fd, buffer, ...args);
|
const res = fakeFs.readPromise(fd, buffer, ...args);
|
||||||
@ -25129,7 +25103,7 @@ function makeManager(pnpapi, opts) {
|
|||||||
apiEntry.lastRefreshCheck = timeNow;
|
apiEntry.lastRefreshCheck = timeNow;
|
||||||
const stats = opts.fakeFs.statSync(pnpApiPath);
|
const stats = opts.fakeFs.statSync(pnpApiPath);
|
||||||
if (stats.mtime > apiEntry.stats.mtime) {
|
if (stats.mtime > apiEntry.stats.mtime) {
|
||||||
process.emitWarning(`[Warning] The runtime detected new informations in a PnP file; reloading the API instance (${npath.fromPortablePath(pnpApiPath)})`);
|
process.emitWarning(`[Warning] The runtime detected new information in a PnP file; reloading the API instance (${npath.fromPortablePath(pnpApiPath)})`);
|
||||||
apiEntry.stats = stats;
|
apiEntry.stats = stats;
|
||||||
apiEntry.instance = loadApiInstance(pnpApiPath);
|
apiEntry.instance = loadApiInstance(pnpApiPath);
|
||||||
}
|
}
|
||||||
|
29
.pnp.loader.mjs
generated
29
.pnp.loader.mjs
generated
@ -1190,18 +1190,10 @@ class ProxiedFS extends FakeFS {
|
|||||||
return this.baseFs.symlinkSync(mappedTarget, mappedP, type);
|
return this.baseFs.symlinkSync(mappedTarget, mappedP, type);
|
||||||
}
|
}
|
||||||
async readFilePromise(p, encoding) {
|
async readFilePromise(p, encoding) {
|
||||||
if (encoding === `utf8`) {
|
|
||||||
return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding);
|
return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding);
|
||||||
} else {
|
|
||||||
return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
readFileSync(p, encoding) {
|
readFileSync(p, encoding) {
|
||||||
if (encoding === `utf8`) {
|
|
||||||
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
||||||
} else {
|
|
||||||
return this.baseFs.readFileSync(this.fsMapToBase(p), encoding);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
async readdirPromise(p, opts) {
|
async readdirPromise(p, opts) {
|
||||||
return this.baseFs.readdirPromise(this.mapToBase(p), opts);
|
return this.baseFs.readdirPromise(this.mapToBase(p), opts);
|
||||||
@ -1333,7 +1325,7 @@ 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_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 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 WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13;
|
||||||
const HAS_LAZY_LOADED_TRANSLATORS = major > 19 || major === 19 && minor >= 3;
|
const HAS_LAZY_LOADED_TRANSLATORS = major === 20 && minor < 6 || major === 19 && minor >= 3;
|
||||||
|
|
||||||
const builtinModules = new Set(Module.builtinModules || Object.keys(process.binding(`natives`)));
|
const builtinModules = new Set(Module.builtinModules || Object.keys(process.binding(`natives`)));
|
||||||
const isBuiltinModule = (request) => request.startsWith(`node:`) || builtinModules.has(request);
|
const isBuiltinModule = (request) => request.startsWith(`node:`) || builtinModules.has(request);
|
||||||
@ -2012,10 +2004,24 @@ async function resolve$1(originalSpecifier, context, nextResolve) {
|
|||||||
|
|
||||||
if (!HAS_LAZY_LOADED_TRANSLATORS) {
|
if (!HAS_LAZY_LOADED_TRANSLATORS) {
|
||||||
const binding = process.binding(`fs`);
|
const binding = process.binding(`fs`);
|
||||||
const originalfstat = binding.fstat;
|
const originalReadFile = binding.readFileUtf8 || binding.readFileSync;
|
||||||
|
if (originalReadFile) {
|
||||||
|
binding[originalReadFile.name] = function(...args) {
|
||||||
|
try {
|
||||||
|
return fs.readFileSync(args[0], {
|
||||||
|
encoding: `utf8`,
|
||||||
|
flag: args[1]
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
}
|
||||||
|
return originalReadFile.apply(this, args);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
const binding2 = process.binding(`fs`);
|
||||||
|
const originalfstat = binding2.fstat;
|
||||||
const ZIP_MASK = 4278190080;
|
const ZIP_MASK = 4278190080;
|
||||||
const ZIP_MAGIC = 704643072;
|
const ZIP_MAGIC = 704643072;
|
||||||
binding.fstat = function(...args) {
|
binding2.fstat = function(...args) {
|
||||||
const [fd, useBigint, req] = args;
|
const [fd, useBigint, req] = args;
|
||||||
if ((fd & ZIP_MASK) === ZIP_MAGIC && useBigint === false && req === void 0) {
|
if ((fd & ZIP_MASK) === ZIP_MAGIC && useBigint === false && req === void 0) {
|
||||||
try {
|
try {
|
||||||
@ -2038,6 +2044,7 @@ if (!HAS_LAZY_LOADED_TRANSLATORS) {
|
|||||||
return originalfstat.apply(this, args);
|
return originalfstat.apply(this, args);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const resolve = resolve$1;
|
const resolve = resolve$1;
|
||||||
const getFormat = HAS_CONSOLIDATED_HOOKS ? void 0 : getFormat$1;
|
const getFormat = HAS_CONSOLIDATED_HOOKS ? void 0 : getFormat$1;
|
||||||
|
874
.yarn/releases/yarn-3.6.3.cjs
vendored
874
.yarn/releases/yarn-3.6.3.cjs
vendored
File diff suppressed because one or more lines are too long
875
.yarn/releases/yarn-3.8.0.cjs
vendored
Executable file
875
.yarn/releases/yarn-3.8.0.cjs
vendored
Executable file
File diff suppressed because one or more lines are too long
@ -13,4 +13,4 @@ plugins:
|
|||||||
|
|
||||||
pnpMode: loose
|
pnpMode: loose
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-3.6.3.cjs
|
yarnPath: .yarn/releases/yarn-3.8.0.cjs
|
||||||
|
45
CHANGELOG.md
45
CHANGELOG.md
@ -6,6 +6,48 @@ and this project adheres to
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- @cosmjs/tendermint-rpc: fix node info check to accept empty string on channels
|
||||||
|
field ([#1591])
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- @cosmjs/stargate, @cosmjs/cosmwasm-stargate: Synchronize the default gas
|
||||||
|
multiplier value between the `signAndBroadcast` and `signAndBroadcastSync`
|
||||||
|
methods so that it is equal to 1.4 everywhere. ([#1584])
|
||||||
|
|
||||||
|
## [0.32.3] - 2024-03-08
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- @cosmjs/amino: Add IBC denom support to `parseCoins` and use the same
|
||||||
|
implementation in all those imports:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { parseCoins } from "@cosmjs/proto-signing";
|
||||||
|
// equals
|
||||||
|
import { parseCoins } from "@cosmjs/stargate";
|
||||||
|
// equals
|
||||||
|
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
|
## [0.32.2] - 2023-12-19
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
@ -1412,7 +1454,8 @@ CHANGELOG entries missing. Please see [the diff][0.24.1].
|
|||||||
`FeeTable`. @cosmjs/cosmwasm has its own `FeeTable` with those properties.
|
`FeeTable`. @cosmjs/cosmwasm has its own `FeeTable` with those properties.
|
||||||
- @cosmjs/sdk38: Rename package to @cosmjs/launchpad.
|
- @cosmjs/sdk38: Rename package to @cosmjs/launchpad.
|
||||||
|
|
||||||
[unreleased]: https://github.com/cosmos/cosmjs/compare/v0.32.2...HEAD
|
[unreleased]: https://github.com/cosmos/cosmjs/compare/v0.32.3...HEAD
|
||||||
|
[0.32.3]: https://github.com/cosmos/cosmjs/compare/v0.32.2...v0.32.3
|
||||||
[0.32.2]: https://github.com/cosmos/cosmjs/compare/v0.32.1...v0.32.2
|
[0.32.2]: https://github.com/cosmos/cosmjs/compare/v0.32.1...v0.32.2
|
||||||
[0.32.1]: https://github.com/cosmos/cosmjs/compare/v0.32.0...v0.32.1
|
[0.32.1]: https://github.com/cosmos/cosmjs/compare/v0.32.0...v0.32.1
|
||||||
[0.32.0]: https://github.com/cosmos/cosmjs/compare/v0.31.3...v0.32.0
|
[0.32.0]: https://github.com/cosmos/cosmjs/compare/v0.31.3...v0.32.0
|
||||||
|
@ -50,5 +50,5 @@
|
|||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"typescript": "~4.9"
|
"typescript": "~4.9"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@3.6.3"
|
"packageManager": "yarn@3.8.0"
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/amino",
|
"name": "@cosmjs/amino",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Helpers for Amino based signing.",
|
"description": "Helpers for Amino based signing.",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Simon Warta <webmaster128@users.noreply.github.com>"
|
"Simon Warta <webmaster128@users.noreply.github.com>"
|
||||||
|
@ -81,15 +81,41 @@ describe("coins", () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works for two", () => {
|
it("works for various denoms", () => {
|
||||||
expect(parseCoins("819966000ucosm,700000000ustake")).toEqual([
|
// very short (3)
|
||||||
|
expect(parseCoins("7643bar")).toEqual([
|
||||||
{
|
{
|
||||||
amount: "819966000",
|
amount: "7643",
|
||||||
denom: "ucosm",
|
denom: "bar",
|
||||||
},
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// very long (128)
|
||||||
|
expect(
|
||||||
|
parseCoins(
|
||||||
|
"7643abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh",
|
||||||
|
),
|
||||||
|
).toEqual([
|
||||||
{
|
{
|
||||||
amount: "700000000",
|
amount: "7643",
|
||||||
denom: "ustake",
|
denom:
|
||||||
|
"abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// IBC denom (https://github.com/cosmos/cosmos-sdk/blob/v0.42.7/types/coin_test.go#L512-L519)
|
||||||
|
expect(parseCoins("7643ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2")).toEqual([
|
||||||
|
{
|
||||||
|
amount: "7643",
|
||||||
|
denom: "ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Token factory denom (https://docs.osmosis.zone/osmosis-core/modules/tokenfactory/)
|
||||||
|
expect(parseCoins("100000000000factory/osmo1c584m4lq25h83yp6ag8hh4htjr92d954vklzja/ufoo")).toEqual([
|
||||||
|
{
|
||||||
|
amount: "100000000000",
|
||||||
|
denom: "factory/osmo1c584m4lq25h83yp6ag8hh4htjr92d954vklzja/ufoo",
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
@ -144,6 +170,19 @@ describe("coins", () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("works for two", () => {
|
||||||
|
expect(parseCoins("819966000ucosm,700000000ustake")).toEqual([
|
||||||
|
{
|
||||||
|
amount: "819966000",
|
||||||
|
denom: "ucosm",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
amount: "700000000",
|
||||||
|
denom: "ustake",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it("ignores empty elements", () => {
|
it("ignores empty elements", () => {
|
||||||
// start
|
// start
|
||||||
expect(parseCoins(",819966000ucosm,700000000ustake")).toEqual([
|
expect(parseCoins(",819966000ucosm,700000000ustake")).toEqual([
|
||||||
@ -186,6 +225,20 @@ describe("coins", () => {
|
|||||||
|
|
||||||
// amount missing
|
// amount missing
|
||||||
expect(() => parseCoins("ucosm")).toThrowError(/invalid coin string/i);
|
expect(() => parseCoins("ucosm")).toThrowError(/invalid coin string/i);
|
||||||
|
|
||||||
|
// denom starting with slash
|
||||||
|
expect(() => parseCoins("3456/ibc")).toThrowError(/invalid coin string/i);
|
||||||
|
|
||||||
|
// denom too short
|
||||||
|
expect(() => parseCoins("3456a")).toThrowError(/invalid coin string/i);
|
||||||
|
expect(() => parseCoins("3456aa")).toThrowError(/invalid coin string/i);
|
||||||
|
|
||||||
|
// denom too long
|
||||||
|
expect(() =>
|
||||||
|
parseCoins(
|
||||||
|
"3456abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgha",
|
||||||
|
),
|
||||||
|
).toThrowError(/invalid coin string/i);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -46,13 +46,21 @@ export function coins(amount: number | string, denom: string): Coin[] {
|
|||||||
/**
|
/**
|
||||||
* Takes a coins list like "819966000ucosm,700000000ustake" and parses it.
|
* Takes a coins list like "819966000ucosm,700000000ustake" and parses it.
|
||||||
*
|
*
|
||||||
* A Stargate-ready variant of this function is available via:
|
* Starting with CosmJS 0.32.3, the following imports are all synonym and support
|
||||||
|
* a variety of denom types such as IBC denoms or tokenfactory. If you need to
|
||||||
|
* restrict the denom to something very minimal, this needs to be implemented
|
||||||
|
* separately in the caller.
|
||||||
*
|
*
|
||||||
* ```
|
* ```
|
||||||
* import { parseCoins } from "@cosmjs/proto-signing";
|
* import { parseCoins } from "@cosmjs/proto-signing";
|
||||||
* // or
|
* // equals
|
||||||
* import { parseCoins } from "@cosmjs/stargate";
|
* import { parseCoins } from "@cosmjs/stargate";
|
||||||
|
* // equals
|
||||||
|
* import { parseCoins } from "@cosmjs/amino";
|
||||||
* ```
|
* ```
|
||||||
|
*
|
||||||
|
* This function is not made for supporting decimal amounts and does not support
|
||||||
|
* parsing gas prices.
|
||||||
*/
|
*/
|
||||||
export function parseCoins(input: string): Coin[] {
|
export function parseCoins(input: string): Coin[] {
|
||||||
return input
|
return input
|
||||||
@ -60,7 +68,8 @@ export function parseCoins(input: string): Coin[] {
|
|||||||
.split(",")
|
.split(",")
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.map((part) => {
|
.map((part) => {
|
||||||
const match = part.match(/^([0-9]+)([a-zA-Z]+)/);
|
// Denom regex from Stargate (https://github.com/cosmos/cosmos-sdk/blob/v0.42.7/types/coin.go#L599-L601)
|
||||||
|
const match = part.match(/^([0-9]+)([a-zA-Z][a-zA-Z0-9/]{2,127})$/);
|
||||||
if (!match) throw new Error("Got an invalid coin string");
|
if (!match) throw new Error("Got an invalid coin string");
|
||||||
return {
|
return {
|
||||||
amount: match[1].replace(/^0+/, "") || "0",
|
amount: match[1].replace(/^0+/, "") || "0",
|
||||||
|
@ -46,7 +46,7 @@ async function main(hackatomWasmPath: string) {
|
|||||||
// Execute contract
|
// Execute contract
|
||||||
const executeFee = calculateFee(300_000, gasPrice);
|
const executeFee = calculateFee(300_000, gasPrice);
|
||||||
const result = await client.execute(alice.address0, contractAddress, { release: {} }, executeFee);
|
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);
|
console.info("The `wasm` event emitted by the contract execution:", wasmEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/cli",
|
"name": "@cosmjs/cli",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Command line interface",
|
"description": "Command line interface",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>",
|
"IOV SAS <admin@iov.one>",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/cosmwasm-stargate",
|
"name": "@cosmjs/cosmwasm-stargate",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "CosmWasm SDK",
|
"description": "CosmWasm SDK",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Will Clark <willclarktech@users.noreply.github.com>"
|
"Will Clark <willclarktech@users.noreply.github.com>"
|
||||||
|
@ -10,7 +10,7 @@ import {
|
|||||||
Registry,
|
Registry,
|
||||||
TxBodyEncodeObject,
|
TxBodyEncodeObject,
|
||||||
} from "@cosmjs/proto-signing";
|
} 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 { assert, sleep } from "@cosmjs/utils";
|
||||||
import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx";
|
import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx";
|
||||||
import { ReadonlyDate } from "readonly-date";
|
import { ReadonlyDate } from "readonly-date";
|
||||||
@ -188,7 +188,6 @@ describe("CosmWasmClient", () => {
|
|||||||
amount: coins(5000, "ucosm"),
|
amount: coins(5000, "ucosm"),
|
||||||
gas: "890000",
|
gas: "890000",
|
||||||
};
|
};
|
||||||
|
|
||||||
const chainId = await client.getChainId();
|
const chainId = await client.getChainId();
|
||||||
const sequenceResponse = await client.getSequence(alice.address0);
|
const sequenceResponse = await client.getSequence(alice.address0);
|
||||||
assert(sequenceResponse);
|
assert(sequenceResponse);
|
||||||
@ -222,8 +221,11 @@ describe("CosmWasmClient", () => {
|
|||||||
const signedTx = Uint8Array.from(TxRaw.encode(txRaw).finish());
|
const signedTx = Uint8Array.from(TxRaw.encode(txRaw).finish());
|
||||||
const result = await client.broadcastTx(signedTx);
|
const result = await client.broadcastTx(signedTx);
|
||||||
assertIsDeliverTxSuccess(result);
|
assertIsDeliverTxSuccess(result);
|
||||||
const amountAttr = logs.findAttribute(logs.parseRawLog(result.rawLog), "transfer", "amount");
|
const amountAttrs = result.events
|
||||||
expect(amountAttr.value).toEqual("1234567ucosm");
|
.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}$/);
|
expect(result.transactionHash).toMatch(/^[0-9A-F]{64}$/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -58,15 +58,19 @@ export function _instantiate2AddressIntermediate(
|
|||||||
/**
|
/**
|
||||||
* Predictable address generation for the MsgInstantiateContract2
|
* Predictable address generation for the MsgInstantiateContract2
|
||||||
* introduced with wasmd 0.29.
|
* introduced with wasmd 0.29.
|
||||||
|
*
|
||||||
|
* With `checksum`, `creator` and `salt`, the instantiate 2 address is
|
||||||
|
* generated in binary form. The `bech32Prefix` is then used for the bech32 representation.
|
||||||
|
* Chains using address formats other than bech32 are not supported by this API.
|
||||||
*/
|
*/
|
||||||
export function instantiate2Address(
|
export function instantiate2Address(
|
||||||
checksum: Uint8Array,
|
checksum: Uint8Array,
|
||||||
creator: string,
|
creator: string,
|
||||||
salt: Uint8Array,
|
salt: Uint8Array,
|
||||||
prefix: string,
|
bech32Prefix: string,
|
||||||
): string {
|
): string {
|
||||||
// Non-empty msg values are discouraged.
|
// Non-empty msg values are discouraged.
|
||||||
// See https://medium.com/cosmwasm/dev-note-3-limitations-of-instantiate2-and-how-to-deal-with-them-a3f946874230.
|
// See https://medium.com/cosmwasm/dev-note-3-limitations-of-instantiate2-and-how-to-deal-with-them-a3f946874230.
|
||||||
const msg = null;
|
const msg = null;
|
||||||
return _instantiate2AddressIntermediate(checksum, creator, salt, msg, prefix).address;
|
return _instantiate2AddressIntermediate(checksum, creator, salt, msg, bech32Prefix).address;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@ import {
|
|||||||
coin,
|
coin,
|
||||||
coins,
|
coins,
|
||||||
DeliverTxResponse,
|
DeliverTxResponse,
|
||||||
logs,
|
|
||||||
SigningStargateClient,
|
SigningStargateClient,
|
||||||
StdFee,
|
StdFee,
|
||||||
} from "@cosmjs/stargate";
|
} 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 { MsgExecuteContract, MsgInstantiateContract, MsgStoreCode } from "cosmjs-types/cosmwasm/wasm/v1/tx";
|
||||||
import { AbsoluteTxPosition, ContractCodeHistoryOperationType } from "cosmjs-types/cosmwasm/wasm/v1/types";
|
import { AbsoluteTxPosition, ContractCodeHistoryOperationType } from "cosmjs-types/cosmwasm/wasm/v1/types";
|
||||||
|
|
||||||
import { SigningCosmWasmClient } from "../../signingcosmwasmclient";
|
import { findAttribute, SigningCosmWasmClient } from "../../signingcosmwasmclient";
|
||||||
import {
|
import {
|
||||||
alice,
|
alice,
|
||||||
bech32AddressMatcher,
|
bech32AddressMatcher,
|
||||||
@ -385,12 +384,11 @@ describe("WasmExtension", () => {
|
|||||||
{
|
{
|
||||||
const result = await uploadContract(wallet, getHackatom());
|
const result = await uploadContract(wallet, getHackatom());
|
||||||
assertIsDeliverTxSuccess(result);
|
assertIsDeliverTxSuccess(result);
|
||||||
const parsedLogs = logs.parseLogs(logs.parseRawLog(result.rawLog));
|
const codeIdAttr = findAttribute(result.events, "store_code", "code_id");
|
||||||
const codeIdAttr = logs.findAttribute(parsedLogs, "store_code", "code_id");
|
|
||||||
codeId = Number.parseInt(codeIdAttr.value, 10);
|
codeId = Number.parseInt(codeIdAttr.value, 10);
|
||||||
expect(codeId).toBeGreaterThanOrEqual(1);
|
expect(codeId).toBeGreaterThanOrEqual(1);
|
||||||
expect(codeId).toBeLessThanOrEqual(200);
|
expect(codeId).toBeLessThanOrEqual(200);
|
||||||
const actionAttr = logs.findAttribute(parsedLogs, "message", "module");
|
const actionAttr = findAttribute(result.events, "message", "module");
|
||||||
expect(actionAttr.value).toEqual("wasm");
|
expect(actionAttr.value).toEqual("wasm");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,12 +398,14 @@ describe("WasmExtension", () => {
|
|||||||
{
|
{
|
||||||
const result = await instantiateContract(wallet, codeId, beneficiaryAddress, funds);
|
const result = await instantiateContract(wallet, codeId, beneficiaryAddress, funds);
|
||||||
assertIsDeliverTxSuccess(result);
|
assertIsDeliverTxSuccess(result);
|
||||||
const parsedLogs = logs.parseLogs(logs.parseRawLog(result.rawLog));
|
const contractAddressAttr = findAttribute(result.events, "instantiate", "_contract_address");
|
||||||
const contractAddressAttr = logs.findAttribute(parsedLogs, "instantiate", "_contract_address");
|
|
||||||
contractAddress = contractAddressAttr.value;
|
contractAddress = contractAddressAttr.value;
|
||||||
const amountAttr = logs.findAttribute(parsedLogs, "transfer", "amount");
|
const amountAttrs = result.events
|
||||||
expect(amountAttr.value).toEqual("1234ucosm,321ustake");
|
.filter((e) => e.type == "transfer")
|
||||||
const actionAttr = logs.findAttribute(parsedLogs, "message", "module");
|
.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");
|
expect(actionAttr.value).toEqual("wasm");
|
||||||
|
|
||||||
const balanceUcosm = await client.bank.balance(contractAddress, "ucosm");
|
const balanceUcosm = await client.bank.balance(contractAddress, "ucosm");
|
||||||
@ -418,8 +418,7 @@ describe("WasmExtension", () => {
|
|||||||
{
|
{
|
||||||
const result = await executeContract(wallet, contractAddress, { release: {} });
|
const result = await executeContract(wallet, contractAddress, { release: {} });
|
||||||
assertIsDeliverTxSuccess(result);
|
assertIsDeliverTxSuccess(result);
|
||||||
const parsedLogs = logs.parseLogs(logs.parseRawLog(result.rawLog));
|
const wasmEvent = result.events.find((e) => e.type === "wasm");
|
||||||
const wasmEvent = parsedLogs.find(() => true)?.events.find((e) => e.type === "wasm");
|
|
||||||
assert(wasmEvent, "Event of type wasm expected");
|
assert(wasmEvent, "Event of type wasm expected");
|
||||||
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
|
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
|
||||||
expect(wasmEvent.attributes).toContain({
|
expect(wasmEvent.attributes).toContain({
|
||||||
|
@ -126,23 +126,75 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with legacy Amino signer access type", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutWasmd();
|
pendingWithoutWasmd();
|
||||||
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
||||||
const options = { ...defaultSigningClientOptions, prefix: wasmd.prefix };
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
const client = await SigningCosmWasmClient.connectWithSigner(wasmd.endpoint, wallet, options);
|
wasmd.endpoint,
|
||||||
|
wallet,
|
||||||
|
defaultSigningClientOptions,
|
||||||
|
);
|
||||||
const wasm = getHackatom().data;
|
const wasm = getHackatom().data;
|
||||||
const accessConfig: AccessConfig = {
|
const { codeId, checksum, originalSize, compressedSize } = await client.upload(
|
||||||
permission: AccessType.ACCESS_TYPE_EVERYBODY,
|
alice.address0,
|
||||||
address: "",
|
wasm,
|
||||||
addresses: [],
|
defaultUploadFee,
|
||||||
};
|
);
|
||||||
|
expect(checksum).toEqual(toHex(sha256(wasm)));
|
||||||
|
expect(originalSize).toEqual(wasm.length);
|
||||||
|
expect(compressedSize).toBeLessThan(wasm.length * 0.5);
|
||||||
|
expect(codeId).toBeGreaterThanOrEqual(1);
|
||||||
|
client.disconnect();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("works with Amino JSON signer (instantiatePermission set to one address)", async () => {
|
||||||
|
pending("Known issue: https://github.com/CosmWasm/wasmd/issues/1863");
|
||||||
|
pendingWithoutWasmd();
|
||||||
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
||||||
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
|
wasmd.endpoint,
|
||||||
|
wallet,
|
||||||
|
defaultSigningClientOptions,
|
||||||
|
);
|
||||||
|
const wasm = getHackatom().data;
|
||||||
|
const instantiatePermission = AccessConfig.fromPartial({
|
||||||
|
permission: AccessType.ACCESS_TYPE_ANY_OF_ADDRESSES,
|
||||||
|
addresses: [makeRandomAddress()],
|
||||||
|
});
|
||||||
const { codeId, checksum, originalSize, compressedSize } = await client.upload(
|
const { codeId, checksum, originalSize, compressedSize } = await client.upload(
|
||||||
alice.address0,
|
alice.address0,
|
||||||
wasm,
|
wasm,
|
||||||
defaultUploadFee,
|
defaultUploadFee,
|
||||||
"test memo",
|
"test memo",
|
||||||
accessConfig,
|
instantiatePermission,
|
||||||
|
);
|
||||||
|
expect(checksum).toEqual(toHex(sha256(wasm)));
|
||||||
|
expect(originalSize).toEqual(wasm.length);
|
||||||
|
expect(compressedSize).toBeLessThan(wasm.length * 0.5);
|
||||||
|
expect(codeId).toBeGreaterThanOrEqual(1);
|
||||||
|
client.disconnect();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("works with Amino JSON signer (instantiatePermission set to everybody)", async () => {
|
||||||
|
pending("Known issue: https://github.com/CosmWasm/wasmd/issues/1863");
|
||||||
|
pendingWithoutWasmd();
|
||||||
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
||||||
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
|
wasmd.endpoint,
|
||||||
|
wallet,
|
||||||
|
defaultSigningClientOptions,
|
||||||
|
);
|
||||||
|
const wasm = getHackatom().data;
|
||||||
|
const instantiatePermission = AccessConfig.fromPartial({
|
||||||
|
permission: AccessType.ACCESS_TYPE_EVERYBODY,
|
||||||
|
addresses: [],
|
||||||
|
});
|
||||||
|
const { codeId, checksum, originalSize, compressedSize } = await client.upload(
|
||||||
|
alice.address0,
|
||||||
|
wasm,
|
||||||
|
defaultUploadFee,
|
||||||
|
"test memo",
|
||||||
|
instantiatePermission,
|
||||||
);
|
);
|
||||||
expect(checksum).toEqual(toHex(sha256(wasm)));
|
expect(checksum).toEqual(toHex(sha256(wasm)));
|
||||||
expect(originalSize).toEqual(wasm.length);
|
expect(originalSize).toEqual(wasm.length);
|
||||||
@ -261,7 +313,7 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with legacy Amino signer", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutWasmd();
|
pendingWithoutWasmd();
|
||||||
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
||||||
const client = await SigningCosmWasmClient.connectWithSigner(
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
@ -269,6 +321,23 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
wallet,
|
wallet,
|
||||||
defaultSigningClientOptions,
|
defaultSigningClientOptions,
|
||||||
);
|
);
|
||||||
|
const funds = [coin(1234, "ucosm"), coin(321, "ustake")];
|
||||||
|
|
||||||
|
// Without admin
|
||||||
|
await client.instantiate(
|
||||||
|
alice.address0,
|
||||||
|
deployedHackatom.codeId,
|
||||||
|
{
|
||||||
|
verifier: alice.address0,
|
||||||
|
beneficiary: makeRandomAddress(),
|
||||||
|
},
|
||||||
|
"contract 1",
|
||||||
|
defaultInstantiateFee,
|
||||||
|
{
|
||||||
|
funds: funds,
|
||||||
|
memo: "instantiate it",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
// With admin
|
// With admin
|
||||||
await client.instantiate(
|
await client.instantiate(
|
||||||
@ -280,19 +349,10 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
},
|
},
|
||||||
"contract 1",
|
"contract 1",
|
||||||
defaultInstantiateFee,
|
defaultInstantiateFee,
|
||||||
{ admin: makeRandomAddress() },
|
|
||||||
);
|
|
||||||
|
|
||||||
// Without admin
|
|
||||||
await client.instantiate(
|
|
||||||
alice.address0,
|
|
||||||
deployedHackatom.codeId,
|
|
||||||
{
|
{
|
||||||
verifier: alice.address0,
|
funds: funds,
|
||||||
beneficiary: makeRandomAddress(),
|
admin: makeRandomAddress(),
|
||||||
},
|
},
|
||||||
"contract 1",
|
|
||||||
defaultInstantiateFee,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
client.disconnect();
|
client.disconnect();
|
||||||
@ -313,7 +373,7 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
|
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
|
||||||
const funds = [coin(1234, "ucosm"), coin(321, "ustake")];
|
const funds = [coin(1234, "ucosm"), coin(321, "ustake")];
|
||||||
const beneficiaryAddress = makeRandomAddress();
|
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 wasm = getHackatom().data;
|
||||||
const msg = {
|
const msg = {
|
||||||
verifier: alice.address0,
|
verifier: alice.address0,
|
||||||
@ -344,24 +404,26 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with Amino JSON signing", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutWasmd();
|
pendingWithoutWasmd();
|
||||||
const aminoJsonWallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, {
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, {
|
||||||
prefix: wasmd.prefix,
|
prefix: wasmd.prefix,
|
||||||
});
|
});
|
||||||
const client = await SigningCosmWasmClient.connectWithSigner(
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
wasmd.endpoint,
|
wasmd.endpoint,
|
||||||
aminoJsonWallet,
|
wallet,
|
||||||
defaultSigningClientOptions,
|
defaultSigningClientOptions,
|
||||||
);
|
);
|
||||||
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
|
const { codeId } = await client.upload(alice.address0, getHackatom().data, defaultUploadFee);
|
||||||
const funds = [coin(1234, "ucosm"), coin(321, "ustake")];
|
const funds = [coin(1234, "ucosm"), coin(321, "ustake")];
|
||||||
const salt = Random.getBytes(64);
|
|
||||||
const msg = {
|
const msg = {
|
||||||
verifier: alice.address0,
|
verifier: alice.address0,
|
||||||
beneficiary: makeRandomAddress(),
|
beneficiary: makeRandomAddress(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Without admin
|
||||||
|
{
|
||||||
|
const salt = Random.getBytes(64);
|
||||||
const { contractAddress } = await client.instantiate2(
|
const { contractAddress } = await client.instantiate2(
|
||||||
alice.address0,
|
alice.address0,
|
||||||
codeId,
|
codeId,
|
||||||
@ -374,11 +436,33 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
funds: funds,
|
funds: funds,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
const ucosmBalance = await client.getBalance(contractAddress, "ucosm");
|
const ucosmBalance = await client.getBalance(contractAddress, "ucosm");
|
||||||
const ustakeBalance = await client.getBalance(contractAddress, "ustake");
|
const ustakeBalance = await client.getBalance(contractAddress, "ustake");
|
||||||
expect(ucosmBalance).toEqual(funds[0]);
|
expect(ucosmBalance).toEqual(funds[0]);
|
||||||
expect(ustakeBalance).toEqual(funds[1]);
|
expect(ustakeBalance).toEqual(funds[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// With admin
|
||||||
|
{
|
||||||
|
const salt = Random.getBytes(64);
|
||||||
|
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,
|
||||||
|
admin: makeRandomAddress(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
const ucosmBalance = await client.getBalance(contractAddress, "ucosm");
|
||||||
|
const ustakeBalance = await client.getBalance(contractAddress, "ustake");
|
||||||
|
expect(ucosmBalance).toEqual(funds[0]);
|
||||||
|
expect(ustakeBalance).toEqual(funds[1]);
|
||||||
|
}
|
||||||
|
|
||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
@ -525,7 +609,7 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with legacy Amino signer", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutWasmd();
|
pendingWithoutWasmd();
|
||||||
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
||||||
const client = await SigningCosmWasmClient.connectWithSigner(
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
@ -607,7 +691,7 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
expect(result.height).toBeGreaterThan(0);
|
expect(result.height).toBeGreaterThan(0);
|
||||||
expect(result.gasWanted).toBeGreaterThan(0);
|
expect(result.gasWanted).toBeGreaterThan(0);
|
||||||
expect(result.gasUsed).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");
|
assert(wasmEvent, "Event of type wasm expected");
|
||||||
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
|
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
|
||||||
expect(wasmEvent.attributes).toContain({
|
expect(wasmEvent.attributes).toContain({
|
||||||
@ -628,7 +712,7 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with legacy Amino signer", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutWasmd();
|
pendingWithoutWasmd();
|
||||||
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
||||||
const client = await SigningCosmWasmClient.connectWithSigner(
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
@ -660,7 +744,7 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
{ release: {} },
|
{ release: {} },
|
||||||
defaultExecuteFee,
|
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");
|
assert(wasmEvent, "Event of type wasm expected");
|
||||||
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
|
expect(wasmEvent.attributes).toContain({ key: "action", value: "release" });
|
||||||
expect(wasmEvent.attributes).toContain({
|
expect(wasmEvent.attributes).toContain({
|
||||||
@ -727,16 +811,17 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
],
|
],
|
||||||
"auto",
|
"auto",
|
||||||
);
|
);
|
||||||
expect(result.logs.length).toEqual(2);
|
const { events } = result;
|
||||||
const wasmEvent1 = result.logs[0].events.find((e) => e.type === "wasm");
|
const wasmEvents = events.filter((e) => e.type == "wasm");
|
||||||
assert(wasmEvent1, "Event of type wasm expected");
|
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: "action", value: "release" });
|
||||||
expect(wasmEvent1.attributes).toContain({
|
expect(wasmEvent1.attributes).toContain({
|
||||||
key: "destination",
|
key: "destination",
|
||||||
value: beneficiaryAddress1,
|
value: beneficiaryAddress1,
|
||||||
});
|
});
|
||||||
const wasmEvent2 = result.logs[1].events.find((e) => e.type === "wasm");
|
expect(wasmEvent2.type).toEqual("wasm");
|
||||||
assert(wasmEvent2, "Event of type wasm expected");
|
|
||||||
expect(wasmEvent2.attributes).toContain({ key: "action", value: "release" });
|
expect(wasmEvent2.attributes).toContain({ key: "action", value: "release" });
|
||||||
expect(wasmEvent2.attributes).toContain({
|
expect(wasmEvent2.attributes).toContain({
|
||||||
key: "destination",
|
key: "destination",
|
||||||
@ -777,7 +862,8 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
memo,
|
memo,
|
||||||
);
|
);
|
||||||
assertIsDeliverTxSuccess(result);
|
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
|
// got tokens
|
||||||
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
||||||
@ -787,7 +873,7 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with legacy Amino signer", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutWasmd();
|
pendingWithoutWasmd();
|
||||||
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
const wallet = await Secp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix });
|
||||||
const client = await SigningCosmWasmClient.connectWithSigner(
|
const client = await SigningCosmWasmClient.connectWithSigner(
|
||||||
@ -816,7 +902,8 @@ describe("SigningCosmWasmClient", () => {
|
|||||||
memo,
|
memo,
|
||||||
);
|
);
|
||||||
assertIsDeliverTxSuccess(result);
|
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
|
// got tokens
|
||||||
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
||||||
|
@ -15,6 +15,7 @@ import {
|
|||||||
} from "@cosmjs/proto-signing";
|
} from "@cosmjs/proto-signing";
|
||||||
import {
|
import {
|
||||||
AminoTypes,
|
AminoTypes,
|
||||||
|
Attribute,
|
||||||
calculateFee,
|
calculateFee,
|
||||||
Coin,
|
Coin,
|
||||||
createDefaultAminoConverters,
|
createDefaultAminoConverters,
|
||||||
@ -72,6 +73,7 @@ export interface UploadResult {
|
|||||||
readonly compressedSize: number;
|
readonly compressedSize: number;
|
||||||
/** The ID of the code asigned by the chain */
|
/** The ID of the code asigned by the chain */
|
||||||
readonly codeId: number;
|
readonly codeId: number;
|
||||||
|
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
|
||||||
readonly logs: readonly logs.Log[];
|
readonly logs: readonly logs.Log[];
|
||||||
/** Block height in which the transaction is included */
|
/** Block height in which the transaction is included */
|
||||||
readonly height: number;
|
readonly height: number;
|
||||||
@ -106,6 +108,7 @@ export interface InstantiateOptions {
|
|||||||
export interface InstantiateResult {
|
export interface InstantiateResult {
|
||||||
/** The address of the newly instantiated contract */
|
/** The address of the newly instantiated contract */
|
||||||
readonly contractAddress: string;
|
readonly contractAddress: string;
|
||||||
|
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
|
||||||
readonly logs: readonly logs.Log[];
|
readonly logs: readonly logs.Log[];
|
||||||
/** Block height in which the transaction is included */
|
/** Block height in which the transaction is included */
|
||||||
readonly height: number;
|
readonly height: number;
|
||||||
@ -120,6 +123,7 @@ export interface InstantiateResult {
|
|||||||
* Result type of updateAdmin and clearAdmin
|
* Result type of updateAdmin and clearAdmin
|
||||||
*/
|
*/
|
||||||
export interface ChangeAdminResult {
|
export interface ChangeAdminResult {
|
||||||
|
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
|
||||||
readonly logs: readonly logs.Log[];
|
readonly logs: readonly logs.Log[];
|
||||||
/** Block height in which the transaction is included */
|
/** Block height in which the transaction is included */
|
||||||
readonly height: number;
|
readonly height: number;
|
||||||
@ -131,6 +135,7 @@ export interface ChangeAdminResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface MigrateResult {
|
export interface MigrateResult {
|
||||||
|
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
|
||||||
readonly logs: readonly logs.Log[];
|
readonly logs: readonly logs.Log[];
|
||||||
/** Block height in which the transaction is included */
|
/** Block height in which the transaction is included */
|
||||||
readonly height: number;
|
readonly height: number;
|
||||||
@ -148,6 +153,7 @@ export interface ExecuteInstruction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface ExecuteResult {
|
export interface ExecuteResult {
|
||||||
|
/** @deprecated Not filled in Cosmos SDK >= 0.50. Use events instead. */
|
||||||
readonly logs: readonly logs.Log[];
|
readonly logs: readonly logs.Log[];
|
||||||
/** Block height in which the transaction is included */
|
/** Block height in which the transaction is included */
|
||||||
readonly height: number;
|
readonly height: number;
|
||||||
@ -158,6 +164,24 @@ export interface ExecuteResult {
|
|||||||
readonly gasUsed: bigint;
|
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 {
|
function createDeliverTxResponseErrorMessage(result: DeliverTxResponse): string {
|
||||||
return `Error when broadcasting tx ${result.transactionHash} at height ${result.height}. Code: ${result.code}; Raw log: ${result.rawLog}`;
|
return `Error when broadcasting tx ${result.transactionHash} at height ${result.height}. Code: ${result.code}; Raw log: ${result.rawLog}`;
|
||||||
}
|
}
|
||||||
@ -178,6 +202,9 @@ export class SigningCosmWasmClient extends CosmWasmClient {
|
|||||||
private readonly signer: OfflineSigner;
|
private readonly signer: OfflineSigner;
|
||||||
private readonly aminoTypes: AminoTypes;
|
private readonly aminoTypes: AminoTypes;
|
||||||
private readonly gasPrice: GasPrice | undefined;
|
private readonly gasPrice: GasPrice | undefined;
|
||||||
|
// Starting with Cosmos SDK 0.47, we see many cases in which 1.3 is not enough anymore
|
||||||
|
// E.g. https://github.com/cosmos/cosmos-sdk/issues/16020
|
||||||
|
private readonly defaultGasMultiplier = 1.4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance by connecting to the given CometBFT RPC endpoint.
|
* Creates an instance by connecting to the given CometBFT RPC endpoint.
|
||||||
@ -288,14 +315,13 @@ export class SigningCosmWasmClient extends CosmWasmClient {
|
|||||||
if (isDeliverTxFailure(result)) {
|
if (isDeliverTxFailure(result)) {
|
||||||
throw new Error(createDeliverTxResponseErrorMessage(result));
|
throw new Error(createDeliverTxResponseErrorMessage(result));
|
||||||
}
|
}
|
||||||
const parsedLogs = logs.parseRawLog(result.rawLog);
|
const codeIdAttr = findAttribute(result.events, "store_code", "code_id");
|
||||||
const codeIdAttr = logs.findAttribute(parsedLogs, "store_code", "code_id");
|
|
||||||
return {
|
return {
|
||||||
checksum: toHex(sha256(wasmCode)),
|
checksum: toHex(sha256(wasmCode)),
|
||||||
originalSize: wasmCode.length,
|
originalSize: wasmCode.length,
|
||||||
compressedSize: compressed.length,
|
compressedSize: compressed.length,
|
||||||
codeId: Number.parseInt(codeIdAttr.value, 10),
|
codeId: Number.parseInt(codeIdAttr.value, 10),
|
||||||
logs: parsedLogs,
|
logs: logs.parseRawLog(result.rawLog),
|
||||||
height: result.height,
|
height: result.height,
|
||||||
transactionHash: result.transactionHash,
|
transactionHash: result.transactionHash,
|
||||||
events: result.events,
|
events: result.events,
|
||||||
@ -327,11 +353,10 @@ export class SigningCosmWasmClient extends CosmWasmClient {
|
|||||||
if (isDeliverTxFailure(result)) {
|
if (isDeliverTxFailure(result)) {
|
||||||
throw new Error(createDeliverTxResponseErrorMessage(result));
|
throw new Error(createDeliverTxResponseErrorMessage(result));
|
||||||
}
|
}
|
||||||
const parsedLogs = logs.parseRawLog(result.rawLog);
|
const contractAddressAttr = findAttribute(result.events, "instantiate", "_contract_address");
|
||||||
const contractAddressAttr = logs.findAttribute(parsedLogs, "instantiate", "_contract_address");
|
|
||||||
return {
|
return {
|
||||||
contractAddress: contractAddressAttr.value,
|
contractAddress: contractAddressAttr.value,
|
||||||
logs: parsedLogs,
|
logs: logs.parseRawLog(result.rawLog),
|
||||||
height: result.height,
|
height: result.height,
|
||||||
transactionHash: result.transactionHash,
|
transactionHash: result.transactionHash,
|
||||||
events: result.events,
|
events: result.events,
|
||||||
@ -366,11 +391,10 @@ export class SigningCosmWasmClient extends CosmWasmClient {
|
|||||||
if (isDeliverTxFailure(result)) {
|
if (isDeliverTxFailure(result)) {
|
||||||
throw new Error(createDeliverTxResponseErrorMessage(result));
|
throw new Error(createDeliverTxResponseErrorMessage(result));
|
||||||
}
|
}
|
||||||
const parsedLogs = logs.parseRawLog(result.rawLog);
|
const contractAddressAttr = findAttribute(result.events, "instantiate", "_contract_address");
|
||||||
const contractAddressAttr = logs.findAttribute(parsedLogs, "instantiate", "_contract_address");
|
|
||||||
return {
|
return {
|
||||||
contractAddress: contractAddressAttr.value,
|
contractAddress: contractAddressAttr.value,
|
||||||
logs: parsedLogs,
|
logs: logs.parseRawLog(result.rawLog),
|
||||||
height: result.height,
|
height: result.height,
|
||||||
transactionHash: result.transactionHash,
|
transactionHash: result.transactionHash,
|
||||||
events: result.events,
|
events: result.events,
|
||||||
@ -593,9 +617,7 @@ export class SigningCosmWasmClient extends CosmWasmClient {
|
|||||||
if (fee == "auto" || typeof fee === "number") {
|
if (fee == "auto" || typeof fee === "number") {
|
||||||
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
||||||
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
||||||
// Starting with Cosmos SDK 0.47, we see many cases in which 1.3 is not enough anymore
|
const multiplier = typeof fee === "number" ? fee : this.defaultGasMultiplier;
|
||||||
// E.g. https://github.com/cosmos/cosmos-sdk/issues/16020
|
|
||||||
const multiplier = typeof fee === "number" ? fee : 1.4;
|
|
||||||
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
||||||
} else {
|
} else {
|
||||||
usedFee = fee;
|
usedFee = fee;
|
||||||
@ -631,7 +653,7 @@ export class SigningCosmWasmClient extends CosmWasmClient {
|
|||||||
if (fee == "auto" || typeof fee === "number") {
|
if (fee == "auto" || typeof fee === "number") {
|
||||||
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
||||||
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
||||||
const multiplier = typeof fee === "number" ? fee : 1.3;
|
const multiplier = typeof fee === "number" ? fee : this.defaultGasMultiplier;
|
||||||
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
||||||
} else {
|
} else {
|
||||||
usedFee = fee;
|
usedFee = fee;
|
||||||
|
@ -101,18 +101,12 @@ export const unused = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const validator = {
|
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
|
* 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`
|
* `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,
|
accountNumber: 0,
|
||||||
sequence: 1,
|
sequence: 1,
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/crypto",
|
"name": "@cosmjs/crypto",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Cryptography resources for blockchain projects",
|
"description": "Cryptography resources for blockchain projects",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>",
|
"IOV SAS <admin@iov.one>",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/encoding",
|
"name": "@cosmjs/encoding",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Encoding helpers for blockchain projects",
|
"description": "Encoding helpers for blockchain projects",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>"
|
"IOV SAS <admin@iov.one>"
|
||||||
|
@ -15,8 +15,9 @@ export function toUtf8(str: string): Uint8Array {
|
|||||||
/**
|
/**
|
||||||
* Takes UTF-8 data and decodes it to a string.
|
* Takes UTF-8 data and decodes it to a string.
|
||||||
*
|
*
|
||||||
* In lossy mode, the replacement character <EFBFBD> is used to substitude invalid
|
* In lossy mode, the [REPLACEMENT CHARACTER](https://en.wikipedia.org/wiki/Specials_(Unicode_block))
|
||||||
* encodings. By default lossy mode is off and invalid data will lead to exceptions.
|
* is used to substitude invalid encodings.
|
||||||
|
* By default lossy mode is off and invalid data will lead to exceptions.
|
||||||
*/
|
*/
|
||||||
export function fromUtf8(data: Uint8Array, lossy = false): string {
|
export function fromUtf8(data: Uint8Array, lossy = false): string {
|
||||||
const fatal = !lossy;
|
const fatal = !lossy;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/faucet-client",
|
"name": "@cosmjs/faucet-client",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "The faucet client",
|
"description": "The faucet client",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Will Clark <willclarktech@users.noreply.github.com>"
|
"Will Clark <willclarktech@users.noreply.github.com>"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/faucet",
|
"name": "@cosmjs/faucet",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "The faucet",
|
"description": "The faucet",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Ethan Frey <ethanfrey@users.noreply.github.com>",
|
"Ethan Frey <ethanfrey@users.noreply.github.com>",
|
||||||
|
@ -83,9 +83,9 @@ export class Webserver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await faucet.credit(address, matchingDenom);
|
|
||||||
// Count addresses to prevent draining
|
// Count addresses to prevent draining
|
||||||
this.addressCounter.set(address, new Date());
|
this.addressCounter.set(address, new Date());
|
||||||
|
await faucet.credit(address, matchingDenom);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
throw new HttpError(500, "Sending tokens failed");
|
throw new HttpError(500, "Sending tokens failed");
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/json-rpc",
|
"name": "@cosmjs/json-rpc",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Framework for implementing a JSON-RPC 2.0 API",
|
"description": "Framework for implementing a JSON-RPC 2.0 API",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>",
|
"IOV SAS <admin@iov.one>",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/ledger-amino",
|
"name": "@cosmjs/ledger-amino",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "A library for signing Amino-encoded transactions using Ledger devices",
|
"description": "A library for signing Amino-encoded transactions using Ledger devices",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Will Clark <willclarktech@users.noreply.github.com>"
|
"Will Clark <willclarktech@users.noreply.github.com>"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/math",
|
"name": "@cosmjs/math",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Math helpers for blockchain projects",
|
"description": "Math helpers for blockchain projects",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>"
|
"IOV SAS <admin@iov.one>"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/proto-signing",
|
"name": "@cosmjs/proto-signing",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Utilities for protobuf based signing (Cosmos SDK 0.40+)",
|
"description": "Utilities for protobuf based signing (Cosmos SDK 0.40+)",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Will Clark <willclarktech@users.noreply.github.com>",
|
"Will Clark <willclarktech@users.noreply.github.com>",
|
||||||
|
@ -1,170 +0,0 @@
|
|||||||
import { parseCoins } from "./coins";
|
|
||||||
|
|
||||||
describe("coins", () => {
|
|
||||||
describe("parseCoins", () => {
|
|
||||||
it("works for empty", () => {
|
|
||||||
expect(parseCoins("")).toEqual([]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("works for one element", () => {
|
|
||||||
expect(parseCoins("7643ureef")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "7643",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("works for various denoms", () => {
|
|
||||||
// very short (3)
|
|
||||||
expect(parseCoins("7643bar")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "7643",
|
|
||||||
denom: "bar",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
// very long (128)
|
|
||||||
expect(
|
|
||||||
parseCoins(
|
|
||||||
"7643abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh",
|
|
||||||
),
|
|
||||||
).toEqual([
|
|
||||||
{
|
|
||||||
amount: "7643",
|
|
||||||
denom:
|
|
||||||
"abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
// IBC denom (https://github.com/cosmos/cosmos-sdk/blob/v0.42.7/types/coin_test.go#L512-L519)
|
|
||||||
expect(parseCoins("7643ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "7643",
|
|
||||||
denom: "ibc/7F1D3FCF4AE79E1554D670D1AD949A9BA4E4A3C76C63093E17E446A46061A7A2",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("trims leading zeros", () => {
|
|
||||||
expect(parseCoins("07643ureef")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "7643",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
expect(parseCoins("007643ureef")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "7643",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
expect(parseCoins("0ureef")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "0",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
expect(parseCoins("0000ureef")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "0",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("works for large numbers", () => {
|
|
||||||
expect(parseCoins(`${Number.MAX_SAFE_INTEGER}ureef`)).toEqual([
|
|
||||||
{
|
|
||||||
amount: "9007199254740991",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
// 2**64-1
|
|
||||||
expect(parseCoins("18446744073709551615ureef")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "18446744073709551615",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
// 2**128-1
|
|
||||||
expect(parseCoins("340282366920938463463374607431768211455ureef")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "340282366920938463463374607431768211455",
|
|
||||||
denom: "ureef",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("works for two", () => {
|
|
||||||
expect(parseCoins("819966000ucosm,700000000ustake")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "819966000",
|
|
||||||
denom: "ucosm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
amount: "700000000",
|
|
||||||
denom: "ustake",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("ignores empty elements", () => {
|
|
||||||
// start
|
|
||||||
expect(parseCoins(",819966000ucosm,700000000ustake")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "819966000",
|
|
||||||
denom: "ucosm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
amount: "700000000",
|
|
||||||
denom: "ustake",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
// middle
|
|
||||||
expect(parseCoins("819966000ucosm,,700000000ustake")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "819966000",
|
|
||||||
denom: "ucosm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
amount: "700000000",
|
|
||||||
denom: "ustake",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
// end
|
|
||||||
expect(parseCoins("819966000ucosm,700000000ustake,")).toEqual([
|
|
||||||
{
|
|
||||||
amount: "819966000",
|
|
||||||
denom: "ucosm",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
amount: "700000000",
|
|
||||||
denom: "ustake",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("throws for invalid inputs", () => {
|
|
||||||
// denom missing
|
|
||||||
expect(() => parseCoins("3456")).toThrowError(/invalid coin string/i);
|
|
||||||
|
|
||||||
// amount missing
|
|
||||||
expect(() => parseCoins("ucosm")).toThrowError(/invalid coin string/i);
|
|
||||||
|
|
||||||
// denom starting with slash
|
|
||||||
expect(() => parseCoins("3456/ibc")).toThrowError(/invalid coin string/i);
|
|
||||||
|
|
||||||
// denom too short
|
|
||||||
expect(() => parseCoins("3456a")).toThrowError(/invalid coin string/i);
|
|
||||||
expect(() => parseCoins("3456aa")).toThrowError(/invalid coin string/i);
|
|
||||||
|
|
||||||
// denom too long
|
|
||||||
expect(() =>
|
|
||||||
parseCoins(
|
|
||||||
"3456abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgha",
|
|
||||||
),
|
|
||||||
).toThrowError(/invalid coin string/i);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,23 +0,0 @@
|
|||||||
import { Coin } from "@cosmjs/amino";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Takes a coins list like "819966000ucosm,700000000ustake" and parses it.
|
|
||||||
*
|
|
||||||
* This is a Stargate ready version of parseCoins from @cosmjs/amino.
|
|
||||||
* It supports more denoms.
|
|
||||||
*/
|
|
||||||
export function parseCoins(input: string): Coin[] {
|
|
||||||
return input
|
|
||||||
.replace(/\s/g, "")
|
|
||||||
.split(",")
|
|
||||||
.filter(Boolean)
|
|
||||||
.map((part) => {
|
|
||||||
// Denom regex from Stargate (https://github.com/cosmos/cosmos-sdk/blob/v0.42.7/types/coin.go#L599-L601)
|
|
||||||
const match = part.match(/^([0-9]+)([a-zA-Z][a-zA-Z0-9/]{2,127})$/);
|
|
||||||
if (!match) throw new Error("Got an invalid coin string");
|
|
||||||
return {
|
|
||||||
amount: match[1].replace(/^0+/, "") || "0",
|
|
||||||
denom: match[2],
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
@ -1,5 +1,4 @@
|
|||||||
// This type happens to be shared between Amino and Direct sign modes
|
// This type happens to be shared between Amino and Direct sign modes
|
||||||
export { parseCoins } from "./coins";
|
|
||||||
export { DecodedTxRaw, decodeTxRaw } from "./decode";
|
export { DecodedTxRaw, decodeTxRaw } from "./decode";
|
||||||
export {
|
export {
|
||||||
DirectSecp256k1HdWallet,
|
DirectSecp256k1HdWallet,
|
||||||
@ -31,4 +30,6 @@ export {
|
|||||||
} from "./signer";
|
} from "./signer";
|
||||||
export { makeAuthInfoBytes, makeSignBytes, makeSignDoc } from "./signing";
|
export { makeAuthInfoBytes, makeSignBytes, makeSignDoc } from "./signing";
|
||||||
export { executeKdf, KdfConfiguration } from "./wallet";
|
export { executeKdf, KdfConfiguration } from "./wallet";
|
||||||
export { Coin, coin, coins } from "@cosmjs/amino";
|
|
||||||
|
// re-exports
|
||||||
|
export { Coin, coin, coins, parseCoins } from "@cosmjs/amino";
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/socket",
|
"name": "@cosmjs/socket",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Utility functions for working with WebSockets",
|
"description": "Utility functions for working with WebSockets",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>",
|
"IOV SAS <admin@iov.one>",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/stargate",
|
"name": "@cosmjs/stargate",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Utilities for Cosmos SDK 0.40",
|
"description": "Utilities for Cosmos SDK 0.40",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Simon Warta <webmaster128@users.noreply.github.com>"
|
"Simon Warta <webmaster128@users.noreply.github.com>"
|
||||||
|
@ -54,7 +54,10 @@ export function parseLogs(input: unknown): readonly Log[] {
|
|||||||
return input.map(parseLog);
|
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) => ({
|
const logsToParse = JSON.parse(input).map(({ events }: { events: readonly unknown[] }, i: number) => ({
|
||||||
msg_index: i,
|
msg_index: i,
|
||||||
events,
|
events,
|
||||||
|
@ -148,7 +148,7 @@ describe("gov messages", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with Amino JSON sign mode", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutSimapp();
|
pendingWithoutSimapp();
|
||||||
assert(voterWalletAmino);
|
assert(voterWalletAmino);
|
||||||
assert(proposalId, "Missing proposal ID");
|
assert(proposalId, "Missing proposal ID");
|
||||||
@ -206,7 +206,7 @@ describe("gov messages", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with Amino JSON sign mode", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutSimapp();
|
pendingWithoutSimapp();
|
||||||
if (simapp50Enabled()) pending("Not working, see https://github.com/cosmos/cosmos-sdk/issues/18546");
|
if (simapp50Enabled()) pending("Not working, see https://github.com/cosmos/cosmos-sdk/issues/18546");
|
||||||
assert(voterWalletAmino);
|
assert(voterWalletAmino);
|
||||||
|
@ -94,7 +94,7 @@ describe("staking messages", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with Amino JSON sign mode", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutSimapp();
|
pendingWithoutSimapp();
|
||||||
if (simapp50Enabled()) pending("Not working, see https://github.com/cosmos/cosmos-sdk/issues/18546");
|
if (simapp50Enabled()) pending("Not working, see https://github.com/cosmos/cosmos-sdk/issues/18546");
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ describe("staking messages", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with Amino JSON sign mode", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutSimapp();
|
pendingWithoutSimapp();
|
||||||
if (simapp50Enabled()) pending("Not working, see https://github.com/cosmos/cosmos-sdk/issues/18546");
|
if (simapp50Enabled()) pending("Not working, see https://github.com/cosmos/cosmos-sdk/issues/18546");
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ describe("vesting messages", () => {
|
|||||||
client.disconnect();
|
client.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with Amino JSON sign mode", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutSimapp46OrHigher(); // 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 wallet = await Secp256k1HdWallet.fromMnemonic(faucet.mnemonic);
|
||||||
const client = await SigningStargateClient.connectWithSigner(
|
const client = await SigningStargateClient.connectWithSigner(
|
||||||
|
@ -126,13 +126,14 @@ describe("SigningStargateClient", () => {
|
|||||||
} else {
|
} else {
|
||||||
expect(result.rawLog).toBeTruthy();
|
expect(result.rawLog).toBeTruthy();
|
||||||
}
|
}
|
||||||
|
expect(result.events.length).toBeGreaterThanOrEqual(1);
|
||||||
|
|
||||||
// got tokens
|
// got tokens
|
||||||
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
||||||
expect(after).toEqual(amount[0]);
|
expect(after).toEqual(amount[0]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with legacy Amino signer", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pendingWithoutSimapp();
|
pendingWithoutSimapp();
|
||||||
const wallet = await Secp256k1HdWallet.fromMnemonic(faucet.mnemonic);
|
const wallet = await Secp256k1HdWallet.fromMnemonic(faucet.mnemonic);
|
||||||
const client = await SigningStargateClient.connectWithSigner(
|
const client = await SigningStargateClient.connectWithSigner(
|
||||||
@ -167,6 +168,7 @@ describe("SigningStargateClient", () => {
|
|||||||
} else {
|
} else {
|
||||||
expect(result.rawLog).toBeTruthy();
|
expect(result.rawLog).toBeTruthy();
|
||||||
}
|
}
|
||||||
|
expect(result.events.length).toBeGreaterThanOrEqual(1);
|
||||||
|
|
||||||
// got tokens
|
// got tokens
|
||||||
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
const after = await client.getBalance(beneficiaryAddress, "ucosm");
|
||||||
@ -299,7 +301,7 @@ describe("SigningStargateClient", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works with Amino signing", async () => {
|
it("works with Amino JSON signer", async () => {
|
||||||
pending("We cannot test this easily anymore since the IBC module was removed from simapp");
|
pending("We cannot test this easily anymore since the IBC module was removed from simapp");
|
||||||
const wallet = await Secp256k1HdWallet.fromMnemonic(faucet.mnemonic);
|
const wallet = await Secp256k1HdWallet.fromMnemonic(faucet.mnemonic);
|
||||||
const client = await SigningStargateClient.connectWithSigner(
|
const client = await SigningStargateClient.connectWithSigner(
|
||||||
|
@ -110,6 +110,9 @@ export class SigningStargateClient extends StargateClient {
|
|||||||
private readonly signer: OfflineSigner;
|
private readonly signer: OfflineSigner;
|
||||||
private readonly aminoTypes: AminoTypes;
|
private readonly aminoTypes: AminoTypes;
|
||||||
private readonly gasPrice: GasPrice | undefined;
|
private readonly gasPrice: GasPrice | undefined;
|
||||||
|
// Starting with Cosmos SDK 0.47, we see many cases in which 1.3 is not enough anymore
|
||||||
|
// E.g. https://github.com/cosmos/cosmos-sdk/issues/16020
|
||||||
|
private readonly defaultGasMultiplier = 1.4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance by connecting to the given CometBFT RPC endpoint.
|
* Creates an instance by connecting to the given CometBFT RPC endpoint.
|
||||||
@ -308,9 +311,7 @@ export class SigningStargateClient extends StargateClient {
|
|||||||
if (fee == "auto" || typeof fee === "number") {
|
if (fee == "auto" || typeof fee === "number") {
|
||||||
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
||||||
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
||||||
// Starting with Cosmos SDK 0.47, we see many cases in which 1.3 is not enough anymore
|
const multiplier = typeof fee === "number" ? fee : this.defaultGasMultiplier;
|
||||||
// E.g. https://github.com/cosmos/cosmos-sdk/issues/16020
|
|
||||||
const multiplier = typeof fee === "number" ? fee : 1.4;
|
|
||||||
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
||||||
} else {
|
} else {
|
||||||
usedFee = fee;
|
usedFee = fee;
|
||||||
@ -337,7 +338,7 @@ export class SigningStargateClient extends StargateClient {
|
|||||||
if (fee == "auto" || typeof fee === "number") {
|
if (fee == "auto" || typeof fee === "number") {
|
||||||
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used.");
|
||||||
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
const gasEstimation = await this.simulate(signerAddress, messages, memo);
|
||||||
const multiplier = typeof fee === "number" ? fee : 1.3;
|
const multiplier = typeof fee === "number" ? fee : this.defaultGasMultiplier;
|
||||||
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice);
|
||||||
} else {
|
} else {
|
||||||
usedFee = fee;
|
usedFee = fee;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/stream",
|
"name": "@cosmjs/stream",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Utility functions for producing and consuming streams",
|
"description": "Utility functions for producing and consuming streams",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>",
|
"IOV SAS <admin@iov.one>",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/tendermint-rpc",
|
"name": "@cosmjs/tendermint-rpc",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Tendermint RPC clients",
|
"description": "Tendermint RPC clients",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>",
|
"IOV SAS <admin@iov.one>",
|
||||||
|
@ -599,7 +599,7 @@ function decodeNodeInfo(data: RpcNodeInfo): responses.NodeInfo {
|
|||||||
listenAddr: assertNotEmpty(data.listen_addr),
|
listenAddr: assertNotEmpty(data.listen_addr),
|
||||||
network: assertNotEmpty(data.network),
|
network: assertNotEmpty(data.network),
|
||||||
version: assertString(data.version), // Can be empty (https://github.com/cosmos/cosmos-sdk/issues/7963)
|
version: assertString(data.version), // Can be empty (https://github.com/cosmos/cosmos-sdk/issues/7963)
|
||||||
channels: assertNotEmpty(data.channels),
|
channels: assertString(data.channels), // can be empty
|
||||||
moniker: assertNotEmpty(data.moniker),
|
moniker: assertNotEmpty(data.moniker),
|
||||||
other: dictionaryToStringMap(data.other),
|
other: dictionaryToStringMap(data.other),
|
||||||
protocolVersion: {
|
protocolVersion: {
|
||||||
|
@ -597,7 +597,7 @@ function decodeNodeInfo(data: RpcNodeInfo): responses.NodeInfo {
|
|||||||
listenAddr: assertNotEmpty(data.listen_addr),
|
listenAddr: assertNotEmpty(data.listen_addr),
|
||||||
network: assertNotEmpty(data.network),
|
network: assertNotEmpty(data.network),
|
||||||
version: assertString(data.version), // Can be empty (https://github.com/cosmos/cosmos-sdk/issues/7963)
|
version: assertString(data.version), // Can be empty (https://github.com/cosmos/cosmos-sdk/issues/7963)
|
||||||
channels: assertNotEmpty(data.channels),
|
channels: assertString(data.channels), // can be empty
|
||||||
moniker: assertNotEmpty(data.moniker),
|
moniker: assertNotEmpty(data.moniker),
|
||||||
other: dictionaryToStringMap(data.other),
|
other: dictionaryToStringMap(data.other),
|
||||||
protocolVersion: {
|
protocolVersion: {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@cosmjs/utils",
|
"name": "@cosmjs/utils",
|
||||||
"version": "0.32.2",
|
"version": "0.32.3",
|
||||||
"description": "Utility tools, primarily for testing code",
|
"description": "Utility tools, primarily for testing code",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"IOV SAS <admin@iov.one>"
|
"IOV SAS <admin@iov.one>"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Choose from https://hub.docker.com/r/cosmwasm/wasmd/tags
|
# Choose from https://hub.docker.com/r/cosmwasm/wasmd/tags
|
||||||
REPOSITORY="cosmwasm/wasmd"
|
REPOSITORY="cosmwasm/wasmd"
|
||||||
VERSION="v0.40.2"
|
VERSION="v0.51.0-rc.5"
|
||||||
|
|
||||||
CONTAINER_NAME="wasmd"
|
CONTAINER_NAME="wasmd"
|
||||||
|
@ -1 +0,0 @@
|
|||||||
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNS0zMSAxMzo0ODoyNS43NzY1OTU0MjIgKzAwMDAgVVRDIG09KzEuMjc2NTU2NzEwIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiTFF1S3A4bG8yT3RkY2hjWSJ9.Azznc81jL876uGDNiGip1RbCsrKkwyQJb9eOqrAR03YmyHsNPVo56Q.z4LQEsxqYwWrPtc8.8Snx2HnDn9A6psM53b8jRtEcWBfc_ApHqeuZqbn3QVl5NZVLPznCBWIBMJZg530ny2EzUany-VCNcDo_fSEWMsVPu_BX1NdDbeQ71GdWQ1WlrNFjGtUtUF6NUs__q_Hk2jcUSC4wDc9VWIFhOQYu3AF3vbI1KtRG8R0NlVHlqyxKWXWCit4yh6l6bxG33jtSfr-cwhmbQDDg9nZqGfjFVJE3r-1StULrMWuBC7Ed8LeQT6PwLVeQH9aq.4cBIKu90PjNLhbVk28sUnw
|
|
@ -0,0 +1 @@
|
|||||||
|
eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyNC0wMi0yOCAxODoxNzoyOS43ODc3NDk0NjYgKzAwMDAgVVRDIG09KzAuNTQwNzc0NDE3IiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiZFFyTlZBTlNyQjJwT0pyMyJ9.G3rn25Mtxkjn2zn8Absf38F9TCC313z7AE6k6RvO2IowEICeNL5qUw.c8ThJWOUbji8octY.wU0YPWyr8_I7JaU91u4ssl0yu-TTvcTmgPY1aLWHs_J69qslsm0ZG1TuAO4zHBF0D0ekl0DelXWb_1brctaZ8tg1Xwtwukf2hdE4vXjlvOk9kjGGQ1ZtRiRiji1QHrVozRja0tF2NQr7Tl0mt_iyvNLN82Poqvv61bYo7bd4OJ2sGZS7QduZmFGIGj58MPL7IiUAwstzKT3UZ4pK-QGNaCTuEyBDAWNW1HjlJSFRkB4SI09ZgnYhJyyE.k-7pkLpK1JOmKZPMWMbakg
|
@ -10,6 +10,10 @@
|
|||||||
# specified in this config (e.g. 0.25token1;0.0001token2).
|
# specified in this config (e.g. 0.25token1;0.0001token2).
|
||||||
minimum-gas-prices = "0stake"
|
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
|
# 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)
|
# 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.
|
# 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
|
# MinRetainBlocks defines the minimum block height offset from the current
|
||||||
# block being committed, such that all blocks past this offset are pruned
|
# 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
|
# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates
|
||||||
# that no blocks should be pruned.
|
# 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
|
# It has no bearing on application state pruning which is determined by the
|
||||||
# "pruning-*" configurations.
|
# "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
|
# with the unbonding (safety threshold) period, state pruning and state sync
|
||||||
# snapshot parameters to determine the correct minimum value of
|
# snapshot parameters to determine the correct minimum value of
|
||||||
# ResponseCommit.RetainHeight.
|
# ResponseCommit.RetainHeight.
|
||||||
@ -53,7 +57,7 @@ min-retain-blocks = 0
|
|||||||
inter-block-cache = true
|
inter-block-cache = true
|
||||||
|
|
||||||
# IndexEvents defines the set of events in the form {eventType}.{attributeKey},
|
# 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:
|
# Example:
|
||||||
# ["message.sender", "message.recipient"]
|
# ["message.sender", "message.recipient"]
|
||||||
@ -66,14 +70,9 @@ iavl-cache-size = 781250
|
|||||||
# Default is false.
|
# Default is false.
|
||||||
iavl-disable-fastnode = 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.
|
# AppDBBackend defines the database backend type to use for the application and snapshots DBs.
|
||||||
# An empty string indicates that a fallback will be used.
|
# An empty string indicates that a fallback will be used.
|
||||||
# First fallback is the deprecated compile-time types.DBBackend value.
|
# The fallback is the db_backend value set in CometBFT's config.toml.
|
||||||
# Second fallback (if the types.DBBackend also isn't set), is the db-backend value set in Tendermint's config.toml.
|
|
||||||
app-db-backend = ""
|
app-db-backend = ""
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@ -123,59 +122,23 @@ enable = true
|
|||||||
swagger = false
|
swagger = false
|
||||||
|
|
||||||
# Address defines the API server to listen on.
|
# Address defines the API server to listen on.
|
||||||
address = "tcp://0.0.0.0:1317"
|
address = "tcp://localhost:1317"
|
||||||
|
|
||||||
# MaxOpenConnections defines the number of maximum open connections.
|
# MaxOpenConnections defines the number of maximum open connections.
|
||||||
max-open-connections = 1000
|
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
|
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
|
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
|
rpc-max-body-bytes = 1000000
|
||||||
|
|
||||||
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
|
# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk).
|
||||||
enabled-unsafe-cors = true
|
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 ###
|
### gRPC Configuration ###
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@ -204,14 +167,9 @@ max-send-msg-size = "2147483647"
|
|||||||
|
|
||||||
# GRPCWebEnable defines if the gRPC-web should be enabled.
|
# GRPCWebEnable defines if the gRPC-web should be enabled.
|
||||||
# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op.
|
# 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
|
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 ###
|
### State Sync Configuration ###
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@ -228,27 +186,30 @@ snapshot-interval = 0
|
|||||||
snapshot-keep-recent = 2
|
snapshot-keep-recent = 2
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
### Store / State Streaming ###
|
### State Streaming ###
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
[store]
|
# Streaming allows nodes to stream state to external systems.
|
||||||
streamers = []
|
[streaming]
|
||||||
|
|
||||||
[streamers]
|
# streaming.abci specifies the configuration for the ABCI Listener streaming service.
|
||||||
[streamers.file]
|
[streaming.abci]
|
||||||
keys = ["*", ]
|
|
||||||
write_dir = ""
|
|
||||||
prefix = ""
|
|
||||||
|
|
||||||
# output-metadata specifies if output the metadata file which includes the abci request/responses
|
# List of kv store keys to stream out via gRPC.
|
||||||
# during processing the block.
|
# The store key names MUST match the module's StoreKey name.
|
||||||
output-metadata = "true"
|
#
|
||||||
|
# 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.
|
# The plugin name used for streaming via gRPC.
|
||||||
stop-node-on-error = "true"
|
# Streaming is only enabled if this is set.
|
||||||
|
# Supported plugins: abci
|
||||||
|
plugin = ""
|
||||||
|
|
||||||
# fsync specifies if call fsync after writing the files.
|
# stop-node-on-err specifies whether to stop the node on message delivery error.
|
||||||
fsync = "false"
|
stop-node-on-err = true
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
### Mempool ###
|
### Mempool ###
|
||||||
@ -261,7 +222,7 @@ fsync = "false"
|
|||||||
#
|
#
|
||||||
# Note, this configuration only applies to SDK built-in app-side mempool
|
# Note, this configuration only applies to SDK built-in app-side mempool
|
||||||
# implementations.
|
# implementations.
|
||||||
max-txs = "5000"
|
max-txs = 5000
|
||||||
|
|
||||||
[wasm]
|
[wasm]
|
||||||
# Smart query gas limit is the max gas to be used in a smart query contract call
|
# Smart query gas limit is the max gas to be used in a smart query contract call
|
||||||
|
@ -6,12 +6,12 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
# The network chain ID
|
# The network chain ID
|
||||||
chain-id = "testing"
|
chain-id = ""
|
||||||
# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory)
|
# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory)
|
||||||
keyring-backend = "os"
|
keyring-backend = "os"
|
||||||
# CLI output format (text|json)
|
# CLI output format (text|json)
|
||||||
output = "text"
|
output = "text"
|
||||||
# <host>:<port> to Tendermint RPC interface for this chain
|
# <host>:<port> to CometBFT RPC interface for this chain
|
||||||
node = "tcp://localhost:26657"
|
node = "tcp://localhost:26657"
|
||||||
# Transaction broadcasting mode (sync|async)
|
# Transaction broadcasting mode (sync|async)
|
||||||
broadcast-mode = "sync"
|
broadcast-mode = "sync"
|
||||||
|
@ -6,6 +6,10 @@
|
|||||||
# "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable
|
# "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable
|
||||||
# or --home cmd flag.
|
# 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 ###
|
### Main Base Config Options ###
|
||||||
#######################################################################
|
#######################################################################
|
||||||
@ -17,14 +21,6 @@ proxy_app = "tcp://127.0.0.1:26658"
|
|||||||
# A custom human readable name for this node
|
# A custom human readable name for this node
|
||||||
moniker = "node001"
|
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
|
# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb
|
||||||
# * goleveldb (github.com/syndtr/goleveldb - most popular implementation)
|
# * goleveldb (github.com/syndtr/goleveldb - most popular implementation)
|
||||||
# - pure go
|
# - pure go
|
||||||
@ -204,11 +200,9 @@ pprof_laddr = "localhost:6060"
|
|||||||
# Address to listen for incoming connections
|
# Address to listen for incoming connections
|
||||||
laddr = "tcp://0.0.0.0:26656"
|
laddr = "tcp://0.0.0.0:26656"
|
||||||
|
|
||||||
# Address to advertise to peers for them to dial
|
# Address to advertise to peers for them to dial. If empty, will use the same
|
||||||
# If empty, will use the same port as the laddr,
|
# port as the laddr, and will introspect on the listener to figure out the
|
||||||
# and will introspect on the listener or use UPnP
|
# address. IP and port are required. Example: 159.89.10.97:26656
|
||||||
# to figure out the address. ip and port are required
|
|
||||||
# example: 159.89.10.97:26656
|
|
||||||
external_address = ""
|
external_address = ""
|
||||||
|
|
||||||
# Comma separated list of seed nodes to connect to
|
# Comma separated list of seed nodes to connect to
|
||||||
@ -217,9 +211,6 @@ seeds = ""
|
|||||||
# Comma separated list of nodes to keep persistent connections to
|
# Comma separated list of nodes to keep persistent connections to
|
||||||
persistent_peers = ""
|
persistent_peers = ""
|
||||||
|
|
||||||
# UPNP port forwarding
|
|
||||||
upnp = false
|
|
||||||
|
|
||||||
# Path to address book
|
# Path to address book
|
||||||
addr_book_file = "config/addrbook.json"
|
addr_book_file = "config/addrbook.json"
|
||||||
|
|
||||||
@ -275,13 +266,24 @@ dial_timeout = "3s"
|
|||||||
#######################################################
|
#######################################################
|
||||||
[mempool]
|
[mempool]
|
||||||
|
|
||||||
# Mempool version to use:
|
# Recheck (default: true) defines whether CometBFT should recheck the
|
||||||
# 1) "v0" - (default) FIFO mempool.
|
# validity for all remaining transaction in the mempool after a block.
|
||||||
# 2) "v1" - prioritized mempool (deprecated; will be removed in the next release).
|
# Since a block affects the application state, some transactions in the
|
||||||
version = "v0"
|
# mempool may become invalid. If this does not apply to your application,
|
||||||
|
# you can disable rechecking.
|
||||||
recheck = true
|
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
|
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 = ""
|
wal_dir = ""
|
||||||
|
|
||||||
# Maximum number of transactions in the mempool
|
# 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
|
# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796
|
||||||
max_batch_bytes = 0
|
max_batch_bytes = 0
|
||||||
|
|
||||||
# ttl-duration, if non-zero, defines the maximum amount of time a transaction
|
# Experimental parameters to limit gossiping txs to up to the specified number of peers.
|
||||||
# can exist for in the mempool.
|
# We use two independent upper values for persistent peers and for non-persistent peers.
|
||||||
#
|
# Unconditional peers are not affected by this feature.
|
||||||
# Note, if ttl-num-blocks is also defined, a transaction will be removed if it
|
# If we are connected to more than the specified number of persistent peers, only send txs to
|
||||||
# has existed in the mempool at least ttl-num-blocks number of blocks or if it's
|
# the first experimental_max_gossip_connections_to_persistent_peers of them. If one of those
|
||||||
# insertion time into the mempool is beyond ttl-duration.
|
# persistent peers disconnects, activate another persistent peer. Similarly for non-persistent
|
||||||
ttl-duration = "0s"
|
# 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
|
||||||
# ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction
|
# number of active connections to that group of peers is not bounded.
|
||||||
# can exist for in the mempool.
|
# For non-persistent peers, if enabled, a value of 10 is recommended based on experimental
|
||||||
#
|
# performance results using the default P2P configuration.
|
||||||
# Note, if ttl-duration is also defined, a transaction will be removed if it
|
experimental_max_gossip_connections_to_persistent_peers = 0
|
||||||
# has existed in the mempool at least ttl-num-blocks number of blocks or if
|
experimental_max_gossip_connections_to_non_persistent_peers = 0
|
||||||
# it's insertion time into the mempool is beyond ttl-duration.
|
|
||||||
ttl-num-blocks = 0
|
|
||||||
|
|
||||||
#######################################################
|
#######################################################
|
||||||
### State Sync Configuration Options ###
|
### State Sync Configuration Options ###
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"app_hash": "",
|
"app_hash": null,
|
||||||
|
"app_name": "wasmd",
|
||||||
"app_state": {
|
"app_state": {
|
||||||
"07-tendermint": null,
|
"07-tendermint": null,
|
||||||
"auth": {
|
"auth": {
|
||||||
@ -7,7 +8,7 @@
|
|||||||
{
|
{
|
||||||
"@type": "/cosmos.auth.v1beta1.BaseAccount",
|
"@type": "/cosmos.auth.v1beta1.BaseAccount",
|
||||||
"account_number": "0",
|
"account_number": "0",
|
||||||
"address": "wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj",
|
"address": "wasm1k2vfqeu2upskfv7awn29g5kvxxnmugkz3xkye4",
|
||||||
"pub_key": null,
|
"pub_key": null,
|
||||||
"sequence": "0"
|
"sequence": "0"
|
||||||
},
|
},
|
||||||
@ -338,19 +339,6 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"address": "wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj",
|
|
||||||
"coins": [
|
|
||||||
{
|
|
||||||
"amount": "1000000000",
|
|
||||||
"denom": "ucosm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"amount": "1000000000",
|
|
||||||
"denom": "ustake"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"address": "wasm1f3pws3ztnp3s4nn5zxqdrl9vlqv5avkq3rjfe7",
|
"address": "wasm1f3pws3ztnp3s4nn5zxqdrl9vlqv5avkq3rjfe7",
|
||||||
"coins": [
|
"coins": [
|
||||||
@ -455,6 +443,19 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"address": "wasm1k2vfqeu2upskfv7awn29g5kvxxnmugkz3xkye4",
|
||||||
|
"coins": [
|
||||||
|
{
|
||||||
|
"amount": "1000000000",
|
||||||
|
"denom": "ucosm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amount": "1000000000",
|
||||||
|
"denom": "ustake"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"address": "wasm1hsm76p4ahyhl5yh3ve9ur49r5kemhp2r93f89d",
|
"address": "wasm1hsm76p4ahyhl5yh3ve9ur49r5kemhp2r93f89d",
|
||||||
"coins": [
|
"coins": [
|
||||||
@ -620,6 +621,10 @@
|
|||||||
"index": "1",
|
"index": "1",
|
||||||
"owners": []
|
"owners": []
|
||||||
},
|
},
|
||||||
|
"circuit": {
|
||||||
|
"account_permissions": [],
|
||||||
|
"disabled_type_urls": []
|
||||||
|
},
|
||||||
"consensus": null,
|
"consensus": null,
|
||||||
"crisis": {
|
"crisis": {
|
||||||
"constant_fee": {
|
"constant_fee": {
|
||||||
@ -678,7 +683,7 @@
|
|||||||
},
|
},
|
||||||
"public_key": {
|
"public_key": {
|
||||||
"@type": "/cosmos.crypto.secp256k1.PubKey",
|
"@type": "/cosmos.crypto.secp256k1.PubKey",
|
||||||
"key": "AuFzwOjmNa2qCjK5SyaWwu2DH8tpIcqhm2EdwoWeZVs1"
|
"key": "A1PeWP+eFZg8bYxgYzUyaeGWZgHIqRARDLKeb2MTJ3+W"
|
||||||
},
|
},
|
||||||
"sequence": "0"
|
"sequence": "0"
|
||||||
}
|
}
|
||||||
@ -687,7 +692,7 @@
|
|||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"extension_options": [],
|
"extension_options": [],
|
||||||
"memo": "219053a07bda81b7669c126f8308c668fe0b217a@172.17.0.2:26656",
|
"memo": "d762d7e639a8733cfe121cd1a431cf19aac4970a@172.17.0.4:26656",
|
||||||
"messages": [
|
"messages": [
|
||||||
{
|
{
|
||||||
"@type": "/cosmos.staking.v1beta1.MsgCreateValidator",
|
"@type": "/cosmos.staking.v1beta1.MsgCreateValidator",
|
||||||
@ -696,7 +701,7 @@
|
|||||||
"max_rate": "0.200000000000000000",
|
"max_rate": "0.200000000000000000",
|
||||||
"rate": "0.100000000000000000"
|
"rate": "0.100000000000000000"
|
||||||
},
|
},
|
||||||
"delegator_address": "wasm1g6kvj7w4c8g0vhl35kjgpe3jmuauet0e5tnevj",
|
"delegator_address": "",
|
||||||
"description": {
|
"description": {
|
||||||
"details": "",
|
"details": "",
|
||||||
"identity": "",
|
"identity": "",
|
||||||
@ -707,9 +712,9 @@
|
|||||||
"min_self_delegation": "1",
|
"min_self_delegation": "1",
|
||||||
"pubkey": {
|
"pubkey": {
|
||||||
"@type": "/cosmos.crypto.ed25519.PubKey",
|
"@type": "/cosmos.crypto.ed25519.PubKey",
|
||||||
"key": "Wl41mDACwzdenqf7Ehq9jvDGRJ3AyFp0J9N6jAbnV3s="
|
"key": "Hg7F1/5m61tUBvTppqh/cFq4Og09pZH5iEf+d9eAzb0="
|
||||||
},
|
},
|
||||||
"validator_address": "wasmvaloper1g6kvj7w4c8g0vhl35kjgpe3jmuauet0ephx9zg",
|
"validator_address": "wasmvaloper1k2vfqeu2upskfv7awn29g5kvxxnmugkzy6rch0",
|
||||||
"value": {
|
"value": {
|
||||||
"amount": "250000000",
|
"amount": "250000000",
|
||||||
"denom": "ustake"
|
"denom": "ustake"
|
||||||
@ -720,18 +725,27 @@
|
|||||||
"timeout_height": "0"
|
"timeout_height": "0"
|
||||||
},
|
},
|
||||||
"signatures": [
|
"signatures": [
|
||||||
"xBiKWraC8m+L0KCtBGWnQlD0eEKEqcwPdjDY02YNefsTr52v1xwoFieFuUbfuLkUEBQXWp/cRNwBFR9qTkV0rA=="
|
"fEgp9HnUJAhLkkLJr/WesljZe/aGPHQj8LGluaCXXf5xO7oc1ldS6HdcHpleLQ8Gefghu0JpcKE+W3w3rWvHDg=="
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gov": {
|
"gov": {
|
||||||
|
"constitution": "",
|
||||||
"deposit_params": null,
|
"deposit_params": null,
|
||||||
"deposits": [],
|
"deposits": [],
|
||||||
"params": {
|
"params": {
|
||||||
"burn_proposal_deposit_prevote": false,
|
"burn_proposal_deposit_prevote": false,
|
||||||
"burn_vote_quorum": false,
|
"burn_vote_quorum": false,
|
||||||
"burn_vote_veto": true,
|
"burn_vote_veto": true,
|
||||||
|
"expedited_min_deposit": [
|
||||||
|
{
|
||||||
|
"amount": "50000000",
|
||||||
|
"denom": "ustake"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"expedited_threshold": "0.667000000000000000",
|
||||||
|
"expedited_voting_period": "86400s",
|
||||||
"max_deposit_period": "172800s",
|
"max_deposit_period": "172800s",
|
||||||
"min_deposit": [
|
"min_deposit": [
|
||||||
{
|
{
|
||||||
@ -739,7 +753,10 @@
|
|||||||
"denom": "ustake"
|
"denom": "ustake"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"min_deposit_ratio": "0.010000000000000000",
|
||||||
"min_initial_deposit_ratio": "0.000000000000000000",
|
"min_initial_deposit_ratio": "0.000000000000000000",
|
||||||
|
"proposal_cancel_dest": "",
|
||||||
|
"proposal_cancel_ratio": "0.500000000000000000",
|
||||||
"quorum": "0.334000000000000000",
|
"quorum": "0.334000000000000000",
|
||||||
"threshold": "0.500000000000000000",
|
"threshold": "0.500000000000000000",
|
||||||
"veto_threshold": "0.334000000000000000",
|
"veto_threshold": "0.334000000000000000",
|
||||||
@ -781,7 +798,8 @@
|
|||||||
"params": {
|
"params": {
|
||||||
"allowed_clients": [
|
"allowed_clients": [
|
||||||
"06-solomachine",
|
"06-solomachine",
|
||||||
"07-tendermint"
|
"07-tendermint",
|
||||||
|
"09-localhost"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -868,7 +886,8 @@
|
|||||||
"receive_enabled": true,
|
"receive_enabled": true,
|
||||||
"send_enabled": true
|
"send_enabled": true
|
||||||
},
|
},
|
||||||
"port_id": "transfer"
|
"port_id": "transfer",
|
||||||
|
"total_escrowed": []
|
||||||
},
|
},
|
||||||
"upgrade": {},
|
"upgrade": {},
|
||||||
"vesting": {},
|
"vesting": {},
|
||||||
@ -877,7 +896,6 @@
|
|||||||
"contracts": [],
|
"contracts": [],
|
||||||
"params": {
|
"params": {
|
||||||
"code_upload_access": {
|
"code_upload_access": {
|
||||||
"address": "",
|
|
||||||
"addresses": [],
|
"addresses": [],
|
||||||
"permission": "Everybody"
|
"permission": "Everybody"
|
||||||
},
|
},
|
||||||
@ -886,8 +904,13 @@
|
|||||||
"sequences": []
|
"sequences": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"app_version": "0.50.0",
|
||||||
"chain_id": "testing",
|
"chain_id": "testing",
|
||||||
"consensus_params": {
|
"consensus": {
|
||||||
|
"params": {
|
||||||
|
"abci": {
|
||||||
|
"vote_extensions_enable_height": "0"
|
||||||
|
},
|
||||||
"block": {
|
"block": {
|
||||||
"max_bytes": "22020096",
|
"max_bytes": "22020096",
|
||||||
"max_gas": "-1"
|
"max_gas": "-1"
|
||||||
@ -905,7 +928,8 @@
|
|||||||
"version": {
|
"version": {
|
||||||
"app": "0"
|
"app": "0"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"genesis_time": "2023-05-31T13:48:23.278155129Z",
|
},
|
||||||
"initial_height": "1"
|
"genesis_time": "2024-02-28T18:17:28.773922633Z",
|
||||||
|
"initial_height": 1
|
||||||
}
|
}
|
||||||
|
@ -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=="]}
|
|
@ -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=="]}
|
@ -1 +1 @@
|
|||||||
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"A6ZsZSk2zdZL3YeCiem6mL8pBlI++ETuaoWX45/5/rUN/QglRAokL1S2EBWyl6t5B0CZ5ilRy/vdzcywgdhS5A=="}}
|
{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"tn2knzIzO3GsIfcOjrgsHhbnLwQYz3aMkw4oGtTa6Ykbzg0HWwqhLOyLcO/v76CbQ8ab/MDUmg6UP82ZHyQkqA=="}}
|
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"address": "A705A5DDB2B289539B3FC9023274D19A807F52DD",
|
"address": "FE3F55B7F2338218467C07F12B9374FDACC2DB12",
|
||||||
"pub_key": {
|
"pub_key": {
|
||||||
"type": "tendermint/PubKeyEd25519",
|
"type": "tendermint/PubKeyEd25519",
|
||||||
"value": "Wl41mDACwzdenqf7Ehq9jvDGRJ3AyFp0J9N6jAbnV3s="
|
"value": "Hg7F1/5m61tUBvTppqh/cFq4Og09pZH5iEf+d9eAzb0="
|
||||||
},
|
},
|
||||||
"priv_key": {
|
"priv_key": {
|
||||||
"type": "tendermint/PrivKeyEd25519",
|
"type": "tendermint/PrivKeyEd25519",
|
||||||
"value": "yXLB65vCSDp7MnaXiP4CR4h1T8u0PoTNx9oaZ+pV7I5aXjWYMALDN16ep/sSGr2O8MZEncDIWnQn03qMBudXew=="
|
"value": "lzpks1F8BO9CKR5PUcPn74PFnGwpqajU9r7NpWv7YggeDsXX/mbrW1QG9OmmqH9wWrg6DT2lkfmIR/5314DNvQ=="
|
||||||
}
|
}
|
||||||
}
|
}
|
2
scripts/wasmd/template/.wasmd/keyhash
Executable file → Normal file
2
scripts/wasmd/template/.wasmd/keyhash
Executable file → Normal file
@ -1 +1 @@
|
|||||||
$2a$10$Mbw.f93oEBpmvaOBQyyUR.TdPqVGmQVDeOEcF6nYj8UNvQqzXyOze
|
$2a$10$cxUpxoR9u6Kssy4YiYFuYus/OLYlGbyQ5M0uNp5Fpc/husRw7Aeca
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user