1 | "use strict";
|
2 | import { deepCopy, defineReadOnly } from "@ethersproject/properties";
|
3 | import { Logger } from "@ethersproject/logger";
|
4 | import { version } from "./_version";
|
5 | const logger = new Logger(version);
|
6 | import { JsonRpcProvider } from "./json-rpc-provider";
|
7 | let _nextId = 1;
|
8 | function buildWeb3LegacyFetcher(provider, sendFunc) {
|
9 | const fetcher = "Web3LegacyFetcher";
|
10 | return function (method, params) {
|
11 | const request = {
|
12 | method: method,
|
13 | params: params,
|
14 | id: (_nextId++),
|
15 | jsonrpc: "2.0"
|
16 | };
|
17 | return new Promise((resolve, reject) => {
|
18 | this.emit("debug", {
|
19 | action: "request",
|
20 | fetcher,
|
21 | request: deepCopy(request),
|
22 | provider: this
|
23 | });
|
24 | sendFunc(request, (error, response) => {
|
25 | if (error) {
|
26 | this.emit("debug", {
|
27 | action: "response",
|
28 | fetcher,
|
29 | error,
|
30 | request,
|
31 | provider: this
|
32 | });
|
33 | return reject(error);
|
34 | }
|
35 | this.emit("debug", {
|
36 | action: "response",
|
37 | fetcher,
|
38 | request,
|
39 | response,
|
40 | provider: this
|
41 | });
|
42 | if (response.error) {
|
43 | const error = new Error(response.error.message);
|
44 | error.code = response.error.code;
|
45 | error.data = response.error.data;
|
46 | return reject(error);
|
47 | }
|
48 | resolve(response.result);
|
49 | });
|
50 | });
|
51 | };
|
52 | }
|
53 | function buildEip1193Fetcher(provider) {
|
54 | return function (method, params) {
|
55 | if (params == null) {
|
56 | params = [];
|
57 | }
|
58 | const request = { method, params };
|
59 | this.emit("debug", {
|
60 | action: "request",
|
61 | fetcher: "Eip1193Fetcher",
|
62 | request: deepCopy(request),
|
63 | provider: this
|
64 | });
|
65 | return provider.request(request).then((response) => {
|
66 | this.emit("debug", {
|
67 | action: "response",
|
68 | fetcher: "Eip1193Fetcher",
|
69 | request,
|
70 | response,
|
71 | provider: this
|
72 | });
|
73 | return response;
|
74 | }, (error) => {
|
75 | this.emit("debug", {
|
76 | action: "response",
|
77 | fetcher: "Eip1193Fetcher",
|
78 | request,
|
79 | error,
|
80 | provider: this
|
81 | });
|
82 | throw error;
|
83 | });
|
84 | };
|
85 | }
|
86 | export class Web3Provider extends JsonRpcProvider {
|
87 | constructor(provider, network) {
|
88 | if (provider == null) {
|
89 | logger.throwArgumentError("missing provider", "provider", provider);
|
90 | }
|
91 | let path = null;
|
92 | let jsonRpcFetchFunc = null;
|
93 | let subprovider = null;
|
94 | if (typeof (provider) === "function") {
|
95 | path = "unknown:";
|
96 | jsonRpcFetchFunc = provider;
|
97 | }
|
98 | else {
|
99 | path = provider.host || provider.path || "";
|
100 | if (!path && provider.isMetaMask) {
|
101 | path = "metamask";
|
102 | }
|
103 | subprovider = provider;
|
104 | if (provider.request) {
|
105 | if (path === "") {
|
106 | path = "eip-1193:";
|
107 | }
|
108 | jsonRpcFetchFunc = buildEip1193Fetcher(provider);
|
109 | }
|
110 | else if (provider.sendAsync) {
|
111 | jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider));
|
112 | }
|
113 | else if (provider.send) {
|
114 | jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider));
|
115 | }
|
116 | else {
|
117 | logger.throwArgumentError("unsupported provider", "provider", provider);
|
118 | }
|
119 | if (!path) {
|
120 | path = "unknown:";
|
121 | }
|
122 | }
|
123 | super(path, network);
|
124 | defineReadOnly(this, "jsonRpcFetchFunc", jsonRpcFetchFunc);
|
125 | defineReadOnly(this, "provider", subprovider);
|
126 | }
|
127 | send(method, params) {
|
128 | return this.jsonRpcFetchFunc(method, params);
|
129 | }
|
130 | }
|
131 |
|
\ | No newline at end of file |