@metamask/nonce-tracker
Advanced tools
Comparing version 5.0.0 to 6.0.0
@@ -9,2 +9,19 @@ # Changelog | ||
## [6.0.0] | ||
### Added | ||
- New `setProvider` function allows atomically changing provider and blockTracker ([#75](https://github.com/MetaMask/nonce-tracker/pull/75)) | ||
### Removed | ||
- **BREAKING**: These private properties are no longer accessible: ([#75](https://github.com/MetaMask/nonce-tracker/pull/75)) | ||
- `blockTracker` | ||
- `lockMap` | ||
- `provider` | ||
- `web3` | ||
- **BREAKING**: These private functions are no longer accessible: ([#75](https://github.com/MetaMask/nonce-tracker/pull/75)) | ||
- `getConfirmedTransactions` | ||
- `getPendingTransactions` | ||
### Fixed | ||
- Types: Allow `blockTracker` constructor option to be any `BlockTracker` instead of class `PollingBlockTracker` ([#76](https://github.com/MetaMask/nonce-tracker/pull/76)) | ||
## [5.0.0] | ||
@@ -58,3 +75,4 @@ ### Changed | ||
[Unreleased]: https://github.com/MetaMask/nonce-tracker/compare/v5.0.0...HEAD | ||
[Unreleased]: https://github.com/MetaMask/nonce-tracker/compare/v6.0.0...HEAD | ||
[6.0.0]: https://github.com/MetaMask/nonce-tracker/compare/v5.0.0...v6.0.0 | ||
[5.0.0]: https://github.com/MetaMask/nonce-tracker/compare/v4.0.0...v5.0.0 | ||
@@ -61,0 +79,0 @@ [4.0.0]: https://github.com/MetaMask/nonce-tracker/compare/v3.0.0...v4.0.0 |
import { Mutex } from 'async-mutex'; | ||
import type { PollingBlockTracker } from '@metamask/eth-block-tracker'; | ||
import type { BlockTracker } from '@metamask/eth-block-tracker'; | ||
/** | ||
* @property opts.provider - An ethereum provider | ||
* @property opts.blockTracker - An instance of eth-block-tracker | ||
* @property opts.blockTracker - An instance of @metamask/eth-block-tracker | ||
* @property opts.getPendingTransactions - A function that returns an array of txMeta | ||
@@ -13,3 +13,3 @@ * whose status is `submitted` | ||
provider: Record<string, unknown>; | ||
blockTracker: PollingBlockTracker; | ||
blockTracker: BlockTracker; | ||
getPendingTransactions: (address: string) => Transaction[]; | ||
@@ -82,10 +82,16 @@ getConfirmedTransactions: (address: string) => Transaction[]; | ||
export declare class NonceTracker { | ||
private provider; | ||
private blockTracker; | ||
private web3; | ||
private getPendingTransactions; | ||
private getConfirmedTransactions; | ||
private lockMap; | ||
#private; | ||
constructor(opts: NonceTrackerOptions); | ||
/** | ||
* Allows changing the provider and block tracker after insrtantiation. As the blockTracker also has a provider, they are updated atomically. | ||
* | ||
* @param opts - new props | ||
* @param opts.provider - An ethereum provider | ||
* @param opts.blockTracker - An instance of @metamask/eth-block-tracker | ||
*/ | ||
setProvider({ provider, blockTracker, }: { | ||
provider: Record<string, unknown>; | ||
blockTracker: BlockTracker; | ||
}): void; | ||
/** | ||
* @returns Promise<{ releaseLock: VoidFunction }> with the key releaseLock (the global mutex) | ||
@@ -92,0 +98,0 @@ */ |
"use strict"; | ||
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { | ||
if (kind === "m") throw new TypeError("Private method is not writable"); | ||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); | ||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); | ||
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; | ||
}; | ||
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { | ||
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); | ||
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); | ||
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
var _NonceTracker_provider, _NonceTracker_blockTracker, _NonceTracker_getPendingTransactions, _NonceTracker_getConfirmedTransactions, _NonceTracker_lockMap; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -9,14 +21,30 @@ exports.NonceTracker = void 0; | ||
const async_mutex_1 = require("async-mutex"); | ||
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports | ||
const { Web3Provider } = require('@ethersproject/providers'); | ||
const providers_1 = require("@ethersproject/providers"); | ||
class NonceTracker { | ||
constructor(opts) { | ||
this.provider = opts.provider; | ||
this.blockTracker = opts.blockTracker; | ||
this.web3 = new Web3Provider(opts.provider); | ||
this.getPendingTransactions = opts.getPendingTransactions; | ||
this.getConfirmedTransactions = opts.getConfirmedTransactions; | ||
this.lockMap = {}; | ||
_NonceTracker_provider.set(this, void 0); | ||
_NonceTracker_blockTracker.set(this, void 0); | ||
_NonceTracker_getPendingTransactions.set(this, void 0); | ||
_NonceTracker_getConfirmedTransactions.set(this, void 0); | ||
_NonceTracker_lockMap.set(this, void 0); | ||
__classPrivateFieldSet(this, _NonceTracker_provider, opts.provider, "f"); | ||
__classPrivateFieldSet(this, _NonceTracker_blockTracker, opts.blockTracker, "f"); | ||
__classPrivateFieldSet(this, _NonceTracker_getPendingTransactions, opts.getPendingTransactions, "f"); | ||
__classPrivateFieldSet(this, _NonceTracker_getConfirmedTransactions, opts.getConfirmedTransactions, "f"); | ||
__classPrivateFieldSet(this, _NonceTracker_lockMap, {}, "f"); | ||
} | ||
/** | ||
* Allows changing the provider and block tracker after insrtantiation. As the blockTracker also has a provider, they are updated atomically. | ||
* | ||
* @param opts - new props | ||
* @param opts.provider - An ethereum provider | ||
* @param opts.blockTracker - An instance of @metamask/eth-block-tracker | ||
*/ | ||
setProvider({ provider, blockTracker, }) { | ||
assert_1.default(typeof provider === 'object', 'missing or invalid provider'); | ||
assert_1.default(typeof blockTracker === 'object', 'missing or invalid blockTracker'); | ||
__classPrivateFieldSet(this, _NonceTracker_provider, provider, "f"); | ||
__classPrivateFieldSet(this, _NonceTracker_blockTracker, blockTracker, "f"); | ||
} | ||
/** | ||
* @returns Promise<{ releaseLock: VoidFunction }> with the key releaseLock (the global mutex) | ||
@@ -48,3 +76,3 @@ */ | ||
const highestSuggested = Math.max(nextNetworkNonce, highestLocallyConfirmed); | ||
const pendingTxs = this.getPendingTransactions(address); | ||
const pendingTxs = __classPrivateFieldGet(this, _NonceTracker_getPendingTransactions, "f").call(this, address); | ||
const localNonceResult = this._getHighestContinuousFrom(pendingTxs, highestSuggested); | ||
@@ -82,6 +110,6 @@ const nonceDetails = { | ||
_lookupMutex(lockId) { | ||
let mutex = this.lockMap[lockId]; | ||
let mutex = __classPrivateFieldGet(this, _NonceTracker_lockMap, "f")[lockId]; | ||
if (!mutex) { | ||
mutex = new async_mutex_1.Mutex(); | ||
this.lockMap[lockId] = mutex; | ||
__classPrivateFieldGet(this, _NonceTracker_lockMap, "f")[lockId] = mutex; | ||
} | ||
@@ -101,4 +129,4 @@ return mutex; | ||
// and pending count are from the same block | ||
const blockNumber = await this.blockTracker.getLatestBlock(); | ||
const baseCount = await this.web3.getTransactionCount(address, blockNumber); | ||
const blockNumber = await __classPrivateFieldGet(this, _NonceTracker_blockTracker, "f").getLatestBlock(); | ||
const baseCount = await new providers_1.Web3Provider(__classPrivateFieldGet(this, _NonceTracker_provider, "f")).getTransactionCount(address, blockNumber); | ||
assert_1.default(Number.isInteger(baseCount), `nonce-tracker - baseCount is not an integer - got: (${typeof baseCount}) "${baseCount}"`); | ||
@@ -117,3 +145,3 @@ return { | ||
_getHighestLocallyConfirmed(address) { | ||
const confirmedTransactions = this.getConfirmedTransactions(address); | ||
const confirmedTransactions = __classPrivateFieldGet(this, _NonceTracker_getConfirmedTransactions, "f").call(this, address); | ||
const highest = this._getHighestNonce(confirmedTransactions); | ||
@@ -157,2 +185,3 @@ return Number.isInteger(highest) ? highest + 1 : 0; | ||
exports.NonceTracker = NonceTracker; | ||
_NonceTracker_provider = new WeakMap(), _NonceTracker_blockTracker = new WeakMap(), _NonceTracker_getPendingTransactions = new WeakMap(), _NonceTracker_getConfirmedTransactions = new WeakMap(), _NonceTracker_lockMap = new WeakMap(); | ||
//# sourceMappingURL=NonceTracker.js.map |
{ | ||
"name": "@metamask/nonce-tracker", | ||
"version": "5.0.0", | ||
"version": "6.0.0", | ||
"description": "Transaction nonce calculation used in MetaMask.", | ||
@@ -31,3 +31,3 @@ "keywords": [ | ||
"devDependencies": { | ||
"@lavamoat/allow-scripts": "^2.5.1", | ||
"@lavamoat/allow-scripts": "^3.0.4", | ||
"@lavamoat/preinstall-always-fail": "^1.0.3", | ||
@@ -34,0 +34,0 @@ "@metamask/auto-changelog": "^3.3.0", |
Sorry, the diff of this file is not supported yet
29057
326