Skip to content

Commit 8c2651c

Browse files
1.27.0-0.0.2: [fix] ledger u2f chrome 91 (#580)
* 1.27.0-0.1.0: Fixes Ledger for Chrome 91
1 parent 1df2bf1 commit 8c2651c

File tree

14 files changed

+1855
-1627
lines changed

14 files changed

+1855
-1627
lines changed

.eslintrc.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ module.exports = {
66
},
77
extends: [
88
'plugin:@typescript-eslint/recommended',
9-
'prettier/@typescript-eslint',
10-
'plugin:prettier/recommended'
9+
'prettier'
1110
],
1211

1312
rules: {

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bnc-onboard",
3-
"version": "1.27.0-0.0.1",
3+
"version": "1.27.0-0.0.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",
@@ -41,12 +41,11 @@
4141
"@typescript-eslint/parser": "^2.30.0",
4242
"babel-plugin-external-helpers": "^6.18.0",
4343
"eslint": "^6.8.0",
44-
"eslint-config-prettier": "^6.11.0",
45-
"eslint-plugin-prettier": "^3.1.3",
44+
"eslint-config-prettier": "^8.3.0",
4645
"prettier": "^2.0.5",
4746
"rimraf": "^3.0.0",
4847
"rollup": "^1.27.5",
49-
"rollup-plugin-svelte": "^5.0.3",
48+
"rollup-plugin-svelte": "^6.1.1",
5049
"rollup-plugin-typescript2": "0.21.0",
5150
"svelte": "^3.12.1",
5251
"svelte-i18n": "^1.1.2-beta",
@@ -58,6 +57,7 @@
5857
"@gnosis.pm/safe-apps-sdk": "^3.0.0",
5958
"@ledgerhq/hw-app-eth": "^5.49.0",
6059
"@ledgerhq/hw-transport-u2f": "^5.21.0",
60+
"@ledgerhq/hw-transport-webusb": "5.53.0",
6161
"@portis/web3": "^4.0.0",
6262
"@toruslabs/torus-embed": "^1.10.11",
6363
"@walletconnect/web3-provider": "^1.4.1",

rollup.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export default {
7373
'@cvbb/eth-keyring',
7474
'hdkey',
7575
'@ledgerhq/hw-transport-u2f',
76+
'@ledgerhq/hw-transport-webusb',
7677
'@ledgerhq/hw-app-eth',
7778
'util',
7879
'assert',

src/@types/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ declare module 'ethereumjs-util'
1414
declare module 'hdkey'
1515
declare module '@ledgerhq/hw-app-eth'
1616
declare module '@ledgerhq/hw-transport-u2f'
17+
declare module '@ledgerhq/hw-transport-webusb'
1718
declare module 'eth-provider'
1819

1920
declare module '*.png'

src/interfaces.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ export interface WalletModule {
113113
iconSrc?: string
114114
iconSrcSet?: string
115115
svg?: string
116-
wallet: (
117-
helpers: Helpers
118-
) => Promise<{
116+
wallet: (helpers: Helpers) => Promise<{
119117
provider: any | undefined
120118
interface: WalletInterface | null
121119
instance?: any

src/modules/check/accounts.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ function accountSelect(
5353
}
5454

5555
const accountSelect = () => {
56-
const accountIndex = (document as any).getElementById('account-select')
57-
.selectedIndex
56+
const accountIndex = (document as any).getElementById(
57+
'account-select'
58+
).selectedIndex
5859

5960
provider.setPrimaryAccount(accountsAndBalances[accountIndex].address)
6061
}

src/modules/select/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ function select(
6868
)
6969
}
7070

71-
function getModule(
72-
name: string
73-
): Promise<{
71+
function getModule(name: string): Promise<{
7472
default: (options: AllWalletInitOptions) => WalletModule
7573
}> {
7674
switch (name) {

src/modules/select/wallets/ledger.ts

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,8 @@ const LEDGER_LIVE_PATH = `m/44'/60'`
55
const ACCOUNTS_TO_GET = 5
66

77
function ledger(options: LedgerOptions & { networkId: number }): WalletModule {
8-
const {
9-
rpcUrl,
10-
LedgerTransport,
11-
networkId,
12-
preferred,
13-
label,
14-
iconSrc,
15-
svg
16-
} = options
8+
const { rpcUrl, LedgerTransport, networkId, preferred, label, iconSrc, svg } =
9+
options
1710

1811
return {
1912
name: label || 'Ledger',
@@ -60,7 +53,7 @@ function ledger(options: LedgerOptions & { networkId: number }): WalletModule {
6053
}
6154
}
6255

63-
async function ledgerProvider(options: {
56+
interface LedgerProviderOptions {
6457
networkId: number
6558
rpcUrl: string
6659
LedgerTransport: any
@@ -70,10 +63,11 @@ async function ledgerProvider(options: {
7063
disconnected: boolean
7164
walletName: string
7265
}) => void
73-
}) {
66+
}
67+
68+
async function ledgerProvider(options: LedgerProviderOptions) {
7469
const { default: createProvider } = await import('./providerEngine')
7570
const { generateAddresses, isValidPath } = await import('./hd-wallet')
76-
const { default: TransportU2F } = await import('@ledgerhq/hw-transport-u2f')
7771
const { default: Eth } = await import('@ledgerhq/hw-app-eth')
7872

7973
const EthereumTx = await import('ethereumjs-tx')
@@ -169,10 +163,12 @@ async function ledgerProvider(options: {
169163
provider.isCustomPath = isCustomPath
170164

171165
let transport: any
166+
let transportSubscription: any
172167
let eth: any
173168

174169
function disconnect() {
175-
transport && transport.close()
170+
transport?.close()
171+
transportSubscription?.unsubscribe()
176172
provider.stop()
177173
resetWalletState({ disconnected: true, walletName: 'Ledger' })
178174
}
@@ -207,12 +203,6 @@ async function ledgerProvider(options: {
207203

208204
async function createTransport() {
209205
try {
210-
transport = LedgerTransport
211-
? await LedgerTransport.create()
212-
: await TransportU2F.create()
213-
214-
eth = new Eth(transport)
215-
216206
const observer = {
217207
next: (event: any) => {
218208
if (event.type === 'remove') {
@@ -223,9 +213,17 @@ async function ledgerProvider(options: {
223213
complete: () => {}
224214
}
225215

226-
LedgerTransport
227-
? LedgerTransport.listen(observer)
228-
: TransportU2F.listen(observer)
216+
// Get the Transport class
217+
const Transport =
218+
LedgerTransport || (await supportsWebUSB())
219+
? (await import('@ledgerhq/hw-transport-webusb')).default
220+
: (await import('@ledgerhq/hw-transport-u2f')).default
221+
222+
transport = await Transport.create()
223+
224+
eth = new Eth(transport)
225+
226+
Transport.listen(observer)
229227
} catch (error) {
230228
throw new Error('Error connecting to Ledger wallet')
231229
}
@@ -453,5 +451,12 @@ async function ledgerProvider(options: {
453451

454452
return provider
455453
}
454+
type Nav = Navigator & { usb: { getDevices(): void } }
455+
const supportsWebUSB = (): Promise<boolean> =>
456+
Promise.resolve(
457+
!!navigator &&
458+
!!(navigator as Nav).usb &&
459+
typeof (navigator as Nav).usb.getDevices === 'function'
460+
)
456461

457462
export default ledger

src/modules/select/wallets/trezor.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,8 @@ import { TrezorOptions, WalletModule, Helpers } from '../../../interfaces'
22
import trezorIcon from '../wallet-icons/icon-trezor'
33

44
function trezor(options: TrezorOptions & { networkId: number }): WalletModule {
5-
const {
6-
rpcUrl,
7-
networkId,
8-
email,
9-
appUrl,
10-
preferred,
11-
label,
12-
iconSrc,
13-
svg
14-
} = options
5+
const { rpcUrl, networkId, email, appUrl, preferred, label, iconSrc, svg } =
6+
options
157

168
return {
179
name: label || 'Trezor',

src/modules/select/wallets/wallet-connect.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,8 @@ import { app } from '../../../stores'
1313
function walletConnect(
1414
options: WalletConnectOptions & { networkId: number }
1515
): WalletModule {
16-
const {
17-
infuraKey,
18-
rpc,
19-
bridge,
20-
preferred,
21-
label,
22-
iconSrc,
23-
svg,
24-
networkId
25-
} = options
16+
const { infuraKey, rpc, bridge, preferred, label, iconSrc, svg, networkId } =
17+
options
2618

2719
const pollingInterval = get(app).blockPollingInterval
2820

0 commit comments

Comments
 (0)