Skip to content

Commit f4788d4

Browse files
committed
fix: add rollback to support nano s.
1 parent 5221d5e commit f4788d4

File tree

3 files changed

+245
-2
lines changed

3 files changed

+245
-2
lines changed

ledger-bridge.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import TransportWebUSB from '@ledgerhq/hw-transport-webusb';
22
import TransportWebHID from '@ledgerhq/hw-transport-webhid';
33
import LedgerEth from '@ledgerhq/hw-app-eth';
44
import WebSocketTransport from '@ledgerhq/hw-transport-http/lib/WebSocketTransport';
5+
import { SignTypedDataVersion, TypedDataUtils } from '@metamask/eth-sig-util';
56

67
// URL which triggers Ledger Live app to open and handle communication
78
const BRIDGE_URL = 'ws://localhost:8435';
@@ -274,7 +275,31 @@ export default class LedgerBridge {
274275
async signTypedData(replyAction, hdPath, message, messageId) {
275276
try {
276277
await this.makeApp();
277-
const res = await this.app.signEIP712Message(hdPath, message);
278+
let res;
279+
try {
280+
res = await this.app.signEIP712Message(hdPath, message);
281+
} catch (signError) {
282+
// Fallback to signEIP712HashedMessage if signEIP712Message fails (e.g., for Nano S)
283+
// Extract hashStructMessageHex and domainSeparatorHex from the message object
284+
const domainSeparatorHex = TypedDataUtils.hashStruct(
285+
'EIP712Domain',
286+
message.domain,
287+
message.types,
288+
SignTypedDataVersion.V4,
289+
).toString('hex');
290+
const hashStructMessageHex = TypedDataUtils.hashStruct(
291+
message.primaryType,
292+
message.message,
293+
message.types,
294+
SignTypedDataVersion.V4,
295+
).toString('hex');
296+
297+
res = await this.app.signEIP712HashedMessage(
298+
hdPath,
299+
domainSeparatorHex,
300+
hashStructMessageHex,
301+
);
302+
}
278303

279304
this.sendMessageToExtension({
280305
action: replyAction,

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
"@ledgerhq/hw-app-eth": "^6.42.0",
2222
"@ledgerhq/hw-transport-http": "^6.30.4",
2323
"@ledgerhq/hw-transport-webhid": "^6.29.4",
24-
"@ledgerhq/hw-transport-webusb": "^6.29.4"
24+
"@ledgerhq/hw-transport-webusb": "^6.29.4",
25+
"@metamask/eth-sig-util": "^8.2.0"
2526
},
2627
"devDependencies": {
2728
"@metamask/eslint-config": "^11.0.1",

yarn.lock

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,6 +1314,48 @@ __metadata:
13141314
languageName: node
13151315
linkType: hard
13161316

1317+
"@ethereumjs/common@npm:^3.2.0":
1318+
version: 3.2.0
1319+
resolution: "@ethereumjs/common@npm:3.2.0"
1320+
dependencies:
1321+
"@ethereumjs/util": "npm:^8.1.0"
1322+
crc-32: "npm:^1.2.0"
1323+
checksum: 10/b3f612406b6bcefaf9117ceb42eff58d311e2b50205e3d55b4c793d803de517efbc84075e058dc0e2ec27a2bff11dfc279dda1fa2b249ed6ab3973be045898f4
1324+
languageName: node
1325+
linkType: hard
1326+
1327+
"@ethereumjs/rlp@npm:^4.0.1":
1328+
version: 4.0.1
1329+
resolution: "@ethereumjs/rlp@npm:4.0.1"
1330+
bin:
1331+
rlp: bin/rlp
1332+
checksum: 10/bfdffd634ce72f3b17e3d085d071f2fe7ce9680aebdf10713d74b30afd80ef882d17f19ff7175fcb049431a56e800bd3558d3b028bd0d82341927edb303ab450
1333+
languageName: node
1334+
linkType: hard
1335+
1336+
"@ethereumjs/tx@npm:^4.2.0":
1337+
version: 4.2.0
1338+
resolution: "@ethereumjs/tx@npm:4.2.0"
1339+
dependencies:
1340+
"@ethereumjs/common": "npm:^3.2.0"
1341+
"@ethereumjs/rlp": "npm:^4.0.1"
1342+
"@ethereumjs/util": "npm:^8.1.0"
1343+
ethereum-cryptography: "npm:^2.0.0"
1344+
checksum: 10/cbd2ffc3ef76ca5416d58f2f694858d9fcac946e6a107fef44cf3f308a7c9fcc996a6847868609354d72d5b356faee68408e9d5601c4c4f7dad8e18cb2c24a95
1345+
languageName: node
1346+
linkType: hard
1347+
1348+
"@ethereumjs/util@npm:^8.1.0":
1349+
version: 8.1.0
1350+
resolution: "@ethereumjs/util@npm:8.1.0"
1351+
dependencies:
1352+
"@ethereumjs/rlp": "npm:^4.0.1"
1353+
ethereum-cryptography: "npm:^2.0.0"
1354+
micro-ftch: "npm:^0.3.1"
1355+
checksum: 10/cc35338932e49b15e54ca6e548b32a1f48eed7d7e1d34ee743e4d3600dd616668bd50f70139e86c5c35f55aac35fba3b6cc4e6f679cf650aeba66bf93016200c
1356+
languageName: node
1357+
linkType: hard
1358+
13171359
"@ethersproject/abi@npm:^5.7.0":
13181360
version: 5.7.0
13191361
resolution: "@ethersproject/abi@npm:5.7.0"
@@ -1794,6 +1836,16 @@ __metadata:
17941836
languageName: node
17951837
linkType: hard
17961838

1839+
"@metamask/abi-utils@npm:^3.0.0":
1840+
version: 3.0.0
1841+
resolution: "@metamask/abi-utils@npm:3.0.0"
1842+
dependencies:
1843+
"@metamask/superstruct": "npm:^3.1.0"
1844+
"@metamask/utils": "npm:^11.0.1"
1845+
checksum: 10/068b98185148b9e185b4af4392c6a6f82f1d4b1ff60013c57679c618f37afe9030e3ccc940e1a8b690be6f62ea91115ab18b73f3c3c09f4eff1794e31ababb9b
1846+
languageName: node
1847+
linkType: hard
1848+
17971849
"@metamask/eslint-config-nodejs@npm:^11.0.0":
17981850
version: 11.1.0
17991851
resolution: "@metamask/eslint-config-nodejs@npm:11.1.0"
@@ -1819,6 +1871,21 @@ __metadata:
18191871
languageName: node
18201872
linkType: hard
18211873

1874+
"@metamask/eth-sig-util@npm:^8.2.0":
1875+
version: 8.2.0
1876+
resolution: "@metamask/eth-sig-util@npm:8.2.0"
1877+
dependencies:
1878+
"@ethereumjs/rlp": "npm:^4.0.1"
1879+
"@ethereumjs/util": "npm:^8.1.0"
1880+
"@metamask/abi-utils": "npm:^3.0.0"
1881+
"@metamask/utils": "npm:^11.0.1"
1882+
"@scure/base": "npm:~1.1.3"
1883+
ethereum-cryptography: "npm:^2.1.2"
1884+
tweetnacl: "npm:^1.0.3"
1885+
checksum: 10/385df1ec541116e1bd725a1df1a519996bad167f99d1b2677126e398cdfda6fc3f03d2ff8f1ca523966bc0aae3ea92a9050953a45d5a7711f4128aacf9242bfc
1886+
languageName: node
1887+
linkType: hard
1888+
18221889
"@metamask/ledger-iframe-bridge@workspace:.":
18231890
version: 0.0.0-use.local
18241891
resolution: "@metamask/ledger-iframe-bridge@workspace:."
@@ -1829,6 +1896,7 @@ __metadata:
18291896
"@ledgerhq/hw-transport-webusb": "npm:^6.29.4"
18301897
"@metamask/eslint-config": "npm:^11.0.1"
18311898
"@metamask/eslint-config-nodejs": "npm:^11.0.0"
1899+
"@metamask/eth-sig-util": "npm:^8.2.0"
18321900
"@vitejs/plugin-legacy": "npm:^5.4.2"
18331901
depcheck: "npm:^1.4.3"
18341902
eslint: "npm:^8.55.0"
@@ -1846,6 +1914,53 @@ __metadata:
18461914
languageName: unknown
18471915
linkType: soft
18481916

1917+
"@metamask/superstruct@npm:^3.1.0":
1918+
version: 3.1.0
1919+
resolution: "@metamask/superstruct@npm:3.1.0"
1920+
checksum: 10/5066fe228d5f11da387606d7f9545de2b473ab5a9e0f1bb8aea2f52d3e2c9d25e427151acde61f4a2de80a07a9871fe9505ad06abca6a61b7c3b54ed5c403b01
1921+
languageName: node
1922+
linkType: hard
1923+
1924+
"@metamask/utils@npm:^11.0.1":
1925+
version: 11.2.0
1926+
resolution: "@metamask/utils@npm:11.2.0"
1927+
dependencies:
1928+
"@ethereumjs/tx": "npm:^4.2.0"
1929+
"@metamask/superstruct": "npm:^3.1.0"
1930+
"@noble/hashes": "npm:^1.3.1"
1931+
"@scure/base": "npm:^1.1.3"
1932+
"@types/debug": "npm:^4.1.7"
1933+
debug: "npm:^4.3.4"
1934+
pony-cause: "npm:^2.1.10"
1935+
semver: "npm:^7.5.4"
1936+
uuid: "npm:^9.0.1"
1937+
checksum: 10/9cc2cb6af4627085e72a310ba9b8921c69757d94e2992d4664627e5a0d99b1f2f7f8069c6f22262515135e1172bd66b82d00512d90ea2ec6da4e768f3d7d4ae2
1938+
languageName: node
1939+
linkType: hard
1940+
1941+
"@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0":
1942+
version: 1.4.2
1943+
resolution: "@noble/curves@npm:1.4.2"
1944+
dependencies:
1945+
"@noble/hashes": "npm:1.4.0"
1946+
checksum: 10/f433a2e8811ae345109388eadfa18ef2b0004c1f79417553241db4f0ad0d59550be6298a4f43d989c627e9f7551ffae6e402a4edf0173981e6da95fc7cab5123
1947+
languageName: node
1948+
linkType: hard
1949+
1950+
"@noble/hashes@npm:1.4.0, @noble/hashes@npm:~1.4.0":
1951+
version: 1.4.0
1952+
resolution: "@noble/hashes@npm:1.4.0"
1953+
checksum: 10/e156e65794c473794c52fa9d06baf1eb20903d0d96719530f523cc4450f6c721a957c544796e6efd0197b2296e7cd70efeb312f861465e17940a3e3c7e0febc6
1954+
languageName: node
1955+
linkType: hard
1956+
1957+
"@noble/hashes@npm:^1.3.1":
1958+
version: 1.7.1
1959+
resolution: "@noble/hashes@npm:1.7.1"
1960+
checksum: 10/ca3120da0c3e7881d6a481e9667465cc9ebbee1329124fb0de442e56d63fef9870f8cc96f264ebdb18096e0e36cebc0e6e979a872d545deb0a6fed9353f17e05
1961+
languageName: node
1962+
linkType: hard
1963+
18491964
"@nodelib/fs.scandir@npm:2.1.5":
18501965
version: 2.1.5
18511966
resolution: "@nodelib/fs.scandir@npm:2.1.5"
@@ -2081,6 +2196,50 @@ __metadata:
20812196
languageName: node
20822197
linkType: hard
20832198

2199+
"@scure/base@npm:^1.1.3":
2200+
version: 1.2.4
2201+
resolution: "@scure/base@npm:1.2.4"
2202+
checksum: 10/4b61679209af40143b49ce7b7570e1d9157c19df311ea6f57cd212d764b0b82222dbe3707334f08bec181caf1f047aca31aa91193c678d6548312cb3f9c82ab1
2203+
languageName: node
2204+
linkType: hard
2205+
2206+
"@scure/base@npm:~1.1.3, @scure/base@npm:~1.1.6":
2207+
version: 1.1.9
2208+
resolution: "@scure/base@npm:1.1.9"
2209+
checksum: 10/f0ab7f687bbcdee2a01377fe3cd808bf63977999672751295b6a92625d5322f4754a96d40f6bd579bc367aad48ecf8a4e6d0390e70296e6ded1076f52adb16bb
2210+
languageName: node
2211+
linkType: hard
2212+
2213+
"@scure/bip32@npm:1.4.0":
2214+
version: 1.4.0
2215+
resolution: "@scure/bip32@npm:1.4.0"
2216+
dependencies:
2217+
"@noble/curves": "npm:~1.4.0"
2218+
"@noble/hashes": "npm:~1.4.0"
2219+
"@scure/base": "npm:~1.1.6"
2220+
checksum: 10/6cd5062d902564d9e970597ec8b1adacb415b2eadfbb95aee1a1a0480a52eb0de4d294d3753aa8b48548064c9795ed108d348a31a8ce3fc88785377bb12c63b9
2221+
languageName: node
2222+
linkType: hard
2223+
2224+
"@scure/bip39@npm:1.3.0":
2225+
version: 1.3.0
2226+
resolution: "@scure/bip39@npm:1.3.0"
2227+
dependencies:
2228+
"@noble/hashes": "npm:~1.4.0"
2229+
"@scure/base": "npm:~1.1.6"
2230+
checksum: 10/7d71fd58153de22fe8cd65b525f6958a80487bc9d0fbc32c71c328aeafe41fa259f989d2f1e0fa4fdfeaf83b8fcf9310d52ed9862987e46c2f2bfb9dd8cf9fc1
2231+
languageName: node
2232+
linkType: hard
2233+
2234+
"@types/debug@npm:^4.1.7":
2235+
version: 4.1.12
2236+
resolution: "@types/debug@npm:4.1.12"
2237+
dependencies:
2238+
"@types/ms": "npm:*"
2239+
checksum: 10/47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053
2240+
languageName: node
2241+
linkType: hard
2242+
20842243
"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.0":
20852244
version: 1.0.6
20862245
resolution: "@types/estree@npm:1.0.6"
@@ -2102,6 +2261,13 @@ __metadata:
21022261
languageName: node
21032262
linkType: hard
21042263

2264+
"@types/ms@npm:*":
2265+
version: 2.1.0
2266+
resolution: "@types/ms@npm:2.1.0"
2267+
checksum: 10/532d2ebb91937ccc4a89389715e5b47d4c66e708d15942fe6cc25add6dc37b2be058230a327dd50f43f89b8b6d5d52b74685a9e8f70516edfc9bdd6be910eff4
2268+
languageName: node
2269+
linkType: hard
2270+
21052271
"@types/parse-json@npm:^4.0.0":
21062272
version: 4.0.2
21072273
resolution: "@types/parse-json@npm:4.0.2"
@@ -2900,6 +3066,15 @@ __metadata:
29003066
languageName: node
29013067
linkType: hard
29023068

3069+
"crc-32@npm:^1.2.0":
3070+
version: 1.2.2
3071+
resolution: "crc-32@npm:1.2.2"
3072+
bin:
3073+
crc32: bin/crc32.njs
3074+
checksum: 10/824f696a5baaf617809aa9cd033313c8f94f12d15ebffa69f10202480396be44aef9831d900ab291638a8022ed91c360696dd5b1ba691eb3f34e60be8835b7c3
3075+
languageName: node
3076+
linkType: hard
3077+
29033078
"create-ecdh@npm:^4.0.4":
29043079
version: 4.0.4
29053080
resolution: "create-ecdh@npm:4.0.4"
@@ -3768,6 +3943,18 @@ __metadata:
37683943
languageName: node
37693944
linkType: hard
37703945

3946+
"ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2":
3947+
version: 2.2.1
3948+
resolution: "ethereum-cryptography@npm:2.2.1"
3949+
dependencies:
3950+
"@noble/curves": "npm:1.4.2"
3951+
"@noble/hashes": "npm:1.4.0"
3952+
"@scure/bip32": "npm:1.4.0"
3953+
"@scure/bip39": "npm:1.3.0"
3954+
checksum: 10/ab123bbfe843500ac2d645ce9edc4bc814962ffb598db6bf8bf01fbecac656e6c81ff4cf2472f1734844bbcbad2bf658d8b699cb7248d768e0f06ae13ecf43b8
3955+
languageName: node
3956+
linkType: hard
3957+
37713958
"events@npm:^3.0.0, events@npm:^3.3.0":
37723959
version: 3.3.0
37733960
resolution: "events@npm:3.3.0"
@@ -5020,6 +5207,13 @@ __metadata:
50205207
languageName: node
50215208
linkType: hard
50225209

5210+
"micro-ftch@npm:^0.3.1":
5211+
version: 0.3.1
5212+
resolution: "micro-ftch@npm:0.3.1"
5213+
checksum: 10/a7ab07d25e28ec4ae492ce4542ea9b06eee85538742b3b1263b247366ee8872f2c5ce9c8651138b2f1d22c8212f691a7b8b5384fe86ead5aff1852e211f1c035
5214+
languageName: node
5215+
linkType: hard
5216+
50235217
"micromatch@npm:^4.0.4":
50245218
version: 4.0.8
50255219
resolution: "micromatch@npm:4.0.8"
@@ -5643,6 +5837,13 @@ __metadata:
56435837
languageName: node
56445838
linkType: hard
56455839

5840+
"pony-cause@npm:^2.1.10":
5841+
version: 2.1.11
5842+
resolution: "pony-cause@npm:2.1.11"
5843+
checksum: 10/ed7d0bb6e3e69f753080bf736b71f40e6ae4c13ec0c8c473ff73345345c088819966fdd68a62ad7482d464bf41176cf9421f5f63715d1a4532005eedc099db55
5844+
languageName: node
5845+
linkType: hard
5846+
56465847
"possible-typed-array-names@npm:^1.0.0":
56475848
version: 1.0.0
56485849
resolution: "possible-typed-array-names@npm:1.0.0"
@@ -6771,6 +6972,13 @@ __metadata:
67716972
languageName: node
67726973
linkType: hard
67736974

6975+
"tweetnacl@npm:^1.0.3":
6976+
version: 1.0.3
6977+
resolution: "tweetnacl@npm:1.0.3"
6978+
checksum: 10/ca122c2f86631f3c0f6d28efb44af2a301d4a557a62a3e2460286b08e97567b258c2212e4ad1cfa22bd6a57edcdc54ba76ebe946847450ab0999e6d48ccae332
6979+
languageName: node
6980+
linkType: hard
6981+
67746982
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
67756983
version: 0.4.0
67766984
resolution: "type-check@npm:0.4.0"
@@ -6961,6 +7169,15 @@ __metadata:
69617169
languageName: node
69627170
linkType: hard
69637171

7172+
"uuid@npm:^9.0.1":
7173+
version: 9.0.1
7174+
resolution: "uuid@npm:9.0.1"
7175+
bin:
7176+
uuid: dist/bin/uuid
7177+
checksum: 10/9d0b6adb72b736e36f2b1b53da0d559125ba3e39d913b6072f6f033e0c87835b414f0836b45bcfaf2bdf698f92297fea1c3cc19b0b258bc182c9c43cc0fab9f2
7178+
languageName: node
7179+
linkType: hard
7180+
69647181
"vite-plugin-node-polyfills@npm:^0.22.0":
69657182
version: 0.22.0
69667183
resolution: "vite-plugin-node-polyfills@npm:0.22.0"

0 commit comments

Comments
 (0)