From 84f60959d9ff335bed85ae1709cd10654ca2af78 Mon Sep 17 00:00:00 2001 From: rob thijssen Date: Wed, 16 Sep 2026 09:37:55 +0300 Subject: [PATCH] fix: decode Quantus block headers, which is what was actually broken MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The console rendered nothing against Quantus and I had reported tier 3 as working on the strength of a unit-level test. It was not working. This is the fault. `qp_header::Header` is not `sp_runtime::generic::Header`. `number` is a plain u32 where Substrate writes a Compact, and a `zk_tree_root: H256` sits between `extrinsics_root` and `digest` — deliberately, so the ZK root has a fixed offset in the header preimage that miners cannot shift by manipulating the digest. Reading a Quantus header as a Substrate one consumes 2 bytes where 4 were written. Every field after shifts, and the digest vector eventually reads a byte that is not a known DigestItem index, which surfaces three layers away as `TypeError: innerDecoder is not a function`. papi retried the subfollow forever, `runtime$` never emitted, and the page stayed blank. The patched codec carries both layouts and picks by **round trip**: a layout is right only if decoding and re-encoding reproduces the input byte for byte, which also catches a short read, trailing bytes and a non-canonical compact. Trying them in a fixed order and taking the first that survives is deterministic; choosing by inspecting a byte would not be. Pinned per version rather than by bare package name, unlike the signers-common patch: four copies of substrate-bindings resolve in this tree and blockHeader.js is not identical across majors — a bare-name key fails the whole install trying to patch 0.19.0 and 0.6.0. Two things this cost, both recorded because they are the kind that recur: - My first attempt replaced the codec with a bare [enc, dec] pair, which dropped scale-ts's `inner`. This console's own block.state.ts does `blockHeader.inner.digests.inner`, so that module threw while evaluating, `createRoot().render()` never ran, and the page was blank with nothing in the UI — the same symptom as the bug, from the opposite cause. The patch now copies the original codec and overrides only the decoder. - The Poseidon block hash is NOT a second blocker, which I had claimed on #1 and #4 without checking. `getHasherFromHeader` returns a function that throws rather than throwing, and only the extrinsic Analyzer page consumes `hasher$`. Everything else works without it. Verified in a browser this time, not by unit test: against mainnet the console renders live data — Finalized 53,989, Best 54,089, block time — advancing, and matching what the node reports. Polkadot still decodes through the same patched codec, and garbage is refused rather than mis-read. Residual: four "fetch header failed TypeError: e is not an object" on first load, from the per-block detail fetch, not recurring since. Not diagnosed. Refs #1, #4 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_012uDUodEcRbBwNRi3UCmw8f --- ...kadot-api__substrate-bindings@0.21.0.patch | 99 +++++++++++++++++++ ...kadot-api__substrate-bindings@0.21.1.patch | 99 +++++++++++++++++++ pnpm-lock.yaml | 82 +++++++-------- pnpm-workspace.yaml | 8 ++ 4 files changed, 248 insertions(+), 40 deletions(-) create mode 100644 patches/@polkadot-api__substrate-bindings@0.21.0.patch create mode 100644 patches/@polkadot-api__substrate-bindings@0.21.1.patch diff --git a/patches/@polkadot-api__substrate-bindings@0.21.0.patch b/patches/@polkadot-api__substrate-bindings@0.21.0.patch new file mode 100644 index 0000000..8c5501a --- /dev/null +++ b/patches/@polkadot-api__substrate-bindings@0.21.0.patch @@ -0,0 +1,99 @@ +diff --git a/dist/codecs/blockHeader.js b/dist/codecs/blockHeader.js +index 0675e59633a14c34148e90aa8c32bcfbc437330c..691ac4ede3c816bad444a6054860ed0bb3fcd37d 100644 +--- a/dist/codecs/blockHeader.js ++++ b/dist/codecs/blockHeader.js +@@ -1,4 +1,4 @@ +-import { enhanceCodec, Bytes, _void } from 'scale-ts'; ++import { enhanceCodec, Bytes, _void, u32 } from 'scale-ts'; + import '../utils/ss58-util.js'; + import './scale/Binary.js'; + import './scale/bitSequence.js'; +@@ -33,7 +33,23 @@ const diggest = Variant( + [0, 4, 5, 6, 8] + ); + const hex32 = Hex(32); +-const blockHeader = Struct({ ++ ++// Quantus patch: this console serves two header layouts. ++// ++// `sp_runtime::generic::Header` encodes `number` with #[codec(compact)] and has ++// no field between `extrinsics_root` and `digest`. Quantus's `qp_header::Header` ++// does neither: `number` is a plain u32, and a `zk_tree_root: H256` sits before ++// the digest — deliberately, so the ZK root has a fixed offset in the header ++// preimage that miners cannot shift by manipulating the digest. ++// ++// Reading a Quantus header as a Substrate one consumes 2 bytes where 4 were ++// written; every field after shifts, and the digest vector eventually reads a ++// byte that is not a known DigestItem index. That surfaces three layers away as ++// `TypeError: innerDecoder is not a function`, papi retries the subfollow ++// forever, `runtime$` never emits, and the page renders nothing at all. ++// ++// See quantus/papi-console#4. ++const substrateHeader = Struct({ + parentHash: hex32, + number: compactNumber, + stateRoot: hex32, +@@ -41,5 +57,63 @@ const blockHeader = Struct({ + digests: Vector(diggest) + }); + ++const quantusHeader = Struct({ ++ parentHash: hex32, ++ number: u32, ++ stateRoot: hex32, ++ extrinsicRoot: hex32, ++ zkTreeRoot: hex32, ++ digests: Vector(diggest) ++}); ++ ++const asBytes = (input) => ++ typeof input === "string" ++ ? Uint8Array.from( ++ input ++ .slice(2) ++ .match(/../g) ++ ?.map((b) => parseInt(b, 16)) ?? [] ++ ) ++ : input; ++ ++const sameBytes = (a, b) => ++ a.length === b.length && a.every((x, i) => x === b[i]); ++ ++// Decide by round trip, not by guessing. A layout is right only if decoding and ++// re-encoding reproduces the input byte for byte — which also catches a short ++// read, trailing bytes, and a non-canonical compact. Trying the layouts in a ++// fixed order and taking the first that survives that check is deterministic; ++// picking one by inspecting a byte would not be. ++const decodeEitherLayout = (input) => { ++ const bytes = asBytes(input); ++ let firstError; ++ ++ for (const codec of [substrateHeader, quantusHeader]) { ++ try { ++ const value = codec.dec(bytes); ++ ++ if (sameBytes(codec.enc(value), bytes)) return value; ++ } catch (error) { ++ firstError ??= error; ++ } ++ } ++ ++ throw firstError ?? new Error("block header matches no known layout"); ++}; ++ ++// Keep every property the original codec carried and override only the decoder. ++// A scale-ts Struct exposes `inner` — its field codecs — and consumers reach for ++// it: this console's own block.state.ts does `blockHeader.inner.digests.inner`. ++// Replacing the codec with a bare [enc, dec] pair drops that, block.state.ts ++// throws while its module is evaluating, `createRoot().render()` never runs, and ++// the page is blank with no error on screen — the same symptom as the bug this ++// patch exists to fix, from the opposite cause. ++const blockHeader = Object.assign([], substrateHeader, { ++ 0: substrateHeader.enc, ++ 1: decodeEitherLayout, ++ enc: substrateHeader.enc, ++ dec: decodeEitherLayout ++}); ++ + export { blockHeader }; + //# sourceMappingURL=blockHeader.js.map diff --git a/patches/@polkadot-api__substrate-bindings@0.21.1.patch b/patches/@polkadot-api__substrate-bindings@0.21.1.patch new file mode 100644 index 0000000..8c5501a --- /dev/null +++ b/patches/@polkadot-api__substrate-bindings@0.21.1.patch @@ -0,0 +1,99 @@ +diff --git a/dist/codecs/blockHeader.js b/dist/codecs/blockHeader.js +index 0675e59633a14c34148e90aa8c32bcfbc437330c..691ac4ede3c816bad444a6054860ed0bb3fcd37d 100644 +--- a/dist/codecs/blockHeader.js ++++ b/dist/codecs/blockHeader.js +@@ -1,4 +1,4 @@ +-import { enhanceCodec, Bytes, _void } from 'scale-ts'; ++import { enhanceCodec, Bytes, _void, u32 } from 'scale-ts'; + import '../utils/ss58-util.js'; + import './scale/Binary.js'; + import './scale/bitSequence.js'; +@@ -33,7 +33,23 @@ const diggest = Variant( + [0, 4, 5, 6, 8] + ); + const hex32 = Hex(32); +-const blockHeader = Struct({ ++ ++// Quantus patch: this console serves two header layouts. ++// ++// `sp_runtime::generic::Header` encodes `number` with #[codec(compact)] and has ++// no field between `extrinsics_root` and `digest`. Quantus's `qp_header::Header` ++// does neither: `number` is a plain u32, and a `zk_tree_root: H256` sits before ++// the digest — deliberately, so the ZK root has a fixed offset in the header ++// preimage that miners cannot shift by manipulating the digest. ++// ++// Reading a Quantus header as a Substrate one consumes 2 bytes where 4 were ++// written; every field after shifts, and the digest vector eventually reads a ++// byte that is not a known DigestItem index. That surfaces three layers away as ++// `TypeError: innerDecoder is not a function`, papi retries the subfollow ++// forever, `runtime$` never emits, and the page renders nothing at all. ++// ++// See quantus/papi-console#4. ++const substrateHeader = Struct({ + parentHash: hex32, + number: compactNumber, + stateRoot: hex32, +@@ -41,5 +57,63 @@ const blockHeader = Struct({ + digests: Vector(diggest) + }); + ++const quantusHeader = Struct({ ++ parentHash: hex32, ++ number: u32, ++ stateRoot: hex32, ++ extrinsicRoot: hex32, ++ zkTreeRoot: hex32, ++ digests: Vector(diggest) ++}); ++ ++const asBytes = (input) => ++ typeof input === "string" ++ ? Uint8Array.from( ++ input ++ .slice(2) ++ .match(/../g) ++ ?.map((b) => parseInt(b, 16)) ?? [] ++ ) ++ : input; ++ ++const sameBytes = (a, b) => ++ a.length === b.length && a.every((x, i) => x === b[i]); ++ ++// Decide by round trip, not by guessing. A layout is right only if decoding and ++// re-encoding reproduces the input byte for byte — which also catches a short ++// read, trailing bytes, and a non-canonical compact. Trying the layouts in a ++// fixed order and taking the first that survives that check is deterministic; ++// picking one by inspecting a byte would not be. ++const decodeEitherLayout = (input) => { ++ const bytes = asBytes(input); ++ let firstError; ++ ++ for (const codec of [substrateHeader, quantusHeader]) { ++ try { ++ const value = codec.dec(bytes); ++ ++ if (sameBytes(codec.enc(value), bytes)) return value; ++ } catch (error) { ++ firstError ??= error; ++ } ++ } ++ ++ throw firstError ?? new Error("block header matches no known layout"); ++}; ++ ++// Keep every property the original codec carried and override only the decoder. ++// A scale-ts Struct exposes `inner` — its field codecs — and consumers reach for ++// it: this console's own block.state.ts does `blockHeader.inner.digests.inner`. ++// Replacing the codec with a bare [enc, dec] pair drops that, block.state.ts ++// throws while its module is evaluating, `createRoot().render()` never runs, and ++// the page is blank with no error on screen — the same symptom as the bug this ++// patch exists to fix, from the opposite cause. ++const blockHeader = Object.assign([], substrateHeader, { ++ 0: substrateHeader.enc, ++ 1: decodeEitherLayout, ++ enc: substrateHeader.enc, ++ dec: decodeEitherLayout ++}); ++ + export { blockHeader }; + //# sourceMappingURL=blockHeader.js.map diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7693437..104f175 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,8 @@ settings: patchedDependencies: '@polkadot-api/signers-common': 365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37 + '@polkadot-api/substrate-bindings@0.21.0': 316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0 + '@polkadot-api/substrate-bindings@0.21.1': 316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0 react18-json-view: 962696fac5fe7ad3e94fd36dad07521c6c3eafd52f219ab335d52438387f6b66 importers: @@ -50,7 +52,7 @@ importers: version: 0.3.1(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) '@polkadot-api/substrate-bindings': specifier: ^0.21.1 - version: 0.21.1 + version: 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': specifier: ^0.2.0 version: 0.2.0(rxjs@7.8.2) @@ -5024,7 +5026,7 @@ snapshots: '@paraspell/descriptors': 14.3.4(polkadot-api@3.1.0(esbuild@0.28.1)(rxjs@7.8.2)) '@paraspell/sdk-core': 14.3.4(typescript@7.0.2)(zod@3.25.76) '@polkadot-api/signers-common': 0.3.1(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-labs/hdkd': 0.0.31 '@polkadot-labs/hdkd-helpers': 0.0.33 polkadot-api: 3.1.0(esbuild@0.28.1)(rxjs@7.8.2) @@ -5053,7 +5055,7 @@ snapshots: '@polkadot-api/observable-client': 0.19.0(rxjs@7.8.2) '@polkadot-api/sm-provider': 0.3.8(@polkadot-api/smoldot@0.4.7) '@polkadot-api/smoldot': 0.4.7 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/substrate-client': 0.7.0 '@polkadot-api/utils': 0.4.0 '@polkadot-api/wasm-executor': 0.2.3 @@ -5088,7 +5090,7 @@ snapshots: '@polkadot-api/observable-client': 0.19.1(rxjs@7.8.2) '@polkadot-api/sm-provider': 0.3.8(@polkadot-api/smoldot@0.4.7) '@polkadot-api/smoldot': 0.4.7 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/substrate-client': 0.7.0 '@polkadot-api/utils': 0.4.0 '@polkadot-api/wasm-executor': 0.2.3 @@ -5117,7 +5119,7 @@ snapshots: '@polkadot-api/ink-contracts': 0.7.0 '@polkadot-api/metadata-builders': 0.15.0 '@polkadot-api/metadata-compatibility': 0.7.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/codegen@0.23.1': @@ -5125,7 +5127,7 @@ snapshots: '@polkadot-api/ink-contracts': 0.7.1 '@polkadot-api/metadata-builders': 0.15.1 '@polkadot-api/metadata-compatibility': 0.7.1 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/descriptors@file:.papi/descriptors(polkadot-api@3.1.0(esbuild@0.28.1)(rxjs@7.8.2))': @@ -5137,7 +5139,7 @@ snapshots: '@acala-network/chopsticks-executor': 1.5.1 '@polkadot-api/metadata-builders': 0.15.0 '@polkadot-api/observable-client': 0.19.0(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/substrate-client': 0.7.0 '@polkadot-api/tx-utils': 0.6.0(rxjs@7.8.2) '@polkadot-api/ws-middleware': 0.4.0(rxjs@7.8.2) @@ -5164,13 +5166,13 @@ snapshots: '@polkadot-api/ink-contracts@0.7.0': dependencies: '@polkadot-api/metadata-builders': 0.15.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/ink-contracts@0.7.1': dependencies: '@polkadot-api/metadata-builders': 0.15.1 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/json-rpc-provider-proxy@0.1.0': @@ -5192,7 +5194,7 @@ snapshots: '@ledgerhq/hw-transport': 6.35.5 '@polkadot-api/merkleize-metadata': 1.3.0 '@polkadot-api/signers-common': 0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 transitivePeerDependencies: @@ -5205,32 +5207,32 @@ snapshots: '@polkadot-api/merkleize-metadata@1.3.0': dependencies: '@polkadot-api/metadata-builders': 0.15.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/merkleize-metadata@1.3.1': dependencies: '@polkadot-api/metadata-builders': 0.15.1 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/meta-signers@0.3.0': dependencies: '@polkadot-api/metadata-builders': 0.15.0 '@polkadot-api/signers-common': 0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 '@polkadot-api/metadata-builders@0.15.0': dependencies: - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/metadata-builders@0.15.1': dependencies: - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@polkadot-api/metadata-builders@0.3.2': @@ -5242,17 +5244,17 @@ snapshots: '@polkadot-api/metadata-compatibility@0.7.0': dependencies: '@polkadot-api/metadata-builders': 0.15.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/metadata-compatibility@0.7.1': dependencies: '@polkadot-api/metadata-builders': 0.15.1 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/observable-client@0.19.0(rxjs@7.8.2)': dependencies: '@polkadot-api/metadata-builders': 0.15.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/substrate-client': 0.7.0 '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5260,7 +5262,7 @@ snapshots: '@polkadot-api/observable-client@0.19.1(rxjs@7.8.2)': dependencies: '@polkadot-api/metadata-builders': 0.15.1 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/substrate-client': 0.7.0 '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5278,7 +5280,7 @@ snapshots: dependencies: '@polkadot-api/metadata-builders': 0.15.0 '@polkadot-api/signers-common': 0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 transitivePeerDependencies: @@ -5288,7 +5290,7 @@ snapshots: dependencies: '@polkadot-api/metadata-builders': 0.15.1 '@polkadot-api/signers-common': 0.3.1(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 transitivePeerDependencies: @@ -5304,7 +5306,7 @@ snapshots: '@polkadot-api/merkleize-metadata': 1.3.0 '@polkadot-api/metadata-builders': 0.15.0 '@polkadot-api/signers-common': 0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5315,7 +5317,7 @@ snapshots: '@polkadot-api/merkleize-metadata': 1.3.1 '@polkadot-api/metadata-builders': 0.15.1 '@polkadot-api/signers-common': 0.3.1(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5323,7 +5325,7 @@ snapshots: '@polkadot-api/react-builder@0.6.1(react@19.2.8)': dependencies: '@polkadot-api/metadata-builders': 0.15.1 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 react: 19.2.8 @@ -5339,7 +5341,7 @@ snapshots: '@polkadot-api/signers-common@0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2)': dependencies: '@polkadot-api/metadata-builders': 0.15.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5347,7 +5349,7 @@ snapshots: '@polkadot-api/signers-common@0.3.1(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2)': dependencies: '@polkadot-api/metadata-builders': 0.15.1 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5373,14 +5375,14 @@ snapshots: '@scure/base': 2.4.0 scale-ts: 1.6.1 - '@polkadot-api/substrate-bindings@0.21.0': + '@polkadot-api/substrate-bindings@0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0)': dependencies: '@noble/hashes': 2.4.0 '@polkadot-api/utils': 0.4.0 '@scure/base': 2.4.0 scale-ts: 1.6.1 - '@polkadot-api/substrate-bindings@0.21.1': + '@polkadot-api/substrate-bindings@0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0)': dependencies: '@noble/hashes': 2.4.0 '@polkadot-api/utils': 0.4.0 @@ -5416,7 +5418,7 @@ snapshots: '@polkadot-api/merkleize-metadata': 1.3.0 '@polkadot-api/metadata-builders': 0.15.0 '@polkadot-api/signers-common': 0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 transitivePeerDependencies: - rxjs @@ -5426,7 +5428,7 @@ snapshots: '@polkadot-api/merkleize-metadata': 1.3.1 '@polkadot-api/metadata-builders': 0.15.1 '@polkadot-api/signers-common': 0.3.1(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 transitivePeerDependencies: - rxjs @@ -5445,7 +5447,7 @@ snapshots: '@polkadot-api/json-rpc-provider': 0.2.0 '@polkadot-api/json-rpc-provider-proxy': 0.4.1 '@polkadot-api/raw-client': 0.3.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5454,7 +5456,7 @@ snapshots: '@polkadot-api/json-rpc-provider': 0.2.0 '@polkadot-api/json-rpc-provider-proxy': 0.4.1 '@polkadot-api/raw-client': 0.3.0 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 rxjs: 7.8.2 @@ -5718,7 +5720,7 @@ snapshots: dependencies: '@polkadot-api/meta-signers': 0.3.0 '@polkadot-api/metadata-builders': 0.15.0 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkahub/context': 0.9.1(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@polkahub/plugin': 0.9.1(@react-rxjs/core@0.10.8(react@19.2.8)(rxjs@7.8.2))(esbuild@0.28.1)(react@19.2.8) '@polkahub/proxy': 0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -5800,7 +5802,7 @@ snapshots: '@polkahub/read-only@0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkahub/context': 0.9.1(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@polkahub/plugin': 0.9.1(@react-rxjs/core@0.10.8(react@19.2.8)(rxjs@7.8.2))(esbuild@0.28.1)(react@19.2.8) '@polkahub/select-account': 0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -5823,7 +5825,7 @@ snapshots: '@polkahub/select-account@0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@polkadot-api/react-components': 0.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkahub/context': 0.9.1(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@polkahub/plugin': 0.9.1(@react-rxjs/core@0.10.8(react@19.2.8)(rxjs@7.8.2))(esbuild@0.28.1)(react@19.2.8) '@polkahub/ui-components': 0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -5860,7 +5862,7 @@ snapshots: '@polkahub/ui-components@0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@polkadot-api/react-components': 0.4.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/utils': 0.4.0 '@radix-ui/primitive': 1.1.7 '@radix-ui/react-checkbox': 1.3.11(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -5894,7 +5896,7 @@ snapshots: dependencies: '@polkadot-api/merkleize-metadata': 1.3.1 '@polkadot-api/signers-common': 0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkahub/context': 0.9.1(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@polkahub/plugin': 0.9.1(@react-rxjs/core@0.10.8(react@19.2.8)(rxjs@7.8.2))(esbuild@0.28.1)(react@19.2.8) '@polkahub/select-account': 0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -5916,7 +5918,7 @@ snapshots: '@polkahub/wallet-connect@0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(debug@4.4.3)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)(use-sync-external-store@1.6.0(react@19.2.8))(zod@3.25.76)': dependencies: - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkahub/context': 0.9.1(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@polkahub/plugin': 0.9.1(@react-rxjs/core@0.10.8(react@19.2.8)(rxjs@7.8.2))(esbuild@0.28.1)(react@19.2.8) '@polkahub/select-account': 0.9.1(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -9238,7 +9240,7 @@ snapshots: '@polkadot-api/signers-common': 0.3.0(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) '@polkadot-api/sm-provider': 0.3.8(@polkadot-api/smoldot@0.4.7) '@polkadot-api/smoldot': 0.4.7 - '@polkadot-api/substrate-bindings': 0.21.0 + '@polkadot-api/substrate-bindings': 0.21.0(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/substrate-client': 0.7.0 '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 @@ -9267,7 +9269,7 @@ snapshots: '@polkadot-api/signers-common': 0.3.1(patch_hash=365a34617de2ae3ad2f7e009f7f3e20e0078448fbfc93c395d323f0e21b75d37)(rxjs@7.8.2) '@polkadot-api/sm-provider': 0.3.8(@polkadot-api/smoldot@0.4.7) '@polkadot-api/smoldot': 0.4.7 - '@polkadot-api/substrate-bindings': 0.21.1 + '@polkadot-api/substrate-bindings': 0.21.1(patch_hash=316e7a04d1ebfc3309d37bb12dd3529b35193506be4cef0b0468842dcb8d56c0) '@polkadot-api/substrate-client': 0.7.0 '@polkadot-api/tx-creator': 0.2.0(rxjs@7.8.2) '@polkadot-api/utils': 0.4.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 62c54c2..0c3647a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,4 +10,12 @@ minimumReleaseAgeExclude: - '@paraspell/sdk@14.3.0 || 14.3.4' patchedDependencies: '@polkadot-api/signers-common': patches/@polkadot-api__signers-common.patch + # Pinned per version, unlike the signers-common patch which is keyed on the + # bare name. Four copies of substrate-bindings resolve in this tree and their + # blockHeader.js is NOT identical across majors — 0.19.0 and 0.6.0 differ, and + # a bare-name key fails the whole install trying to patch them. 0.21.1 is what + # the console and observable-client actually import; 0.21.0 is byte-identical + # and patched too so a minor bump does not silently drop the fix. + '@polkadot-api/substrate-bindings@0.21.0': patches/@polkadot-api__substrate-bindings@0.21.0.patch + '@polkadot-api/substrate-bindings@0.21.1': patches/@polkadot-api__substrate-bindings@0.21.1.patch react18-json-view: patches/react18-json-view.patch