import { LedgerSubprovider } from '@0xproject/subproviders'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; import Eth from '@ledgerhq/hw-app-eth'; import TransportNodeHid from '@ledgerhq/hw-transport-node-hid'; import { Provider } from 'ethereum-types'; import ProviderEngine = require('web3-provider-engine'); import RpcSubprovider = require('web3-provider-engine/subproviders/rpc'); import { LedgerEthereumClient } from '../types'; import { constants } from './constants'; async function ledgerEthereumNodeJsClientFactoryAsync(): Promise { const ledgerConnection = await TransportNodeHid.create(); const ledgerEthClient = new Eth(ledgerConnection); return ledgerEthClient; } export const providerFactory = { async getLedgerProviderAsync(): Promise { const provider = new ProviderEngine(); provider.addProvider( new RpcSubprovider({ rpcUrl: constants.RPC_URL, }), ); const web3Wrapper = new Web3Wrapper(provider); const networkId = await web3Wrapper.getNetworkIdAsync(); const ledgerWalletConfigs = { networkId, ledgerEthereumClientFactoryAsync: ledgerEthereumNodeJsClientFactoryAsync, }; const ledgerSubprovider = new LedgerSubprovider(ledgerWalletConfigs); provider.addProvider(ledgerSubprovider); provider.start(); return provider; }, };