Updated dist files.

This commit is contained in:
Richard Moore 2020-05-04 23:01:04 -04:00
parent 8eeda23e98
commit 7f0374c5a5
No known key found for this signature in database
GPG Key ID: 665176BE8E9DC651
29 changed files with 357 additions and 173 deletions

@ -2,14 +2,20 @@ Changelog
=========
This change log is managed by `scripts/cmds/update-versions` but may be manually updated.
During the v5-BETA, although attempts are made to minimize it, some of the APIs
may change. It is generally recommended that you remove your `node_modules/`,
`package-lock.json` (and similar files for yarn, etc.) and doing an `npm install`
after upgrading to a newer version of the v5-BETA.
ethers/v5.0.0-beta.185 (2020-05-03 21:57)
ethers/v5.0.0-beta.185 (2020-05-04 22:54)
-----------------------------------------
- More robust FallbackProvider on clean exits. ([8eeda23](https://github.com/ethers-io/ethers.js/commit/8eeda23e989fcb0126bd20b17c67f62466d19259))
- Safer test suite reporter timer. ([657a039](https://github.com/ethers-io/ethers.js/commit/657a0394f56b51a13c691477c2b0dcf74678fd7c))
- Added goerli to AlchemyProvider tests. ([ab7c781](https://github.com/ethers-io/ethers.js/commit/ab7c78118ab80990a3e3368749599a1cf6e9d4ae))
- Added more robust poll event to Provider. ([dc48bfb](https://github.com/ethers-io/ethers.js/commit/dc48bfb7adb9334848c93173ba2c634f22a9a72f))
- Added goerli to AlchemyProvider. ([86670eb](https://github.com/ethers-io/ethers.js/commit/86670eb80e96fc4ba4e3664c9389f8130bbfea73))
- Removed Cloudflare from test suite; it is down again. ([17dc022](https://github.com/ethers-io/ethers.js/commit/17dc022603afdfe4147638ab4b2704bcef09533f))
- Prevent forceOutput in test reporter from crashing. ([cafd344](https://github.com/ethers-io/ethers.js/commit/cafd34460b194d78092021f1d7e0307130340b68))
- Stall FallbackProvider backends from requests if not in-sync. ([fa6904f](https://github.com/ethers-io/ethers.js/commit/fa6904fef35e7ab888221f3a0613bfe7e6df3594))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -15963,6 +15963,9 @@ function poll(func, options) {
resolve(result);
}
}
else if (options.oncePoll) {
options.oncePoll.once("poll", check);
}
else if (options.onceBlock) {
options.onceBlock.once("block", check);
// Otherwise, exponential back-off (up to 10s) our next request
@ -16463,6 +16466,7 @@ function getTime() {
/**
* EventType
* - "block"
* - "poll"
* - "pending"
* - "error"
* - filter
@ -16511,7 +16515,7 @@ class Event {
return filter;
}
pollable() {
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending");
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending" || this.tag === "poll");
}
}
let defaultFormatter = null;
@ -16627,8 +16631,11 @@ class BaseProvider extends Provider {
const runners = [];
const blockNumber = yield this._getInternalBlockNumber(100 + this.pollingInterval / 2);
this._setFastBlockNumber(blockNumber);
// Emit a poll event after we have the latest (fast) block number
this.emit("poll", pollId, blockNumber);
// If the block has not changed, meh.
if (blockNumber === this._lastBlockNumber) {
this.emit("didPoll", pollId);
return;
}
// First polling cycle, trigger a "block" events
@ -16721,22 +16728,38 @@ class BaseProvider extends Provider {
return this.ready;
}
get blockNumber() {
return this._fastBlockNumber;
this._getInternalBlockNumber(100 + this.pollingInterval / 2).then((blockNumber) => {
this._setFastBlockNumber(blockNumber);
});
return (this._fastBlockNumber != null) ? this._fastBlockNumber : -1;
}
get polling() {
return (this._poller != null);
}
set polling(value) {
setTimeout(() => {
if (value && !this._poller) {
this._poller = setInterval(this.poll.bind(this), this.pollingInterval);
this.poll();
if (value && !this._poller) {
this._poller = setInterval(this.poll.bind(this), this.pollingInterval);
if (!this._bootstrapPoll) {
this._bootstrapPoll = setTimeout(() => {
this.poll();
// We block additional polls until the polling interval
// is done, to prevent overwhelming the poll function
this._bootstrapPoll = setTimeout(() => {
// If polling was disabled, something may require a poke
// since starting the bootstrap poll and it was disabled
if (!this._poller) {
this.poll();
}
// Clear out the bootstrap so we can do another
this._bootstrapPoll = null;
}, this.pollingInterval);
}, 0);
}
else if (!value && this._poller) {
clearInterval(this._poller);
this._poller = null;
}
}, 0);
}
else if (!value && this._poller) {
clearInterval(this._poller);
this._poller = null;
}
}
get pollingInterval() {
return this._pollingInterval;
@ -17918,6 +17941,9 @@ class AlchemyProvider extends UrlJsonRpcProvider {
case "rinkeby":
host = "eth-rinkeby.alchemyapi.io/jsonrpc/";
break;
case "goerli":
host = "eth-goerli.alchemyapi.io/jsonrpc/";
break;
case "kovan":
host = "eth-kovan.alchemyapi.io/jsonrpc/";
break;
@ -18549,23 +18575,33 @@ function getProcessFunc(provider, method, params) {
}
// If we are doing a blockTag query, we need to make sure the backend is
// caught up to the FallbackProvider, before sending a request to it.
function waitForSync(provider, blockNumber) {
function waitForSync(config, blockNumber) {
return __awaiter$b(this, void 0, void 0, function* () {
const provider = (config.provider);
if ((provider.blockNumber != null && provider.blockNumber >= blockNumber) || blockNumber === -1) {
return provider;
}
return poll(() => {
return provider.getBlockNumber().then((b) => {
if (b >= blockNumber) {
return Provider;
}
return undefined;
return new Promise((resolve, reject) => {
setTimeout(function () {
// We are synced
if (provider.blockNumber >= blockNumber) {
return resolve(Provider);
}
// We're done; just quit
if (config.cancelled) {
return resolve(null);
}
// Try again, next block
return resolve(undefined);
}, 0);
});
}, { onceBlock: provider });
}, { oncePoll: provider });
});
}
function getRunner(provider, currentBlockNumber, method, params) {
function getRunner(config, currentBlockNumber, method, params) {
return __awaiter$b(this, void 0, void 0, function* () {
let provider = config.provider;
switch (method) {
case "getBlockNumber":
case "getGasPrice":
@ -18579,23 +18615,23 @@ function getRunner(provider, currentBlockNumber, method, params) {
case "getTransactionCount":
case "getCode":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider[method](params.address, params.blockTag || "latest");
case "getStorageAt":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider.getStorageAt(params.address, params.position, params.blockTag || "latest");
case "getBlock":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider[(params.includeTransactions ? "getBlockWithTransactions" : "getBlock")](params.blockTag || params.blockHash);
case "call":
case "estimateGas":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider[method](params.transaction);
case "getTransaction":
@ -18604,7 +18640,7 @@ function getRunner(provider, currentBlockNumber, method, params) {
case "getLogs": {
let filter = params.filter;
if ((filter.fromBlock && isHexString(filter.fromBlock)) || (filter.toBlock && isHexString(filter.toBlock))) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider.getLogs(filter);
}
@ -18713,7 +18749,7 @@ class FallbackProvider extends BaseProvider {
config.start = now();
config.staller = stall(config.stallTimeout);
config.staller.wait(() => { config.staller = null; });
config.runner = getRunner((config.provider), currentBlockNumber, method, params).then((result) => {
config.runner = getRunner(config, currentBlockNumber, method, params).then((result) => {
config.done = true;
config.result = result;
if (this.listenerCount("debug")) {
@ -18770,7 +18806,12 @@ class FallbackProvider extends BaseProvider {
const result = processFunc(results);
if (result !== undefined) {
// Shut down any stallers
configs.filter(c => c.staller).forEach(c => c.staller.cancel());
configs.forEach(c => {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return result;
}
if (!first) {
@ -18784,7 +18825,12 @@ class FallbackProvider extends BaseProvider {
}
}
// Shut down any stallers; shouldn't be any
configs.filter(c => c.staller).forEach(c => c.staller.cancel());
configs.forEach(c => {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return logger$x.throwError("failed to meet quorum", Logger.errors.SERVER_ERROR, {
method: method,
params: params,

File diff suppressed because one or more lines are too long

@ -17705,6 +17705,9 @@
resolve(result);
}
}
else if (options.oncePoll) {
options.oncePoll.once("poll", check);
}
else if (options.onceBlock) {
options.onceBlock.once("block", check);
// Otherwise, exponential back-off (up to 10s) our next request
@ -18290,6 +18293,7 @@
/**
* EventType
* - "block"
* - "poll"
* - "pending"
* - "error"
* - filter
@ -18354,7 +18358,7 @@
configurable: true
});
Event.prototype.pollable = function () {
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending");
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending" || this.tag === "poll");
};
return Event;
}());
@ -18514,8 +18518,11 @@
case 1:
blockNumber = _a.sent();
this._setFastBlockNumber(blockNumber);
// Emit a poll event after we have the latest (fast) block number
this.emit("poll", pollId, blockNumber);
// If the block has not changed, meh.
if (blockNumber === this._lastBlockNumber) {
this.emit("didPoll", pollId);
return [2 /*return*/];
}
// First polling cycle, trigger a "block" events
@ -18615,7 +18622,11 @@
};
Object.defineProperty(BaseProvider.prototype, "blockNumber", {
get: function () {
return this._fastBlockNumber;
var _this = this;
this._getInternalBlockNumber(100 + this.pollingInterval / 2).then(function (blockNumber) {
_this._setFastBlockNumber(blockNumber);
});
return (this._fastBlockNumber != null) ? this._fastBlockNumber : -1;
},
enumerable: true,
configurable: true
@ -18626,16 +18637,29 @@
},
set: function (value) {
var _this = this;
setTimeout(function () {
if (value && !_this._poller) {
_this._poller = setInterval(_this.poll.bind(_this), _this.pollingInterval);
_this.poll();
if (value && !this._poller) {
this._poller = setInterval(this.poll.bind(this), this.pollingInterval);
if (!this._bootstrapPoll) {
this._bootstrapPoll = setTimeout(function () {
_this.poll();
// We block additional polls until the polling interval
// is done, to prevent overwhelming the poll function
_this._bootstrapPoll = setTimeout(function () {
// If polling was disabled, something may require a poke
// since starting the bootstrap poll and it was disabled
if (!_this._poller) {
_this.poll();
}
// Clear out the bootstrap so we can do another
_this._bootstrapPoll = null;
}, _this.pollingInterval);
}, 0);
}
else if (!value && _this._poller) {
clearInterval(_this._poller);
_this._poller = null;
}
}, 0);
}
else if (!value && this._poller) {
clearInterval(this._poller);
this._poller = null;
}
},
enumerable: true,
configurable: true
@ -20279,6 +20303,9 @@
case "rinkeby":
host = "eth-rinkeby.alchemyapi.io/jsonrpc/";
break;
case "goerli":
host = "eth-goerli.alchemyapi.io/jsonrpc/";
break;
case "kovan":
host = "eth-kovan.alchemyapi.io/jsonrpc/";
break;
@ -21126,29 +21153,40 @@
}
// If we are doing a blockTag query, we need to make sure the backend is
// caught up to the FallbackProvider, before sending a request to it.
function waitForSync(provider, blockNumber) {
function waitForSync(config, blockNumber) {
return __awaiter(this, void 0, void 0, function () {
var provider;
return __generator(this, function (_a) {
provider = (config.provider);
if ((provider.blockNumber != null && provider.blockNumber >= blockNumber) || blockNumber === -1) {
return [2 /*return*/, provider];
}
return [2 /*return*/, lib$l.poll(function () {
return provider.getBlockNumber().then(function (b) {
if (b >= blockNumber) {
return lib$b.Provider;
}
return undefined;
return new Promise(function (resolve, reject) {
setTimeout(function () {
// We are synced
if (provider.blockNumber >= blockNumber) {
return resolve(lib$b.Provider);
}
// We're done; just quit
if (config.cancelled) {
return resolve(null);
}
// Try again, next block
return resolve(undefined);
}, 0);
});
}, { onceBlock: provider })];
}, { oncePoll: provider })];
});
});
}
function getRunner(provider, currentBlockNumber, method, params) {
function getRunner(config, currentBlockNumber, method, params) {
return __awaiter(this, void 0, void 0, function () {
var _a, filter;
var provider, _a, filter;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
provider = config.provider;
_a = method;
switch (_a) {
case "getBlockNumber": return [3 /*break*/, 1];
@ -21174,28 +21212,28 @@
return [3 /*break*/, 19];
case 3:
if (!(params.blockTag && lib$1.isHexString(params.blockTag))) return [3 /*break*/, 5];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 4:
provider = _b.sent();
_b.label = 5;
case 5: return [2 /*return*/, provider[method](params.address, params.blockTag || "latest")];
case 6:
if (!(params.blockTag && lib$1.isHexString(params.blockTag))) return [3 /*break*/, 8];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 7:
provider = _b.sent();
_b.label = 8;
case 8: return [2 /*return*/, provider.getStorageAt(params.address, params.position, params.blockTag || "latest")];
case 9:
if (!(params.blockTag && lib$1.isHexString(params.blockTag))) return [3 /*break*/, 11];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 10:
provider = _b.sent();
_b.label = 11;
case 11: return [2 /*return*/, provider[(params.includeTransactions ? "getBlockWithTransactions" : "getBlock")](params.blockTag || params.blockHash)];
case 12:
if (!(params.blockTag && lib$1.isHexString(params.blockTag))) return [3 /*break*/, 14];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 13:
provider = _b.sent();
_b.label = 14;
@ -21204,7 +21242,7 @@
case 16:
filter = params.filter;
if (!((filter.fromBlock && lib$1.isHexString(filter.fromBlock)) || (filter.toBlock && lib$1.isHexString(filter.toBlock)))) return [3 /*break*/, 18];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 17:
provider = _b.sent();
_b.label = 18;
@ -21333,7 +21371,7 @@
config.start = now();
config.staller = stall(config.stallTimeout);
config.staller.wait(function () { config.staller = null; });
config.runner = getRunner((config.provider), currentBlockNumber, method, params).then(function (result) {
config.runner = getRunner(config, currentBlockNumber, method, params).then(function (result) {
config.done = true;
config.result = result;
if (_this.listenerCount("debug")) {
@ -21394,7 +21432,12 @@
result = processFunc(results);
if (result !== undefined) {
// Shut down any stallers
configs.filter(function (c) { return c.staller; }).forEach(function (c) { return c.staller.cancel(); });
configs.forEach(function (c) {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return [2 /*return*/, { value: result }];
}
if (!!first) return [3 /*break*/, 4];
@ -21428,7 +21471,12 @@
return [3 /*break*/, 5];
case 7:
// Shut down any stallers; shouldn't be any
configs.filter(function (c) { return c.staller; }).forEach(function (c) { return c.staller.cancel(); });
configs.forEach(function (c) {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return [2 /*return*/, logger.throwError("failed to meet quorum", lib.Logger.errors.SERVER_ERROR, {
method: method,
params: params,

File diff suppressed because one or more lines are too long

@ -26,5 +26,5 @@ import { Bytes, BytesLike, Hexable } from "@ethersproject/bytes";
import { Mnemonic } from "@ethersproject/hdnode";
import { EncryptOptions, ProgressCallback } from "@ethersproject/json-wallets";
import { Utf8ErrorFunc } from "@ethersproject/strings";
import { ConnectionInfo, FetchJsonResponse, OnceBlockable, PollOptions } from "@ethersproject/web";
export { AbiCoder, defaultAbiCoder, Fragment, EventFragment, FunctionFragment, ParamType, FormatTypes, checkResultErrors, Result, Logger, RLP, fetchJson, poll, checkProperties, deepCopy, defineReadOnly, getStatic, resolveProperties, shallowCopy, arrayify, concat, stripZeros, zeroPad, isBytes, isBytesLike, defaultPath, HDNode, SigningKey, Interface, base64, hexlify, isHexString, hexStripZeros, hexValue, hexZeroPad, hexDataLength, hexDataSlice, nameprep, _toEscapedUtf8String, toUtf8Bytes, toUtf8CodePoints, toUtf8String, Utf8ErrorFuncs, formatBytes32String, parseBytes32String, hashMessage, namehash, isValidName, id, getAddress, getIcapAddress, getContractAddress, getCreate2Address, isAddress, formatEther, parseEther, formatUnits, parseUnits, commify, computeHmac, keccak256, ripemd160, sha256, sha512, randomBytes, shuffled, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, recoverAddress, computePublicKey, recoverPublicKey, verifyMessage, mnemonicToEntropy, entropyToMnemonic, isValidMnemonic, mnemonicToSeed, SupportedAlgorithm, UnicodeNormalizationForm, Utf8ErrorReason, Bytes, BytesLike, Hexable, UnsignedTransaction, CoerceFunc, Indexed, Mnemonic, Utf8ErrorFunc, ConnectionInfo, OnceBlockable, PollOptions, FetchJsonResponse, EncryptOptions, ProgressCallback };
import { ConnectionInfo, FetchJsonResponse, OnceBlockable, OncePollable, PollOptions } from "@ethersproject/web";
export { AbiCoder, defaultAbiCoder, Fragment, EventFragment, FunctionFragment, ParamType, FormatTypes, checkResultErrors, Result, Logger, RLP, fetchJson, poll, checkProperties, deepCopy, defineReadOnly, getStatic, resolveProperties, shallowCopy, arrayify, concat, stripZeros, zeroPad, isBytes, isBytesLike, defaultPath, HDNode, SigningKey, Interface, base64, hexlify, isHexString, hexStripZeros, hexValue, hexZeroPad, hexDataLength, hexDataSlice, nameprep, _toEscapedUtf8String, toUtf8Bytes, toUtf8CodePoints, toUtf8String, Utf8ErrorFuncs, formatBytes32String, parseBytes32String, hashMessage, namehash, isValidName, id, getAddress, getIcapAddress, getContractAddress, getCreate2Address, isAddress, formatEther, parseEther, formatUnits, parseUnits, commify, computeHmac, keccak256, ripemd160, sha256, sha512, randomBytes, shuffled, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, recoverAddress, computePublicKey, recoverPublicKey, verifyMessage, mnemonicToEntropy, entropyToMnemonic, isValidMnemonic, mnemonicToSeed, SupportedAlgorithm, UnicodeNormalizationForm, Utf8ErrorReason, Bytes, BytesLike, Hexable, UnsignedTransaction, CoerceFunc, Indexed, Mnemonic, Utf8ErrorFunc, ConnectionInfo, OnceBlockable, OncePollable, PollOptions, FetchJsonResponse, EncryptOptions, ProgressCallback };

@ -26,5 +26,5 @@ import { Bytes, BytesLike, Hexable } from "@ethersproject/bytes";
import { Mnemonic } from "@ethersproject/hdnode";
import { EncryptOptions, ProgressCallback } from "@ethersproject/json-wallets";
import { Utf8ErrorFunc } from "@ethersproject/strings";
import { ConnectionInfo, FetchJsonResponse, OnceBlockable, PollOptions } from "@ethersproject/web";
export { AbiCoder, defaultAbiCoder, Fragment, EventFragment, FunctionFragment, ParamType, FormatTypes, checkResultErrors, Result, Logger, RLP, fetchJson, poll, checkProperties, deepCopy, defineReadOnly, getStatic, resolveProperties, shallowCopy, arrayify, concat, stripZeros, zeroPad, isBytes, isBytesLike, defaultPath, HDNode, SigningKey, Interface, base64, hexlify, isHexString, hexStripZeros, hexValue, hexZeroPad, hexDataLength, hexDataSlice, nameprep, _toEscapedUtf8String, toUtf8Bytes, toUtf8CodePoints, toUtf8String, Utf8ErrorFuncs, formatBytes32String, parseBytes32String, hashMessage, namehash, isValidName, id, getAddress, getIcapAddress, getContractAddress, getCreate2Address, isAddress, formatEther, parseEther, formatUnits, parseUnits, commify, computeHmac, keccak256, ripemd160, sha256, sha512, randomBytes, shuffled, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, recoverAddress, computePublicKey, recoverPublicKey, verifyMessage, mnemonicToEntropy, entropyToMnemonic, isValidMnemonic, mnemonicToSeed, SupportedAlgorithm, UnicodeNormalizationForm, Utf8ErrorReason, Bytes, BytesLike, Hexable, UnsignedTransaction, CoerceFunc, Indexed, Mnemonic, Utf8ErrorFunc, ConnectionInfo, OnceBlockable, PollOptions, FetchJsonResponse, EncryptOptions, ProgressCallback };
import { ConnectionInfo, FetchJsonResponse, OnceBlockable, OncePollable, PollOptions } from "@ethersproject/web";
export { AbiCoder, defaultAbiCoder, Fragment, EventFragment, FunctionFragment, ParamType, FormatTypes, checkResultErrors, Result, Logger, RLP, fetchJson, poll, checkProperties, deepCopy, defineReadOnly, getStatic, resolveProperties, shallowCopy, arrayify, concat, stripZeros, zeroPad, isBytes, isBytesLike, defaultPath, HDNode, SigningKey, Interface, base64, hexlify, isHexString, hexStripZeros, hexValue, hexZeroPad, hexDataLength, hexDataSlice, nameprep, _toEscapedUtf8String, toUtf8Bytes, toUtf8CodePoints, toUtf8String, Utf8ErrorFuncs, formatBytes32String, parseBytes32String, hashMessage, namehash, isValidName, id, getAddress, getIcapAddress, getContractAddress, getCreate2Address, isAddress, formatEther, parseEther, formatUnits, parseUnits, commify, computeHmac, keccak256, ripemd160, sha256, sha512, randomBytes, shuffled, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, recoverAddress, computePublicKey, recoverPublicKey, verifyMessage, mnemonicToEntropy, entropyToMnemonic, isValidMnemonic, mnemonicToSeed, SupportedAlgorithm, UnicodeNormalizationForm, Utf8ErrorReason, Bytes, BytesLike, Hexable, UnsignedTransaction, CoerceFunc, Indexed, Mnemonic, Utf8ErrorFunc, ConnectionInfo, OnceBlockable, OncePollable, PollOptions, FetchJsonResponse, EncryptOptions, ProgressCallback };

@ -52,7 +52,7 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"tarballHash": "0xee6633babeaf42a27299a2d3d14780efecf6fbe4cee7681493f807d71055d759",
"tarballHash": "0xfaa41aecf50c97b6d1560bf37604bb05359cd0d8a6f1f2be70ddf55156acef60",
"types": "./lib/index.d.ts",
"version": "5.0.0-beta.185"
}

@ -30,6 +30,9 @@ export class AlchemyProvider extends UrlJsonRpcProvider {
case "rinkeby":
host = "eth-rinkeby.alchemyapi.io/jsonrpc/";
break;
case "goerli":
host = "eth-goerli.alchemyapi.io/jsonrpc/";
break;
case "kovan":
host = "eth-kovan.alchemyapi.io/jsonrpc/";
break;

@ -7,6 +7,7 @@ import { Formatter } from "./formatter";
/**
* EventType
* - "block"
* - "poll"
* - "pending"
* - "error"
* - filter
@ -34,6 +35,7 @@ export declare class BaseProvider extends Provider {
};
_pollingInterval: number;
_poller: NodeJS.Timer;
_bootstrapPoll: NodeJS.Timer;
_lastBlockNumber: number;
_fastBlockNumber: number;
_fastBlockNumberPromise: Promise<number>;

@ -100,6 +100,7 @@ function getTime() {
/**
* EventType
* - "block"
* - "poll"
* - "pending"
* - "error"
* - filter
@ -148,7 +149,7 @@ export class Event {
return filter;
}
pollable() {
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending");
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending" || this.tag === "poll");
}
}
let defaultFormatter = null;
@ -264,8 +265,11 @@ export class BaseProvider extends Provider {
const runners = [];
const blockNumber = yield this._getInternalBlockNumber(100 + this.pollingInterval / 2);
this._setFastBlockNumber(blockNumber);
// Emit a poll event after we have the latest (fast) block number
this.emit("poll", pollId, blockNumber);
// If the block has not changed, meh.
if (blockNumber === this._lastBlockNumber) {
this.emit("didPoll", pollId);
return;
}
// First polling cycle, trigger a "block" events
@ -358,22 +362,38 @@ export class BaseProvider extends Provider {
return this.ready;
}
get blockNumber() {
return this._fastBlockNumber;
this._getInternalBlockNumber(100 + this.pollingInterval / 2).then((blockNumber) => {
this._setFastBlockNumber(blockNumber);
});
return (this._fastBlockNumber != null) ? this._fastBlockNumber : -1;
}
get polling() {
return (this._poller != null);
}
set polling(value) {
setTimeout(() => {
if (value && !this._poller) {
this._poller = setInterval(this.poll.bind(this), this.pollingInterval);
this.poll();
if (value && !this._poller) {
this._poller = setInterval(this.poll.bind(this), this.pollingInterval);
if (!this._bootstrapPoll) {
this._bootstrapPoll = setTimeout(() => {
this.poll();
// We block additional polls until the polling interval
// is done, to prevent overwhelming the poll function
this._bootstrapPoll = setTimeout(() => {
// If polling was disabled, something may require a poke
// since starting the bootstrap poll and it was disabled
if (!this._poller) {
this.poll();
}
// Clear out the bootstrap so we can do another
this._bootstrapPoll = null;
}, this.pollingInterval);
}, 0);
}
else if (!value && this._poller) {
clearInterval(this._poller);
this._poller = null;
}
}, 0);
}
else if (!value && this._poller) {
clearInterval(this._poller);
this._poller = null;
}
}
get pollingInterval() {
return this._pollingInterval;

@ -255,23 +255,33 @@ function getProcessFunc(provider, method, params) {
}
// If we are doing a blockTag query, we need to make sure the backend is
// caught up to the FallbackProvider, before sending a request to it.
function waitForSync(provider, blockNumber) {
function waitForSync(config, blockNumber) {
return __awaiter(this, void 0, void 0, function* () {
const provider = (config.provider);
if ((provider.blockNumber != null && provider.blockNumber >= blockNumber) || blockNumber === -1) {
return provider;
}
return poll(() => {
return provider.getBlockNumber().then((b) => {
if (b >= blockNumber) {
return Provider;
}
return undefined;
return new Promise((resolve, reject) => {
setTimeout(function () {
// We are synced
if (provider.blockNumber >= blockNumber) {
return resolve(Provider);
}
// We're done; just quit
if (config.cancelled) {
return resolve(null);
}
// Try again, next block
return resolve(undefined);
}, 0);
});
}, { onceBlock: provider });
}, { oncePoll: provider });
});
}
function getRunner(provider, currentBlockNumber, method, params) {
function getRunner(config, currentBlockNumber, method, params) {
return __awaiter(this, void 0, void 0, function* () {
let provider = config.provider;
switch (method) {
case "getBlockNumber":
case "getGasPrice":
@ -285,23 +295,23 @@ function getRunner(provider, currentBlockNumber, method, params) {
case "getTransactionCount":
case "getCode":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider[method](params.address, params.blockTag || "latest");
case "getStorageAt":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider.getStorageAt(params.address, params.position, params.blockTag || "latest");
case "getBlock":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider[(params.includeTransactions ? "getBlockWithTransactions" : "getBlock")](params.blockTag || params.blockHash);
case "call":
case "estimateGas":
if (params.blockTag && isHexString(params.blockTag)) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider[method](params.transaction);
case "getTransaction":
@ -310,7 +320,7 @@ function getRunner(provider, currentBlockNumber, method, params) {
case "getLogs": {
let filter = params.filter;
if ((filter.fromBlock && isHexString(filter.fromBlock)) || (filter.toBlock && isHexString(filter.toBlock))) {
provider = yield waitForSync(provider, currentBlockNumber);
provider = yield waitForSync(config, currentBlockNumber);
}
return provider.getLogs(filter);
}
@ -419,7 +429,7 @@ export class FallbackProvider extends BaseProvider {
config.start = now();
config.staller = stall(config.stallTimeout);
config.staller.wait(() => { config.staller = null; });
config.runner = getRunner((config.provider), currentBlockNumber, method, params).then((result) => {
config.runner = getRunner(config, currentBlockNumber, method, params).then((result) => {
config.done = true;
config.result = result;
if (this.listenerCount("debug")) {
@ -476,7 +486,12 @@ export class FallbackProvider extends BaseProvider {
const result = processFunc(results);
if (result !== undefined) {
// Shut down any stallers
configs.filter(c => c.staller).forEach(c => c.staller.cancel());
configs.forEach(c => {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return result;
}
if (!first) {
@ -490,7 +505,12 @@ export class FallbackProvider extends BaseProvider {
}
}
// Shut down any stallers; shouldn't be any
configs.filter(c => c.staller).forEach(c => c.staller.cancel());
configs.forEach(c => {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return logger.throwError("failed to meet quorum", Logger.errors.SERVER_ERROR, {
method: method,
params: params,

@ -48,6 +48,9 @@ var AlchemyProvider = /** @class */ (function (_super) {
case "rinkeby":
host = "eth-rinkeby.alchemyapi.io/jsonrpc/";
break;
case "goerli":
host = "eth-goerli.alchemyapi.io/jsonrpc/";
break;
case "kovan":
host = "eth-kovan.alchemyapi.io/jsonrpc/";
break;

@ -7,6 +7,7 @@ import { Formatter } from "./formatter";
/**
* EventType
* - "block"
* - "poll"
* - "pending"
* - "error"
* - filter
@ -34,6 +35,7 @@ export declare class BaseProvider extends Provider {
};
_pollingInterval: number;
_poller: NodeJS.Timer;
_bootstrapPoll: NodeJS.Timer;
_lastBlockNumber: number;
_fastBlockNumber: number;
_fastBlockNumberPromise: Promise<number>;

@ -141,6 +141,7 @@ function getTime() {
/**
* EventType
* - "block"
* - "poll"
* - "pending"
* - "error"
* - filter
@ -205,7 +206,7 @@ var Event = /** @class */ (function () {
configurable: true
});
Event.prototype.pollable = function () {
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending");
return (this.tag.indexOf(":") >= 0 || this.tag === "block" || this.tag === "pending" || this.tag === "poll");
};
return Event;
}());
@ -365,8 +366,11 @@ var BaseProvider = /** @class */ (function (_super) {
case 1:
blockNumber = _a.sent();
this._setFastBlockNumber(blockNumber);
// Emit a poll event after we have the latest (fast) block number
this.emit("poll", pollId, blockNumber);
// If the block has not changed, meh.
if (blockNumber === this._lastBlockNumber) {
this.emit("didPoll", pollId);
return [2 /*return*/];
}
// First polling cycle, trigger a "block" events
@ -466,7 +470,11 @@ var BaseProvider = /** @class */ (function (_super) {
};
Object.defineProperty(BaseProvider.prototype, "blockNumber", {
get: function () {
return this._fastBlockNumber;
var _this = this;
this._getInternalBlockNumber(100 + this.pollingInterval / 2).then(function (blockNumber) {
_this._setFastBlockNumber(blockNumber);
});
return (this._fastBlockNumber != null) ? this._fastBlockNumber : -1;
},
enumerable: true,
configurable: true
@ -477,16 +485,29 @@ var BaseProvider = /** @class */ (function (_super) {
},
set: function (value) {
var _this = this;
setTimeout(function () {
if (value && !_this._poller) {
_this._poller = setInterval(_this.poll.bind(_this), _this.pollingInterval);
_this.poll();
if (value && !this._poller) {
this._poller = setInterval(this.poll.bind(this), this.pollingInterval);
if (!this._bootstrapPoll) {
this._bootstrapPoll = setTimeout(function () {
_this.poll();
// We block additional polls until the polling interval
// is done, to prevent overwhelming the poll function
_this._bootstrapPoll = setTimeout(function () {
// If polling was disabled, something may require a poke
// since starting the bootstrap poll and it was disabled
if (!_this._poller) {
_this.poll();
}
// Clear out the bootstrap so we can do another
_this._bootstrapPoll = null;
}, _this.pollingInterval);
}, 0);
}
else if (!value && _this._poller) {
clearInterval(_this._poller);
_this._poller = null;
}
}, 0);
}
else if (!value && this._poller) {
clearInterval(this._poller);
this._poller = null;
}
},
enumerable: true,
configurable: true

@ -296,29 +296,40 @@ function getProcessFunc(provider, method, params) {
}
// If we are doing a blockTag query, we need to make sure the backend is
// caught up to the FallbackProvider, before sending a request to it.
function waitForSync(provider, blockNumber) {
function waitForSync(config, blockNumber) {
return __awaiter(this, void 0, void 0, function () {
var provider;
return __generator(this, function (_a) {
provider = (config.provider);
if ((provider.blockNumber != null && provider.blockNumber >= blockNumber) || blockNumber === -1) {
return [2 /*return*/, provider];
}
return [2 /*return*/, web_1.poll(function () {
return provider.getBlockNumber().then(function (b) {
if (b >= blockNumber) {
return abstract_provider_1.Provider;
}
return undefined;
return new Promise(function (resolve, reject) {
setTimeout(function () {
// We are synced
if (provider.blockNumber >= blockNumber) {
return resolve(abstract_provider_1.Provider);
}
// We're done; just quit
if (config.cancelled) {
return resolve(null);
}
// Try again, next block
return resolve(undefined);
}, 0);
});
}, { onceBlock: provider })];
}, { oncePoll: provider })];
});
});
}
function getRunner(provider, currentBlockNumber, method, params) {
function getRunner(config, currentBlockNumber, method, params) {
return __awaiter(this, void 0, void 0, function () {
var _a, filter;
var provider, _a, filter;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
provider = config.provider;
_a = method;
switch (_a) {
case "getBlockNumber": return [3 /*break*/, 1];
@ -344,28 +355,28 @@ function getRunner(provider, currentBlockNumber, method, params) {
return [3 /*break*/, 19];
case 3:
if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 5];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 4:
provider = _b.sent();
_b.label = 5;
case 5: return [2 /*return*/, provider[method](params.address, params.blockTag || "latest")];
case 6:
if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 8];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 7:
provider = _b.sent();
_b.label = 8;
case 8: return [2 /*return*/, provider.getStorageAt(params.address, params.position, params.blockTag || "latest")];
case 9:
if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 11];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 10:
provider = _b.sent();
_b.label = 11;
case 11: return [2 /*return*/, provider[(params.includeTransactions ? "getBlockWithTransactions" : "getBlock")](params.blockTag || params.blockHash)];
case 12:
if (!(params.blockTag && bytes_1.isHexString(params.blockTag))) return [3 /*break*/, 14];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 13:
provider = _b.sent();
_b.label = 14;
@ -374,7 +385,7 @@ function getRunner(provider, currentBlockNumber, method, params) {
case 16:
filter = params.filter;
if (!((filter.fromBlock && bytes_1.isHexString(filter.fromBlock)) || (filter.toBlock && bytes_1.isHexString(filter.toBlock)))) return [3 /*break*/, 18];
return [4 /*yield*/, waitForSync(provider, currentBlockNumber)];
return [4 /*yield*/, waitForSync(config, currentBlockNumber)];
case 17:
provider = _b.sent();
_b.label = 18;
@ -503,7 +514,7 @@ var FallbackProvider = /** @class */ (function (_super) {
config.start = now();
config.staller = stall(config.stallTimeout);
config.staller.wait(function () { config.staller = null; });
config.runner = getRunner((config.provider), currentBlockNumber, method, params).then(function (result) {
config.runner = getRunner(config, currentBlockNumber, method, params).then(function (result) {
config.done = true;
config.result = result;
if (_this.listenerCount("debug")) {
@ -564,7 +575,12 @@ var FallbackProvider = /** @class */ (function (_super) {
result = processFunc(results);
if (result !== undefined) {
// Shut down any stallers
configs.filter(function (c) { return c.staller; }).forEach(function (c) { return c.staller.cancel(); });
configs.forEach(function (c) {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return [2 /*return*/, { value: result }];
}
if (!!first) return [3 /*break*/, 4];
@ -598,7 +614,12 @@ var FallbackProvider = /** @class */ (function (_super) {
return [3 /*break*/, 5];
case 7:
// Shut down any stallers; shouldn't be any
configs.filter(function (c) { return c.staller; }).forEach(function (c) { return c.staller.cancel(); });
configs.forEach(function (c) {
if (c.staller) {
c.staller.cancel();
}
c.cancelled = true;
});
return [2 /*return*/, logger.throwError("failed to meet quorum", logger_1.Logger.errors.SERVER_ERROR, {
method: method,
params: params,

@ -56,7 +56,7 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"tarballHash": "0x8af51f5043e8b3d30f54fbe3b0b010949bb211324d6eaef0f89354cacf9de4b5",
"tarballHash": "0x37c5f15bcb70eac5b469a51a292980bfcef861eef0bff51eb6dbe23192a2bbc6",
"types": "./lib/index.d.ts",
"version": "5.0.0-beta.165"
}

@ -21,7 +21,15 @@ function getDelta(t0) {
}
export function Reporter(runner) {
let suites = [];
// Force Output; Keeps the console output alive with periodic updates
let lastOutput = getTime();
function forceOutput() {
if (((getTime() - lastOutput) / 1000) > MAX_DELAY) {
const currentSuite = suites[suites.length - 1];
log(`[ Still running suite - test # ${(currentSuite ? currentSuite._countTotal : "0")} ]`);
}
}
const timer = setInterval(forceOutput, 1000);
function getIndent() {
let result = '';
for (let i = 0; i < suites.length; i++) {
@ -57,7 +65,7 @@ export function Reporter(runner) {
let suite = suites.pop();
let failure = '';
if (suite._countTotal > suite._countPass) {
failure = ' (' + (suite._countTotal - suite._countPass) + ' failed)';
failure = ' (' + (suite._countTotal - suite._countPass) + ' failed) *****';
}
log(' Total Tests: ' + suite._countPass + '/' + suite._countTotal + ' passed ' + getDelta(suite._t0) + failure);
log();
@ -67,17 +75,10 @@ export function Reporter(runner) {
currentSuite._countPass += suite._countPass;
currentSuite._countTotal += suite._countTotal;
}
});
function forceOutput() {
if (((getTime() - lastOutput) / 1000) > MAX_DELAY) {
const currentSuite = suites[suites.length - 1];
log(`[ Still running suite - test # ${(currentSuite ? currentSuite._countTotal : "0")} ]`);
else {
clearTimeout(timer);
}
}
const timer = setInterval(forceOutput, 1000);
if (timer.unref) {
timer.unref();
}
});
runner.on('test', function (test) {
forceOutput();
const currentSuite = suites[suites.length - 1];

@ -402,12 +402,6 @@ function testProvider(providerName, networkName) {
if (providerName === "getDefaultProvider") {
provider = ethers.getDefaultProvider();
}
else if (providerName === "Web3Provider") {
//let infuraUrl = (new ethers.providers.InfuraProvider()).connection.url;
//provider = new ethers.providers.Web3Provider(new Web3HttpProvider(infuraUrl));
//throw new Error("skipping Web3 tests; archos error on npm install");
return;
}
else {
provider = new (ethers.providers)[providerName]();
}
@ -416,12 +410,6 @@ function testProvider(providerName, networkName) {
if (providerName === "getDefaultProvider") {
provider = ethers.getDefaultProvider(networkName);
}
else if (providerName === "Web3Provider") {
//let infuraUrl = (new ethers.providers.InfuraProvider(networkName)).connection.url;
//provider = new ethers.providers.Web3Provider(new Web3HttpProvider(infuraUrl), networkName);
//throw new Error("skipping Web3 tests; archos error on npm install");
return;
}
else {
provider = new (ethers.providers)[providerName](networkName);
}
@ -559,7 +547,7 @@ function testProvider(providerName, networkName) {
if (providerName === "CloudflareProvider") {
return;
}
if (networkName === "goerli" && providerName === "AlchemyProvider") {
if (providerName === "Web3Provider") {
return;
}
if ((networkName !== "homestead" && networkName !== "default") && providerName === "CloudflareProvider") {

@ -22,7 +22,15 @@ function getDelta(t0) {
}
function Reporter(runner) {
var suites = [];
// Force Output; Keeps the console output alive with periodic updates
var lastOutput = getTime();
function forceOutput() {
if (((getTime() - lastOutput) / 1000) > MAX_DELAY) {
var currentSuite = suites[suites.length - 1];
log("[ Still running suite - test # " + (currentSuite ? currentSuite._countTotal : "0") + " ]");
}
}
var timer = setInterval(forceOutput, 1000);
function getIndent() {
var result = '';
for (var i = 0; i < suites.length; i++) {
@ -58,7 +66,7 @@ function Reporter(runner) {
var suite = suites.pop();
var failure = '';
if (suite._countTotal > suite._countPass) {
failure = ' (' + (suite._countTotal - suite._countPass) + ' failed)';
failure = ' (' + (suite._countTotal - suite._countPass) + ' failed) *****';
}
log(' Total Tests: ' + suite._countPass + '/' + suite._countTotal + ' passed ' + getDelta(suite._t0) + failure);
log();
@ -68,17 +76,10 @@ function Reporter(runner) {
currentSuite._countPass += suite._countPass;
currentSuite._countTotal += suite._countTotal;
}
});
function forceOutput() {
if (((getTime() - lastOutput) / 1000) > MAX_DELAY) {
var currentSuite = suites[suites.length - 1];
log("[ Still running suite - test # " + (currentSuite ? currentSuite._countTotal : "0") + " ]");
else {
clearTimeout(timer);
}
}
var timer = setInterval(forceOutput, 1000);
if (timer.unref) {
timer.unref();
}
});
runner.on('test', function (test) {
forceOutput();
var currentSuite = suites[suites.length - 1];

@ -406,12 +406,6 @@ function testProvider(providerName, networkName) {
if (providerName === "getDefaultProvider") {
provider = ethers_1.ethers.getDefaultProvider();
}
else if (providerName === "Web3Provider") {
//let infuraUrl = (new ethers.providers.InfuraProvider()).connection.url;
//provider = new ethers.providers.Web3Provider(new Web3HttpProvider(infuraUrl));
//throw new Error("skipping Web3 tests; archos error on npm install");
return;
}
else {
provider = new (ethers_1.ethers.providers)[providerName]();
}
@ -420,12 +414,6 @@ function testProvider(providerName, networkName) {
if (providerName === "getDefaultProvider") {
provider = ethers_1.ethers.getDefaultProvider(networkName);
}
else if (providerName === "Web3Provider") {
//let infuraUrl = (new ethers.providers.InfuraProvider(networkName)).connection.url;
//provider = new ethers.providers.Web3Provider(new Web3HttpProvider(infuraUrl), networkName);
//throw new Error("skipping Web3 tests; archos error on npm install");
return;
}
else {
provider = new (ethers_1.ethers.providers)[providerName](networkName);
}
@ -563,7 +551,7 @@ function testProvider(providerName, networkName) {
if (providerName === "CloudflareProvider") {
return;
}
if (networkName === "goerli" && providerName === "AlchemyProvider") {
if (providerName === "Web3Provider") {
return;
}
if ((networkName !== "homestead" && networkName !== "default") && providerName === "CloudflareProvider") {

@ -39,7 +39,7 @@
"scripts": {
"test": "exit 1"
},
"tarballHash": "0x70cc8736dfbf68427e0ed236bebee488a50d64222fd81ff16eb04950a9ca3d4b",
"tarballHash": "0x39652f5cf5adf63d747b3decc96aab331f8f59697de93cc8bca8232f0e7be863",
"types": "./lib/index.d.ts",
"version": "5.0.0-beta.158"
}

@ -12,6 +12,9 @@ export declare type ConnectionInfo = {
export interface OnceBlockable {
once(eventName: "block", handler: () => void): void;
}
export interface OncePollable {
once(eventName: "poll", handler: () => void): void;
}
export declare type PollOptions = {
timeout?: number;
floor?: number;
@ -19,6 +22,7 @@ export declare type PollOptions = {
interval?: number;
retryLimit?: number;
onceBlock?: OnceBlockable;
oncePoll?: OncePollable;
};
export declare type FetchJsonResponse = {
statusCode: number;

@ -190,6 +190,9 @@ export function poll(func, options) {
resolve(result);
}
}
else if (options.oncePoll) {
options.oncePoll.once("poll", check);
}
else if (options.onceBlock) {
options.onceBlock.once("block", check);
// Otherwise, exponential back-off (up to 10s) our next request

@ -12,6 +12,9 @@ export declare type ConnectionInfo = {
export interface OnceBlockable {
once(eventName: "block", handler: () => void): void;
}
export interface OncePollable {
once(eventName: "poll", handler: () => void): void;
}
export declare type PollOptions = {
timeout?: number;
floor?: number;
@ -19,6 +22,7 @@ export declare type PollOptions = {
interval?: number;
retryLimit?: number;
onceBlock?: OnceBlockable;
oncePoll?: OncePollable;
};
export declare type FetchJsonResponse = {
statusCode: number;

@ -235,6 +235,9 @@ function poll(func, options) {
resolve(result);
}
}
else if (options.oncePoll) {
options.oncePoll.once("poll", check);
}
else if (options.onceBlock) {
options.onceBlock.once("block", check);
// Otherwise, exponential back-off (up to 10s) our next request

@ -35,7 +35,7 @@
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"tarballHash": "0xb65d230f34fff51296199d36c8963829b38d278b9a14f0eefe8dd45f544a1b90",
"tarballHash": "0xfc2c320ae603870cf3abd09b8a0f2c42f49821f21194f4bffa8354144eca6693",
"types": "./lib/index.d.ts",
"version": "5.0.0-beta.138"
}