@qevm/providers 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +78 -0
- package/lib/_version.d.ts +2 -0
- package/lib/_version.d.ts.map +1 -0
- package/lib/_version.js +5 -0
- package/lib/_version.js.map +1 -0
- package/lib/alchemy-provider.d.ts +17 -0
- package/lib/alchemy-provider.d.ts.map +1 -0
- package/lib/alchemy-provider.js +112 -0
- package/lib/alchemy-provider.js.map +1 -0
- package/lib/ankr-provider.d.ts +10 -0
- package/lib/ankr-provider.d.ts.map +1 -0
- package/lib/ankr-provider.js +79 -0
- package/lib/ankr-provider.js.map +1 -0
- package/lib/base-provider.d.ts +156 -0
- package/lib/base-provider.d.ts.map +1 -0
- package/lib/base-provider.js +2585 -0
- package/lib/base-provider.js.map +1 -0
- package/lib/browser-ipc-provider.d.ts +3 -0
- package/lib/browser-ipc-provider.d.ts.map +1 -0
- package/lib/browser-ipc-provider.js +6 -0
- package/lib/browser-ipc-provider.js.map +1 -0
- package/lib/browser-net.d.ts +2 -0
- package/lib/browser-net.d.ts.map +1 -0
- package/lib/browser-net.js +6 -0
- package/lib/browser-net.js.map +1 -0
- package/lib/browser-ws.d.ts +3 -0
- package/lib/browser-ws.d.ts.map +1 -0
- package/lib/browser-ws.js +22 -0
- package/lib/browser-ws.js.map +1 -0
- package/lib/cloudflare-provider.d.ts +8 -0
- package/lib/cloudflare-provider.d.ts.map +1 -0
- package/lib/cloudflare-provider.js +100 -0
- package/lib/cloudflare-provider.js.map +1 -0
- package/lib/etherscan-provider.d.ts +18 -0
- package/lib/etherscan-provider.d.ts.map +1 -0
- package/lib/etherscan-provider.js +528 -0
- package/lib/etherscan-provider.js.map +1 -0
- package/lib/fallback-provider.d.ts +20 -0
- package/lib/fallback-provider.d.ts.map +1 -0
- package/lib/fallback-provider.js +699 -0
- package/lib/fallback-provider.js.map +1 -0
- package/lib/formatter.d.ts +60 -0
- package/lib/formatter.d.ts.map +1 -0
- package/lib/formatter.js +452 -0
- package/lib/formatter.js.map +1 -0
- package/lib/index.d.ts +23 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +97 -0
- package/lib/index.js.map +1 -0
- package/lib/infura-provider.d.ts +21 -0
- package/lib/infura-provider.d.ts.map +1 -0
- package/lib/infura-provider.js +141 -0
- package/lib/infura-provider.js.map +1 -0
- package/lib/ipc-provider.d.ts +8 -0
- package/lib/ipc-provider.d.ts.map +1 -0
- package/lib/ipc-provider.js +77 -0
- package/lib/ipc-provider.js.map +1 -0
- package/lib/json-rpc-batch-provider.d.ts +17 -0
- package/lib/json-rpc-batch-provider.d.ts.map +1 -0
- package/lib/json-rpc-batch-provider.js +99 -0
- package/lib/json-rpc-batch-provider.js.map +1 -0
- package/lib/json-rpc-provider.d.ts +54 -0
- package/lib/json-rpc-provider.d.ts.map +1 -0
- package/lib/json-rpc-provider.js +855 -0
- package/lib/json-rpc-provider.js.map +1 -0
- package/lib/nodesmith-provider.d.ts +7 -0
- package/lib/nodesmith-provider.d.ts.map +1 -0
- package/lib/nodesmith-provider.js +64 -0
- package/lib/nodesmith-provider.js.map +1 -0
- package/lib/pocket-provider.d.ts +12 -0
- package/lib/pocket-provider.d.ts.map +1 -0
- package/lib/pocket-provider.js +98 -0
- package/lib/pocket-provider.js.map +1 -0
- package/lib/url-json-rpc-provider.d.ts +18 -0
- package/lib/url-json-rpc-provider.d.ts.map +1 -0
- package/lib/url-json-rpc-provider.js +153 -0
- package/lib/url-json-rpc-provider.js.map +1 -0
- package/lib/web3-provider.d.ts +28 -0
- package/lib/web3-provider.d.ts.map +1 -0
- package/lib/web3-provider.js +155 -0
- package/lib/web3-provider.js.map +1 -0
- package/lib/websocket-provider.d.ts +48 -0
- package/lib/websocket-provider.d.ts.map +1 -0
- package/lib/websocket-provider.js +384 -0
- package/lib/websocket-provider.js.map +1 -0
- package/lib/ws.d.ts +3 -0
- package/lib/ws.d.ts.map +1 -0
- package/lib/ws.js +9 -0
- package/lib/ws.js.map +1 -0
- package/package.json +57 -0
- package/src.ts/_version.ts +1 -0
- package/src.ts/alchemy-provider.ts +101 -0
- package/src.ts/ankr-provider.ts +68 -0
- package/src.ts/base-provider.ts +2216 -0
- package/src.ts/browser-ipc-provider.ts +7 -0
- package/src.ts/browser-net.ts +3 -0
- package/src.ts/browser-ws.ts +21 -0
- package/src.ts/cloudflare-provider.ts +42 -0
- package/src.ts/etherscan-provider.ts +454 -0
- package/src.ts/fallback-provider.ts +654 -0
- package/src.ts/formatter.ts +522 -0
- package/src.ts/index.ts +178 -0
- package/src.ts/infura-provider.ts +143 -0
- package/src.ts/ipc-provider.ts +72 -0
- package/src.ts/json-rpc-batch-provider.ts +97 -0
- package/src.ts/json-rpc-provider.ts +742 -0
- package/src.ts/nodesmith-provider.ts +50 -0
- package/src.ts/pocket-provider.ts +93 -0
- package/src.ts/url-json-rpc-provider.ts +106 -0
- package/src.ts/web3-provider.ts +169 -0
- package/src.ts/websocket-provider.ts +350 -0
- package/src.ts/ws.ts +3 -0
- package/thirdparty.d.ts +10 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* istanbul ignore file */
|
|
2
|
+
|
|
3
|
+
"use strict";
|
|
4
|
+
|
|
5
|
+
import { Network } from "@ethersproject/networks";
|
|
6
|
+
import { UrlJsonRpcProvider } from "./url-json-rpc-provider";
|
|
7
|
+
|
|
8
|
+
import { Logger } from "@ethersproject/logger";
|
|
9
|
+
import { version } from "./_version";
|
|
10
|
+
const logger = new Logger(version);
|
|
11
|
+
|
|
12
|
+
// Special API key provided by Nodesmith for ethers.js
|
|
13
|
+
const defaultApiKey = "ETHERS_JS_SHARED";
|
|
14
|
+
|
|
15
|
+
export class NodesmithProvider extends UrlJsonRpcProvider {
|
|
16
|
+
|
|
17
|
+
static getApiKey(apiKey: any): any {
|
|
18
|
+
if (apiKey && typeof(apiKey) !== "string") {
|
|
19
|
+
logger.throwArgumentError("invalid apiKey", "apiKey", apiKey);
|
|
20
|
+
}
|
|
21
|
+
return apiKey || defaultApiKey;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
static getUrl(network: Network, apiKey?: any): string {
|
|
25
|
+
logger.warn("NodeSmith will be discontinued on 2019-12-20; please migrate to another platform.");
|
|
26
|
+
|
|
27
|
+
let host = null;
|
|
28
|
+
switch (network.name) {
|
|
29
|
+
case "homestead":
|
|
30
|
+
host = "https://ethereum.api.nodesmith.io/v1/mainnet/jsonrpc";
|
|
31
|
+
break;
|
|
32
|
+
case "ropsten":
|
|
33
|
+
host = "https://ethereum.api.nodesmith.io/v1/ropsten/jsonrpc";
|
|
34
|
+
break;
|
|
35
|
+
case "rinkeby":
|
|
36
|
+
host = "https://ethereum.api.nodesmith.io/v1/rinkeby/jsonrpc";
|
|
37
|
+
break;
|
|
38
|
+
case "goerli":
|
|
39
|
+
host = "https://ethereum.api.nodesmith.io/v1/goerli/jsonrpc";
|
|
40
|
+
break;
|
|
41
|
+
case "kovan":
|
|
42
|
+
host = "https://ethereum.api.nodesmith.io/v1/kovan/jsonrpc";
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
logger.throwArgumentError("unsupported network", "network", arguments[0]);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return (host + "?apiKey=" + apiKey);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Network } from "@ethersproject/networks";
|
|
4
|
+
import { ConnectionInfo } from "@ethersproject/web";
|
|
5
|
+
|
|
6
|
+
import { Logger } from "@ethersproject/logger";
|
|
7
|
+
import { version } from "./_version";
|
|
8
|
+
const logger = new Logger(version);
|
|
9
|
+
|
|
10
|
+
import { UrlJsonRpcProvider } from "./url-json-rpc-provider";
|
|
11
|
+
|
|
12
|
+
const defaultApplicationId = "62e1ad51b37b8e00394bda3b";
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export class PocketProvider extends UrlJsonRpcProvider {
|
|
16
|
+
readonly applicationId: string;
|
|
17
|
+
readonly applicationSecretKey: string;
|
|
18
|
+
readonly loadBalancer: boolean;
|
|
19
|
+
|
|
20
|
+
static getApiKey(apiKey: any): any {
|
|
21
|
+
const apiKeyObj: { applicationId: string, applicationSecretKey: string, loadBalancer: boolean } = {
|
|
22
|
+
applicationId: null,
|
|
23
|
+
loadBalancer: true,
|
|
24
|
+
applicationSecretKey: null
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Parse applicationId and applicationSecretKey
|
|
28
|
+
if (apiKey == null) {
|
|
29
|
+
apiKeyObj.applicationId = defaultApplicationId;
|
|
30
|
+
|
|
31
|
+
} else if (typeof (apiKey) === "string") {
|
|
32
|
+
apiKeyObj.applicationId = apiKey;
|
|
33
|
+
|
|
34
|
+
} else if (apiKey.applicationSecretKey != null) {
|
|
35
|
+
apiKeyObj.applicationId = apiKey.applicationId;
|
|
36
|
+
apiKeyObj.applicationSecretKey = apiKey.applicationSecretKey;
|
|
37
|
+
|
|
38
|
+
} else if (apiKey.applicationId) {
|
|
39
|
+
apiKeyObj.applicationId = apiKey.applicationId;
|
|
40
|
+
|
|
41
|
+
} else {
|
|
42
|
+
logger.throwArgumentError("unsupported PocketProvider apiKey", "apiKey", apiKey);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return apiKeyObj;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static getUrl(network: Network, apiKey: any): ConnectionInfo {
|
|
49
|
+
let host: string = null;
|
|
50
|
+
switch (network ? network.name : "unknown") {
|
|
51
|
+
case "goerli":
|
|
52
|
+
host = "eth-goerli.gateway.pokt.network";
|
|
53
|
+
break;
|
|
54
|
+
case "homestead":
|
|
55
|
+
host = "eth-mainnet.gateway.pokt.network";
|
|
56
|
+
break;
|
|
57
|
+
case "kovan":
|
|
58
|
+
host = "poa-kovan.gateway.pokt.network";
|
|
59
|
+
break;
|
|
60
|
+
case "matic":
|
|
61
|
+
host = "poly-mainnet.gateway.pokt.network";
|
|
62
|
+
break;
|
|
63
|
+
case "maticmum":
|
|
64
|
+
host = "polygon-mumbai-rpc.gateway.pokt.network";
|
|
65
|
+
break;
|
|
66
|
+
case "rinkeby":
|
|
67
|
+
host = "eth-rinkeby.gateway.pokt.network";
|
|
68
|
+
break;
|
|
69
|
+
case "ropsten":
|
|
70
|
+
host = "eth-ropsten.gateway.pokt.network";
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
logger.throwError("unsupported network", Logger.errors.INVALID_ARGUMENT, {
|
|
74
|
+
argument: "network",
|
|
75
|
+
value: network
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const url = `https:/\/${ host }/v1/lb/${ apiKey.applicationId }`
|
|
80
|
+
|
|
81
|
+
const connection: ConnectionInfo = { headers: { }, url };
|
|
82
|
+
if (apiKey.applicationSecretKey != null) {
|
|
83
|
+
connection.user = "";
|
|
84
|
+
connection.password = apiKey.applicationSecretKey
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return connection;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
isCommunityResource(): boolean {
|
|
91
|
+
return (this.applicationId === defaultApplicationId);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
import { Network, Networkish } from "@ethersproject/networks";
|
|
5
|
+
import { defineReadOnly, getStatic } from "@ethersproject/properties";
|
|
6
|
+
import { ConnectionInfo } from "@ethersproject/web";
|
|
7
|
+
|
|
8
|
+
import { Logger } from "@ethersproject/logger";
|
|
9
|
+
import { version } from "./_version";
|
|
10
|
+
const logger = new Logger(version);
|
|
11
|
+
|
|
12
|
+
import { CommunityResourcable } from "./formatter";
|
|
13
|
+
import { JsonRpcProvider, JsonRpcSigner } from "./json-rpc-provider";
|
|
14
|
+
|
|
15
|
+
type getUrlFunc = (network: Network, apiKey: string) => string | ConnectionInfo;
|
|
16
|
+
|
|
17
|
+
// A StaticJsonRpcProvider is useful when you *know* for certain that
|
|
18
|
+
// the backend will never change, as it never calls eth_chainId to
|
|
19
|
+
// verify its backend. However, if the backend does change, the effects
|
|
20
|
+
// are undefined and may include:
|
|
21
|
+
// - inconsistent results
|
|
22
|
+
// - locking up the UI
|
|
23
|
+
// - block skew warnings
|
|
24
|
+
// - wrong results
|
|
25
|
+
// If the network is not explicit (i.e. auto-detection is expected), the
|
|
26
|
+
// node MUST be running and available to respond to requests BEFORE this
|
|
27
|
+
// is instantiated.
|
|
28
|
+
export class StaticJsonRpcProvider extends JsonRpcProvider {
|
|
29
|
+
async detectNetwork(): Promise<Network> {
|
|
30
|
+
let network = this.network;
|
|
31
|
+
if (network == null) {
|
|
32
|
+
network = await super.detectNetwork();
|
|
33
|
+
|
|
34
|
+
if (!network) {
|
|
35
|
+
logger.throwError("no network detected", Logger.errors.UNKNOWN_ERROR, { });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// If still not set, set it
|
|
39
|
+
if (this._network == null) {
|
|
40
|
+
// A static network does not support "any"
|
|
41
|
+
defineReadOnly(this, "_network", network);
|
|
42
|
+
|
|
43
|
+
this.emit("network", network, null);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return network;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export abstract class UrlJsonRpcProvider extends StaticJsonRpcProvider implements CommunityResourcable {
|
|
51
|
+
readonly apiKey: any;
|
|
52
|
+
|
|
53
|
+
constructor(network?: Networkish, apiKey?: any) {
|
|
54
|
+
logger.checkAbstract(new.target, UrlJsonRpcProvider);
|
|
55
|
+
|
|
56
|
+
// Normalize the Network and API Key
|
|
57
|
+
network = getStatic<(network: Networkish) => Network>(new.target, "getNetwork")(network);
|
|
58
|
+
apiKey = getStatic<(apiKey: string) => string>(new.target, "getApiKey")(apiKey);
|
|
59
|
+
|
|
60
|
+
const connection = getStatic<getUrlFunc>(new.target, "getUrl")(network, apiKey);
|
|
61
|
+
|
|
62
|
+
super(connection, network);
|
|
63
|
+
|
|
64
|
+
if (typeof(apiKey) === "string") {
|
|
65
|
+
defineReadOnly(this, "apiKey", apiKey);
|
|
66
|
+
} else if (apiKey != null) {
|
|
67
|
+
Object.keys(apiKey).forEach((key) => {
|
|
68
|
+
defineReadOnly<any, any>(this, key, apiKey[key]);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
_startPending(): void {
|
|
74
|
+
logger.warn("WARNING: API provider does not support pending filters");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
isCommunityResource(): boolean {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
getSigner(address?: string): JsonRpcSigner {
|
|
82
|
+
return logger.throwError(
|
|
83
|
+
"API provider does not support signing",
|
|
84
|
+
Logger.errors.UNSUPPORTED_OPERATION,
|
|
85
|
+
{ operation: "getSigner" }
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
listAccounts(): Promise<Array<string>> {
|
|
90
|
+
return Promise.resolve([]);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Return a defaultApiKey if null, otherwise validate the API key
|
|
94
|
+
static getApiKey(apiKey: any): any {
|
|
95
|
+
return apiKey;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Returns the url or connection for the given network and API key. The
|
|
99
|
+
// API key will have been sanitized by the getApiKey first, so any validation
|
|
100
|
+
// or transformations can be done there.
|
|
101
|
+
static getUrl(network: Network, apiKey: any): string | ConnectionInfo {
|
|
102
|
+
return logger.throwError("not implemented; sub-classes must override getUrl", Logger.errors.NOT_IMPLEMENTED, {
|
|
103
|
+
operation: "getUrl"
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { Networkish } from "@ethersproject/networks";
|
|
4
|
+
import { deepCopy, defineReadOnly } from "@ethersproject/properties";
|
|
5
|
+
|
|
6
|
+
import { Logger } from "@ethersproject/logger";
|
|
7
|
+
import { version } from "./_version";
|
|
8
|
+
const logger = new Logger(version);
|
|
9
|
+
|
|
10
|
+
import { JsonRpcProvider } from "./json-rpc-provider";
|
|
11
|
+
|
|
12
|
+
// Exported Types
|
|
13
|
+
export type ExternalProvider = {
|
|
14
|
+
isMetaMask?: boolean;
|
|
15
|
+
isStatus?: boolean;
|
|
16
|
+
host?: string;
|
|
17
|
+
path?: string;
|
|
18
|
+
sendAsync?: (request: { method: string, params?: Array<any> }, callback: (error: any, response: any) => void) => void
|
|
19
|
+
send?: (request: { method: string, params?: Array<any> }, callback: (error: any, response: any) => void) => void
|
|
20
|
+
request?: (request: { method: string, params?: Array<any> }) => Promise<any>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let _nextId = 1;
|
|
24
|
+
|
|
25
|
+
export type JsonRpcFetchFunc = (method: string, params?: Array<any>) => Promise<any>;
|
|
26
|
+
|
|
27
|
+
type Web3LegacySend = (request: any, callback: (error: Error, response: any) => void) => void;
|
|
28
|
+
|
|
29
|
+
function buildWeb3LegacyFetcher(provider: ExternalProvider, sendFunc: Web3LegacySend) : JsonRpcFetchFunc {
|
|
30
|
+
const fetcher = "Web3LegacyFetcher";
|
|
31
|
+
|
|
32
|
+
return function(method: string, params: Array<any>): Promise<any> {
|
|
33
|
+
const request = {
|
|
34
|
+
method: method,
|
|
35
|
+
params: params,
|
|
36
|
+
id: (_nextId++),
|
|
37
|
+
jsonrpc: "2.0"
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
this.emit("debug", {
|
|
42
|
+
action: "request",
|
|
43
|
+
fetcher,
|
|
44
|
+
request: deepCopy(request),
|
|
45
|
+
provider: this
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
sendFunc(request, (error, response) => {
|
|
49
|
+
|
|
50
|
+
if (error) {
|
|
51
|
+
this.emit("debug", {
|
|
52
|
+
action: "response",
|
|
53
|
+
fetcher,
|
|
54
|
+
error,
|
|
55
|
+
request,
|
|
56
|
+
provider: this
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return reject(error);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
this.emit("debug", {
|
|
63
|
+
action: "response",
|
|
64
|
+
fetcher,
|
|
65
|
+
request,
|
|
66
|
+
response,
|
|
67
|
+
provider: this
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
if (response.error) {
|
|
71
|
+
const error = new Error(response.error.message);
|
|
72
|
+
(<any>error).code = response.error.code;
|
|
73
|
+
(<any>error).data = response.error.data;
|
|
74
|
+
return reject(error);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
resolve(response.result);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function buildEip1193Fetcher(provider: ExternalProvider): JsonRpcFetchFunc {
|
|
84
|
+
return function(method: string, params: Array<any>): Promise<any> {
|
|
85
|
+
if (params == null) { params = [ ]; }
|
|
86
|
+
|
|
87
|
+
const request = { method, params };
|
|
88
|
+
|
|
89
|
+
this.emit("debug", {
|
|
90
|
+
action: "request",
|
|
91
|
+
fetcher: "Eip1193Fetcher",
|
|
92
|
+
request: deepCopy(request),
|
|
93
|
+
provider: this
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
return provider.request(request).then((response) => {
|
|
97
|
+
this.emit("debug", {
|
|
98
|
+
action: "response",
|
|
99
|
+
fetcher: "Eip1193Fetcher",
|
|
100
|
+
request,
|
|
101
|
+
response,
|
|
102
|
+
provider: this
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
return response;
|
|
106
|
+
|
|
107
|
+
}, (error) => {
|
|
108
|
+
this.emit("debug", {
|
|
109
|
+
action: "response",
|
|
110
|
+
fetcher: "Eip1193Fetcher",
|
|
111
|
+
request,
|
|
112
|
+
error,
|
|
113
|
+
provider: this
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
throw error;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export class Web3Provider extends JsonRpcProvider {
|
|
122
|
+
readonly provider: ExternalProvider;
|
|
123
|
+
readonly jsonRpcFetchFunc: JsonRpcFetchFunc;
|
|
124
|
+
|
|
125
|
+
constructor(provider: ExternalProvider | JsonRpcFetchFunc, network?: Networkish) {
|
|
126
|
+
if (provider == null) {
|
|
127
|
+
logger.throwArgumentError("missing provider", "provider", provider);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
let path: string = null;
|
|
131
|
+
let jsonRpcFetchFunc: JsonRpcFetchFunc = null;
|
|
132
|
+
let subprovider: ExternalProvider = null;
|
|
133
|
+
|
|
134
|
+
if (typeof(provider) === "function") {
|
|
135
|
+
path = "unknown:";
|
|
136
|
+
jsonRpcFetchFunc = provider;
|
|
137
|
+
|
|
138
|
+
} else {
|
|
139
|
+
path = provider.host || provider.path || "";
|
|
140
|
+
if (!path && provider.isMetaMask) {
|
|
141
|
+
path = "metamask";
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
subprovider = provider;
|
|
145
|
+
|
|
146
|
+
if (provider.request) {
|
|
147
|
+
if (path === "") { path = "eip-1193:"; }
|
|
148
|
+
jsonRpcFetchFunc = buildEip1193Fetcher(provider);
|
|
149
|
+
} else if (provider.sendAsync) {
|
|
150
|
+
jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider));
|
|
151
|
+
} else if (provider.send) {
|
|
152
|
+
jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider));
|
|
153
|
+
} else {
|
|
154
|
+
logger.throwArgumentError("unsupported provider", "provider", provider);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (!path) { path = "unknown:"; }
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
super(path, network);
|
|
161
|
+
|
|
162
|
+
defineReadOnly(this, "jsonRpcFetchFunc", jsonRpcFetchFunc);
|
|
163
|
+
defineReadOnly(this, "provider", subprovider);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
send(method: string, params: Array<any>): Promise<any> {
|
|
167
|
+
return this.jsonRpcFetchFunc(method, params);
|
|
168
|
+
}
|
|
169
|
+
}
|