Skip to content

Commit 1493ed4

Browse files
1.25.0-0.2.2: [feature] Ledger EIP712 Support (#554)
* Add EIP712 signing support to ledger * Minor Fixes: - Use dynamic import - Don't parse JSON Co-authored-by: koushikmohan1996 <koushikmohan1996@gmail.com>
1 parent f84cc60 commit 1493ed4

File tree

6 files changed

+164
-15
lines changed

6 files changed

+164
-15
lines changed

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bnc-onboard",
3-
"version": "1.25.0-0.1.2",
3+
"version": "1.25.0-0.2.2",
44
"description": "Onboard users to web3 by allowing them to select a wallet, get that wallet ready to transact and have access to synced wallet state.",
55
"keywords": [
66
"ethereum",
@@ -56,7 +56,7 @@
5656
"@cvbb/eth-keyring": "^1.1.0",
5757
"@gnosis.pm/safe-apps-provider": "^0.3.0",
5858
"@gnosis.pm/safe-apps-sdk": "^2.3.0",
59-
"@ledgerhq/hw-app-eth": "^5.21.0",
59+
"@ledgerhq/hw-app-eth": "^5.49.0",
6060
"@ledgerhq/hw-transport-u2f": "^5.21.0",
6161
"@portis/web3": "^4.0.0",
6262
"@toruslabs/torus-embed": "^1.9.2",
@@ -67,6 +67,7 @@
6767
"bowser": "^2.10.0",
6868
"eth-lattice-keyring": "^0.2.7",
6969
"eth-provider": "^0.6.1",
70+
"eth-sig-util": "^3.0.1",
7071
"ethereumjs-tx": "^2.1.2",
7172
"ethereumjs-util": "^7.0.3",
7273
"fortmatic": "^2.2.1",
@@ -77,4 +78,4 @@
7778
"walletlink": "^2.1.0",
7879
"web3-provider-engine": "^15.0.4"
7980
}
80-
}
81+
}

rollup.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export default {
6969
'ethereumjs-tx',
7070
'ethereumjs-util',
7171
'eth-lattice-keyring',
72+
'eth-sig-util',
7273
'@cvbb/eth-keyring',
7374
'hdkey',
7475
'@ledgerhq/hw-transport-u2f',

src/@types/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ declare module 'web3-provider-engine/subproviders/subscriptions'
88
declare module 'web3-provider-engine/subproviders/filters'
99
declare module 'trezor-connect'
1010
declare module 'eth-lattice-keyring'
11+
declare module 'eth-sig-util'
1112
declare module 'ethereumjs-tx'
1213
declare module 'ethereumjs-util'
1314
declare module 'hdkey'

src/modules/select/wallets/ledger.ts

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { LedgerOptions, WalletModule, Helpers } from '../../../interfaces'
2-
32
import ledgerIcon from '../wallet-icons/icon-ledger'
43

54
const LEDGER_LIVE_PATH = `m/44'/60'`
@@ -80,6 +79,24 @@ async function ledgerProvider(options: {
8079
const EthereumTx = await import('ethereumjs-tx')
8180
const ethUtil = await import('ethereumjs-util')
8281
const buffer = await import('buffer')
82+
const { TypedDataUtils } = await import('eth-sig-util')
83+
84+
const domainHash = (message: any) => {
85+
return TypedDataUtils.hashStruct(
86+
'EIP712Domain',
87+
message.domain,
88+
message.types,
89+
true
90+
)
91+
}
92+
const messageHash = (message: any) => {
93+
return TypedDataUtils.hashStruct(
94+
message.primaryType,
95+
message.message,
96+
message.types,
97+
true
98+
)
99+
}
83100

84101
const {
85102
networkId,
@@ -130,6 +147,11 @@ async function ledgerProvider(options: {
130147
.then((res: string) => callback(null, res))
131148
.catch(err => callback(err, null))
132149
},
150+
signTypedMessage: (messageData: any, callback: any) => {
151+
signTypedMessage(messageData)
152+
.then((res: string) => callback(null, res))
153+
.catch(err => callback(err, null))
154+
},
133155
rpcUrl
134156
})
135157

@@ -406,6 +428,29 @@ async function ledgerProvider(options: {
406428
})
407429
}
408430

431+
async function signTypedMessage({ data }: { data: any }) {
432+
if (addressToPath.size === 0) {
433+
await enable()
434+
}
435+
436+
const path = [...addressToPath.values()][0]
437+
438+
return eth
439+
.signEIP712HashedMessage(
440+
path,
441+
ethUtil.bufferToHex(domainHash(data)),
442+
ethUtil.bufferToHex(messageHash(data))
443+
)
444+
.then((result: any) => {
445+
let v = (result['v'] - 27).toString(16)
446+
if (v.length < 2) {
447+
v = '0' + v
448+
}
449+
450+
return `0x${result['r']}${result['s']}${v}`
451+
})
452+
}
453+
409454
return provider
410455
}
411456

src/modules/select/wallets/providerEngine.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ function createProvider(config: any) {
1616
processMessage,
1717
processPersonalMessage,
1818
signMessage,
19-
signPersonalMessage
19+
signPersonalMessage,
20+
signTypedMessage
2021
} = config
2122

2223
const pollingInterval = get(app).blockPollingInterval
@@ -29,7 +30,8 @@ function createProvider(config: any) {
2930
processMessage,
3031
processPersonalMessage,
3132
signMessage,
32-
signPersonalMessage
33+
signPersonalMessage,
34+
signTypedMessage
3335
})
3436

