diff --git a/src/helpers.ts b/src/helpers.ts index d95e0e4a..d4f65158 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -63,7 +63,29 @@ import { Transaction, } from '@ethersproject/transactions'; -let LedgerSigner: any; // TODO type +let ledgerSigner: Signer; + +function ledgerSignerFactory( + provider: Web3Provider | zk.Web3Provider, + path: string +): Signer { + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const hardwareWalletModule = require('@ethersproject/hardware-wallets'); + return new hardwareWalletModule.LedgerSigner(provider, 'default', path); + } catch (_) { + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const hardwareWalletModule = require('@anders-t/ethers-ledger'); + return new hardwareWalletModule.LedgerSigner(provider, path); + } catch (e) { + console.error( + `failed to loader hardhware wallet module for ledger, you can either use "@ethersproject/hardware-wallets" which as time of writing does not work or use "@anders-t/ethers-ledger."` + ); + throw e; + } + } +} async function handleSpecificErrors<T>(p: Promise<T>): Promise<T> { let result: T; @@ -1763,33 +1785,16 @@ Note that in this case, the contract deployment will not behave the same if depl return provider.getTransaction(response.hash); }; hardwareWallet = 'external'; - } else if (registeredProtocol === 'ledger') { - if (!LedgerSigner) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - let error: any | undefined; - try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const hardwareWalletModule = require('@ethersproject/hardware-wallets'); - LedgerSigner = hardwareWalletModule.LedgerSigner; - } catch (e) { - error = e; - try { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const hardwareWalletModule = require('@anders-t/ethers-ledger'); - LedgerSigner = hardwareWalletModule.LedgerSigner; - error = undefined; - } catch (e) {} - } - - if (error) { - console.error( - `failed to loader hardhware wallet module for ledger, you can either use "@ethersproject/hardware-wallets" which as time of writing does not work or use "@anders-t/ethers-ledger."` - ); - throw error; - } + } else if (registeredProtocol.startsWith('ledger')) { + if (!ledgerSigner) { + ledgerSigner = ledgerSignerFactory( + provider, + registeredProtocol.substr(9) + ); } - ethersSigner = new LedgerSigner(provider); + hardwareWallet = 'ledger'; + ethersSigner = ledgerSigner; } else if (registeredProtocol.startsWith('privatekey')) { ethersSigner = new Wallet(registeredProtocol.substr(13), provider); } else if (registeredProtocol.startsWith('gnosis')) { diff --git a/src/utils.ts b/src/utils.ts index f964141c..2b3080b4 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -341,9 +341,17 @@ function transformNamedAccounts( protocolSplit[0].toLowerCase(); // knownAccountsDict[address.toLowerCase()] = true; // TODO ? this would prevent auto impersonation in fork/test } else if (protocolSplit[0].toLowerCase() === 'ledger') { - address = protocolSplit[1]; - addressesToProtocol[address.toLowerCase()] = - protocolSplit[0].toLowerCase(); + const addressSplit = protocolSplit[1].split(':'); + if (addressSplit.length > 1) { + address = addressSplit[1]; + addressesToProtocol[ + address.toLowerCase() + ] = `ledger://${addressSplit[0]}`; + } else { + address = protocolSplit[1]; + addressesToProtocol[address.toLowerCase()] = + "ledger://m/44'/60'/0'/0/0"; + } // knownAccountsDict[address.toLowerCase()] = true; // TODO ? this would prevent auto impersonation in fork/test } else if (protocolSplit[0].toLowerCase() === 'privatekey') { address = new Wallet(protocolSplit[1]).address;