Skip to content

Commit 86abbc2

Browse files
authored
fix: fix ledger signing issue due to new weird on-chain metadata version (#1754)
closes #1753
1 parent 58942ca commit 86abbc2

4 files changed

Lines changed: 101 additions & 70 deletions

File tree

packages/extension-polkagate/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"@fortawesome/free-regular-svg-icons": "^6.5.2",
2323
"@fortawesome/free-solid-svg-icons": "^6.5.2",
2424
"@fortawesome/react-fontawesome": "^0.2.2",
25-
"@polkadot-api/merkleize-metadata": "^1.1.1",
25+
"@polkadot-api/merkleize-metadata": "^1.1.18",
2626
"@polkadot/extension-base": "^0.47.5",
2727
"@polkadot/extension-chains": "^0.47.5",
2828
"@polkadot/extension-dapp": "^0.47.5",

packages/extension-polkagate/src/hooks/useMetadataProof.ts

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import type { ApiPromise } from '@polkadot/api';
5-
import { useMemo, useState } from 'react';
6-
import { objectSpread, u8aToHex } from '@polkadot/util';
7-
import { GenericExtrinsicPayload, Option, u32 } from "@polkadot/types";
8-
import type { OpaqueMetadata } from "@polkadot/types/interfaces";
5+
import type { GenericExtrinsicPayload, Option } from '@polkadot/types';
6+
import type { OpaqueMetadata } from '@polkadot/types/interfaces';
97
import type { SignerPayloadJSON } from '@polkadot/types/types';
8+
9+
import { useMemo, useState } from 'react';
10+
11+
import { BN, objectSpread, u8aToHex } from '@polkadot/util';
1012
import { merkleizeMetadata } from '@polkadot-api/merkleize-metadata';
1113

1214
export interface MetadataProof {
@@ -19,44 +21,52 @@ export default function useMetadataProof(api: ApiPromise | undefined, payload: S
1921

2022
const apiGenesisHash = api?.genesisHash.toHex();
2123

22-
useMemo(async () => {
23-
if (!api || !payload) {
24-
return;
25-
}
24+
useMemo(() => {
25+
const getProof = async () => {
26+
if (!apiGenesisHash || !payload || !api) {
27+
return;
28+
}
2629

27-
if (!payload.signedExtensions.includes('CheckMetadataHash')) {
28-
payload.signedExtensions.push('CheckMetadataHash');
29-
}
30-
// payload.assetId = null // TODO: add asset id later
30+
if (!payload.signedExtensions.includes('CheckMetadataHash')) {
31+
payload.signedExtensions.push('CheckMetadataHash');
32+
}
33+
34+
// const versions = await api.call['metadata']['metadataVersions']() as unknown as u32[]; // returns: [14, 15, 4294967295] not on all chains
35+
// if (!latestMetadataVersion || latestMetadataVersion.toNumber() < 15) {
36+
// throw new Error('Cant fetch the latest version of the chain metadata');
37+
// }
3138

32-
const versions = await api.call['metadata']['metadataVersions']() as u32[];
39+
const latestMetadataVersion = new BN(15);
40+
const maybeHexMetadata = await api.call['metadata']['metadataAtVersion']<Option<OpaqueMetadata>>(latestMetadataVersion);
3341

34-
const latestMetadataVersion = !!versions && versions[versions.length - 1];
35-
if (!latestMetadataVersion || latestMetadataVersion.toNumber() < 15) throw new Error('Cant fetch the latest version of the chain metadata')
42+
if (maybeHexMetadata.isNone) {
43+
throw new Error('metadata not found');
44+
}
3645

37-
const maybeHexMetadata = await api.call['metadata']['metadataAtVersion']<Option<OpaqueMetadata>>(latestMetadataVersion);
38-
if (maybeHexMetadata.isNone) throw new Error("metadata not found");
46+
const { specName, specVersion } = api.runtimeVersion;
3947

40-
const { specName, specVersion } = api.runtimeVersion;
48+
const merkleizedMetadata = merkleizeMetadata(
49+
maybeHexMetadata.toHex(),
50+
{
51+
base58Prefix: (api.consts['system']['ss58Prefix'] as any).toNumber(),
52+
decimals: api.registry.chainDecimals[0],
53+
specName: specName.toString(),
54+
specVersion: specVersion.toNumber(),
55+
tokenSymbol: api.registry.chainTokens[0]
56+
}
57+
);
4158

42-
const merkleizedMetadata = merkleizeMetadata(
43-
maybeHexMetadata.toHex(),
44-
{
45-
base58Prefix: (api.consts['system']['ss58Prefix'] as any).toNumber(),
46-
decimals: api.registry.chainDecimals[0],
47-
specName: specName.toString(),
48-
specVersion: specVersion.toNumber(),
49-
tokenSymbol: api.registry.chainTokens[0]
50-
}
51-
);
59+
const metadataHash = u8aToHex(merkleizedMetadata.digest());
60+
const newPayload = objectSpread({}, payload, { metadataHash, mode: 1 });
61+
const raw = api.registry.createType('ExtrinsicPayload', newPayload);
5262

53-
const metadataHash = u8aToHex(merkleizedMetadata.digest());
54-
const newPayload = objectSpread({}, payload, { metadataHash, mode: 1 });
55-
const raw = api.registry.createType('ExtrinsicPayload', newPayload);
63+
const txMetadata = merkleizedMetadata.getProofForExtrinsicPayload(u8aToHex(raw.toU8a(true)));
5664

57-
const txMetadata = merkleizedMetadata.getProofForExtrinsicPayload(u8aToHex(raw.toU8a(true)))
65+
setProof({ raw, txMetadata });
66+
};
5867

59-
setProof({ raw, txMetadata });
68+
getProof().catch(console.error);
69+
// eslint-disable-next-line react-hooks/exhaustive-deps
6070
}, [apiGenesisHash, payload?.address]);
6171

6272
return proof;

packages/extension-polkagate/src/popup/home/news.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ export interface News {
99
}
1010

1111
export const news: News[] = [
12+
{
13+
version: '0.36.4',
14+
notes: [
15+
'Fix Ledger Signing Issue: Resolved an issue with Ledger signing to ensure a smoother user experience',
16+
'Upcoming UI Redesign: PolkaGate is getting a fresh new look—stay tuned for exciting updates!'
17+
]
18+
},
1219
{
1320
version: '0.36.3',
1421
notes: [

yarn.lock

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,13 +1549,20 @@ __metadata:
15491549
languageName: node
15501550
linkType: hard
15511551

1552-
"@noble/hashes@npm:1.6.0, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.3.3, @noble/hashes@npm:^1.5.0":
1552+
"@noble/hashes@npm:1.6.0, @noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.3.3":
15531553
version: 1.6.0
15541554
resolution: "@noble/hashes@npm:1.6.0"
15551555
checksum: 10/b44b043b02adbecd33596adeed97d9f9864c24a2410f7ac3b847986c2ecf1f6f0df76024b3f1b14d6ea954932960d88898fe551fb9d39844a8b870e9f9044ea1
15561556
languageName: node
15571557
linkType: hard
15581558

1559+
"@noble/hashes@npm:^1.8.0":
1560+
version: 1.8.0
1561+
resolution: "@noble/hashes@npm:1.8.0"
1562+
checksum: 10/474b7f56bc6fb2d5b3a42132561e221b0ea4f91e590f4655312ca13667840896b34195e2b53b7f097ec080a1fdd3b58d902c2a8d0fbdf51d2e238b53808a177e
1563+
languageName: node
1564+
linkType: hard
1565+
15591566
"@nodelib/fs.scandir@npm:2.1.5":
15601567
version: 2.1.5
15611568
resolution: "@nodelib/fs.scandir@npm:2.1.5"
@@ -2244,14 +2251,14 @@ __metadata:
22442251
languageName: node
22452252
linkType: hard
22462253

2247-
"@polkadot-api/merkleize-metadata@npm:^1.1.1":
2248-
version: 1.1.10
2249-
resolution: "@polkadot-api/merkleize-metadata@npm:1.1.10"
2254+
"@polkadot-api/merkleize-metadata@npm:^1.1.18":
2255+
version: 1.1.18
2256+
resolution: "@polkadot-api/merkleize-metadata@npm:1.1.18"
22502257
dependencies:
2251-
"@polkadot-api/metadata-builders": "npm:0.9.2"
2252-
"@polkadot-api/substrate-bindings": "npm:0.9.4"
2253-
"@polkadot-api/utils": "npm:0.1.2"
2254-
checksum: 10/13819fe8cf37dc29c06a99540924e094db324abb29d29ad74922e79ab3f877dc876b7ceae18fb3671bd68bd8d2b31b37908b2df28826143a5feeeccf2413c34c
2258+
"@polkadot-api/metadata-builders": "npm:0.12.2"
2259+
"@polkadot-api/substrate-bindings": "npm:0.14.0"
2260+
"@polkadot-api/utils": "npm:0.2.0"
2261+
checksum: 10/d4f23c0bdad154ae2e7c554e1e8959b010053fce82d609e2386a578179877359930dd9d0ce077189e76c500979d656f2da0cc50f0ede1275ab9e06f4cb8fd0be
22552262
languageName: node
22562263
linkType: hard
22572264

@@ -2275,6 +2282,16 @@ __metadata:
22752282
languageName: node
22762283
linkType: hard
22772284

2285+
"@polkadot-api/metadata-builders@npm:0.12.2":
2286+
version: 0.12.2
2287+
resolution: "@polkadot-api/metadata-builders@npm:0.12.2"
2288+
dependencies:
2289+
"@polkadot-api/substrate-bindings": "npm:0.14.0"
2290+
"@polkadot-api/utils": "npm:0.2.0"
2291+
checksum: 10/d680106ebd51052b1a932731c60b5adb4d3f6a61dadab15e7a836ecde44d0f2a61f74be651bfedc4986b1da819a28f39635418e01aad2834f975d5703caf987a
2292+
languageName: node
2293+
linkType: hard
2294+
22782295
"@polkadot-api/metadata-builders@npm:0.3.2":
22792296
version: 0.3.2
22802297
resolution: "@polkadot-api/metadata-builders@npm:0.3.2"
@@ -2285,16 +2302,6 @@ __metadata:
22852302
languageName: node
22862303
linkType: hard
22872304

2288-
"@polkadot-api/metadata-builders@npm:0.9.2":
2289-
version: 0.9.2
2290-
resolution: "@polkadot-api/metadata-builders@npm:0.9.2"
2291-
dependencies:
2292-
"@polkadot-api/substrate-bindings": "npm:0.9.4"
2293-
"@polkadot-api/utils": "npm:0.1.2"
2294-
checksum: 10/eeae832ac93830a3fc020c9897f7e16aa6fd3686ca4d28f6c9c8cc39541d50d1e8b223ee5b574ea9e20591cfbbf3567cfc4a6fbfac26c5d8dd9c292f519a9240
2295-
languageName: node
2296-
linkType: hard
2297-
22982305
"@polkadot-api/observable-client@npm:0.1.0":
22992306
version: 0.1.0
23002307
resolution: "@polkadot-api/observable-client@npm:0.1.0"
@@ -2347,6 +2354,18 @@ __metadata:
23472354
languageName: node
23482355
linkType: hard
23492356

2357+
"@polkadot-api/substrate-bindings@npm:0.14.0":
2358+
version: 0.14.0
2359+
resolution: "@polkadot-api/substrate-bindings@npm:0.14.0"
2360+
dependencies:
2361+
"@noble/hashes": "npm:^1.8.0"
2362+
"@polkadot-api/utils": "npm:0.2.0"
2363+
"@scure/base": "npm:^1.2.6"
2364+
scale-ts: "npm:^1.6.1"
2365+
checksum: 10/af20568755f44318043728b08d30360de1cad3fbc068c583ead763d5dfd2faccd1372584daabbc49ba53786355a44d090407e2bd4bb5b03a9cc320dfd5300588
2366+
languageName: node
2367+
linkType: hard
2368+
23502369
"@polkadot-api/substrate-bindings@npm:0.6.0":
23512370
version: 0.6.0
23522371
resolution: "@polkadot-api/substrate-bindings@npm:0.6.0"
@@ -2359,18 +2378,6 @@ __metadata:
23592378
languageName: node
23602379
linkType: hard
23612380

2362-
"@polkadot-api/substrate-bindings@npm:0.9.4":
2363-
version: 0.9.4
2364-
resolution: "@polkadot-api/substrate-bindings@npm:0.9.4"
2365-
dependencies:
2366-
"@noble/hashes": "npm:^1.5.0"
2367-
"@polkadot-api/utils": "npm:0.1.2"
2368-
"@scure/base": "npm:^1.1.9"
2369-
scale-ts: "npm:^1.6.1"
2370-
checksum: 10/ff3a3e39d2f259a7291f0725279cf00af003869297a09148a037b3242ea87b5d3ac2229914f9c781a80d926490f62786b470a11b3d7498b0bd91142a2cb737bb
2371-
languageName: node
2372-
linkType: hard
2373-
23742381
"@polkadot-api/substrate-client@npm:0.0.1":
23752382
version: 0.0.1
23762383
resolution: "@polkadot-api/substrate-client@npm:0.0.1"
@@ -2416,10 +2423,10 @@ __metadata:
24162423
languageName: node
24172424
linkType: hard
24182425

2419-
"@polkadot-api/utils@npm:0.1.2":
2420-
version: 0.1.2
2421-
resolution: "@polkadot-api/utils@npm:0.1.2"
2422-
checksum: 10/75c69522107274c489dff17d55d547192bd03379bfe70fd88fd5e70220bd8186849c60856e29a8cf097bbf861d3b06b5a4fd219646879651106f996bd113caca
2426+
"@polkadot-api/utils@npm:0.2.0":
2427+
version: 0.2.0
2428+
resolution: "@polkadot-api/utils@npm:0.2.0"
2429+
checksum: 10/5171c52af86bc85181cf8681342e38a6cbbe049d70f437ab256641a30f2d167d4d1f5f871d13731d9a7e08be5b35c2e981deba4efe6f16f0c57f2309d90bb52c
24232430
languageName: node
24242431
linkType: hard
24252432

@@ -2760,7 +2767,7 @@ __metadata:
27602767
"@fortawesome/free-regular-svg-icons": "npm:^6.5.2"
27612768
"@fortawesome/free-solid-svg-icons": "npm:^6.5.2"
27622769
"@fortawesome/react-fontawesome": "npm:^0.2.2"
2763-
"@polkadot-api/merkleize-metadata": "npm:^1.1.1"
2770+
"@polkadot-api/merkleize-metadata": "npm:^1.1.18"
27642771
"@polkadot/extension-base": "npm:^0.47.5"
27652772
"@polkadot/extension-chains": "npm:^0.47.5"
27662773
"@polkadot/extension-dapp": "npm:^0.47.5"
@@ -3922,13 +3929,20 @@ __metadata:
39223929
languageName: node
39233930
linkType: hard
39243931

3925-
"@scure/base@npm:^1.1.1, @scure/base@npm:^1.1.7, @scure/base@npm:^1.1.9":
3932+
"@scure/base@npm:^1.1.1, @scure/base@npm:^1.1.7":
39263933
version: 1.2.1
39273934
resolution: "@scure/base@npm:1.2.1"
39283935
checksum: 10/f7bdd17618ccae7a74c8cbe410a235e4adbe54aa8afe4e2fb1294338aa92f6fd04b1f1f5dea60552f638b5f5e3e74902b7baf59d3954e5e42c0a36c6baa2ebe0
39293936
languageName: node
39303937
linkType: hard
39313938

3939+
"@scure/base@npm:^1.2.6":
3940+
version: 1.2.6
3941+
resolution: "@scure/base@npm:1.2.6"
3942+
checksum: 10/c1a7bd5e0b0c8f94c36fbc220f4a67cc832b00e2d2065c7d8a404ed81ab1c94c5443def6d361a70fc382db3496e9487fb9941728f0584782b274c18a4bed4187
3943+
languageName: node
3944+
linkType: hard
3945+
39323946
"@scure/base@npm:~1.1.6":
39333947
version: 1.1.9
39343948
resolution: "@scure/base@npm:1.1.9"

0 commit comments

Comments
 (0)