@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.
Files changed (114) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +78 -0
  3. package/lib/_version.d.ts +2 -0
  4. package/lib/_version.d.ts.map +1 -0
  5. package/lib/_version.js +5 -0
  6. package/lib/_version.js.map +1 -0
  7. package/lib/alchemy-provider.d.ts +17 -0
  8. package/lib/alchemy-provider.d.ts.map +1 -0
  9. package/lib/alchemy-provider.js +112 -0
  10. package/lib/alchemy-provider.js.map +1 -0
  11. package/lib/ankr-provider.d.ts +10 -0
  12. package/lib/ankr-provider.d.ts.map +1 -0
  13. package/lib/ankr-provider.js +79 -0
  14. package/lib/ankr-provider.js.map +1 -0
  15. package/lib/base-provider.d.ts +156 -0
  16. package/lib/base-provider.d.ts.map +1 -0
  17. package/lib/base-provider.js +2585 -0
  18. package/lib/base-provider.js.map +1 -0
  19. package/lib/browser-ipc-provider.d.ts +3 -0
  20. package/lib/browser-ipc-provider.d.ts.map +1 -0
  21. package/lib/browser-ipc-provider.js +6 -0
  22. package/lib/browser-ipc-provider.js.map +1 -0
  23. package/lib/browser-net.d.ts +2 -0
  24. package/lib/browser-net.d.ts.map +1 -0
  25. package/lib/browser-net.js +6 -0
  26. package/lib/browser-net.js.map +1 -0
  27. package/lib/browser-ws.d.ts +3 -0
  28. package/lib/browser-ws.d.ts.map +1 -0
  29. package/lib/browser-ws.js +22 -0
  30. package/lib/browser-ws.js.map +1 -0
  31. package/lib/cloudflare-provider.d.ts +8 -0
  32. package/lib/cloudflare-provider.d.ts.map +1 -0
  33. package/lib/cloudflare-provider.js +100 -0
  34. package/lib/cloudflare-provider.js.map +1 -0
  35. package/lib/etherscan-provider.d.ts +18 -0
  36. package/lib/etherscan-provider.d.ts.map +1 -0
  37. package/lib/etherscan-provider.js +528 -0
  38. package/lib/etherscan-provider.js.map +1 -0
  39. package/lib/fallback-provider.d.ts +20 -0
  40. package/lib/fallback-provider.d.ts.map +1 -0
  41. package/lib/fallback-provider.js +699 -0
  42. package/lib/fallback-provider.js.map +1 -0
  43. package/lib/formatter.d.ts +60 -0
  44. package/lib/formatter.d.ts.map +1 -0
  45. package/lib/formatter.js +452 -0
  46. package/lib/formatter.js.map +1 -0
  47. package/lib/index.d.ts +23 -0
  48. package/lib/index.d.ts.map +1 -0
  49. package/lib/index.js +97 -0
  50. package/lib/index.js.map +1 -0
  51. package/lib/infura-provider.d.ts +21 -0
  52. package/lib/infura-provider.d.ts.map +1 -0
  53. package/lib/infura-provider.js +141 -0
  54. package/lib/infura-provider.js.map +1 -0
  55. package/lib/ipc-provider.d.ts +8 -0
  56. package/lib/ipc-provider.d.ts.map +1 -0
  57. package/lib/ipc-provider.js +77 -0
  58. package/lib/ipc-provider.js.map +1 -0
  59. package/lib/json-rpc-batch-provider.d.ts +17 -0
  60. package/lib/json-rpc-batch-provider.d.ts.map +1 -0
  61. package/lib/json-rpc-batch-provider.js +99 -0
  62. package/lib/json-rpc-batch-provider.js.map +1 -0
  63. package/lib/json-rpc-provider.d.ts +54 -0
  64. package/lib/json-rpc-provider.d.ts.map +1 -0
  65. package/lib/json-rpc-provider.js +855 -0
  66. package/lib/json-rpc-provider.js.map +1 -0
  67. package/lib/nodesmith-provider.d.ts +7 -0
  68. package/lib/nodesmith-provider.d.ts.map +1 -0
  69. package/lib/nodesmith-provider.js +64 -0
  70. package/lib/nodesmith-provider.js.map +1 -0
  71. package/lib/pocket-provider.d.ts +12 -0
  72. package/lib/pocket-provider.d.ts.map +1 -0
  73. package/lib/pocket-provider.js +98 -0
  74. package/lib/pocket-provider.js.map +1 -0
  75. package/lib/url-json-rpc-provider.d.ts +18 -0
  76. package/lib/url-json-rpc-provider.d.ts.map +1 -0
  77. package/lib/url-json-rpc-provider.js +153 -0
  78. package/lib/url-json-rpc-provider.js.map +1 -0
  79. package/lib/web3-provider.d.ts +28 -0
  80. package/lib/web3-provider.d.ts.map +1 -0
  81. package/lib/web3-provider.js +155 -0
  82. package/lib/web3-provider.js.map +1 -0
  83. package/lib/websocket-provider.d.ts +48 -0
  84. package/lib/websocket-provider.d.ts.map +1 -0
  85. package/lib/websocket-provider.js +384 -0
  86. package/lib/websocket-provider.js.map +1 -0
  87. package/lib/ws.d.ts +3 -0
  88. package/lib/ws.d.ts.map +1 -0
  89. package/lib/ws.js +9 -0
  90. package/lib/ws.js.map +1 -0
  91. package/package.json +57 -0
  92. package/src.ts/_version.ts +1 -0
  93. package/src.ts/alchemy-provider.ts +101 -0
  94. package/src.ts/ankr-provider.ts +68 -0
  95. package/src.ts/base-provider.ts +2216 -0
  96. package/src.ts/browser-ipc-provider.ts +7 -0
  97. package/src.ts/browser-net.ts +3 -0
  98. package/src.ts/browser-ws.ts +21 -0
  99. package/src.ts/cloudflare-provider.ts +42 -0
  100. package/src.ts/etherscan-provider.ts +454 -0
  101. package/src.ts/fallback-provider.ts +654 -0
  102. package/src.ts/formatter.ts +522 -0
  103. package/src.ts/index.ts +178 -0
  104. package/src.ts/infura-provider.ts +143 -0
  105. package/src.ts/ipc-provider.ts +72 -0
  106. package/src.ts/json-rpc-batch-provider.ts +97 -0
  107. package/src.ts/json-rpc-provider.ts +742 -0
  108. package/src.ts/nodesmith-provider.ts +50 -0
  109. package/src.ts/pocket-provider.ts +93 -0
  110. package/src.ts/url-json-rpc-provider.ts +106 -0
  111. package/src.ts/web3-provider.ts +169 -0
  112. package/src.ts/websocket-provider.ts +350 -0
  113. package/src.ts/ws.ts +3 -0
  114. package/thirdparty.d.ts +10 -0
