Skip to content

Commit 1770969

Browse files
committed
Add custom ledger transport option
1 parent 130a5ac commit 1770969

File tree

3 files changed

+49
-29
lines changed

3 files changed

+49
-29
lines changed

src/interfaces.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ export interface TrezorOptions {
150150

151151
export interface LedgerOptions {
152152
rpcUrl: string
153+
LedgerTransport?: any
153154
}
154155

155156
export interface TorusOptions {
@@ -161,13 +162,12 @@ export interface TorusOptions {
161162
enabledVerifiers: TorusVerifierStatus
162163
}
163164

164-
165165
interface TorusVerifierStatus {
166-
google?: boolean;
167-
facebook?: boolean;
168-
reddit?: boolean;
169-
twitch?: boolean;
170-
discord?: boolean;
166+
google?: boolean
167+
facebook?: boolean
168+
reddit?: boolean
169+
twitch?: boolean
170+
discord?: boolean
171171
}
172172

173173
export interface AuthereumOptions {

src/modules/select/wallets/ledger.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,19 @@ import * as EthereumTx from 'ethereumjs-tx'
1414

1515
import buffer from 'buffer'
1616

17+
let transport: any
18+
let eth: any
19+
1720
function ledger(options: LedgerOptions & CommonWalletOptions): WalletModule {
18-
const { rpcUrl, networkId, preferred, label, iconSrc, svg } = options
21+
const {
22+
rpcUrl,
23+
LedgerTransport,
24+
networkId,
25+
preferred,
26+
label,
27+
iconSrc,
28+
svg
29+
} = options
1930

2031
return {
2132
name: label || 'Ledger',
@@ -27,6 +38,7 @@ function ledger(options: LedgerOptions & CommonWalletOptions): WalletModule {
2738
const provider = await ledgerProvider({
2839
rpcUrl,
2940
networkId,
41+
LedgerTransport,
3042
BigNumber,
3143
networkName
3244
})
@@ -61,10 +73,11 @@ function ledger(options: LedgerOptions & CommonWalletOptions): WalletModule {
6173
async function ledgerProvider(options: {
6274
networkId: number
6375
rpcUrl: string
76+
LedgerTransport: any
6477
BigNumber: any
6578
networkName: (id: number) => string
6679
}) {
67-
const { networkId, rpcUrl, BigNumber, networkName } = options
80+
const { networkId, rpcUrl, LedgerTransport, BigNumber, networkName } = options
6881
const basePath = networkIdToDerivationPath(networkId)
6982

7083
let addressToPath = new Map()
@@ -90,6 +103,25 @@ async function ledgerProvider(options: {
90103
provider.setPrimaryAccount = setPrimaryAccount
91104
provider.getBalance = getBalance
92105
provider.send = provider.sendAsync
106+
provider.disconnect = disconnect
107+
108+
if (!eth) {
109+
try {
110+
transport = LedgerTransport
111+
? await LedgerTransport.create()
112+
: await TransportU2F.create()
113+
114+
eth = new Eth(transport)
115+
} catch (error) {
116+
throw new Error('Error connecting to Ledger wallet')
117+
}
118+
}
119+
120+
function disconnect() {
121+
addressToPath = new Map()
122+
enabled = false
123+
provider.stop()
124+
}
93125

94126
function enable() {
95127
enabled = true
@@ -161,16 +193,6 @@ async function ledgerProvider(options: {
161193
paths.push(`${basePath}/0'/0`)
162194
}
163195

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-
174196
for (const path of paths) {
175197
try {
176198
const { address } = await eth.getAddress(path)
@@ -215,15 +237,6 @@ async function ledgerProvider(options: {
215237

216238
async function signTransaction(transactionData: any) {
217239
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-
}
227240

228241
try {
229242
const transaction = new EthereumTx.Transaction(transactionData, {

src/validation.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ export function validateWalletInit(
527527
appUrl,
528528
email,
529529
rpcUrl,
530+
LedgerTransport,
530531
buildEnv,
531532
buttonPosition,
532533
enableLogging,
@@ -551,6 +552,7 @@ export function validateWalletInit(
551552
'appUrl',
552553
'email',
553554
'rpcUrl',
555+
'LedgerTransport',
554556
'buildEnv',
555557
'buttonPosition',
556558
'enableLogging',
@@ -619,11 +621,17 @@ export function validateWalletInit(
619621
validateType({
620622
name: 'walletInit.appUrl',
621623
value: appUrl,
622-
623624
type: 'string',
624625
optional: true
625626
})
626627

628+
validateType({
629+
name: 'walletInit.LedgerTransport',
630+
value: LedgerTransport,
631+
type: 'function',
632+
optional: true
633+
})
634+
627635
validateType({
628636
name: 'walletInit.email',
629637
value: email,
@@ -660,7 +668,6 @@ export function validateWalletInit(
660668
optional: true
661669
})
662670

663-
664671
validateType({
665672
name: 'walletInit.enabledVerifiers',
666673
value: enabledVerifiers,

0 commit comments

Comments
 (0)