3537
const rpcSubProvider = new RpcSource({

yarn.lock

Lines changed: 108 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,13 @@
12051205
dependencies:
12061206
"@json-rpc-tools/types" "^1.6.1"
12071207

1208+
"@ledgerhq/cryptoassets@^5.50.0":
1209+
version "5.50.0"
1210+
resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-5.50.0.tgz#16b1ebc414381b61ffcac5595880cd1eb940dfba"
1211+
integrity sha512-+VGfu+OHyPLBMasprOHkaesBHkE2R5DAdYQqSuAC1vW2WPZ6tyLyZqytmconl4npDzI6Z8EXxOmdnnXYdOArJw==
1212+
dependencies:
1213+
invariant "2"
1214+
12081215
"@ledgerhq/devices@^5.21.0":
12091216
version "5.21.0"
12101217
resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.21.0.tgz#b6dc274536e70513a3ae7df7a9f956ea87adcc49"
@@ -1214,19 +1221,35 @@
12141221
"@ledgerhq/logs" "^5.21.0"
12151222
rxjs "^6.6.0"
12161223

1224+
"@ledgerhq/devices@^5.50.0":
1225+
version "5.50.0"
1226+
resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-5.50.0.tgz#4bfc375d9781fff6bd772b7914211df547574649"
1227+
integrity sha512-VU3i48egHwUSHqNPKa8dNXLxD6gvmPKbKkp2pGL8tNNGXT44iHWplEAQy7et7+Fa48Sh7G2WPBvCbQg9K/SeCw==
1228+
dependencies:
1229+
"@ledgerhq/errors" "^5.50.0"
1230+
"@ledgerhq/logs" "^5.50.0"
1231+
rxjs "^6.6.7"
1232+
semver "^7.3.5"
1233+
12171234
"@ledgerhq/errors@^5.21.0":
12181235
version "5.21.0"
12191236
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.21.0.tgz#2a7bdea62fe7e0bd9ccc3b786d2c179f8f65bc02"
12201237
integrity sha512-sGfXoaVGfzrhnexu2TEdgL2FAjM7PUeobWdDBx3DJKE+ARje1y+i5+qg7gyvQL+9k4FV7mW2xMOcnUI3T2Zw0Q==
12211238

1222-
"@ledgerhq/hw-app-eth@^5.21.0":
1223-
version "5.21.0"
1224-
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.21.0.tgz#a6857df45cddf29b5e7623237171d7ffba42a44c"
1225-
integrity sha512-FKwwqp7IDgCq9ToL/JwO4S3HXr4LSI+Vr6KqeCtpCwRGNdvtiUHF3S9g2LtUroCcGXx9HTr2XL4hZzfrj+2jfg==
1239+
"@ledgerhq/errors@^5.50.0":
1240+
version "5.50.0"
1241+
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.50.0.tgz#e3a6834cb8c19346efca214c1af84ed28e69dad9"
1242+
integrity sha512-gu6aJ/BHuRlpU7kgVpy2vcYk6atjB4iauP2ymF7Gk0ez0Y/6VSMVSJvubeEQN+IV60+OBK0JgeIZG7OiHaw8ow==
1243+
1244+
"@ledgerhq/hw-app-eth@^5.49.0":
1245+
version "5.50.0"
1246+
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-5.50.0.tgz#f11583d005b327403816ade54f6b8157834dddc9"
1247+
integrity sha512-z3uSJ5z/59zoRrccVLnw1ea2WyJ0tof6tp2rvQX8H/Prxb9hXGXua91F+PwuuNdKDR8pgMzQXJMWUb9qlE2R0A==
12261248
dependencies:
1227-
"@ledgerhq/errors" "^5.21.0"
1228-
"@ledgerhq/hw-transport" "^5.21.0"
1229-
bignumber.js "^9.0.0"
1249+
"@ledgerhq/cryptoassets" "^5.50.0"
1250+
"@ledgerhq/errors" "^5.50.0"
1251+
"@ledgerhq/hw-transport" "^5.50.0"
1252+
bignumber.js "^9.0.1"
12301253
rlp "^2.2.6"
12311254

12321255
"@ledgerhq/hw-transport-u2f@^5.21.0":
@@ -1248,11 +1271,25 @@
12481271
"@ledgerhq/errors" "^5.21.0"
12491272
events "^3.2.0"
12501273

1274+
"@ledgerhq/hw-transport@^5.50.0":
1275+
version "5.50.0"
1276+
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-5.50.0.tgz#8a132dbdfd1baed7cedf2e0984e7d234b499f46a"
1277+
integrity sha512-VlcVGgp+Ae4hrUFzSroPJS4i7iBWEYVat91pCl8LyrN+xD8sjamHje69JCdDYY+Cb5++0pbSZt3FGiV0ml3xGA==
1278+
dependencies:
1279+
"@ledgerhq/devices" "^5.50.0"
1280+
"@ledgerhq/errors" "^5.50.0"
1281+
events "^3.3.0"
1282+
12511283
"@ledgerhq/logs@^5.21.0":
12521284
version "5.21.0"
12531285
resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.21.0.tgz#19629222e44b4d312e232c2dfbe0d067ecc12830"
12541286
integrity sha512-eyPXrKfQ+HSLcITB5MdSWhXlImE2qKWTLT2u6l+a9wiCZl5yimSqn0uC5evxaP0McKOW0wSntgfj+gOoKv+Paw==
12551287

1288+
"@ledgerhq/logs@^5.50.0":
1289+
version "5.50.0"
1290+
resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186"
1291+
integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA==
1292+
12561293
"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0":
12571294
version "2.0.0"
12581295
resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c"
@@ -3117,6 +3154,32 @@ eth-sig-util@^1.4.2:
31173154
ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
31183155
ethereumjs-util "^5.1.1"
31193156

3157+
eth-sig-util@^3.0.1:
3158+
version "3.0.1"
3159+
resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.1.tgz#8753297c83a3f58346bd13547b59c4b2cd110c96"
3160+
integrity sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ==
3161+
dependencies:
3162+
ethereumjs-abi "^0.6.8"
3163+
ethereumjs-util "^5.1.1"
3164+
tweetnacl "^1.0.3"
3165+
tweetnacl-util "^0.15.0"
3166+
3167+
eth-tx-summary@^3.1.2:
3168+
version "3.2.4"
3169+
resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c"
3170+
integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==
3171+
dependencies:
3172+
async "^2.1.2"
3173+
clone "^2.0.0"
3174+
concat-stream "^1.5.1"
3175+
end-of-stream "^1.1.0"
3176+
eth-query "^2.0.2"
3177+
ethereumjs-block "^1.4.1"
3178+
ethereumjs-tx "^1.1.1"
3179+
ethereumjs-util "^5.0.1"
3180+
ethereumjs-vm "^2.6.0"
3181+
through2 "^2.0.3"
3182+
31203183
ethereum-bloom-filters@^1.0.6:
31213184
version "1.0.7"
31223185
resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz#b7b80735e385dbb7f944ce6b4533e24511306060"
@@ -3197,7 +3260,7 @@ ethereum-public-key-to-address@0.0.1:
31973260
meow "^5.0.0"
31983261
secp256k1 "^3.7.1"
31993262

3200-
"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
3263+
ethereumjs-abi@^0.6.8, "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
32013264
version "0.6.8"
32023265
resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1cfbb13862f90f0b391d8a699544d5fe4dfb8c7b"
32033266
dependencies:
@@ -4007,7 +4070,7 @@ intl-messageformat@^7.5.2:
40074070
intl-format-cache "^4.2.21"
40084071
intl-messageformat-parser "^3.6.4"
40094072

4010-
invariant@^2.2.2, invariant@^2.2.4:
4073+
invariant@2, invariant@^2.2.2, invariant@^2.2.4:
40114074
version "2.2.4"
40124075
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
40134076
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@@ -4601,6 +4664,13 @@ loud-rejection@^1.0.0:
46014664
currently-unhandled "^0.4.1"
46024665
signal-exit "^3.0.0"
46034666

4667+
lru-cache@^6.0.0:
4668+
version "6.0.0"
4669+
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
4670+
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
4671+
dependencies:
4672+
yallist "^4.0.0"
4673+
46044674
ltgt@~2.2.0:
46054675
version "2.2.1"
46064676
resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
@@ -5796,6 +5866,13 @@ rxjs@^6.6.3:
57965866
dependencies:
57975867
tslib "^1.9.0"
57985868

5869+
rxjs@^6.6.7:
5870+
version "6.6.7"
5871+
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
5872+
integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
5873+
dependencies:
5874+
tslib "^1.9.0"
5875+
57995876
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
58005877
version "5.2.1"
58015878
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -5901,6 +5978,13 @@ semver@^7.3.2:
59015978
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
59025979
integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
59035980

5981+
semver@^7.3.5:
5982+
version "7.3.5"
5983+
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
5984+
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
5985+
dependencies:
5986+
lru-cache "^6.0.0"
5987+
59045988
semver@~5.4.1:
59055989
version "5.4.1"
59065990
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
@@ -6394,11 +6478,21 @@ tunnel-agent@^0.6.0:
63946478
dependencies:
63956479
safe-buffer "^5.0.1"
63966480

6481+
tweetnacl-util@^0.15.0:
6482+
version "0.15.1"
6483+
resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
6484+
integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
6485+
63976486
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
63986487
version "0.14.5"
63996488
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
64006489
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
64016490

6491+
tweetnacl@^1.0.3:
6492+
version "1.0.3"
6493+
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
6494+
integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
6495+
64026496
type-check@~0.3.2:
64036497
version "0.3.2"
64046498
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
@@ -7033,6 +7127,11 @@ yaeti@^0.0.6:
70337127
resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
70347128
integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
70357129

7130+
yallist@^4.0.0:
7131+
version "4.0.0"
7132+
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
7133+
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
7134+
70367135
yargs-parser@^10.0.0:
70377136
version "10.1.0"
70387137
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"

0 commit comments

Comments
 (0)