@@ -0,0 +1,2585 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (_) try {
33
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ var __importDefault = (this && this.__importDefault) || function (mod) {
54
+ return (mod && mod.__esModule) ? mod : { "default": mod };
55
+ };
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.BaseProvider = exports.Resolver = exports.Event = void 0;
58
+ var abstract_provider_1 = require("@qevm/abstract-provider");
59
+ var base64_1 = require("@ethersproject/base64");
60
+ var basex_1 = require("@ethersproject/basex");
61
+ var bignumber_1 = require("@ethersproject/bignumber");
62
+ var bytes_1 = require("@qevm/bytes");
63
+ var constants_1 = require("@ethersproject/constants");
64
+ var hash_1 = require("@qevm/hash");
65
+ var networks_1 = require("@ethersproject/networks");
66
+ var properties_1 = require("@ethersproject/properties");
67
+ var sha2_1 = require("@ethersproject/sha2");
68
+ var strings_1 = require("@ethersproject/strings");
69
+ var web_1 = require("@ethersproject/web");
70
+ var bech32_1 = __importDefault(require("bech32"));
71
+ var logger_1 = require("@ethersproject/logger");
72
+ var _version_1 = require("./_version");
73
+ var logger = new logger_1.Logger(_version_1.version);
74
+ var formatter_1 = require("./formatter");
75
+ var MAX_CCIP_REDIRECTS = 10;
76
+ //////////////////////////////
77
+ // Event Serializeing
78
+ function checkTopic(topic) {
79
+ if (topic == null) {
80
+ return "null";
81
+ }
82
+ if ((0, bytes_1.hexDataLength)(topic) !== 32) {
83
+ logger.throwArgumentError("invalid topic", "topic", topic);
84
+ }
85
+ return topic.toLowerCase();
86
+ }
87
+ function serializeTopics(topics) {
88
+ // Remove trailing null AND-topics; they are redundant
89
+ topics = topics.slice();
90
+ while (topics.length > 0 && topics[topics.length - 1] == null) {
91
+ topics.pop();
92
+ }
93
+ return topics.map(function (topic) {
94
+ if (Array.isArray(topic)) {
95
+ // Only track unique OR-topics
96
+ var unique_1 = {};
97
+ topic.forEach(function (topic) {
98
+ unique_1[checkTopic(topic)] = true;
99
+ });
100
+ // The order of OR-topics does not matter
101
+ var sorted = Object.keys(unique_1);
102
+ sorted.sort();
103
+ return sorted.join("|");
104
+ }
105
+ else {
106
+ return checkTopic(topic);
107
+ }
108
+ }).join("&");
109
+ }
110
+ function deserializeTopics(data) {
111
+ if (data === "") {
112
+ return [];
113
+ }
114
+ return data.split(/&/g).map(function (topic) {
115
+ if (topic === "") {
116
+ return [];
117
+ }
118
+ var comps = topic.split("|").map(function (topic) {
119
+ return ((topic === "null") ? null : topic);
120
+ });
121
+ return ((comps.length === 1) ? comps[0] : comps);
122
+ });
123
+ }
124
+ function getEventTag(eventName) {
125
+ if (typeof (eventName) === "string") {
126
+ eventName = eventName.toLowerCase();
127
+ if ((0, bytes_1.hexDataLength)(eventName) === 32) {
128
+ return "tx:" + eventName;
129
+ }
130
+ if (eventName.indexOf(":") === -1) {
131
+ return eventName;
132
+ }
133
+ }
134
+ else if (Array.isArray(eventName)) {
135
+ return "filter:*:" + serializeTopics(eventName);
136
+ }
137
+ else if (abstract_provider_1.ForkEvent.isForkEvent(eventName)) {
138
+ logger.warn("not implemented");
139
+ throw new Error("not implemented");
140
+ }
141
+ else if (eventName && typeof (eventName) === "object") {
142
+ return "filter:" + (eventName.address || "*") + ":" + serializeTopics(eventName.topics || []);
143
+ }
144
+ throw new Error("invalid event - " + eventName);
145
+ }
146
+ //////////////////////////////
147
+ // Helper Object
148
+ function getTime() {
149
+ return (new Date()).getTime();
150
+ }
151
+ function stall(duration) {
152
+ return new Promise(function (resolve) {
153
+ setTimeout(resolve, duration);
154
+ });
155
+ }
156
+ //////////////////////////////
157
+ // Provider Object
158
+ /**
159
+ * EventType
160
+ * - "block"
161
+ * - "poll"
162
+ * - "didPoll"
163
+ * - "pending"
164
+ * - "error"
165
+ * - "network"
166
+ * - filter
167
+ * - topics array
168
+ * - transaction hash
169
+ */
170
+ var PollableEvents = ["block", "network", "pending", "poll"];
171
+ var Event = /** @class */ (function () {
172
+ function Event(tag, listener, once) {
173
+ (0, properties_1.defineReadOnly)(this, "tag", tag);
174
+ (0, properties_1.defineReadOnly)(this, "listener", listener);
175
+ (0, properties_1.defineReadOnly)(this, "once", once);
176
+ this._lastBlockNumber = -2;
177
+ this._inflight = false;
178
+ }
179
+ Object.defineProperty(Event.prototype, "event", {
180
+ get: function () {
181
+ switch (this.type) {
182
+ case "tx":
183
+ return this.hash;
184
+ case "filter":
185
+ return this.filter;
186
+ }
187
+ return this.tag;
188
+ },
189
+ enumerable: false,
190
+ configurable: true
191
+ });
192
+ Object.defineProperty(Event.prototype, "type", {
193
+ get: function () {
194
+ return this.tag.split(":")[0];
195
+ },
196
+ enumerable: false,
197
+ configurable: true
198
+ });
199
+ Object.defineProperty(Event.prototype, "hash", {
200
+ get: function () {
201
+ var comps = this.tag.split(":");
202
+ if (comps[0] !== "tx") {
203
+ return null;
204
+ }
205
+ return comps[1];
206
+ },
207
+ enumerable: false,
208
+ configurable: true
209
+ });
210
+ Object.defineProperty(Event.prototype, "filter", {
211
+ get: function () {
212
+ var comps = this.tag.split(":");
213
+ if (comps[0] !== "filter") {
214
+ return null;
215
+ }
216
+ var address = comps[1];
217
+ var topics = deserializeTopics(comps[2]);
218
+ var filter = {};
219
+ if (topics.length > 0) {
220
+ filter.topics = topics;
221
+ }
222
+ if (address && address !== "*") {
223
+ filter.address = address;
224
+ }
225
+ return filter;
226
+ },
227
+ enumerable: false,
228
+ configurable: true
229
+ });
230
+ Event.prototype.pollable = function () {
231
+ return (this.tag.indexOf(":") >= 0 || PollableEvents.indexOf(this.tag) >= 0);
232
+ };
233
+ return Event;
234
+ }());
235
+ exports.Event = Event;
236
+ ;
237
+ // https://github.com/satoshilabs/slips/blob/master/slip-0044.md
238
+ var coinInfos = {
239
+ "0": { symbol: "btc", p2pkh: 0x00, p2sh: 0x05, prefix: "bc" },
240
+ "2": { symbol: "ltc", p2pkh: 0x30, p2sh: 0x32, prefix: "ltc" },
241
+ "3": { symbol: "doge", p2pkh: 0x1e, p2sh: 0x16 },
242
+ "60": { symbol: "eth", ilk: "eth" },
243
+ "61": { symbol: "etc", ilk: "eth" },
244
+ "700": { symbol: "xdai", ilk: "eth" },
245
+ };
246
+ function bytes32ify(value) {
247
+ return (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(value).toHexString(), 32);
248
+ }
249
+ // Compute the Base58Check encoded data (checksum is first 4 bytes of sha256d)
250
+ function base58Encode(data) {
251
+ return basex_1.Base58.encode((0, bytes_1.concat)([data, (0, bytes_1.hexDataSlice)((0, sha2_1.sha256)((0, sha2_1.sha256)(data)), 0, 4)]));
252
+ }
253
+ var matcherIpfs = new RegExp("^(ipfs):/\/(.*)$", "i");
254
+ var matchers = [
255
+ new RegExp("^(https):/\/(.*)$", "i"),
256
+ new RegExp("^(data):(.*)$", "i"),
257
+ matcherIpfs,
258
+ new RegExp("^eip155:[0-9]+/(erc[0-9]+):(.*)$", "i"),
259
+ ];
260
+ function _parseString(result, start) {
261
+ try {
262
+ return (0, strings_1.toUtf8String)(_parseBytes(result, start));
263
+ }
264
+ catch (error) { }
265
+ return null;
266
+ }
267
+ function _parseBytes(result, start) {
268
+ if (result === "0x") {
269
+ return null;
270
+ }
271
+ var offset = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result, start, start + 32)).toNumber();
272
+ var length = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result, offset, offset + 32)).toNumber();
273
+ return (0, bytes_1.hexDataSlice)(result, offset + 32, offset + 32 + length);
274
+ }
275
+ // Trim off the ipfs:// prefix and return the default gateway URL
276
+ function getIpfsLink(link) {
277
+ if (link.match(/^ipfs:\/\/ipfs\//i)) {
278
+ link = link.substring(12);
279
+ }
280
+ else if (link.match(/^ipfs:\/\//i)) {
281
+ link = link.substring(7);
282
+ }
283
+ else {
284
+ logger.throwArgumentError("unsupported IPFS format", "link", link);
285
+ }
286
+ return "https://gateway.ipfs.io/ipfs/" + link;
287
+ }
288
+ function numPad(value) {
289
+ var result = (0, bytes_1.arrayify)(value);
290
+ if (result.length > 32) {
291
+ throw new Error("internal; should not happen");
292
+ }
293
+ var padded = new Uint8Array(32);
294
+ padded.set(result, 32 - result.length);
295
+ return padded;
296
+ }
297
+ function bytesPad(value) {
298
+ if ((value.length % 32) === 0) {
299
+ return value;
300
+ }
301
+ var result = new Uint8Array(Math.ceil(value.length / 32) * 32);
302
+ result.set(value);
303
+ return result;
304
+ }
305
+ // ABI Encodes a series of (bytes, bytes, ...)
306
+ function encodeBytes(datas) {
307
+ var result = [];
308
+ var byteCount = 0;
309
+ // Add place-holders for pointers as we add items
310
+ for (var i = 0; i < datas.length; i++) {
311
+ result.push(null);
312
+ byteCount += 32;
313
+ }
314
+ for (var i = 0; i < datas.length; i++) {
315
+ var data = (0, bytes_1.arrayify)(datas[i]);
316
+ // Update the bytes offset
317
+ result[i] = numPad(byteCount);
318
+ // The length and padded value of data
319
+ result.push(numPad(data.length));
320
+ result.push(bytesPad(data));
321
+ byteCount += 32 + Math.ceil(data.length / 32) * 32;
322
+ }
323
+ return (0, bytes_1.hexConcat)(result);
324
+ }
325
+ var Resolver = /** @class */ (function () {
326
+ // The resolvedAddress is only for creating a ReverseLookup resolver
327
+ function Resolver(provider, address, name, resolvedAddress) {
328
+ (0, properties_1.defineReadOnly)(this, "provider", provider);
329
+ (0, properties_1.defineReadOnly)(this, "name", name);
330
+ (0, properties_1.defineReadOnly)(this, "address", provider.formatter.address(address));
331
+ (0, properties_1.defineReadOnly)(this, "_resolvedAddress", resolvedAddress);
332
+ }
333
+ Resolver.prototype.supportsWildcard = function () {
334
+ var _this = this;
335
+ if (!this._supportsEip2544) {
336
+ // supportsInterface(bytes4 = selector("resolve(bytes,bytes)"))
337
+ this._supportsEip2544 = this.provider.call({
338
+ to: this.address,
339
+ data: "0x01ffc9a79061b92300000000000000000000000000000000000000000000000000000000"
340
+ }).then(function (result) {
341
+ return bignumber_1.BigNumber.from(result).eq(1);
342
+ }).catch(function (error) {
343
+ if (error.code === logger_1.Logger.errors.CALL_EXCEPTION) {
344
+ return false;
345
+ }
346
+ // Rethrow the error: link is down, etc. Let future attempts retry.
347
+ _this._supportsEip2544 = null;
348
+ throw error;
349
+ });
350
+ }
351
+ return this._supportsEip2544;
352
+ };
353
+ Resolver.prototype._fetch = function (selector, parameters) {
354
+ return __awaiter(this, void 0, void 0, function () {
355
+ var tx, parseBytes, result, error_1;
356
+ return __generator(this, function (_a) {
357
+ switch (_a.label) {
358
+ case 0:
359
+ tx = {
360
+ to: this.address,
361
+ ccipReadEnabled: true,
362
+ data: (0, bytes_1.hexConcat)([selector, (0, hash_1.namehash)(this.name), (parameters || "0x")])
363
+ };
364
+ parseBytes = false;
365
+ return [4 /*yield*/, this.supportsWildcard()];
366
+ case 1:
367
+ if (_a.sent()) {
368
+ parseBytes = true;
369
+ // selector("resolve(bytes,bytes)")
370
+ tx.data = (0, bytes_1.hexConcat)(["0x9061b923", encodeBytes([(0, hash_1.dnsEncode)(this.name), tx.data])]);
371
+ }
372
+ _a.label = 2;
373
+ case 2:
374
+ _a.trys.push([2, 4, , 5]);
375
+ return [4 /*yield*/, this.provider.call(tx)];
376
+ case 3:
377
+ result = _a.sent();
378
+ if (((0, bytes_1.arrayify)(result).length % 32) === 4) {
379
+ logger.throwError("resolver threw error", logger_1.Logger.errors.CALL_EXCEPTION, {
380
+ transaction: tx, data: result
381
+ });
382
+ }
383
+ if (parseBytes) {
384
+ result = _parseBytes(result, 0);
385
+ }
386
+ return [2 /*return*/, result];
387
+ case 4:
388
+ error_1 = _a.sent();
389
+ if (error_1.code === logger_1.Logger.errors.CALL_EXCEPTION) {
390
+ return [2 /*return*/, null];
391
+ }
392
+ throw error_1;
393
+ case 5: return [2 /*return*/];
394
+ }
395
+ });
396
+ });
397
+ };
398
+ Resolver.prototype._fetchBytes = function (selector, parameters) {
399
+ return __awaiter(this, void 0, void 0, function () {
400
+ var result;
401
+ return __generator(this, function (_a) {
402
+ switch (_a.label) {
403
+ case 0: return [4 /*yield*/, this._fetch(selector, parameters)];
404
+ case 1:
405
+ result = _a.sent();
406
+ if (result != null) {
407
+ return [2 /*return*/, _parseBytes(result, 0)];
408
+ }
409
+ return [2 /*return*/, null];
410
+ }
411
+ });
412
+ });
413
+ };
414
+ Resolver.prototype._getAddress = function (coinType, hexBytes) {
415
+ var coinInfo = coinInfos[String(coinType)];
416
+ if (coinInfo == null) {
417
+ logger.throwError("unsupported coin type: " + coinType, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {
418
+ operation: "getAddress(" + coinType + ")"
419
+ });
420
+ }
421
+ if (coinInfo.ilk === "eth") {
422
+ return this.provider.formatter.address(hexBytes);
423
+ }
424
+ var bytes = (0, bytes_1.arrayify)(hexBytes);
425
+ // P2PKH: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
426
+ if (coinInfo.p2pkh != null) {
427
+ var p2pkh = hexBytes.match(/^0x76a9([0-9a-f][0-9a-f])([0-9a-f]*)88ac$/);
428
+ if (p2pkh) {
429
+ var length_1 = parseInt(p2pkh[1], 16);
430
+ if (p2pkh[2].length === length_1 * 2 && length_1 >= 1 && length_1 <= 75) {
431
+ return base58Encode((0, bytes_1.concat)([[coinInfo.p2pkh], ("0x" + p2pkh[2])]));
432
+ }
433
+ }
434
+ }
435
+ // P2SH: OP_HASH160 <scriptHash> OP_EQUAL
436
+ if (coinInfo.p2sh != null) {
437
+ var p2sh = hexBytes.match(/^0xa9([0-9a-f][0-9a-f])([0-9a-f]*)87$/);
438
+ if (p2sh) {
439
+ var length_2 = parseInt(p2sh[1], 16);
440
+ if (p2sh[2].length === length_2 * 2 && length_2 >= 1 && length_2 <= 75) {
441
+ return base58Encode((0, bytes_1.concat)([[coinInfo.p2sh], ("0x" + p2sh[2])]));
442
+ }
443
+ }
444
+ }
445
+ // Bech32
446
+ if (coinInfo.prefix != null) {
447
+ var length_3 = bytes[1];
448
+ // https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#witness-program
449
+ var version_1 = bytes[0];
450
+ if (version_1 === 0x00) {
451
+ if (length_3 !== 20 && length_3 !== 32) {
452
+ version_1 = -1;
453
+ }
454
+ }
455
+ else {
456
+ version_1 = -1;
457
+ }
458
+ if (version_1 >= 0 && bytes.length === 2 + length_3 && length_3 >= 1 && length_3 <= 75) {
459
+ var words = bech32_1.default.toWords(bytes.slice(2));
460
+ words.unshift(version_1);
461
+ return bech32_1.default.encode(coinInfo.prefix, words);
462
+ }
463
+ }
464
+ return null;
465
+ };
466
+ Resolver.prototype.getAddress = function (coinType) {
467
+ return __awaiter(this, void 0, void 0, function () {
468
+ var result, error_2, hexBytes, address;
469
+ return __generator(this, function (_a) {
470
+ switch (_a.label) {
471
+ case 0:
472
+ if (coinType == null) {
473
+ coinType = 60;
474
+ }
475
+ if (!(coinType === 60)) return [3 /*break*/, 4];
476
+ _a.label = 1;
477
+ case 1:
478
+ _a.trys.push([1, 3, , 4]);
479
+ return [4 /*yield*/, this._fetch("0x3b3b57de")];
480
+ case 2:
481
+ result = _a.sent();
482
+ // No address
483
+ if (result === "0x" || result === constants_1.HashZero) {
484
+ return [2 /*return*/, null];
485
+ }
486
+ return [2 /*return*/, this.provider.formatter.callAddress(result)];
487
+ case 3:
488
+ error_2 = _a.sent();
489
+ if (error_2.code === logger_1.Logger.errors.CALL_EXCEPTION) {
490
+ return [2 /*return*/, null];
491
+ }
492
+ throw error_2;
493
+ case 4: return [4 /*yield*/, this._fetchBytes("0xf1cb7e06", bytes32ify(coinType))];
494
+ case 5:
495
+ hexBytes = _a.sent();
496
+ // No address
497
+ if (hexBytes == null || hexBytes === "0x") {
498
+ return [2 /*return*/, null];
499
+ }
500
+ address = this._getAddress(coinType, hexBytes);
501
+ if (address == null) {
502
+ logger.throwError("invalid or unsupported coin data", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {
503
+ operation: "getAddress(" + coinType + ")",
504
+ coinType: coinType,
505
+ data: hexBytes
506
+ });
507
+ }
508
+ return [2 /*return*/, address];
509
+ }
510
+ });
511
+ });
512
+ };
513
+ Resolver.prototype.getAvatar = function () {
514
+ return __awaiter(this, void 0, void 0, function () {
515
+ var linkage, avatar, i, match, scheme, _a, selector, owner, _b, comps, addr, tokenId, tokenOwner, _c, _d, balance, _e, _f, tx, metadataUrl, _g, metadata, imageUrl, ipfs, error_3;
516
+ return __generator(this, function (_h) {
517
+ switch (_h.label) {
518
+ case 0:
519
+ linkage = [{ type: "name", content: this.name }];
520
+ _h.label = 1;
521
+ case 1:
522
+ _h.trys.push([1, 19, , 20]);
523
+ return [4 /*yield*/, this.getText("avatar")];
524
+ case 2:
525
+ avatar = _h.sent();
526
+ if (avatar == null) {
527
+ return [2 /*return*/, null];
528
+ }
529
+ i = 0;
530
+ _h.label = 3;
531
+ case 3:
532
+ if (!(i < matchers.length)) return [3 /*break*/, 18];
533
+ match = avatar.match(matchers[i]);
534
+ if (match == null) {
535
+ return [3 /*break*/, 17];
536
+ }
537
+ scheme = match[1].toLowerCase();
538
+ _a = scheme;
539
+ switch (_a) {
540
+ case "https": return [3 /*break*/, 4];
541
+ case "data": return [3 /*break*/, 5];
542
+ case "ipfs": return [3 /*break*/, 6];
543
+ case "erc721": return [3 /*break*/, 7];
544
+ case "erc1155": return [3 /*break*/, 7];
545
+ }
546
+ return [3 /*break*/, 17];
547
+ case 4:
548
+ linkage.push({ type: "url", content: avatar });
549
+ return [2 /*return*/, { linkage: linkage, url: avatar }];
550
+ case 5:
551
+ linkage.push({ type: "data", content: avatar });
552
+ return [2 /*return*/, { linkage: linkage, url: avatar }];
553
+ case 6:
554
+ linkage.push({ type: "ipfs", content: avatar });
555
+ return [2 /*return*/, { linkage: linkage, url: getIpfsLink(avatar) }];
556
+ case 7:
557
+ selector = (scheme === "erc721") ? "0xc87b56dd" : "0x0e89341c";
558
+ linkage.push({ type: scheme, content: avatar });
559
+ _b = this._resolvedAddress;
560
+ if (_b) return [3 /*break*/, 9];
561
+ return [4 /*yield*/, this.getAddress()];
562
+ case 8:
563
+ _b = (_h.sent());
564
+ _h.label = 9;
565
+ case 9:
566
+ owner = (_b);
567
+ comps = (match[2] || "").split("/");
568
+ if (comps.length !== 2) {
569
+ return [2 /*return*/, null];
570
+ }
571
+ return [4 /*yield*/, this.provider.formatter.address(comps[0])];
572
+ case 10:
573
+ addr = _h.sent();
574
+ tokenId = (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(comps[1]).toHexString(), 32);
575
+ if (!(scheme === "erc721")) return [3 /*break*/, 12];
576
+ _d = (_c = this.provider.formatter).callAddress;
577
+ return [4 /*yield*/, this.provider.call({
578
+ to: addr, data: (0, bytes_1.hexConcat)(["0x6352211e", tokenId])
579
+ })];
580
+ case 11:
581
+ tokenOwner = _d.apply(_c, [_h.sent()]);
582
+ if (owner !== tokenOwner) {
583
+ return [2 /*return*/, null];
584
+ }
585
+ linkage.push({ type: "owner", content: tokenOwner });
586
+ return [3 /*break*/, 14];
587
+ case 12:
588
+ if (!(scheme === "erc1155")) return [3 /*break*/, 14];
589
+ _f = (_e = bignumber_1.BigNumber).from;
590
+ return [4 /*yield*/, this.provider.call({
591
+ to: addr, data: (0, bytes_1.hexConcat)(["0x00fdd58e", (0, bytes_1.hexZeroPad)(owner, 32), tokenId])
592
+ })];
593
+ case 13:
594
+ balance = _f.apply(_e, [_h.sent()]);
595
+ if (balance.isZero()) {
596
+ return [2 /*return*/, null];
597
+ }
598
+ linkage.push({ type: "balance", content: balance.toString() });
599
+ _h.label = 14;
600
+ case 14:
601
+ tx = {
602
+ to: this.provider.formatter.address(comps[0]),
603
+ data: (0, bytes_1.hexConcat)([selector, tokenId])
604
+ };
605
+ _g = _parseString;
606
+ return [4 /*yield*/, this.provider.call(tx)];
607
+ case 15:
608
+ metadataUrl = _g.apply(void 0, [_h.sent(), 0]);
609
+ if (metadataUrl == null) {
610
+ return [2 /*return*/, null];
611
+ }
612
+ linkage.push({ type: "metadata-url-base", content: metadataUrl });
613
+ // ERC-1155 allows a generic {id} in the URL
614
+ if (scheme === "erc1155") {
615
+ metadataUrl = metadataUrl.replace("{id}", tokenId.substring(2));
616
+ linkage.push({ type: "metadata-url-expanded", content: metadataUrl });
617
+ }
618
+ // Transform IPFS metadata links
619
+ if (metadataUrl.match(/^ipfs:/i)) {
620
+ metadataUrl = getIpfsLink(metadataUrl);
621
+ }
622
+ linkage.push({ type: "metadata-url", content: metadataUrl });
623
+ return [4 /*yield*/, (0, web_1.fetchJson)(metadataUrl)];
624
+ case 16:
625
+ metadata = _h.sent();
626
+ if (!metadata) {
627
+ return [2 /*return*/, null];
628
+ }
629
+ linkage.push({ type: "metadata", content: JSON.stringify(metadata) });
630
+ imageUrl = metadata.image;
631
+ if (typeof (imageUrl) !== "string") {
632
+ return [2 /*return*/, null];
633
+ }
634
+ if (imageUrl.match(/^(https:\/\/|data:)/i)) {
635
+ // Allow
636
+ }
637
+ else {
638
+ ipfs = imageUrl.match(matcherIpfs);
639
+ if (ipfs == null) {
640
+ return [2 /*return*/, null];
641
+ }
642
+ linkage.push({ type: "url-ipfs", content: imageUrl });
643
+ imageUrl = getIpfsLink(imageUrl);
644
+ }
645
+ linkage.push({ type: "url", content: imageUrl });
646
+ return [2 /*return*/, { linkage: linkage, url: imageUrl }];
647
+ case 17:
648
+ i++;
649
+ return [3 /*break*/, 3];
650
+ case 18: return [3 /*break*/, 20];
651
+ case 19:
652
+ error_3 = _h.sent();
653
+ return [3 /*break*/, 20];
654
+ case 20: return [2 /*return*/, null];
655
+ }
656
+ });
657
+ });
658
+ };
659
+ Resolver.prototype.getContentHash = function () {
660
+ return __awaiter(this, void 0, void 0, function () {
661
+ var hexBytes, ipfs, length_4, ipns, length_5, swarm, skynet, urlSafe_1, hash;
662
+ return __generator(this, function (_a) {
663
+ switch (_a.label) {
664
+ case 0: return [4 /*yield*/, this._fetchBytes("0xbc1c58d1")];
665
+ case 1:
666
+ hexBytes = _a.sent();
667
+ // No contenthash
668
+ if (hexBytes == null || hexBytes === "0x") {
669
+ return [2 /*return*/, null];
670
+ }
671
+ ipfs = hexBytes.match(/^0xe3010170(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/);
672
+ if (ipfs) {
673
+ length_4 = parseInt(ipfs[3], 16);
674
+ if (ipfs[4].length === length_4 * 2) {
675
+ return [2 /*return*/, "ipfs:/\/" + basex_1.Base58.encode("0x" + ipfs[1])];
676
+ }
677
+ }
678
+ ipns = hexBytes.match(/^0xe5010172(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/);
679
+ if (ipns) {
680
+ length_5 = parseInt(ipns[3], 16);
681
+ if (ipns[4].length === length_5 * 2) {
682
+ return [2 /*return*/, "ipns:/\/" + basex_1.Base58.encode("0x" + ipns[1])];
683
+ }
684
+ }
685
+ swarm = hexBytes.match(/^0xe40101fa011b20([0-9a-f]*)$/);
686
+ if (swarm) {
687
+ if (swarm[1].length === (32 * 2)) {
688
+ return [2 /*return*/, "bzz:/\/" + swarm[1]];
689
+ }
690
+ }
691
+ skynet = hexBytes.match(/^0x90b2c605([0-9a-f]*)$/);
692
+ if (skynet) {
693
+ if (skynet[1].length === (34 * 2)) {
694
+ urlSafe_1 = { "=": "", "+": "-", "/": "_" };
695
+ hash = (0, base64_1.encode)("0x" + skynet[1]).replace(/[=+\/]/g, function (a) { return (urlSafe_1[a]); });
696
+ return [2 /*return*/, "sia:/\/" + hash];
697
+ }
698
+ }
699
+ return [2 /*return*/, logger.throwError("invalid or unsupported content hash data", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {
700
+ operation: "getContentHash()",
701
+ data: hexBytes
702
+ })];
703
+ }
704
+ });
705
+ });
706
+ };
707
+ Resolver.prototype.getText = function (key) {
708
+ return __awaiter(this, void 0, void 0, function () {
709
+ var keyBytes, hexBytes;
710
+ return __generator(this, function (_a) {
711
+ switch (_a.label) {
712
+ case 0:
713
+ keyBytes = (0, strings_1.toUtf8Bytes)(key);
714
+ // The nodehash consumes the first slot, so the string pointer targets
715
+ // offset 64, with the length at offset 64 and data starting at offset 96
716
+ keyBytes = (0, bytes_1.concat)([bytes32ify(64), bytes32ify(keyBytes.length), keyBytes]);
717
+ // Pad to word-size (32 bytes)
718
+ if ((keyBytes.length % 32) !== 0) {
719
+ keyBytes = (0, bytes_1.concat)([keyBytes, (0, bytes_1.hexZeroPad)("0x", 32 - (key.length % 32))]);
720
+ }
721
+ return [4 /*yield*/, this._fetchBytes("0x59d1d43c", (0, bytes_1.hexlify)(keyBytes))];
722
+ case 1:
723
+ hexBytes = _a.sent();
724
+ if (hexBytes == null || hexBytes === "0x") {
725
+ return [2 /*return*/, null];
726
+ }
727
+ return [2 /*return*/, (0, strings_1.toUtf8String)(hexBytes)];
728
+ }
729
+ });
730
+ });
731
+ };
732
+ return Resolver;
733
+ }());
734
+ exports.Resolver = Resolver;
735
+ var defaultFormatter = null;
736
+ var nextPollId = 1;
737
+ var BaseProvider = /** @class */ (function (_super) {
738
+ __extends(BaseProvider, _super);
739
+ /**
740
+ * ready
741
+ *
742
+ * A Promise<Network> that resolves only once the provider is ready.
743
+ *
744
+ * Sub-classes that call the super with a network without a chainId
745
+ * MUST set this. Standard named networks have a known chainId.
746
+ *
747
+ */
748
+ function BaseProvider(network) {
749
+ var _newTarget = this.constructor;
750
+ var _this = _super.call(this) || this;
751
+ // Events being listened to
752
+ _this._events = [];
753
+ _this._emitted = { block: -2 };
754
+ _this.disableCcipRead = false;
755
+ _this.formatter = _newTarget.getFormatter();
756
+ // If network is any, this Provider allows the underlying
757
+ // network to change dynamically, and we auto-detect the
758
+ // current network
759
+ (0, properties_1.defineReadOnly)(_this, "anyNetwork", (network === "any"));
760
+ if (_this.anyNetwork) {
761
+ network = _this.detectNetwork();
762
+ }
763
+ if (network instanceof Promise) {
764
+ _this._networkPromise = network;
765
+ // Squash any "unhandled promise" errors; that do not need to be handled
766
+ network.catch(function (error) { });
767
+ // Trigger initial network setting (async)
768
+ _this._ready().catch(function (error) { });
769
+ }
770
+ else {
771
+ var knownNetwork = (0, properties_1.getStatic)(_newTarget, "getNetwork")(network);
772
+ if (knownNetwork) {
773
+ (0, properties_1.defineReadOnly)(_this, "_network", knownNetwork);
774
+ _this.emit("network", knownNetwork, null);
775
+ }
776
+ else {
777
+ logger.throwArgumentError("invalid network", "network", network);
778
+ }
779
+ }
780
+ _this._maxInternalBlockNumber = -1024;
781
+ _this._lastBlockNumber = -2;
782
+ _this._maxFilterBlockRange = 10;
783
+ _this._pollingInterval = 4000;
784
+ _this._fastQueryDate = 0;
785
+ return _this;
786
+ }
787
+ BaseProvider.prototype._ready = function () {
788
+ return __awaiter(this, void 0, void 0, function () {
789
+ var network, error_4;
790
+ return __generator(this, function (_a) {
791
+ switch (_a.label) {
792
+ case 0:
793
+ if (!(this._network == null)) return [3 /*break*/, 7];
794
+ network = null;
795
+ if (!this._networkPromise) return [3 /*break*/, 4];
796
+ _a.label = 1;
797
+ case 1:
798
+ _a.trys.push([1, 3, , 4]);
799
+ return [4 /*yield*/, this._networkPromise];
800
+ case 2:
801
+ network = _a.sent();
802
+ return [3 /*break*/, 4];
803
+ case 3:
804
+ error_4 = _a.sent();
805
+ return [3 /*break*/, 4];
806
+ case 4:
807
+ if (!(network == null)) return [3 /*break*/, 6];
808
+ return [4 /*yield*/, this.detectNetwork()];
809
+ case 5:
810
+ network = _a.sent();
811
+ _a.label = 6;
812
+ case 6:
813
+ // This should never happen; every Provider sub-class should have
814
+ // suggested a network by here (or have thrown).
815
+ if (!network) {
816
+ logger.throwError("no network detected", logger_1.Logger.errors.UNKNOWN_ERROR, {});
817
+ }
818
+ // Possible this call stacked so do not call defineReadOnly again
819
+ if (this._network == null) {
820
+ if (this.anyNetwork) {
821
+ this._network = network;
822
+ }
823
+ else {
824
+ (0, properties_1.defineReadOnly)(this, "_network", network);
825
+ }
826
+ this.emit("network", network, null);
827
+ }
828
+ _a.label = 7;
829
+ case 7: return [2 /*return*/, this._network];
830
+ }
831
+ });
832
+ });
833
+ };
834
+ Object.defineProperty(BaseProvider.prototype, "ready", {
835
+ // This will always return the most recently established network.
836
+ // For "any", this can change (a "network" event is emitted before
837
+ // any change is reflected); otherwise this cannot change
838
+ get: function () {
839
+ var _this = this;
840
+ return (0, web_1.poll)(function () {
841
+ return _this._ready().then(function (network) {
842
+ return network;
843
+ }, function (error) {
844
+ // If the network isn't running yet, we will wait
845
+ if (error.code === logger_1.Logger.errors.NETWORK_ERROR && error.event === "noNetwork") {
846
+ return undefined;
847
+ }
848
+ throw error;
849
+ });
850
+ });
851
+ },
852
+ enumerable: false,
853
+ configurable: true
854
+ });
855
+ // @TODO: Remove this and just create a singleton formatter
856
+ BaseProvider.getFormatter = function () {
857
+ if (defaultFormatter == null) {
858
+ defaultFormatter = new formatter_1.Formatter();
859
+ }
860
+ return defaultFormatter;
861
+ };
862
+ // @TODO: Remove this and just use getNetwork
863
+ BaseProvider.getNetwork = function (network) {
864
+ return (0, networks_1.getNetwork)((network == null) ? "homestead" : network);
865
+ };
866
+ BaseProvider.prototype.ccipReadFetch = function (tx, calldata, urls) {
867
+ return __awaiter(this, void 0, void 0, function () {
868
+ var sender, data, errorMessages, i, url, href, json, result, errorMessage;
869
+ return __generator(this, function (_a) {
870
+ switch (_a.label) {
871
+ case 0:
872
+ if (this.disableCcipRead || urls.length === 0) {
873
+ return [2 /*return*/, null];
874
+ }
875
+ sender = tx.to.toLowerCase();
876
+ data = calldata.toLowerCase();
877
+ errorMessages = [];
878
+ i = 0;
879
+ _a.label = 1;
880
+ case 1:
881
+ if (!(i < urls.length)) return [3 /*break*/, 4];
882
+ url = urls[i];
883
+ href = url.replace("{sender}", sender).replace("{data}", data);
884
+ json = (url.indexOf("{data}") >= 0) ? null : JSON.stringify({ data: data, sender: sender });
885
+ return [4 /*yield*/, (0, web_1.fetchJson)({ url: href, errorPassThrough: true }, json, function (value, response) {
886
+ value.status = response.statusCode;
887
+ return value;
888
+ })];
889
+ case 2:
890
+ result = _a.sent();
891
+ if (result.data) {
892
+ return [2 /*return*/, result.data];
893
+ }
894
+ errorMessage = (result.message || "unknown error");
895
+ // 4xx indicates the result is not present; stop
896
+ if (result.status >= 400 && result.status < 500) {
897
+ return [2 /*return*/, logger.throwError("response not found during CCIP fetch: " + errorMessage, logger_1.Logger.errors.SERVER_ERROR, { url: url, errorMessage: errorMessage })];
898
+ }
899
+ // 5xx indicates server issue; try the next url
900
+ errorMessages.push(errorMessage);
901
+ _a.label = 3;
902
+ case 3:
903
+ i++;
904
+ return [3 /*break*/, 1];
905
+ case 4: return [2 /*return*/, logger.throwError("error encountered during CCIP fetch: " + errorMessages.map(function (m) { return JSON.stringify(m); }).join(", "), logger_1.Logger.errors.SERVER_ERROR, {
906
+ urls: urls,
907
+ errorMessages: errorMessages
908
+ })];
909
+ }
910
+ });
911
+ });
912
+ };
913
+ // Fetches the blockNumber, but will reuse any result that is less
914
+ // than maxAge old or has been requested since the last request
915
+ BaseProvider.prototype._getInternalBlockNumber = function (maxAge) {
916
+ return __awaiter(this, void 0, void 0, function () {
917
+ var internalBlockNumber, result, error_5, reqTime, checkInternalBlockNumber;
918
+ var _this = this;
919
+ return __generator(this, function (_a) {
920
+ switch (_a.label) {
921
+ case 0: return [4 /*yield*/, this._ready()];
922
+ case 1:
923
+ _a.sent();
924
+ if (!(maxAge > 0)) return [3 /*break*/, 7];
925
+ _a.label = 2;
926
+ case 2:
927
+ if (!this._internalBlockNumber) return [3 /*break*/, 7];
928
+ internalBlockNumber = this._internalBlockNumber;
929
+ _a.label = 3;
930
+ case 3:
931
+ _a.trys.push([3, 5, , 6]);
932
+ return [4 /*yield*/, internalBlockNumber];
933
+ case 4:
934
+ result = _a.sent();
935
+ if ((getTime() - result.respTime) <= maxAge) {
936
+ return [2 /*return*/, result.blockNumber];
937
+ }
938
+ // Too old; fetch a new value
939
+ return [3 /*break*/, 7];
940
+ case 5:
941
+ error_5 = _a.sent();
942
+ // The fetch rejected; if we are the first to get the
943
+ // rejection, drop through so we replace it with a new
944
+ // fetch; all others blocked will then get that fetch
945
+ // which won't match the one they "remembered" and loop
946
+ if (this._internalBlockNumber === internalBlockNumber) {
947
+ return [3 /*break*/, 7];
948
+ }
949
+ return [3 /*break*/, 6];
950
+ case 6: return [3 /*break*/, 2];
951
+ case 7:
952
+ reqTime = getTime();
953
+ checkInternalBlockNumber = (0, properties_1.resolveProperties)({
954
+ blockNumber: this.perform("getBlockNumber", {}),
955
+ networkError: this.getNetwork().then(function (network) { return (null); }, function (error) { return (error); })
956
+ }).then(function (_a) {
957
+ var blockNumber = _a.blockNumber, networkError = _a.networkError;
958
+ if (networkError) {
959
+ // Unremember this bad internal block number
960
+ if (_this._internalBlockNumber === checkInternalBlockNumber) {
961
+ _this._internalBlockNumber = null;
962
+ }
963
+ throw networkError;
964
+ }
965
+ var respTime = getTime();
966
+ blockNumber = bignumber_1.BigNumber.from(blockNumber).toNumber();
967
+ if (blockNumber < _this._maxInternalBlockNumber) {
968
+ blockNumber = _this._maxInternalBlockNumber;
969
+ }
970
+ _this._maxInternalBlockNumber = blockNumber;
971
+ _this._setFastBlockNumber(blockNumber); // @TODO: Still need this?
972
+ return { blockNumber: blockNumber, reqTime: reqTime, respTime: respTime };
973
+ });
974
+ this._internalBlockNumber = checkInternalBlockNumber;
975
+ // Swallow unhandled exceptions; if needed they are handled else where
976
+ checkInternalBlockNumber.catch(function (error) {
977
+ // Don't null the dead (rejected) fetch, if it has already been updated
978
+ if (_this._internalBlockNumber === checkInternalBlockNumber) {
979
+ _this._internalBlockNumber = null;
980
+ }
981
+ });
982
+ return [4 /*yield*/, checkInternalBlockNumber];
983
+ case 8: return [2 /*return*/, (_a.sent()).blockNumber];
984
+ }
985
+ });
986
+ });
987
+ };
988
+ BaseProvider.prototype.poll = function () {
989
+ return __awaiter(this, void 0, void 0, function () {
990
+ var pollId, runners, blockNumber, error_6, i;
991
+ var _this = this;
992
+ return __generator(this, function (_a) {
993
+ switch (_a.label) {
994
+ case 0:
995
+ pollId = nextPollId++;
996
+ runners = [];
997
+ blockNumber = null;
998
+ _a.label = 1;
999
+ case 1:
1000
+ _a.trys.push([1, 3, , 4]);
1001
+ return [4 /*yield*/, this._getInternalBlockNumber(100 + this.pollingInterval / 2)];
1002
+ case 2:
1003
+ blockNumber = _a.sent();
1004
+ return [3 /*break*/, 4];
1005
+ case 3:
1006
+ error_6 = _a.sent();
1007
+ this.emit("error", error_6);
1008
+ return [2 /*return*/];
1009
+ case 4:
1010
+ this._setFastBlockNumber(blockNumber);
1011
+ // Emit a poll event after we have the latest (fast) block number
1012
+ this.emit("poll", pollId, blockNumber);
1013
+ // If the block has not changed, meh.
1014
+ if (blockNumber === this._lastBlockNumber) {
1015
+ this.emit("didPoll", pollId);
1016
+ return [2 /*return*/];
1017
+ }
1018
+ // First polling cycle, trigger a "block" events
1019
+ if (this._emitted.block === -2) {
1020
+ this._emitted.block = blockNumber - 1;
1021
+ }
1022
+ if (Math.abs((this._emitted.block) - blockNumber) > 1000) {
1023
+ logger.warn("network block skew detected; skipping block events (emitted=" + this._emitted.block + " blockNumber" + blockNumber + ")");
1024
+ this.emit("error", logger.makeError("network block skew detected", logger_1.Logger.errors.NETWORK_ERROR, {
1025
+ blockNumber: blockNumber,
1026
+ event: "blockSkew",
1027
+ previousBlockNumber: this._emitted.block
1028
+ }));
1029
+ this.emit("block", blockNumber);
1030
+ }
1031
+ else {
1032
+ // Notify all listener for each block that has passed
1033
+ for (i = this._emitted.block + 1; i <= blockNumber; i++) {
1034
+ this.emit("block", i);
1035
+ }
1036
+ }
1037
+ // The emitted block was updated, check for obsolete events
1038
+ if (this._emitted.block !== blockNumber) {
1039
+ this._emitted.block = blockNumber;
1040
+ Object.keys(this._emitted).forEach(function (key) {
1041
+ // The block event does not expire
1042
+ if (key === "block") {
1043
+ return;
1044
+ }
1045
+ // The block we were at when we emitted this event
1046
+ var eventBlockNumber = _this._emitted[key];
1047
+ // We cannot garbage collect pending transactions or blocks here
1048
+ // They should be garbage collected by the Provider when setting
1049
+ // "pending" events
1050
+ if (eventBlockNumber === "pending") {
1051
+ return;
1052
+ }
1053
+ // Evict any transaction hashes or block hashes over 12 blocks
1054
+ // old, since they should not return null anyways
1055
+ if (blockNumber - eventBlockNumber > 12) {
1056
+ delete _this._emitted[key];
1057
+ }
1058
+ });
1059
+ }
1060
+ // First polling cycle
1061
+ if (this._lastBlockNumber === -2) {
1062
+ this._lastBlockNumber = blockNumber - 1;
1063
+ }
1064
+ // Find all transaction hashes we are waiting on
1065
+ this._events.forEach(function (event) {
1066
+ switch (event.type) {
1067
+ case "tx": {
1068
+ var hash_2 = event.hash;
1069
+ var runner = _this.getTransactionReceipt(hash_2).then(function (receipt) {
1070
+ if (!receipt || receipt.blockNumber == null) {
1071
+ return null;
1072
+ }
1073
+ _this._emitted["t:" + hash_2] = receipt.blockNumber;
1074
+ _this.emit(hash_2, receipt);
1075
+ return null;
1076
+ }).catch(function (error) { _this.emit("error", error); });
1077
+ runners.push(runner);
1078
+ break;
1079
+ }
1080
+ case "filter": {
1081
+ // We only allow a single getLogs to be in-flight at a time
1082
+ if (!event._inflight) {
1083
+ event._inflight = true;
1084
+ // This is the first filter for this event, so we want to
1085
+ // restrict events to events that happened no earlier than now
1086
+ if (event._lastBlockNumber === -2) {
1087
+ event._lastBlockNumber = blockNumber - 1;
1088
+ }
1089
+ // Filter from the last *known* event; due to load-balancing
1090
+ // and some nodes returning updated block numbers before
1091
+ // indexing events, a logs result with 0 entries cannot be
1092
+ // trusted and we must retry a range which includes it again
1093
+ var filter_1 = event.filter;
1094
+ filter_1.fromBlock = event._lastBlockNumber + 1;
1095
+ filter_1.toBlock = blockNumber;
1096
+ // Prevent fitler ranges from growing too wild, since it is quite
1097
+ // likely there just haven't been any events to move the lastBlockNumber.
1098
+ var minFromBlock = filter_1.toBlock - _this._maxFilterBlockRange;
1099
+ if (minFromBlock > filter_1.fromBlock) {
1100
+ filter_1.fromBlock = minFromBlock;
1101
+ }
1102
+ if (filter_1.fromBlock < 0) {
1103
+ filter_1.fromBlock = 0;
1104
+ }
1105
+ var runner = _this.getLogs(filter_1).then(function (logs) {
1106
+ // Allow the next getLogs
1107
+ event._inflight = false;
1108
+ if (logs.length === 0) {
1109
+ return;
1110
+ }
1111
+ logs.forEach(function (log) {
1112
+ // Only when we get an event for a given block number
1113
+ // can we trust the events are indexed
1114
+ if (log.blockNumber > event._lastBlockNumber) {
1115
+ event._lastBlockNumber = log.blockNumber;
1116
+ }
1117
+ // Make sure we stall requests to fetch blocks and txs
1118
+ _this._emitted["b:" + log.blockHash] = log.blockNumber;
1119
+ _this._emitted["t:" + log.transactionHash] = log.blockNumber;
1120
+ _this.emit(filter_1, log);
1121
+ });
1122
+ }).catch(function (error) {
1123
+ _this.emit("error", error);
1124
+ // Allow another getLogs (the range was not updated)
1125
+ event._inflight = false;
1126
+ });
1127
+ runners.push(runner);
1128
+ }
1129
+ break;
1130
+ }
1131
+ }
1132
+ });
1133
+ this._lastBlockNumber = blockNumber;
1134
+ // Once all events for this loop have been processed, emit "didPoll"
1135
+ Promise.all(runners).then(function () {
1136
+ _this.emit("didPoll", pollId);
1137
+ }).catch(function (error) { _this.emit("error", error); });
1138
+ return [2 /*return*/];
1139
+ }
1140
+ });
1141
+ });
1142
+ };
1143
+ // Deprecated; do not use this
1144
+ BaseProvider.prototype.resetEventsBlock = function (blockNumber) {
1145
+ this._lastBlockNumber = blockNumber - 1;
1146
+ if (this.polling) {
1147
+ this.poll();
1148
+ }
1149
+ };
1150
+ Object.defineProperty(BaseProvider.prototype, "network", {
1151
+ get: function () {
1152
+ return this._network;
1153
+ },
1154
+ enumerable: false,
1155
+ configurable: true
1156
+ });
1157
+ // This method should query the network if the underlying network
1158
+ // can change, such as when connected to a JSON-RPC backend
1159
+ BaseProvider.prototype.detectNetwork = function () {
1160
+ return __awaiter(this, void 0, void 0, function () {
1161
+ return __generator(this, function (_a) {
1162
+ return [2 /*return*/, logger.throwError("provider does not support network detection", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {
1163
+ operation: "provider.detectNetwork"
1164
+ })];
1165
+ });
1166
+ });
1167
+ };
1168
+ BaseProvider.prototype.getNetwork = function () {
1169
+ return __awaiter(this, void 0, void 0, function () {
1170
+ var network, currentNetwork, error;
1171
+ return __generator(this, function (_a) {
1172
+ switch (_a.label) {
1173
+ case 0: return [4 /*yield*/, this._ready()];
1174
+ case 1:
1175
+ network = _a.sent();
1176
+ return [4 /*yield*/, this.detectNetwork()];
1177
+ case 2:
1178
+ currentNetwork = _a.sent();
1179
+ if (!(network.chainId !== currentNetwork.chainId)) return [3 /*break*/, 5];
1180
+ if (!this.anyNetwork) return [3 /*break*/, 4];
1181
+ this._network = currentNetwork;
1182
+ // Reset all internal block number guards and caches
1183
+ this._lastBlockNumber = -2;
1184
+ this._fastBlockNumber = null;
1185
+ this._fastBlockNumberPromise = null;
1186
+ this._fastQueryDate = 0;
1187
+ this._emitted.block = -2;
1188
+ this._maxInternalBlockNumber = -1024;
1189
+ this._internalBlockNumber = null;
1190
+ // The "network" event MUST happen before this method resolves
1191
+ // so any events have a chance to unregister, so we stall an
1192
+ // additional event loop before returning from /this/ call
1193
+ this.emit("network", currentNetwork, network);
1194
+ return [4 /*yield*/, stall(0)];
1195
+ case 3:
1196
+ _a.sent();
1197
+ return [2 /*return*/, this._network];
1198
+ case 4:
1199
+ error = logger.makeError("underlying network changed", logger_1.Logger.errors.NETWORK_ERROR, {
1200
+ event: "changed",
1201
+ network: network,
1202
+ detectedNetwork: currentNetwork
1203
+ });
1204
+ this.emit("error", error);
1205
+ throw error;
1206
+ case 5: return [2 /*return*/, network];
1207
+ }
1208
+ });
1209
+ });
1210
+ };
1211
+ Object.defineProperty(BaseProvider.prototype, "blockNumber", {
1212
+ get: function () {
1213
+ var _this = this;
1214
+ this._getInternalBlockNumber(100 + this.pollingInterval / 2).then(function (blockNumber) {
1215
+ _this._setFastBlockNumber(blockNumber);
1216
+ }, function (error) { });
1217
+ return (this._fastBlockNumber != null) ? this._fastBlockNumber : -1;
1218
+ },
1219
+ enumerable: false,
1220
+ configurable: true
1221
+ });
1222
+ Object.defineProperty(BaseProvider.prototype, "polling", {
1223
+ get: function () {
1224
+ return (this._poller != null);
1225
+ },
1226
+ set: function (value) {
1227
+ var _this = this;
1228
+ if (value && !this._poller) {
1229
+ this._poller = setInterval(function () { _this.poll(); }, this.pollingInterval);
1230
+ if (!this._bootstrapPoll) {
1231
+ this._bootstrapPoll = setTimeout(function () {
1232
+ _this.poll();
1233
+ // We block additional polls until the polling interval
1234
+ // is done, to prevent overwhelming the poll function
1235
+ _this._bootstrapPoll = setTimeout(function () {
1236
+ // If polling was disabled, something may require a poke
1237
+ // since starting the bootstrap poll and it was disabled
1238
+ if (!_this._poller) {
1239
+ _this.poll();
1240
+ }
1241
+ // Clear out the bootstrap so we can do another
1242
+ _this._bootstrapPoll = null;
1243
+ }, _this.pollingInterval);
1244
+ }, 0);
1245
+ }
1246
+ }
1247
+ else if (!value && this._poller) {
1248
+ clearInterval(this._poller);
1249
+ this._poller = null;
1250
+ }
1251
+ },
1252
+ enumerable: false,
1253
+ configurable: true
1254
+ });
1255
+ Object.defineProperty(BaseProvider.prototype, "pollingInterval", {
1256
+ get: function () {
1257
+ return this._pollingInterval;
1258
+ },
1259
+ set: function (value) {
1260
+ var _this = this;
1261
+ if (typeof (value) !== "number" || value <= 0 || parseInt(String(value)) != value) {
1262
+ throw new Error("invalid polling interval");
1263
+ }
1264
+ this._pollingInterval = value;
1265
+ if (this._poller) {
1266
+ clearInterval(this._poller);
1267
+ this._poller = setInterval(function () { _this.poll(); }, this._pollingInterval);
1268
+ }
1269
+ },
1270
+ enumerable: false,
1271
+ configurable: true
1272
+ });
1273
+ BaseProvider.prototype._getFastBlockNumber = function () {
1274
+ var _this = this;
1275
+ var now = getTime();
1276
+ // Stale block number, request a newer value
1277
+ if ((now - this._fastQueryDate) > 2 * this._pollingInterval) {
1278
+ this._fastQueryDate = now;
1279
+ this._fastBlockNumberPromise = this.getBlockNumber().then(function (blockNumber) {
1280
+ if (_this._fastBlockNumber == null || blockNumber > _this._fastBlockNumber) {
1281
+ _this._fastBlockNumber = blockNumber;
1282
+ }
1283
+ return _this._fastBlockNumber;
1284
+ });
1285
+ }
1286
+ return this._fastBlockNumberPromise;
1287
+ };
1288
+ BaseProvider.prototype._setFastBlockNumber = function (blockNumber) {
1289
+ // Older block, maybe a stale request
1290
+ if (this._fastBlockNumber != null && blockNumber < this._fastBlockNumber) {
1291
+ return;
1292
+ }
1293
+ // Update the time we updated the blocknumber
1294
+ this._fastQueryDate = getTime();
1295
+ // Newer block number, use it
1296
+ if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) {
1297
+ this._fastBlockNumber = blockNumber;
1298
+ this._fastBlockNumberPromise = Promise.resolve(blockNumber);
1299
+ }
1300
+ };
1301
+ BaseProvider.prototype.waitForTransaction = function (transactionHash, confirmations, timeout) {
1302
+ return __awaiter(this, void 0, void 0, function () {
1303
+ return __generator(this, function (_a) {
1304
+ return [2 /*return*/, this._waitForTransaction(transactionHash, (confirmations == null) ? 1 : confirmations, timeout || 0, null)];
1305
+ });
1306
+ });
1307
+ };
1308
+ BaseProvider.prototype._waitForTransaction = function (transactionHash, confirmations, timeout, replaceable) {
1309
+ return __awaiter(this, void 0, void 0, function () {
1310
+ var receipt;
1311
+ var _this = this;
1312
+ return __generator(this, function (_a) {
1313
+ switch (_a.label) {
1314
+ case 0: return [4 /*yield*/, this.getTransactionReceipt(transactionHash)];
1315
+ case 1:
1316
+ receipt = _a.sent();
1317
+ // Receipt is already good
1318
+ if ((receipt ? receipt.confirmations : 0) >= confirmations) {
1319
+ return [2 /*return*/, receipt];
1320
+ }
1321
+ // Poll until the receipt is good...
1322
+ return [2 /*return*/, new Promise(function (resolve, reject) {
1323
+ var cancelFuncs = [];
1324
+ var done = false;
1325
+ var alreadyDone = function () {
1326
+ if (done) {
1327
+ return true;
1328
+ }
1329
+ done = true;
1330
+ cancelFuncs.forEach(function (func) { func(); });
1331
+ return false;
1332
+ };
1333
+ var minedHandler = function (receipt) {
1334
+ if (receipt.confirmations < confirmations) {
1335
+ return;
1336
+ }
1337
+ if (alreadyDone()) {
1338
+ return;
1339
+ }
1340
+ resolve(receipt);
1341
+ };
1342
+ _this.on(transactionHash, minedHandler);
1343
+ cancelFuncs.push(function () { _this.removeListener(transactionHash, minedHandler); });
1344
+ if (replaceable) {
1345
+ var lastBlockNumber_1 = replaceable.startBlock;
1346
+ var scannedBlock_1 = null;
1347
+ var replaceHandler_1 = function (blockNumber) { return __awaiter(_this, void 0, void 0, function () {
1348
+ var _this = this;
1349
+ return __generator(this, function (_a) {
1350
+ switch (_a.label) {
1351
+ case 0:
1352
+ if (done) {
1353
+ return [2 /*return*/];
1354
+ }
1355
+ // Wait 1 second; this is only used in the case of a fault, so
1356
+ // we will trade off a little bit of latency for more consistent
1357
+ // results and fewer JSON-RPC calls
1358
+ return [4 /*yield*/, stall(1000)];
1359
+ case 1:
1360
+ // Wait 1 second; this is only used in the case of a fault, so
1361
+ // we will trade off a little bit of latency for more consistent
1362
+ // results and fewer JSON-RPC calls
1363
+ _a.sent();
1364
+ this.getTransactionCount(replaceable.from).then(function (nonce) { return __awaiter(_this, void 0, void 0, function () {
1365
+ var mined, block, ti, tx, receipt_1, reason;
1366
+ return __generator(this, function (_a) {
1367
+ switch (_a.label) {
1368
+ case 0:
1369
+ if (done) {
1370
+ return [2 /*return*/];
1371
+ }
1372
+ if (!(nonce <= replaceable.nonce)) return [3 /*break*/, 1];
1373
+ lastBlockNumber_1 = blockNumber;
1374
+ return [3 /*break*/, 9];
1375
+ case 1: return [4 /*yield*/, this.getTransaction(transactionHash)];
1376
+ case 2:
1377
+ mined = _a.sent();
1378
+ if (mined && mined.blockNumber != null) {
1379
+ return [2 /*return*/];
1380
+ }
1381
+ // First time scanning. We start a little earlier for some
1382
+ // wiggle room here to handle the eventually consistent nature
1383
+ // of blockchain (e.g. the getTransactionCount was for a
1384
+ // different block)
1385
+ if (scannedBlock_1 == null) {
1386
+ scannedBlock_1 = lastBlockNumber_1 - 3;
1387
+ if (scannedBlock_1 < replaceable.startBlock) {
1388
+ scannedBlock_1 = replaceable.startBlock;
1389
+ }
1390
+ }
1391
+ _a.label = 3;
1392
+ case 3:
1393
+ if (!(scannedBlock_1 <= blockNumber)) return [3 /*break*/, 9];
1394
+ if (done) {
1395
+ return [2 /*return*/];
1396
+ }
1397
+ return [4 /*yield*/, this.getBlockWithTransactions(scannedBlock_1)];
1398
+ case 4:
1399
+ block = _a.sent();
1400
+ ti = 0;
1401
+ _a.label = 5;
1402
+ case 5:
1403
+ if (!(ti < block.transactions.length)) return [3 /*break*/, 8];
1404
+ tx = block.transactions[ti];
1405
+ // Successfully mined!
1406
+ if (tx.hash === transactionHash) {
1407
+ return [2 /*return*/];
1408
+ }
1409
+ if (!(tx.from === replaceable.from && tx.nonce === replaceable.nonce)) return [3 /*break*/, 7];
1410
+ if (done) {
1411
+ return [2 /*return*/];
1412
+ }
1413
+ return [4 /*yield*/, this.waitForTransaction(tx.hash, confirmations)];
1414
+ case 6:
1415
+ receipt_1 = _a.sent();
1416
+ // Already resolved or rejected (prolly a timeout)
1417
+ if (alreadyDone()) {
1418
+ return [2 /*return*/];
1419
+ }
1420
+ reason = "replaced";
1421
+ if (tx.data === replaceable.data && tx.to === replaceable.to && tx.value.eq(replaceable.value)) {
1422
+ reason = "repriced";
1423
+ }
1424
+ else if (tx.data === "0x" && tx.from === tx.to && tx.value.isZero()) {
1425
+ reason = "cancelled";
1426
+ }
1427
+ // Explain why we were replaced
1428
+ reject(logger.makeError("transaction was replaced", logger_1.Logger.errors.TRANSACTION_REPLACED, {
1429
+ cancelled: (reason === "replaced" || reason === "cancelled"),
1430
+ reason: reason,
1431
+ replacement: this._wrapTransaction(tx),
1432
+ hash: transactionHash,
1433
+ receipt: receipt_1
1434
+ }));
1435
+ return [2 /*return*/];
1436
+ case 7:
1437
+ ti++;
1438
+ return [3 /*break*/, 5];
1439
+ case 8:
1440
+ scannedBlock_1++;
1441
+ return [3 /*break*/, 3];
1442
+ case 9:
1443
+ if (done) {
1444
+ return [2 /*return*/];
1445
+ }
1446
+ this.once("block", replaceHandler_1);
1447
+ return [2 /*return*/];
1448
+ }
1449
+ });
1450
+ }); }, function (error) {
1451
+ if (done) {
1452
+ return;
1453
+ }
1454
+ _this.once("block", replaceHandler_1);
1455
+ });
1456
+ return [2 /*return*/];
1457
+ }
1458
+ });
1459
+ }); };
1460
+ if (done) {
1461
+ return;
1462
+ }
1463
+ _this.once("block", replaceHandler_1);
1464
+ cancelFuncs.push(function () {
1465
+ _this.removeListener("block", replaceHandler_1);
1466
+ });
1467
+ }
1468
+ if (typeof (timeout) === "number" && timeout > 0) {
1469
+ var timer_1 = setTimeout(function () {
1470
+ if (alreadyDone()) {
1471
+ return;
1472
+ }
1473
+ reject(logger.makeError("timeout exceeded", logger_1.Logger.errors.TIMEOUT, { timeout: timeout }));
1474
+ }, timeout);
1475
+ if (timer_1.unref) {
1476
+ timer_1.unref();
1477
+ }
1478
+ cancelFuncs.push(function () { clearTimeout(timer_1); });
1479
+ }
1480
+ })];
1481
+ }
1482
+ });
1483
+ });
1484
+ };
1485
+ BaseProvider.prototype.getBlockNumber = function () {
1486
+ return __awaiter(this, void 0, void 0, function () {
1487
+ return __generator(this, function (_a) {
1488
+ return [2 /*return*/, this._getInternalBlockNumber(0)];
1489
+ });
1490
+ });
1491
+ };
1492
+ BaseProvider.prototype.getGasPrice = function () {
1493
+ return __awaiter(this, void 0, void 0, function () {
1494
+ var result;
1495
+ return __generator(this, function (_a) {
1496
+ switch (_a.label) {
1497
+ case 0: return [4 /*yield*/, this.getNetwork()];
1498
+ case 1:
1499
+ _a.sent();
1500
+ return [4 /*yield*/, this.perform("getGasPrice", {})];
1501
+ case 2:
1502
+ result = _a.sent();
1503
+ try {
1504
+ return [2 /*return*/, bignumber_1.BigNumber.from(result)];
1505
+ }
1506
+ catch (error) {
1507
+ return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, {
1508
+ method: "getGasPrice",
1509
+ result: result,
1510
+ error: error
1511
+ })];
1512
+ }
1513
+ return [2 /*return*/];
1514
+ }
1515
+ });
1516
+ });
1517
+ };
1518
+ BaseProvider.prototype.getBalance = function (addressOrName, blockTag) {
1519
+ return __awaiter(this, void 0, void 0, function () {
1520
+ var params, result;
1521
+ return __generator(this, function (_a) {
1522
+ switch (_a.label) {
1523
+ case 0: return [4 /*yield*/, this.getNetwork()];
1524
+ case 1:
1525
+ _a.sent();
1526
+ return [4 /*yield*/, (0, properties_1.resolveProperties)({
1527
+ address: this._getAddress(addressOrName),
1528
+ blockTag: this._getBlockTag(blockTag)
1529
+ })];
1530
+ case 2:
1531
+ params = _a.sent();
1532
+ return [4 /*yield*/, this.perform("getBalance", params)];
1533
+ case 3:
1534
+ result = _a.sent();
1535
+ try {
1536
+ return [2 /*return*/, bignumber_1.BigNumber.from(result)];
1537
+ }
1538
+ catch (error) {
1539
+ return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, {
1540
+ method: "getBalance",
1541
+ params: params,
1542
+ result: result,
1543
+ error: error
1544
+ })];
1545
+ }
1546
+ return [2 /*return*/];
1547
+ }
1548
+ });
1549
+ });
1550
+ };
1551
+ BaseProvider.prototype.getTransactionCount = function (addressOrName, blockTag) {
1552
+ return __awaiter(this, void 0, void 0, function () {
1553
+ var params, result;
1554
+ return __generator(this, function (_a) {
1555
+ switch (_a.label) {
1556
+ case 0: return [4 /*yield*/, this.getNetwork()];
1557
+ case 1:
1558
+ _a.sent();
1559
+ return [4 /*yield*/, (0, properties_1.resolveProperties)({
1560
+ address: this._getAddress(addressOrName),
1561
+ blockTag: this._getBlockTag(blockTag)
1562
+ })];
1563
+ case 2:
1564
+ params = _a.sent();
1565
+ return [4 /*yield*/, this.perform("getTransactionCount", params)];
1566
+ case 3:
1567
+ result = _a.sent();
1568
+ try {
1569
+ return [2 /*return*/, bignumber_1.BigNumber.from(result).toNumber()];
1570
+ }
1571
+ catch (error) {
1572
+ return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, {
1573
+ method: "getTransactionCount",
1574
+ params: params,
1575
+ result: result,
1576
+ error: error
1577
+ })];
1578
+ }
1579
+ return [2 /*return*/];
1580
+ }
1581
+ });
1582
+ });
1583
+ };
1584
+ BaseProvider.prototype.getCode = function (addressOrName, blockTag) {
1585
+ return __awaiter(this, void 0, void 0, function () {
1586
+ var params, result;
1587
+ return __generator(this, function (_a) {
1588
+ switch (_a.label) {
1589
+ case 0: return [4 /*yield*/, this.getNetwork()];
1590
+ case 1:
1591
+ _a.sent();
1592
+ return [4 /*yield*/, (0, properties_1.resolveProperties)({
1593
+ address: this._getAddress(addressOrName),
1594
+ blockTag: this._getBlockTag(blockTag)
1595
+ })];
1596
+ case 2:
1597
+ params = _a.sent();
1598
+ return [4 /*yield*/, this.perform("getCode", params)];
1599
+ case 3:
1600
+ result = _a.sent();
1601
+ try {
1602
+ return [2 /*return*/, (0, bytes_1.hexlify)(result)];
1603
+ }
1604
+ catch (error) {
1605
+ return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, {
1606
+ method: "getCode",
1607
+ params: params,
1608
+ result: result,
1609
+ error: error
1610
+ })];
1611
+ }
1612
+ return [2 /*return*/];
1613
+ }
1614
+ });
1615
+ });
1616
+ };
1617
+ BaseProvider.prototype.getStorageAt = function (addressOrName, position, blockTag) {
1618
+ return __awaiter(this, void 0, void 0, function () {
1619
+ var params, result;
1620
+ return __generator(this, function (_a) {
1621
+ switch (_a.label) {
1622
+ case 0: return [4 /*yield*/, this.getNetwork()];
1623
+ case 1:
1624
+ _a.sent();
1625
+ return [4 /*yield*/, (0, properties_1.resolveProperties)({
1626
+ address: this._getAddress(addressOrName),
1627
+ blockTag: this._getBlockTag(blockTag),
1628
+ position: Promise.resolve(position).then(function (p) { return (0, bytes_1.hexValue)(p); })
1629
+ })];
1630
+ case 2:
1631
+ params = _a.sent();
1632
+ return [4 /*yield*/, this.perform("getStorageAt", params)];
1633
+ case 3:
1634
+ result = _a.sent();
1635
+ try {
1636
+ return [2 /*return*/, (0, bytes_1.hexlify)(result)];
1637
+ }
1638
+ catch (error) {
1639
+ return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, {
1640
+ method: "getStorageAt",
1641
+ params: params,
1642
+ result: result,
1643
+ error: error
1644
+ })];
1645
+ }
1646
+ return [2 /*return*/];
1647
+ }
1648
+ });
1649
+ });
1650
+ };
1651
+ // This should be called by any subclass wrapping a TransactionResponse
1652
+ BaseProvider.prototype._wrapTransaction = function (tx, hash, startBlock) {
1653
+ var _this = this;
1654
+ if (hash != null && (0, bytes_1.hexDataLength)(hash) !== 32) {
1655
+ throw new Error("invalid response - sendTransaction");
1656
+ }
1657
+ var result = tx;
1658
+ // Check the hash we expect is the same as the hash the server reported
1659
+ if (hash != null && tx.hash !== hash) {
1660
+ logger.throwError("Transaction hash mismatch from Provider.sendTransaction.", logger_1.Logger.errors.UNKNOWN_ERROR, { expectedHash: tx.hash, returnedHash: hash });
1661
+ }
1662
+ result.wait = function (confirms, timeout) { return __awaiter(_this, void 0, void 0, function () {
1663
+ var replacement, receipt;
1664
+ return __generator(this, function (_a) {
1665
+ switch (_a.label) {
1666
+ case 0:
1667
+ if (confirms == null) {
1668
+ confirms = 1;
1669
+ }
1670
+ if (timeout == null) {
1671
+ timeout = 0;
1672
+ }
1673
+ replacement = undefined;
1674
+ if (confirms !== 0 && startBlock != null) {
1675
+ replacement = {
1676
+ data: tx.data,
1677
+ from: tx.from,
1678
+ nonce: tx.nonce,
1679
+ to: tx.to,
1680
+ value: tx.value,
1681
+ startBlock: startBlock
1682
+ };
1683
+ }
1684
+ return [4 /*yield*/, this._waitForTransaction(tx.hash, confirms, timeout, replacement)];
1685
+ case 1:
1686
+ receipt = _a.sent();
1687
+ if (receipt == null && confirms === 0) {
1688
+ return [2 /*return*/, null];
1689
+ }
1690
+ // No longer pending, allow the polling loop to garbage collect this
1691
+ this._emitted["t:" + tx.hash] = receipt.blockNumber;
1692
+ if (receipt.status === 0) {
1693
+ logger.throwError("transaction failed", logger_1.Logger.errors.CALL_EXCEPTION, {
1694
+ transactionHash: tx.hash,
1695
+ transaction: tx,
1696
+ receipt: receipt
1697
+ });
1698
+ }
1699
+ return [2 /*return*/, receipt];
1700
+ }
1701
+ });
1702
+ }); };
1703
+ return result;
1704
+ };
1705
+ BaseProvider.prototype.sendTransaction = function (signedTransaction) {
1706
+ return __awaiter(this, void 0, void 0, function () {
1707
+ var hexTx, tx, blockNumber, hash, error_7;
1708
+ return __generator(this, function (_a) {
1709
+ switch (_a.label) {
1710
+ case 0: return [4 /*yield*/, this.getNetwork()];
1711
+ case 1:
1712
+ _a.sent();
1713
+ return [4 /*yield*/, Promise.resolve(signedTransaction).then(function (t) { return (0, bytes_1.hexlify)(t); })];
1714
+ case 2:
1715
+ hexTx = _a.sent();
1716
+ tx = this.formatter.transaction(signedTransaction);
1717
+ if (tx.confirmations == null) {
1718
+ tx.confirmations = 0;
1719
+ }
1720
+ return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];
1721
+ case 3:
1722
+ blockNumber = _a.sent();
1723
+ _a.label = 4;
1724
+ case 4:
1725
+ _a.trys.push([4, 6, , 7]);
1726
+ return [4 /*yield*/, this.perform("sendTransaction", { signedTransaction: hexTx })];
1727
+ case 5:
1728
+ hash = _a.sent();
1729
+ return [2 /*return*/, this._wrapTransaction(tx, hash, blockNumber)];
1730
+ case 6:
1731
+ error_7 = _a.sent();
1732
+ error_7.transaction = tx;
1733
+ error_7.transactionHash = tx.hash;
1734
+ throw error_7;
1735
+ case 7: return [2 /*return*/];
1736
+ }
1737
+ });
1738
+ });
1739
+ };
1740
+ BaseProvider.prototype._getTransactionRequest = function (transaction) {
1741
+ return __awaiter(this, void 0, void 0, function () {
1742
+ var values, tx, _a, _b;
1743
+ var _this = this;
1744
+ return __generator(this, function (_c) {
1745
+ switch (_c.label) {
1746
+ case 0: return [4 /*yield*/, transaction];
1747
+ case 1:
1748
+ values = _c.sent();
1749
+ tx = {};
1750
+ ["from", "to"].forEach(function (key) {
1751
+ if (values[key] == null) {
1752
+ return;
1753
+ }
1754
+ tx[key] = Promise.resolve(values[key]).then(function (v) { return (v ? _this._getAddress(v) : null); });
1755
+ });
1756
+ ["gasLimit", "gasPrice", "maxFeePerGas", "maxPriorityFeePerGas", "value"].forEach(function (key) {
1757
+ if (values[key] == null) {
1758
+ return;
1759
+ }
1760
+ tx[key] = Promise.resolve(values[key]).then(function (v) { return (v ? bignumber_1.BigNumber.from(v) : null); });
1761
+ });
1762
+ ["type"].forEach(function (key) {
1763
+ if (values[key] == null) {
1764
+ return;
1765
+ }
1766
+ tx[key] = Promise.resolve(values[key]).then(function (v) { return ((v != null) ? v : null); });
1767
+ });
1768
+ if (values.accessList) {
1769
+ tx.accessList = this.formatter.accessList(values.accessList);
1770
+ }
1771
+ ["data"].forEach(function (key) {
1772
+ if (values[key] == null) {
1773
+ return;
1774
+ }
1775
+ tx[key] = Promise.resolve(values[key]).then(function (v) { return (v ? (0, bytes_1.hexlify)(v) : null); });
1776
+ });
1777
+ _b = (_a = this.formatter).transactionRequest;
1778
+ return [4 /*yield*/, (0, properties_1.resolveProperties)(tx)];
1779
+ case 2: return [2 /*return*/, _b.apply(_a, [_c.sent()])];
1780
+ }
1781
+ });
1782
+ });
1783
+ };
1784
+ BaseProvider.prototype._getFilter = function (filter) {
1785
+ return __awaiter(this, void 0, void 0, function () {
1786
+ var result, _a, _b;
1787
+ var _this = this;
1788
+ return __generator(this, function (_c) {
1789
+ switch (_c.label) {
1790
+ case 0: return [4 /*yield*/, filter];
1791
+ case 1:
1792
+ filter = _c.sent();
1793
+ result = {};
1794
+ if (filter.address != null) {
1795
+ result.address = this._getAddress(filter.address);
1796
+ }
1797
+ ["blockHash", "topics"].forEach(function (key) {
1798
+ if (filter[key] == null) {
1799
+ return;
1800
+ }
1801
+ result[key] = filter[key];
1802
+ });
1803
+ ["fromBlock", "toBlock"].forEach(function (key) {
1804
+ if (filter[key] == null) {
1805
+ return;
1806
+ }
1807
+ result[key] = _this._getBlockTag(filter[key]);
1808
+ });
1809
+ _b = (_a = this.formatter).filter;
1810
+ return [4 /*yield*/, (0, properties_1.resolveProperties)(result)];
1811
+ case 2: return [2 /*return*/, _b.apply(_a, [_c.sent()])];
1812
+ }
1813
+ });
1814
+ });
1815
+ };
1816
+ BaseProvider.prototype._call = function (transaction, blockTag, attempt) {
1817
+ return __awaiter(this, void 0, void 0, function () {
1818
+ var txSender, result, data, sender, urls, urlsOffset, urlsLength, urlsData, u, url, calldata, callbackSelector, extraData, ccipResult, tx, error_8;
1819
+ return __generator(this, function (_a) {
1820
+ switch (_a.label) {
1821
+ case 0:
1822
+ if (attempt >= MAX_CCIP_REDIRECTS) {
1823
+ logger.throwError("CCIP read exceeded maximum redirections", logger_1.Logger.errors.SERVER_ERROR, {
1824
+ redirects: attempt,
1825
+ transaction: transaction
1826
+ });
1827
+ }
1828
+ txSender = transaction.to;
1829
+ return [4 /*yield*/, this.perform("call", { transaction: transaction, blockTag: blockTag })];
1830
+ case 1:
1831
+ result = _a.sent();
1832
+ if (!(attempt >= 0 && blockTag === "latest" && txSender != null && result.substring(0, 10) === "0x556f1830" && ((0, bytes_1.hexDataLength)(result) % 32 === 4))) return [3 /*break*/, 5];
1833
+ _a.label = 2;
1834
+ case 2:
1835
+ _a.trys.push([2, 4, , 5]);
1836
+ data = (0, bytes_1.hexDataSlice)(result, 4);
1837
+ sender = (0, bytes_1.hexDataSlice)(data, 0, 32);
1838
+ if (!bignumber_1.BigNumber.from(sender).eq(txSender)) {
1839
+ logger.throwError("CCIP Read sender did not match", logger_1.Logger.errors.CALL_EXCEPTION, {
1840
+ name: "OffchainLookup",
1841
+ signature: "OffchainLookup(address,string[],bytes,bytes4,bytes)",
1842
+ transaction: transaction,
1843
+ data: result
1844
+ });
1845
+ }
1846
+ urls = [];
1847
+ urlsOffset = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(data, 32, 64)).toNumber();
1848
+ urlsLength = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(data, urlsOffset, urlsOffset + 32)).toNumber();
1849
+ urlsData = (0, bytes_1.hexDataSlice)(data, urlsOffset + 32);
1850
+ for (u = 0; u < urlsLength; u++) {
1851
+ url = _parseString(urlsData, u * 32);
1852
+ if (url == null) {
1853
+ logger.throwError("CCIP Read contained corrupt URL string", logger_1.Logger.errors.CALL_EXCEPTION, {
1854
+ name: "OffchainLookup",
1855
+ signature: "OffchainLookup(address,string[],bytes,bytes4,bytes)",
1856
+ transaction: transaction,
1857
+ data: result
1858
+ });
1859
+ }
1860
+ urls.push(url);
1861
+ }
1862
+ calldata = _parseBytes(data, 64);
1863
+ // Get the callbackSelector (bytes4)
1864
+ if (!bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(data, 100, 128)).isZero()) {
1865
+ logger.throwError("CCIP Read callback selector included junk", logger_1.Logger.errors.CALL_EXCEPTION, {
1866
+ name: "OffchainLookup",
1867
+ signature: "OffchainLookup(address,string[],bytes,bytes4,bytes)",
1868
+ transaction: transaction,
1869
+ data: result
1870
+ });
1871
+ }
1872
+ callbackSelector = (0, bytes_1.hexDataSlice)(data, 96, 100);
1873
+ extraData = _parseBytes(data, 128);
1874
+ return [4 /*yield*/, this.ccipReadFetch(transaction, calldata, urls)];
1875
+ case 3:
1876
+ ccipResult = _a.sent();
1877
+ if (ccipResult == null) {
1878
+ logger.throwError("CCIP Read disabled or provided no URLs", logger_1.Logger.errors.CALL_EXCEPTION, {
1879
+ name: "OffchainLookup",
1880
+ signature: "OffchainLookup(address,string[],bytes,bytes4,bytes)",
1881
+ transaction: transaction,
1882
+ data: result
1883
+ });
1884
+ }
1885
+ tx = {
1886
+ to: txSender,
1887
+ data: (0, bytes_1.hexConcat)([callbackSelector, encodeBytes([ccipResult, extraData])])
1888
+ };
1889
+ return [2 /*return*/, this._call(tx, blockTag, attempt + 1)];
1890
+ case 4:
1891
+ error_8 = _a.sent();
1892
+ if (error_8.code === logger_1.Logger.errors.SERVER_ERROR) {
1893
+ throw error_8;
1894
+ }
1895
+ return [3 /*break*/, 5];
1896
+ case 5:
1897
+ try {
1898
+ return [2 /*return*/, (0, bytes_1.hexlify)(result)];
1899
+ }
1900
+ catch (error) {
1901
+ return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, {
1902
+ method: "call",
1903
+ params: { transaction: transaction, blockTag: blockTag },
1904
+ result: result,
1905
+ error: error
1906
+ })];
1907
+ }
1908
+ return [2 /*return*/];
1909
+ }
1910
+ });
1911
+ });
1912
+ };
1913
+ BaseProvider.prototype.call = function (transaction, blockTag) {
1914
+ return __awaiter(this, void 0, void 0, function () {
1915
+ var resolved;
1916
+ return __generator(this, function (_a) {
1917
+ switch (_a.label) {
1918
+ case 0: return [4 /*yield*/, this.getNetwork()];
1919
+ case 1:
1920
+ _a.sent();
1921
+ return [4 /*yield*/, (0, properties_1.resolveProperties)({
1922
+ transaction: this._getTransactionRequest(transaction),
1923
+ blockTag: this._getBlockTag(blockTag),
1924
+ ccipReadEnabled: Promise.resolve(transaction.ccipReadEnabled)
1925
+ })];
1926
+ case 2:
1927
+ resolved = _a.sent();
1928
+ return [2 /*return*/, this._call(resolved.transaction, resolved.blockTag, resolved.ccipReadEnabled ? 0 : -1)];
1929
+ }
1930
+ });
1931
+ });
1932
+ };
1933
+ BaseProvider.prototype.estimateGas = function (transaction) {
1934
+ return __awaiter(this, void 0, void 0, function () {
1935
+ var params, result;
1936
+ return __generator(this, function (_a) {
1937
+ switch (_a.label) {
1938
+ case 0: return [4 /*yield*/, this.getNetwork()];
1939
+ case 1:
1940
+ _a.sent();
1941
+ return [4 /*yield*/, (0, properties_1.resolveProperties)({
1942
+ transaction: this._getTransactionRequest(transaction)
1943
+ })];
1944
+ case 2:
1945
+ params = _a.sent();
1946
+ return [4 /*yield*/, this.perform("estimateGas", params)];
1947
+ case 3:
1948
+ result = _a.sent();
1949
+ try {
1950
+ return [2 /*return*/, bignumber_1.BigNumber.from(result)];
1951
+ }
1952
+ catch (error) {
1953
+ return [2 /*return*/, logger.throwError("bad result from backend", logger_1.Logger.errors.SERVER_ERROR, {
1954
+ method: "estimateGas",
1955
+ params: params,
1956
+ result: result,
1957
+ error: error
1958
+ })];
1959
+ }
1960
+ return [2 /*return*/];
1961
+ }
1962
+ });
1963
+ });
1964
+ };
1965
+ BaseProvider.prototype._getAddress = function (addressOrName) {
1966
+ return __awaiter(this, void 0, void 0, function () {
1967
+ var address;
1968
+ return __generator(this, function (_a) {
1969
+ switch (_a.label) {
1970
+ case 0: return [4 /*yield*/, addressOrName];
1971
+ case 1:
1972
+ addressOrName = _a.sent();
1973
+ if (typeof (addressOrName) !== "string") {
1974
+ logger.throwArgumentError("invalid address or ENS name", "name", addressOrName);
1975
+ }
1976
+ return [4 /*yield*/, this.resolveName(addressOrName)];
1977
+ case 2:
1978
+ address = _a.sent();
1979
+ if (address == null) {
1980
+ logger.throwError("ENS name not configured", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {
1981
+ operation: "resolveName(" + JSON.stringify(addressOrName) + ")"
1982
+ });
1983
+ }
1984
+ return [2 /*return*/, address];
1985
+ }
1986
+ });
1987
+ });
1988
+ };
1989
+ BaseProvider.prototype._getBlock = function (blockHashOrBlockTag, includeTransactions) {
1990
+ return __awaiter(this, void 0, void 0, function () {
1991
+ var blockNumber, params, _a, error_9;
1992
+ var _this = this;
1993
+ return __generator(this, function (_b) {
1994
+ switch (_b.label) {
1995
+ case 0: return [4 /*yield*/, this.getNetwork()];
1996
+ case 1:
1997
+ _b.sent();
1998
+ return [4 /*yield*/, blockHashOrBlockTag];
1999
+ case 2:
2000
+ blockHashOrBlockTag = _b.sent();
2001
+ blockNumber = -128;
2002
+ params = {
2003
+ includeTransactions: !!includeTransactions
2004
+ };
2005
+ if (!(0, bytes_1.isHexString)(blockHashOrBlockTag, 32)) return [3 /*break*/, 3];
2006
+ params.blockHash = blockHashOrBlockTag;
2007
+ return [3 /*break*/, 6];
2008
+ case 3:
2009
+ _b.trys.push([3, 5, , 6]);
2010
+ _a = params;
2011
+ return [4 /*yield*/, this._getBlockTag(blockHashOrBlockTag)];
2012
+ case 4:
2013
+ _a.blockTag = _b.sent();
2014
+ if ((0, bytes_1.isHexString)(params.blockTag)) {
2015
+ blockNumber = parseInt(params.blockTag.substring(2), 16);
2016
+ }
2017
+ return [3 /*break*/, 6];
2018
+ case 5:
2019
+ error_9 = _b.sent();
2020
+ logger.throwArgumentError("invalid block hash or block tag", "blockHashOrBlockTag", blockHashOrBlockTag);
2021
+ return [3 /*break*/, 6];
2022
+ case 6: return [2 /*return*/, (0, web_1.poll)(function () { return __awaiter(_this, void 0, void 0, function () {
2023
+ var block, blockNumber_1, i, tx, confirmations, blockWithTxs;
2024
+ var _this = this;
2025
+ return __generator(this, function (_a) {
2026
+ switch (_a.label) {
2027
+ case 0: return [4 /*yield*/, this.perform("getBlock", params)];
2028
+ case 1:
2029
+ block = _a.sent();
2030
+ // Block was not found
2031
+ if (block == null) {
2032
+ // For blockhashes, if we didn't say it existed, that blockhash may
2033
+ // not exist. If we did see it though, perhaps from a log, we know
2034
+ // it exists, and this node is just not caught up yet.
2035
+ if (params.blockHash != null) {
2036
+ if (this._emitted["b:" + params.blockHash] == null) {
2037
+ return [2 /*return*/, null];
2038
+ }
2039
+ }
2040
+ // For block tags, if we are asking for a future block, we return null
2041
+ if (params.blockTag != null) {
2042
+ if (blockNumber > this._emitted.block) {
2043
+ return [2 /*return*/, null];
2044
+ }
2045
+ }
2046
+ // Retry on the next block
2047
+ return [2 /*return*/, undefined];
2048
+ }
2049
+ if (!includeTransactions) return [3 /*break*/, 8];
2050
+ blockNumber_1 = null;
2051
+ i = 0;
2052
+ _a.label = 2;
2053
+ case 2:
2054
+ if (!(i < block.transactions.length)) return [3 /*break*/, 7];
2055
+ tx = block.transactions[i];
2056
+ if (!(tx.blockNumber == null)) return [3 /*break*/, 3];
2057
+ tx.confirmations = 0;
2058
+ return [3 /*break*/, 6];
2059
+ case 3:
2060
+ if (!(tx.confirmations == null)) return [3 /*break*/, 6];
2061
+ if (!(blockNumber_1 == null)) return [3 /*break*/, 5];
2062
+ return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];
2063
+ case 4:
2064
+ blockNumber_1 = _a.sent();
2065
+ _a.label = 5;
2066
+ case 5:
2067
+ confirmations = (blockNumber_1 - tx.blockNumber) + 1;
2068
+ if (confirmations <= 0) {
2069
+ confirmations = 1;
2070
+ }
2071
+ tx.confirmations = confirmations;
2072
+ _a.label = 6;
2073
+ case 6:
2074
+ i++;
2075
+ return [3 /*break*/, 2];
2076
+ case 7:
2077
+ blockWithTxs = this.formatter.blockWithTransactions(block);
2078
+ blockWithTxs.transactions = blockWithTxs.transactions.map(function (tx) { return _this._wrapTransaction(tx); });
2079
+ return [2 /*return*/, blockWithTxs];
2080
+ case 8: return [2 /*return*/, this.formatter.block(block)];
2081
+ }
2082
+ });
2083
+ }); }, { oncePoll: this })];
2084
+ }
2085
+ });
2086
+ });
2087
+ };
2088
+ BaseProvider.prototype.getBlock = function (blockHashOrBlockTag) {
2089
+ return (this._getBlock(blockHashOrBlockTag, false));
2090
+ };
2091
+ BaseProvider.prototype.getBlockWithTransactions = function (blockHashOrBlockTag) {
2092
+ return (this._getBlock(blockHashOrBlockTag, true));
2093
+ };
2094
+ BaseProvider.prototype.getTransaction = function (transactionHash) {
2095
+ return __awaiter(this, void 0, void 0, function () {
2096
+ var params;
2097
+ var _this = this;
2098
+ return __generator(this, function (_a) {
2099
+ switch (_a.label) {
2100
+ case 0: return [4 /*yield*/, this.getNetwork()];
2101
+ case 1:
2102
+ _a.sent();
2103
+ return [4 /*yield*/, transactionHash];
2104
+ case 2:
2105
+ transactionHash = _a.sent();
2106
+ params = { transactionHash: this.formatter.hash(transactionHash, true) };
2107
+ return [2 /*return*/, (0, web_1.poll)(function () { return __awaiter(_this, void 0, void 0, function () {
2108
+ var result, tx, blockNumber, confirmations;
2109
+ return __generator(this, function (_a) {
2110
+ switch (_a.label) {
2111
+ case 0: return [4 /*yield*/, this.perform("getTransaction", params)];
2112
+ case 1:
2113
+ result = _a.sent();
2114
+ if (result == null) {
2115
+ if (this._emitted["t:" + transactionHash] == null) {
2116
+ return [2 /*return*/, null];
2117
+ }
2118
+ return [2 /*return*/, undefined];
2119
+ }
2120
+ tx = this.formatter.transactionResponse(result);
2121
+ if (!(tx.blockNumber == null)) return [3 /*break*/, 2];
2122
+ tx.confirmations = 0;
2123
+ return [3 /*break*/, 4];
2124
+ case 2:
2125
+ if (!(tx.confirmations == null)) return [3 /*break*/, 4];
2126
+ return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];
2127
+ case 3:
2128
+ blockNumber = _a.sent();
2129
+ confirmations = (blockNumber - tx.blockNumber) + 1;
2130
+ if (confirmations <= 0) {
2131
+ confirmations = 1;
2132
+ }
2133
+ tx.confirmations = confirmations;
2134
+ _a.label = 4;
2135
+ case 4: return [2 /*return*/, this._wrapTransaction(tx)];
2136
+ }
2137
+ });
2138
+ }); }, { oncePoll: this })];
2139
+ }
2140
+ });
2141
+ });
2142
+ };
2143
+ BaseProvider.prototype.getTransactionReceipt = function (transactionHash) {
2144
+ return __awaiter(this, void 0, void 0, function () {
2145
+ var params;
2146
+ var _this = this;
2147
+ return __generator(this, function (_a) {
2148
+ switch (_a.label) {
2149
+ case 0: return [4 /*yield*/, this.getNetwork()];
2150
+ case 1:
2151
+ _a.sent();
2152
+ return [4 /*yield*/, transactionHash];
2153
+ case 2:
2154
+ transactionHash = _a.sent();
2155
+ params = { transactionHash: this.formatter.hash(transactionHash, true) };
2156
+ return [2 /*return*/, (0, web_1.poll)(function () { return __awaiter(_this, void 0, void 0, function () {
2157
+ var result, receipt, blockNumber, confirmations;
2158
+ return __generator(this, function (_a) {
2159
+ switch (_a.label) {
2160
+ case 0: return [4 /*yield*/, this.perform("getTransactionReceipt", params)];
2161
+ case 1:
2162
+ result = _a.sent();
2163
+ if (result == null) {
2164
+ if (this._emitted["t:" + transactionHash] == null) {
2165
+ return [2 /*return*/, null];
2166
+ }
2167
+ return [2 /*return*/, undefined];
2168
+ }
2169
+ // "geth-etc" returns receipts before they are ready
2170
+ if (result.blockHash == null) {
2171
+ return [2 /*return*/, undefined];
2172
+ }
2173
+ receipt = this.formatter.receipt(result);
2174
+ if (!(receipt.blockNumber == null)) return [3 /*break*/, 2];
2175
+ receipt.confirmations = 0;
2176
+ return [3 /*break*/, 4];
2177
+ case 2:
2178
+ if (!(receipt.confirmations == null)) return [3 /*break*/, 4];
2179
+ return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];
2180
+ case 3:
2181
+ blockNumber = _a.sent();
2182
+ confirmations = (blockNumber - receipt.blockNumber) + 1;
2183
+ if (confirmations <= 0) {
2184
+ confirmations = 1;
2185
+ }
2186
+ receipt.confirmations = confirmations;
2187
+ _a.label = 4;
2188
+ case 4: return [2 /*return*/, receipt];
2189
+ }
2190
+ });
2191
+ }); }, { oncePoll: this })];
2192
+ }
2193
+ });
2194
+ });
2195
+ };
2196
+ BaseProvider.prototype.getLogs = function (filter) {
2197
+ return __awaiter(this, void 0, void 0, function () {
2198
+ var params, logs;
2199
+ return __generator(this, function (_a) {
2200
+ switch (_a.label) {
2201
+ case 0: return [4 /*yield*/, this.getNetwork()];
2202
+ case 1:
2203
+ _a.sent();
2204
+ return [4 /*yield*/, (0, properties_1.resolveProperties)({ filter: this._getFilter(filter) })];
2205
+ case 2:
2206
+ params = _a.sent();
2207
+ return [4 /*yield*/, this.perform("getLogs", params)];
2208
+ case 3:
2209
+ logs = _a.sent();
2210
+ logs.forEach(function (log) {
2211
+ if (log.removed == null) {
2212
+ log.removed = false;
2213
+ }
2214
+ });
2215
+ return [2 /*return*/, formatter_1.Formatter.arrayOf(this.formatter.filterLog.bind(this.formatter))(logs)];
2216
+ }
2217
+ });
2218
+ });
2219
+ };
2220
+ BaseProvider.prototype.getEtherPrice = function () {
2221
+ return __awaiter(this, void 0, void 0, function () {
2222
+ return __generator(this, function (_a) {
2223
+ switch (_a.label) {
2224
+ case 0: return [4 /*yield*/, this.getNetwork()];
2225
+ case 1:
2226
+ _a.sent();
2227
+ return [2 /*return*/, this.perform("getEtherPrice", {})];
2228
+ }
2229
+ });
2230
+ });
2231
+ };
2232
+ BaseProvider.prototype._getBlockTag = function (blockTag) {
2233
+ return __awaiter(this, void 0, void 0, function () {
2234
+ var blockNumber;
2235
+ return __generator(this, function (_a) {
2236
+ switch (_a.label) {
2237
+ case 0: return [4 /*yield*/, blockTag];
2238
+ case 1:
2239
+ blockTag = _a.sent();
2240
+ if (!(typeof (blockTag) === "number" && blockTag < 0)) return [3 /*break*/, 3];
2241
+ if (blockTag % 1) {
2242
+ logger.throwArgumentError("invalid BlockTag", "blockTag", blockTag);
2243
+ }
2244
+ return [4 /*yield*/, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];
2245
+ case 2:
2246
+ blockNumber = _a.sent();
2247
+ blockNumber += blockTag;
2248
+ if (blockNumber < 0) {
2249
+ blockNumber = 0;
2250
+ }
2251
+ return [2 /*return*/, this.formatter.blockTag(blockNumber)];
2252
+ case 3: return [2 /*return*/, this.formatter.blockTag(blockTag)];
2253
+ }
2254
+ });
2255
+ });
2256
+ };
2257
+ BaseProvider.prototype.getResolver = function (name) {
2258
+ return __awaiter(this, void 0, void 0, function () {
2259
+ var currentName, addr, resolver, _a;
2260
+ return __generator(this, function (_b) {
2261
+ switch (_b.label) {
2262
+ case 0:
2263
+ currentName = name;
2264
+ _b.label = 1;
2265
+ case 1:
2266
+ if (!true) return [3 /*break*/, 6];
2267
+ if (currentName === "" || currentName === ".") {
2268
+ return [2 /*return*/, null];
2269
+ }
2270
+ // Optimization since the eth node cannot change and does
2271
+ // not have a wildcard resolver
2272
+ if (name !== "eth" && currentName === "eth") {
2273
+ return [2 /*return*/, null];
2274
+ }
2275
+ return [4 /*yield*/, this._getResolver(currentName, "getResolver")];
2276
+ case 2:
2277
+ addr = _b.sent();
2278
+ if (!(addr != null)) return [3 /*break*/, 5];
2279
+ resolver = new Resolver(this, addr, name);
2280
+ _a = currentName !== name;
2281
+ if (!_a) return [3 /*break*/, 4];
2282
+ return [4 /*yield*/, resolver.supportsWildcard()];
2283
+ case 3:
2284
+ _a = !(_b.sent());
2285
+ _b.label = 4;
2286
+ case 4:
2287
+ // Legacy resolver found, using EIP-2544 so it isn't safe to use
2288
+ if (_a) {
2289
+ return [2 /*return*/, null];
2290
+ }
2291
+ return [2 /*return*/, resolver];
2292
+ case 5:
2293
+ // Get the parent node
2294
+ currentName = currentName.split(".").slice(1).join(".");
2295
+ return [3 /*break*/, 1];
2296
+ case 6: return [2 /*return*/];
2297
+ }
2298
+ });
2299
+ });
2300
+ };
2301
+ BaseProvider.prototype._getResolver = function (name, operation) {
2302
+ return __awaiter(this, void 0, void 0, function () {
2303
+ var network, addrData, error_10;
2304
+ return __generator(this, function (_a) {
2305
+ switch (_a.label) {
2306
+ case 0:
2307
+ if (operation == null) {
2308
+ operation = "ENS";
2309
+ }
2310
+ return [4 /*yield*/, this.getNetwork()];
2311
+ case 1:
2312
+ network = _a.sent();
2313
+ // No ENS...
2314
+ if (!network.ensAddress) {
2315
+ logger.throwError("network does not support ENS", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: operation, network: network.name });
2316
+ }
2317
+ _a.label = 2;
2318
+ case 2:
2319
+ _a.trys.push([2, 4, , 5]);
2320
+ return [4 /*yield*/, this.call({
2321
+ to: network.ensAddress,
2322
+ data: ("0x0178b8bf" + (0, hash_1.namehash)(name).substring(2))
2323
+ })];
2324
+ case 3:
2325
+ addrData = _a.sent();
2326
+ return [2 /*return*/, this.formatter.callAddress(addrData)];
2327
+ case 4:
2328
+ error_10 = _a.sent();
2329
+ return [3 /*break*/, 5];
2330
+ case 5: return [2 /*return*/, null];
2331
+ }
2332
+ });
2333
+ });
2334
+ };
2335
+ BaseProvider.prototype.resolveName = function (name) {
2336
+ return __awaiter(this, void 0, void 0, function () {
2337
+ var resolver;
2338
+ return __generator(this, function (_a) {
2339
+ switch (_a.label) {
2340
+ case 0: return [4 /*yield*/, name];
2341
+ case 1:
2342
+ name = _a.sent();
2343
+ // If it is already an address, nothing to resolve
2344
+ try {
2345
+ return [2 /*return*/, Promise.resolve(this.formatter.address(name))];
2346
+ }
2347
+ catch (error) {
2348
+ // If is is a hexstring, the address is bad (See #694)
2349
+ if ((0, bytes_1.isHexString)(name)) {
2350
+ throw error;
2351
+ }
2352
+ }
2353
+ if (typeof (name) !== "string") {
2354
+ logger.throwArgumentError("invalid ENS name", "name", name);
2355
+ }
2356
+ return [4 /*yield*/, this.getResolver(name)];
2357
+ case 2:
2358
+ resolver = _a.sent();
2359
+ if (!resolver) {
2360
+ return [2 /*return*/, null];
2361
+ }
2362
+ return [4 /*yield*/, resolver.getAddress()];
2363
+ case 3: return [2 /*return*/, _a.sent()];
2364
+ }
2365
+ });
2366
+ });
2367
+ };
2368
+ BaseProvider.prototype.lookupAddress = function (address) {
2369
+ return __awaiter(this, void 0, void 0, function () {
2370
+ var node, resolverAddr, name, _a, addr;
2371
+ return __generator(this, function (_b) {
2372
+ switch (_b.label) {
2373
+ case 0: return [4 /*yield*/, address];
2374
+ case 1:
2375
+ address = _b.sent();
2376
+ address = this.formatter.address(address);
2377
+ node = address.substring(2).toLowerCase() + ".addr.reverse";
2378
+ return [4 /*yield*/, this._getResolver(node, "lookupAddress")];
2379
+ case 2:
2380
+ resolverAddr = _b.sent();
2381
+ if (resolverAddr == null) {
2382
+ return [2 /*return*/, null];
2383
+ }
2384
+ _a = _parseString;
2385
+ return [4 /*yield*/, this.call({
2386
+ to: resolverAddr,
2387
+ data: ("0x691f3431" + (0, hash_1.namehash)(node).substring(2))
2388
+ })];
2389
+ case 3:
2390
+ name = _a.apply(void 0, [_b.sent(), 0]);
2391
+ return [4 /*yield*/, this.resolveName(name)];
2392
+ case 4:
2393
+ addr = _b.sent();
2394
+ if (addr != address) {
2395
+ return [2 /*return*/, null];
2396
+ }
2397
+ return [2 /*return*/, name];
2398
+ }
2399
+ });
2400
+ });
2401
+ };
2402
+ BaseProvider.prototype.getAvatar = function (nameOrAddress) {
2403
+ return __awaiter(this, void 0, void 0, function () {
2404
+ var resolver, address, node, resolverAddress, avatar_1, error_11, name_1, _a, error_12, avatar;
2405
+ return __generator(this, function (_b) {
2406
+ switch (_b.label) {
2407
+ case 0:
2408
+ resolver = null;
2409
+ if (!(0, bytes_1.isHexString)(nameOrAddress)) return [3 /*break*/, 10];
2410
+ address = this.formatter.address(nameOrAddress);
2411
+ node = address.substring(2).toLowerCase() + ".addr.reverse";
2412
+ return [4 /*yield*/, this._getResolver(node, "getAvatar")];
2413
+ case 1:
2414
+ resolverAddress = _b.sent();
2415
+ if (!resolverAddress) {
2416
+ return [2 /*return*/, null];
2417
+ }
2418
+ // Try resolving the avatar against the addr.reverse resolver
2419
+ resolver = new Resolver(this, resolverAddress, node);
2420
+ _b.label = 2;
2421
+ case 2:
2422
+ _b.trys.push([2, 4, , 5]);
2423
+ return [4 /*yield*/, resolver.getAvatar()];
2424
+ case 3:
2425
+ avatar_1 = _b.sent();
2426
+ if (avatar_1) {
2427
+ return [2 /*return*/, avatar_1.url];
2428
+ }
2429
+ return [3 /*break*/, 5];
2430
+ case 4:
2431
+ error_11 = _b.sent();
2432
+ if (error_11.code !== logger_1.Logger.errors.CALL_EXCEPTION) {
2433
+ throw error_11;
2434
+ }
2435
+ return [3 /*break*/, 5];
2436
+ case 5:
2437
+ _b.trys.push([5, 8, , 9]);
2438
+ _a = _parseString;
2439
+ return [4 /*yield*/, this.call({
2440
+ to: resolverAddress,
2441
+ data: ("0x691f3431" + (0, hash_1.namehash)(node).substring(2))
2442
+ })];
2443
+ case 6:
2444
+ name_1 = _a.apply(void 0, [_b.sent(), 0]);
2445
+ return [4 /*yield*/, this.getResolver(name_1)];
2446
+ case 7:
2447
+ resolver = _b.sent();
2448
+ return [3 /*break*/, 9];
2449
+ case 8:
2450
+ error_12 = _b.sent();
2451
+ if (error_12.code !== logger_1.Logger.errors.CALL_EXCEPTION) {
2452
+ throw error_12;
2453
+ }
2454
+ return [2 /*return*/, null];
2455
+ case 9: return [3 /*break*/, 12];
2456
+ case 10: return [4 /*yield*/, this.getResolver(nameOrAddress)];
2457
+ case 11:
2458
+ // ENS name; forward lookup with wildcard
2459
+ resolver = _b.sent();
2460
+ if (!resolver) {
2461
+ return [2 /*return*/, null];
2462
+ }
2463
+ _b.label = 12;
2464
+ case 12: return [4 /*yield*/, resolver.getAvatar()];
2465
+ case 13:
2466
+ avatar = _b.sent();
2467
+ if (avatar == null) {
2468
+ return [2 /*return*/, null];
2469
+ }
2470
+ return [2 /*return*/, avatar.url];
2471
+ }
2472
+ });
2473
+ });
2474
+ };
2475
+ BaseProvider.prototype.perform = function (method, params) {
2476
+ return logger.throwError(method + " not implemented", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method });
2477
+ };
2478
+ BaseProvider.prototype._startEvent = function (event) {
2479
+ this.polling = (this._events.filter(function (e) { return e.pollable(); }).length > 0);
2480
+ };
2481
+ BaseProvider.prototype._stopEvent = function (event) {
2482
+ this.polling = (this._events.filter(function (e) { return e.pollable(); }).length > 0);
2483
+ };
2484
+ BaseProvider.prototype._addEventListener = function (eventName, listener, once) {
2485
+ var event = new Event(getEventTag(eventName), listener, once);
2486
+ this._events.push(event);
2487
+ this._startEvent(event);
2488
+ return this;
2489
+ };
2490
+ BaseProvider.prototype.on = function (eventName, listener) {
2491
+ return this._addEventListener(eventName, listener, false);
2492
+ };
2493
+ BaseProvider.prototype.once = function (eventName, listener) {
2494
+ return this._addEventListener(eventName, listener, true);
2495
+ };
2496
+ BaseProvider.prototype.emit = function (eventName) {
2497
+ var _this = this;
2498
+ var args = [];
2499
+ for (var _i = 1; _i < arguments.length; _i++) {
2500
+ args[_i - 1] = arguments[_i];
2501
+ }
2502
+ var result = false;
2503
+ var stopped = [];
2504
+ var eventTag = getEventTag(eventName);
2505
+ this._events = this._events.filter(function (event) {
2506
+ if (event.tag !== eventTag) {
2507
+ return true;
2508
+ }
2509
+ setTimeout(function () {
2510
+ event.listener.apply(_this, args);
2511
+ }, 0);
2512
+ result = true;
2513
+ if (event.once) {
2514
+ stopped.push(event);
2515
+ return false;
2516
+ }
2517
+ return true;
2518
+ });
2519
+ stopped.forEach(function (event) { _this._stopEvent(event); });
2520
+ return result;
2521
+ };
2522
+ BaseProvider.prototype.listenerCount = function (eventName) {
2523
+ if (!eventName) {
2524
+ return this._events.length;
2525
+ }
2526
+ var eventTag = getEventTag(eventName);
2527
+ return this._events.filter(function (event) {
2528
+ return (event.tag === eventTag);
2529
+ }).length;
2530
+ };
2531
+ BaseProvider.prototype.listeners = function (eventName) {
2532
+ if (eventName == null) {
2533
+ return this._events.map(function (event) { return event.listener; });
2534
+ }
2535
+ var eventTag = getEventTag(eventName);
2536
+ return this._events
2537
+ .filter(function (event) { return (event.tag === eventTag); })
2538
+ .map(function (event) { return event.listener; });
2539
+ };
2540
+ BaseProvider.prototype.off = function (eventName, listener) {
2541
+ var _this = this;
2542
+ if (listener == null) {
2543
+ return this.removeAllListeners(eventName);
2544
+ }
2545
+ var stopped = [];
2546
+ var found = false;
2547
+ var eventTag = getEventTag(eventName);
2548
+ this._events = this._events.filter(function (event) {
2549
+ if (event.tag !== eventTag || event.listener != listener) {
2550
+ return true;
2551
+ }
2552
+ if (found) {
2553
+ return true;
2554
+ }
2555
+ found = true;
2556
+ stopped.push(event);
2557
+ return false;
2558
+ });
2559
+ stopped.forEach(function (event) { _this._stopEvent(event); });
2560
+ return this;
2561
+ };
2562
+ BaseProvider.prototype.removeAllListeners = function (eventName) {
2563
+ var _this = this;
2564
+ var stopped = [];
2565
+ if (eventName == null) {
2566
+ stopped = this._events;
2567
+ this._events = [];
2568
+ }
2569
+ else {
2570
+ var eventTag_1 = getEventTag(eventName);
2571
+ this._events = this._events.filter(function (event) {
2572
+ if (event.tag !== eventTag_1) {
2573
+ return true;
2574
+ }
2575
+ stopped.push(event);
2576
+ return false;
2577
+ });
2578
+ }
2579
+ stopped.forEach(function (event) { _this._stopEvent(event); });
2580
+ return this;
2581
+ };
2582
+ return BaseProvider;
2583
+ }(abstract_provider_1.Provider));
2584
+ exports.BaseProvider = BaseProvider;
2585
+ //# sourceMappingURL=base-provider.js.map