1 | "use strict";
|
2 | import { defineReadOnly } from "@ethersproject/properties";
|
3 | import { WebSocketProvider } from "./websocket-provider";
|
4 | import { showThrottleMessage } from "./formatter";
|
5 | import { Logger } from "@ethersproject/logger";
|
6 | import { version } from "./_version";
|
7 | const logger = new Logger(version);
|
8 | import { UrlJsonRpcProvider } from "./url-json-rpc-provider";
|
9 | const defaultProjectId = "84842078b09946638c03157f83405213";
|
10 | export class InfuraWebSocketProvider extends WebSocketProvider {
|
11 | constructor(network, apiKey) {
|
12 | const provider = new InfuraProvider(network, apiKey);
|
13 | const connection = provider.connection;
|
14 | if (connection.password) {
|
15 | logger.throwError("INFURA WebSocket project secrets unsupported", Logger.errors.UNSUPPORTED_OPERATION, {
|
16 | operation: "InfuraProvider.getWebSocketProvider()"
|
17 | });
|
18 | }
|
19 | const url = connection.url.replace(/^http/i, "ws").replace("/v3/", "/ws/v3/");
|
20 | super(url, network);
|
21 | defineReadOnly(this, "apiKey", provider.projectId);
|
22 | defineReadOnly(this, "projectId", provider.projectId);
|
23 | defineReadOnly(this, "projectSecret", provider.projectSecret);
|
24 | }
|
25 | isCommunityResource() {
|
26 | return (this.projectId === defaultProjectId);
|
27 | }
|
28 | }
|
29 | export class InfuraProvider extends UrlJsonRpcProvider {
|
30 | static getWebSocketProvider(network, apiKey) {
|
31 | return new InfuraWebSocketProvider(network, apiKey);
|
32 | }
|
33 | static getApiKey(apiKey) {
|
34 | const apiKeyObj = {
|
35 | apiKey: defaultProjectId,
|
36 | projectId: defaultProjectId,
|
37 | projectSecret: null
|
38 | };
|
39 | if (apiKey == null) {
|
40 | return apiKeyObj;
|
41 | }
|
42 | if (typeof (apiKey) === "string") {
|
43 | apiKeyObj.projectId = apiKey;
|
44 | }
|
45 | else if (apiKey.projectSecret != null) {
|
46 | logger.assertArgument((typeof (apiKey.projectId) === "string"), "projectSecret requires a projectId", "projectId", apiKey.projectId);
|
47 | logger.assertArgument((typeof (apiKey.projectSecret) === "string"), "invalid projectSecret", "projectSecret", "[REDACTED]");
|
48 | apiKeyObj.projectId = apiKey.projectId;
|
49 | apiKeyObj.projectSecret = apiKey.projectSecret;
|
50 | }
|
51 | else if (apiKey.projectId) {
|
52 | apiKeyObj.projectId = apiKey.projectId;
|
53 | }
|
54 | apiKeyObj.apiKey = apiKeyObj.projectId;
|
55 | return apiKeyObj;
|
56 | }
|
57 | static getUrl(network, apiKey) {
|
58 | let host = null;
|
59 | switch (network ? network.name : "unknown") {
|
60 | case "homestead":
|
61 | host = "mainnet.infura.io";
|
62 | break;
|
63 | case "ropsten":
|
64 | host = "ropsten.infura.io";
|
65 | break;
|
66 | case "rinkeby":
|
67 | host = "rinkeby.infura.io";
|
68 | break;
|
69 | case "kovan":
|
70 | host = "kovan.infura.io";
|
71 | break;
|
72 | case "goerli":
|
73 | host = "goerli.infura.io";
|
74 | break;
|
75 | case "matic":
|
76 | host = "polygon-mainnet.infura.io";
|
77 | break;
|
78 | case "maticmum":
|
79 | host = "polygon-mumbai.infura.io";
|
80 | break;
|
81 | case "optimism":
|
82 | host = "optimism-mainnet.infura.io";
|
83 | break;
|
84 | case "optimism-kovan":
|
85 | host = "optimism-kovan.infura.io";
|
86 | break;
|
87 | case "arbitrum":
|
88 | host = "arbitrum-mainnet.infura.io";
|
89 | break;
|
90 | case "arbitrum-rinkeby":
|
91 | host = "arbitrum-rinkeby.infura.io";
|
92 | break;
|
93 | default:
|
94 | logger.throwError("unsupported network", Logger.errors.INVALID_ARGUMENT, {
|
95 | argument: "network",
|
96 | value: network
|
97 | });
|
98 | }
|
99 | const connection = {
|
100 | allowGzip: true,
|
101 | url: ("https:/" + "/" + host + "/v3/" + apiKey.projectId),
|
102 | throttleCallback: (attempt, url) => {
|
103 | if (apiKey.projectId === defaultProjectId) {
|
104 | showThrottleMessage();
|
105 | }
|
106 | return Promise.resolve(true);
|
107 | }
|
108 | };
|
109 | if (apiKey.projectSecret != null) {
|
110 | connection.user = "";
|
111 | connection.password = apiKey.projectSecret;
|
112 | }
|
113 | return connection;
|
114 | }
|
115 | isCommunityResource() {
|
116 | return (this.projectId === defaultProjectId);
|
117 | }
|
118 | }
|
119 |
|
\ | No newline at end of file |