diff --git a/packages/hdwallet-provider/package.json b/packages/hdwallet-provider/package.json index 2101ae31647..58bc7c4d821 100644 --- a/packages/hdwallet-provider/package.json +++ b/packages/hdwallet-provider/package.json @@ -39,7 +39,8 @@ "ganache-core": "2.13.0", "mocha": "8.1.2", "ts-node": "^9.0.0", - "typescript": "^4.1.4" + "typescript": "^4.1.4", + "web3": "1.5.3" }, "keywords": [ "etheruem", diff --git a/packages/hdwallet-provider/src/constructor/Constructor.ts b/packages/hdwallet-provider/src/constructor/Constructor.ts index 6bdd7469ab8..29284e4004c 100644 --- a/packages/hdwallet-provider/src/constructor/Constructor.ts +++ b/packages/hdwallet-provider/src/constructor/Constructor.ts @@ -3,6 +3,7 @@ import type { MnemonicPhrase, PrivateKey, Provider, + ProviderUrl, ProviderOrUrl, AddressIndex, NumberOfAddresses, @@ -41,7 +42,7 @@ export type InputSigningAuthority = export interface CommonOptions { providerOrUrl?: ProviderOrUrl; provider?: Provider; - url?: string; + url?: ProviderUrl; addressIndex?: AddressIndex; numberOfAddresses?: NumberOfAddresses; shareNonce?: ShareNonce; diff --git a/packages/hdwallet-provider/src/constructor/types.ts b/packages/hdwallet-provider/src/constructor/types.ts index 791f2b0d05f..9f470433eff 100644 --- a/packages/hdwallet-provider/src/constructor/types.ts +++ b/packages/hdwallet-provider/src/constructor/types.ts @@ -7,8 +7,15 @@ export interface Mnemonic { phrase: MnemonicPhrase; password?: MnemonicPassword; } +import type { Provider as LegacyProvider } from "web3/providers"; +type Eip1193Provider = { + request: (options: { + method: string; + params?: unknown[] | object; + }) => Promise; +}; export type PrivateKey = string; -export type Provider = any; +export type Provider = LegacyProvider | Eip1193Provider; export type ProviderUrl = string; export type ProviderOrUrl = Provider | ProviderUrl; export type AddressIndex = number; diff --git a/packages/hdwallet-provider/src/index.ts b/packages/hdwallet-provider/src/index.ts index 12bf49fcbba..d4ea45af35b 100644 --- a/packages/hdwallet-provider/src/index.ts +++ b/packages/hdwallet-provider/src/index.ts @@ -54,7 +54,9 @@ class HDWalletProvider { constructor(...args: ConstructorArguments) { const { - providerOrUrl, // required + provider, + url, + providerOrUrl, addressIndex = 0, numberOfAddresses = 10, shareNonce = true, @@ -78,11 +80,21 @@ class HDWalletProvider { pollingInterval }); - if (!HDWalletProvider.isValidProvider(providerOrUrl)) { + let providerToUse; + if (HDWalletProvider.isValidProvider(provider)) { + providerToUse = provider; + } else if (HDWalletProvider.isValidProvider(url)) { + providerToUse = url; + } else { + providerToUse = providerOrUrl; + } + + if (!HDWalletProvider.isValidProvider(providerToUse)) { throw new Error( [ - `Malformed provider URL: '${providerOrUrl}'`, - "Please specify a correct URL, using the http, https, ws, or wss protocol.", + `No provider or an invalid provider was specified: '${providerToUse}'`, + "Please specify a valid provider or URL, using the http, https, " + + "ws, or wss protocol.", "" ].join("\n") ); @@ -219,8 +231,8 @@ class HDWalletProvider { : this.engine.addProvider(singletonNonceSubProvider); this.engine.addProvider(new FiltersSubprovider()); - if (typeof providerOrUrl === "string") { - const url = providerOrUrl; + if (typeof providerToUse === "string") { + const url = providerToUse; const providerProtocol = ( Url.parse(url).protocol || "http:" @@ -235,8 +247,7 @@ class HDWalletProvider { this.engine.addProvider(new RpcProvider({ rpcUrl: url })); } } else { - const provider = providerOrUrl; - this.engine.addProvider(new ProviderSubprovider(provider)); + this.engine.addProvider(new ProviderSubprovider(providerToUse)); } // Required by the provider engine. @@ -356,15 +367,20 @@ class HDWalletProvider { return this.addresses; } - public static isValidProvider(provider: string | any): boolean { - const validProtocols = ["http:", "https:", "ws:", "wss:"]; - + public static isValidProvider(provider: any): boolean { + if (!provider) return false; if (typeof provider === "string") { + const validProtocols = ["http:", "https:", "ws:", "wss:"]; const url = Url.parse(provider.toLowerCase()); return !!(validProtocols.includes(url.protocol || "") && url.slashes); + } else if ("request" in provider) { + // provider is an 1193 provider + return true; + } else if ("send" in provider) { + // provider is a "legacy" provider + return true; } - - return true; + return false; } }