@@ -15,7 +15,15 @@ import * as EthereumTx from 'ethereumjs-tx'
15
15
import buffer from 'buffer'
16
16
17
17
function ledger ( options : LedgerOptions & CommonWalletOptions ) : WalletModule {
18
- const { rpcUrl, networkId, preferred, label, iconSrc, svg } = options
18
+ const {
19
+ rpcUrl,
20
+ LedgerTransport,
21
+ networkId,
22
+ preferred,
23
+ label,
24
+ iconSrc,
25
+ svg
26
+ } = options
19
27
20
28
return {
21
29
name : label || 'Ledger' ,
@@ -27,6 +35,7 @@ function ledger(options: LedgerOptions & CommonWalletOptions): WalletModule {
27
35
const provider = await ledgerProvider ( {
28
36
rpcUrl,
29
37
networkId,
38
+ LedgerTransport,
30
39
BigNumber,
31
40
networkName
32
41
} )
@@ -36,7 +45,7 @@ function ledger(options: LedgerOptions & CommonWalletOptions): WalletModule {
36
45
interface : {
37
46
name : 'Ledger' ,
38
47
connect : provider . enable ,
39
- disconnect : ( ) => provider . stop ( ) ,
48
+ disconnect : provider . disconnect ,
40
49
address : {
41
50
get : async ( ) => provider . getPrimaryAddress ( )
42
51
} ,
@@ -61,10 +70,11 @@ function ledger(options: LedgerOptions & CommonWalletOptions): WalletModule {
61
70
async function ledgerProvider ( options : {
62
71
networkId : number
63
72
rpcUrl : string
73
+ LedgerTransport : any
64
74
BigNumber : any
65
75
networkName : ( id : number ) => string
66
76
} ) {
67
- const { networkId, rpcUrl, BigNumber, networkName } = options
77
+ const { networkId, rpcUrl, LedgerTransport , BigNumber, networkName } = options
68
78
const basePath = networkIdToDerivationPath ( networkId )
69
79
70
80
let addressToPath = new Map ( )
@@ -90,6 +100,27 @@ async function ledgerProvider(options: {
90
100
provider . setPrimaryAccount = setPrimaryAccount
91
101
provider . getBalance = getBalance
92
102
provider . send = provider . sendAsync
103
+ provider . disconnect = disconnect
104
+
105
+ let transport : any
106
+ let eth : any
107
+
108
+ try {
109
+ transport = LedgerTransport
110
+ ? await LedgerTransport . create ( )
111
+ : await TransportU2F . create ( )
112
+
113
+ eth = new Eth ( transport )
114
+ } catch ( error ) {
115
+ throw new Error ( 'Error connecting to Ledger wallet' )
116
+ }
117
+
118
+ function disconnect ( ) {
119
+ transport . close ( )
120
+ addressToPath = new Map ( )
121
+ enabled = false
122
+ provider . stop ( )
123
+ }
93
124
94
125
function enable ( ) {
95
126
enabled = true
@@ -161,16 +192,6 @@ async function ledgerProvider(options: {
161
192
paths . push ( `${ basePath } /0'/0` )
162
193
}
163
194
164
- let transport
165
- let eth
166
-
167
- try {
168
- transport = await TransportU2F . create ( )
169
- eth = new Eth ( transport )
170
- } catch ( error ) {
171
- reject ( { message : 'Error connecting to Ledger wallet' } )
172
- }
173
-
174
195
for ( const path of paths ) {
175
196
try {
176
197
const { address } = await eth . getAddress ( path )
@@ -215,15 +236,6 @@ async function ledgerProvider(options: {
215
236
216
237
async function signTransaction ( transactionData : any ) {
217
238
const path = [ ...addressToPath . values ( ) ] [ 0 ]
218
- let transport
219
- let eth
220
-
221
- try {
222
- transport = await TransportU2F . create ( )
223
- eth = new Eth ( transport )
224
- } catch ( error ) {
225
- throw new Error ( 'Error connecting to Ledger wallet' )
226
- }
227
239
228
240
try {
229
241
const transaction = new EthereumTx . Transaction ( transactionData , {
0 commit comments