From 37b705683b5af525841c492b09f9374c3ef24e30 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Aug 2022 13:32:02 +0200 Subject: [PATCH 1/5] Test Node.js 18 --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ef088ec8..dc46f0d1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -34,7 +34,7 @@ workflows: - build matrix: parameters: - node-version: ["14", "16"] + node-version: ["14", "16", "18"] - test-chrome: requires: - build @@ -245,6 +245,7 @@ jobs: declare -A node_links=( ["14"]="https://deb.nodesource.com/node_14.x/pool/main/n/nodejs/nodejs_14.18.0-deb-1nodesource1_amd64.deb" ["16"]="https://deb.nodesource.com/node_16.x/pool/main/n/nodejs/nodejs_16.13.2-deb-1nodesource1_amd64.deb" + ["18"]="https://deb.nodesource.com/node_18.x/pool/main/n/nodejs/nodejs_18.7.0-deb-1nodesource1_amd64.deb" ) wget -O "$HOME/nodejs.deb" "${node_links[<< parameters.node-version >>]}" sudo dpkg -i "$HOME/nodejs.deb" From 612576f85c5498f266bcd0929462cc3870eabf05 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 7 Dec 2022 21:06:53 +0100 Subject: [PATCH 2/5] Upgrade usb dependency to 1.9.2 --- .pnp.cjs | 79 +++++++------------ ...on-api-npm-3.0.2-4c22ea0673-cd4ef5ddc1.zip | 3 - ...on-api-npm-4.3.0-a07a1232df-3de396e23c.zip | 3 + ...-build-npm-4.5.0-2538da6152-d888bae0fb.zip | 3 + ...nstall-npm-5.3.6-843a9baf36-9b99e5ea2c.zip | 3 - .../usb-npm-1.7.1-d03d3a15f5-7d20ffef8b.zip | 3 - .../usb-npm-1.9.2-7362a49b80-7aaf6669f0.zip | 3 + ...m-runs-npm-1.0.0-c3252bc9d6-30cf7aee31.zip | 3 - yarn.lock | 76 +++++++----------- 9 files changed, 64 insertions(+), 112 deletions(-) delete mode 100644 .yarn/cache/node-addon-api-npm-3.0.2-4c22ea0673-cd4ef5ddc1.zip create mode 100644 .yarn/cache/node-addon-api-npm-4.3.0-a07a1232df-3de396e23c.zip create mode 100644 .yarn/cache/node-gyp-build-npm-4.5.0-2538da6152-d888bae0fb.zip delete mode 100644 .yarn/cache/prebuild-install-npm-5.3.6-843a9baf36-9b99e5ea2c.zip delete mode 100644 .yarn/cache/usb-npm-1.7.1-d03d3a15f5-7d20ffef8b.zip create mode 100644 .yarn/cache/usb-npm-1.9.2-7362a49b80-7aaf6669f0.zip delete mode 100644 .yarn/cache/which-pm-runs-npm-1.0.0-c3252bc9d6-30cf7aee31.zip diff --git a/.pnp.cjs b/.pnp.cjs index a335ce37..0421c3bc 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2026,6 +2026,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "node-gyp",\ "npm:8.0.0"\ ],\ + [\ + "node-gyp-build",\ + "npm:4.5.0"\ + ],\ [\ "node-hid",\ "npm:2.1.1"\ @@ -2676,7 +2680,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ [\ "usb",\ - "npm:1.7.1"\ + "npm:1.9.2"\ ],\ [\ "util-deprecate",\ @@ -2746,10 +2750,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "which-module",\ "npm:2.0.0"\ ],\ - [\ - "which-pm-runs",\ - "npm:1.0.0"\ - ],\ [\ "wide-align",\ "npm:1.1.3"\ @@ -4121,7 +4121,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@ledgerhq/logs", "npm:5.50.0"],\ ["lodash", "npm:4.17.21"],\ ["node-hid", "npm:2.1.1"],\ - ["usb", "npm:1.7.1"]\ + ["usb", "npm:1.9.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -9918,14 +9918,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["node-addon-api", [\ - ["npm:3.0.2", {\ - "packageLocation": "./.yarn/unplugged/node-addon-api-npm-3.0.2-4c22ea0673/node_modules/node-addon-api/",\ - "packageDependencies": [\ - ["node-addon-api", "npm:3.0.2"],\ - ["node-gyp", "npm:8.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.2.0", {\ "packageLocation": "./.yarn/unplugged/node-addon-api-npm-3.2.0-061ff0dbab/node_modules/node-addon-api/",\ "packageDependencies": [\ @@ -9933,6 +9925,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["node-gyp", "npm:8.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/unplugged/node-addon-api-npm-4.3.0-a07a1232df/node_modules/node-addon-api/",\ + "packageDependencies": [\ + ["node-addon-api", "npm:4.3.0"],\ + ["node-gyp", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["node-gyp", [\ @@ -9954,6 +9954,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["node-gyp-build", [\ + ["npm:4.5.0", {\ + "packageLocation": "./.yarn/cache/node-gyp-build-npm-4.5.0-2538da6152-d888bae0fb.zip/node_modules/node-gyp-build/",\ + "packageDependencies": [\ + ["node-gyp-build", "npm:4.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["node-hid", [\ ["npm:2.1.1", {\ "packageLocation": "./.yarn/unplugged/node-hid-npm-2.1.1-840235e168/node_modules/node-hid/",\ @@ -10457,28 +10466,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["prebuild-install", [\ - ["npm:5.3.6", {\ - "packageLocation": "./.yarn/cache/prebuild-install-npm-5.3.6-843a9baf36-9b99e5ea2c.zip/node_modules/prebuild-install/",\ - "packageDependencies": [\ - ["prebuild-install", "npm:5.3.6"],\ - ["detect-libc", "npm:1.0.3"],\ - ["expand-template", "npm:2.0.3"],\ - ["github-from-package", "npm:0.0.0"],\ - ["minimist", "npm:1.2.6"],\ - ["mkdirp-classic", "npm:0.5.3"],\ - ["napi-build-utils", "npm:1.0.2"],\ - ["node-abi", "npm:2.26.0"],\ - ["noop-logger", "npm:0.1.1"],\ - ["npmlog", "npm:4.1.2"],\ - ["pump", "npm:3.0.0"],\ - ["rc", "npm:1.2.8"],\ - ["simple-get", "npm:3.1.1"],\ - ["tar-fs", "npm:2.1.1"],\ - ["tunnel-agent", "npm:0.6.0"],\ - ["which-pm-runs", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:6.1.2", {\ "packageLocation": "./.yarn/cache/prebuild-install-npm-6.1.2-5d6abe684c-db205c9f40.zip/node_modules/prebuild-install/",\ "packageDependencies": [\ @@ -12265,14 +12252,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["usb", [\ - ["npm:1.7.1", {\ - "packageLocation": "./.yarn/unplugged/usb-npm-1.7.1-d03d3a15f5/node_modules/usb/",\ + ["npm:1.9.2", {\ + "packageLocation": "./.yarn/unplugged/usb-npm-1.9.2-7362a49b80/node_modules/usb/",\ "packageDependencies": [\ - ["usb", "npm:1.7.1"],\ - ["bindings", "npm:1.5.0"],\ - ["node-addon-api", "npm:3.0.2"],\ + ["usb", "npm:1.9.2"],\ + ["node-addon-api", "npm:4.3.0"],\ ["node-gyp", "npm:8.0.0"],\ - ["prebuild-install", "npm:5.3.6"]\ + ["node-gyp-build", "npm:4.5.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -13622,15 +13608,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["which-pm-runs", [\ - ["npm:1.0.0", {\ - "packageLocation": "./.yarn/cache/which-pm-runs-npm-1.0.0-c3252bc9d6-30cf7aee31.zip/node_modules/which-pm-runs/",\ - "packageDependencies": [\ - ["which-pm-runs", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["wide-align", [\ ["npm:1.1.3", {\ "packageLocation": "./.yarn/cache/wide-align-npm-1.1.3-48c7d4953c-d09c801265.zip/node_modules/wide-align/",\ diff --git a/.yarn/cache/node-addon-api-npm-3.0.2-4c22ea0673-cd4ef5ddc1.zip b/.yarn/cache/node-addon-api-npm-3.0.2-4c22ea0673-cd4ef5ddc1.zip deleted file mode 100644 index 62e36888..00000000 --- a/.yarn/cache/node-addon-api-npm-3.0.2-4c22ea0673-cd4ef5ddc1.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2af2c1a02a5597abd79a0e6656b9754078f9630176c406b61b0a4ae8155cef72 -size 168093 diff --git a/.yarn/cache/node-addon-api-npm-4.3.0-a07a1232df-3de396e23c.zip b/.yarn/cache/node-addon-api-npm-4.3.0-a07a1232df-3de396e23c.zip new file mode 100644 index 00000000..5d625bf8 --- /dev/null +++ b/.yarn/cache/node-addon-api-npm-4.3.0-a07a1232df-3de396e23c.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b266fbdf700d030dc2134074a0efb7938c8b5110592870a95688ffb33078a095 +size 62602 diff --git a/.yarn/cache/node-gyp-build-npm-4.5.0-2538da6152-d888bae0fb.zip b/.yarn/cache/node-gyp-build-npm-4.5.0-2538da6152-d888bae0fb.zip new file mode 100644 index 00000000..24a54823 --- /dev/null +++ b/.yarn/cache/node-gyp-build-npm-4.5.0-2538da6152-d888bae0fb.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bc9162a22ca85749eb56deca2acb70568385d133b51c349efbd88bf610d1c53 +size 6653 diff --git a/.yarn/cache/prebuild-install-npm-5.3.6-843a9baf36-9b99e5ea2c.zip b/.yarn/cache/prebuild-install-npm-5.3.6-843a9baf36-9b99e5ea2c.zip deleted file mode 100644 index 4cb60ccd..00000000 --- a/.yarn/cache/prebuild-install-npm-5.3.6-843a9baf36-9b99e5ea2c.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6c1d39e50d1ac50f2e589177b1010204bf6c910fdec6f5fea6e9807c91b8459 -size 13042 diff --git a/.yarn/cache/usb-npm-1.7.1-d03d3a15f5-7d20ffef8b.zip b/.yarn/cache/usb-npm-1.7.1-d03d3a15f5-7d20ffef8b.zip deleted file mode 100644 index 488203fb..00000000 --- a/.yarn/cache/usb-npm-1.7.1-d03d3a15f5-7d20ffef8b.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2a01c35e286561944b2b5dd6c91e9eb8bd07d0e94a1183090b910aff55ea6c9 -size 471786 diff --git a/.yarn/cache/usb-npm-1.9.2-7362a49b80-7aaf6669f0.zip b/.yarn/cache/usb-npm-1.9.2-7362a49b80-7aaf6669f0.zip new file mode 100644 index 00000000..d16fd3a5 --- /dev/null +++ b/.yarn/cache/usb-npm-1.9.2-7362a49b80-7aaf6669f0.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:072464ca26f0f0c357e97fc9f8490d44a122962f0f35628f71775b0cf86fc028 +size 1805014 diff --git a/.yarn/cache/which-pm-runs-npm-1.0.0-c3252bc9d6-30cf7aee31.zip b/.yarn/cache/which-pm-runs-npm-1.0.0-c3252bc9d6-30cf7aee31.zip deleted file mode 100644 index 48178924..00000000 --- a/.yarn/cache/which-pm-runs-npm-1.0.0-c3252bc9d6-30cf7aee31.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:340a91c8fd8a9ce8b71483b03182e981d414fcce8bfabf4480e04501a2eba0c6 -size 2405 diff --git a/yarn.lock b/yarn.lock index f959aa12..e0176312 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2403,7 +2403,7 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.4.0, bindings@npm:^1.5.0": +"bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" dependencies: @@ -5431,7 +5431,7 @@ __metadata: languageName: node linkType: hard -"node-abi@npm:^2.21.0, node-abi@npm:^2.7.0": +"node-abi@npm:^2.21.0": version: 2.26.0 resolution: "node-abi@npm:2.26.0" dependencies: @@ -5440,15 +5440,6 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:3.0.2": - version: 3.0.2 - resolution: "node-addon-api@npm:3.0.2" - dependencies: - node-gyp: latest - checksum: cd4ef5ddc17f96fc291cc74880cbf5c1d65ab849098bc3092fa6f15f6e1a4f5ec474e071715bace3fabeb0860599bccb1a3f151063cd269962c0653dc999bf39 - languageName: node - linkType: hard - "node-addon-api@npm:^3.0.2": version: 3.2.0 resolution: "node-addon-api@npm:3.2.0" @@ -5458,6 +5449,26 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^4.2.0": + version: 4.3.0 + resolution: "node-addon-api@npm:4.3.0" + dependencies: + node-gyp: latest + checksum: 3de396e23cc209f539c704583e8e99c148850226f6e389a641b92e8967953713228109f919765abc1f4355e801e8f41842f96210b8d61c7dcc10a477002dcf00 + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.3.0": + version: 4.5.0 + resolution: "node-gyp-build@npm:4.5.0" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: d888bae0fb88335f69af1b57a2294a931c5042f36e413d8d364c992c9ebfa0b96ffe773179a5a2c8f04b73856e8634e09cce108dbb9804396d3cc8c5455ff2db + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 8.0.0 resolution: "node-gyp@npm:8.0.0" @@ -5935,31 +5946,6 @@ __metadata: languageName: node linkType: hard -"prebuild-install@npm:^5.3.3": - version: 5.3.6 - resolution: "prebuild-install@npm:5.3.6" - dependencies: - detect-libc: ^1.0.3 - expand-template: ^2.0.3 - github-from-package: 0.0.0 - minimist: ^1.2.3 - mkdirp-classic: ^0.5.3 - napi-build-utils: ^1.0.1 - node-abi: ^2.7.0 - noop-logger: ^0.1.1 - npmlog: ^4.0.1 - pump: ^3.0.0 - rc: ^1.2.7 - simple-get: ^3.0.3 - tar-fs: ^2.0.0 - tunnel-agent: ^0.6.0 - which-pm-runs: ^1.0.0 - bin: - prebuild-install: bin.js - checksum: 9b99e5ea2c1db44efbd1bc1f3d04f887e66ae282af8560191ee3005886c8d3fab578ad3e903d0965fec082d3c0779e6337a63152dc9d0f847f1bc95317356ea1 - languageName: node - linkType: hard - "prebuild-install@npm:^6.0.0": version: 6.1.2 resolution: "prebuild-install@npm:6.1.2" @@ -7293,14 +7279,13 @@ __metadata: linkType: hard "usb@npm:^1.7.0": - version: 1.7.1 - resolution: "usb@npm:1.7.1" + version: 1.9.2 + resolution: "usb@npm:1.9.2" dependencies: - bindings: ^1.4.0 - node-addon-api: 3.0.2 + node-addon-api: ^4.2.0 node-gyp: latest - prebuild-install: ^5.3.3 - checksum: 7d20ffef8bc0052d0510387968bcedf70e071639eec46985ee17648d26cba6595ef0fbee3837b6701235dded52eb30cf1c51be423ab877c704569914ec3323fa + node-gyp-build: ^4.3.0 + checksum: 7aaf6669f02c6f4bebe571de1c364447ca44be4dc8c60fc3261f38660e04015099ebed3943935ad64755afccd11213245d697ea05571a2f142d912bb801bb54f languageName: node linkType: hard @@ -7492,13 +7477,6 @@ __metadata: languageName: node linkType: hard -"which-pm-runs@npm:^1.0.0": - version: 1.0.0 - resolution: "which-pm-runs@npm:1.0.0" - checksum: 30cf7aee31f264558070e92414316c169367bb2b84a0a32777d30392fea0892fcf9955b81c3fe7f52165ae5a33f0acfd3bc0916416cb07e6d414c90255c228ca - languageName: node - linkType: hard - "which@npm:^1.2.1": version: 1.3.1 resolution: "which@npm:1.3.1" From b33c6c9193f730f6867c55dde8f3bee701f5855a Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 8 Dec 2022 11:40:12 +0100 Subject: [PATCH 3/5] Split http tests --- .../src/rpcclients/http.spec.ts | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/tendermint-rpc/src/rpcclients/http.spec.ts b/packages/tendermint-rpc/src/rpcclients/http.spec.ts index fa6b3b0f..839f1b96 100644 --- a/packages/tendermint-rpc/src/rpcclients/http.spec.ts +++ b/packages/tendermint-rpc/src/rpcclients/http.spec.ts @@ -19,17 +19,11 @@ describe("http", () => { expect(response).toEqual(jasmine.objectContaining({ jsonrpc: "2.0" })); }); - it("errors for non-open port", async () => { - await expectAsync( - http("POST", `http://localhost:56745`, undefined, createJsonRpcRequest("health")), - ).toBeRejectedWithError(/(ECONNREFUSED|Failed to fetch)/i); - }); - - it("can send custom headers", async () => { + it("can POST to echo server", async () => { pendingWithoutHttpServer(); - // Without custom headers - const response1 = await http("POST", echoUrl, undefined, createJsonRpcRequest("health")); - expect(response1).toEqual({ + + const response = await http("POST", echoUrl, undefined, createJsonRpcRequest("health")); + expect(response).toEqual({ request_headers: jasmine.objectContaining({ // Basic headers from http client Accept: jasmine.any(String), @@ -39,15 +33,25 @@ describe("http", () => { "User-Agent": jasmine.any(String), }), }); + }); + + it("errors for non-open port", async () => { + await expectAsync( + http("POST", `http://localhost:56745`, undefined, createJsonRpcRequest("health")), + ).toBeRejectedWithError(/(ECONNREFUSED|Failed to fetch)/i); + }); + + it("can POST to echo server with custom headers", async () => { + pendingWithoutHttpServer(); // With custom headers - const response2 = await http( + const response = await http( "POST", echoUrl, { foo: "bar123", Authorization: "Basic Z3Vlc3Q6bm9QYXNzMTIz" }, createJsonRpcRequest("health"), ); - expect(response2).toEqual({ + expect(response).toEqual({ request_headers: jasmine.objectContaining({ // Basic headers from http client "Content-Length": jasmine.any(String), From 182b1e778cbfdcbc73f95f2de8345e5c0613fb00 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 8 Dec 2022 11:38:26 +0100 Subject: [PATCH 4/5] Do not use experimental fetch --- .../tendermint-rpc/src/rpcclients/http.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/tendermint-rpc/src/rpcclients/http.ts b/packages/tendermint-rpc/src/rpcclients/http.ts index f7ec0b41..1d389504 100644 --- a/packages/tendermint-rpc/src/rpcclients/http.ts +++ b/packages/tendermint-rpc/src/rpcclients/http.ts @@ -11,6 +11,23 @@ function filterBadStatus(res: any): any { return res; } +/** + * Node.js 18 comes with exprimental fetch support (https://nodejs.org/de/blog/announcements/v18-release-announce/). + * This is nice, but the implementation does not yet work wekk for us. We + * can just stick with axios on those systems for now. + */ +// eslint-disable-next-line @typescript-eslint/ban-types +function isExperimental(nodeJsFunc: Function): boolean { + // This works because we get this info in node 18: + // + // > fetch.toString() + // 'async function fetch(input, init = undefined) {\n' + + // " emitExperimentalWarning('The Fetch API');\n" + + // ' return lazyUndici().fetch(input, init);\n' + + // ' }' + return nodeJsFunc.toString().includes("emitExperimentalWarning"); +} + /** * Helper to work around missing CORS support in Tendermint (https://github.com/tendermint/tendermint/pull/2800) * @@ -23,7 +40,7 @@ export async function http( headers: Record | undefined, request?: any, ): Promise { - if (typeof fetch !== "undefined") { + if (typeof fetch === "function" && !isExperimental(fetch)) { const settings = { method: method, body: request ? JSON.stringify(request) : undefined, From 81ca5bb44d0c798e68dcef607f2fa36639ed021c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 8 Dec 2022 12:05:02 +0100 Subject: [PATCH 5/5] Add CHANGELOG for node 18 [ci skip] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e3e6c42..64d43e80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to ### Changed - all: The TypeScript compilation target is now ES2020 ([#1002]). +- all: Add full support for Node.js 18 and run all CI tests with it ([#1240]). - @cosmjs/tendermint-rpc: Remove unused `index` field from `RpcTxEvent` and `TxEvent`. This is unset starting with Tendermint 0.34. - @cosmjs/crypto: The pbkdf2 implementation for old Node.js versions @@ -18,6 +19,7 @@ and this project adheres to [#1002]: https://github.com/cosmos/cosmjs/issues/1002 [#1341]: https://github.com/cosmos/cosmjs/issues/1341 +[#1240]: https://github.com/cosmos/cosmjs/pull/1240 ## [0.29.5] - 2022-12-07