@toruslabs/ethereum-controllers 8.4.4 → 8.4.6

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 (27) hide show
  1. package/dist/ethereumControllers.umd.min.js +1 -1
  2. package/dist/lib.cjs/Block/PollingBlockTracker.js +24 -14
  3. package/dist/lib.cjs/Currency/CurrencyController.js +5 -10
  4. package/dist/lib.cjs/Gas/GasFeeController.js +6 -15
  5. package/dist/lib.cjs/Network/NetworkController.js +5 -2
  6. package/dist/lib.cjs/Network/createJsonRpcClient.js +3 -2
  7. package/dist/lib.cjs/Nfts/NftsController.js +8 -20
  8. package/dist/lib.cjs/Tokens/TokenRatesController.js +5 -10
  9. package/dist/lib.cjs/Tokens/TokensController.js +7 -19
  10. package/dist/lib.cjs/types/Block/PollingBlockTracker.d.ts +5 -2
  11. package/dist/lib.cjs/types/Currency/CurrencyController.d.ts +5 -4
  12. package/dist/lib.cjs/types/Gas/GasFeeController.d.ts +4 -4
  13. package/dist/lib.cjs/types/Network/NetworkController.d.ts +4 -2
  14. package/dist/lib.cjs/types/Network/createJsonRpcClient.d.ts +2 -2
  15. package/dist/lib.cjs/types/Nfts/NftsController.d.ts +4 -5
  16. package/dist/lib.cjs/types/Tokens/TokenRatesController.d.ts +5 -4
  17. package/dist/lib.cjs/types/Tokens/TokensController.d.ts +4 -5
  18. package/dist/lib.cjs/types/utils/interfaces.d.ts +1 -1
  19. package/dist/lib.esm/Block/PollingBlockTracker.js +25 -15
  20. package/dist/lib.esm/Currency/CurrencyController.js +6 -11
  21. package/dist/lib.esm/Gas/GasFeeController.js +7 -16
  22. package/dist/lib.esm/Network/NetworkController.js +5 -2
  23. package/dist/lib.esm/Network/createJsonRpcClient.js +3 -2
  24. package/dist/lib.esm/Nfts/NftsController.js +9 -21
  25. package/dist/lib.esm/Tokens/TokenRatesController.js +6 -11
  26. package/dist/lib.esm/Tokens/TokensController.js +8 -20
  27. package/package.json +3 -3
@@ -1,4 +1,5 @@
1
- import { BaseBlockTracker, idleTimeTracker, timeout } from '@toruslabs/base-controllers';
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import { BaseBlockTracker, PollingManager, timeout } from '@toruslabs/base-controllers';
2
3
  import log from 'loglevel';
3
4
 
4
5
  const DEFAULT_POLLING_INTERVAL = 20;
@@ -7,15 +8,20 @@ const SEC = 1000;
7
8
  class PollingBlockTracker extends BaseBlockTracker {
8
9
  constructor({
9
10
  config,
10
- state = {}
11
+ state = {},
12
+ idleTimeTracker
11
13
  }) {
12
14
  if (!config.provider) {
13
15
  throw new Error("PollingBlockTracker - no provider specified.");
14
16
  }
17
+ if (!idleTimeTracker) {
18
+ throw new Error("PollingBlockTracker - no idleTimeTracker specified.");
19
+ }
15
20
  super({
16
21
  config,
17
22
  state
18
23
  });
24
+ _defineProperty(this, "pollingManager", void 0);
19
25
  const pollingInterval = config.pollingInterval || DEFAULT_POLLING_INTERVAL;
20
26
  const retryTimeout = config.retryTimeout || DEFAULT_RETRY_TIMEOUT;
21
27
 
@@ -27,6 +33,7 @@ class PollingBlockTracker extends BaseBlockTracker {
27
33
  setSkipCacheFlag: config.setSkipCacheFlag || false
28
34
  };
29
35
  this.initialize();
36
+ this.pollingManager = new PollingManager(idleTimeTracker, pollingInterval);
30
37
  }
31
38
  async checkForLatestBlock() {
32
39
  await this._updateLatestBlock();
@@ -35,23 +42,26 @@ class PollingBlockTracker extends BaseBlockTracker {
35
42
 
36
43
  // overrides the BaseBlockTracker._start method.
37
44
  _start() {
38
- this._synchronize().catch(err => this.emit("error", err));
45
+ this.pollingManager.start(async () => {
46
+ await this._synchronize().catch(err => {
47
+ this.emit("error", err);
48
+ });
49
+ });
50
+ }
51
+ _end() {
52
+ this.pollingManager.stop();
39
53
  }
40
54
  async _synchronize() {
41
- while (this.state._isRunning) {
42
- if (idleTimeTracker.checkIfIdle()) return;
55
+ try {
56
+ await this._updateLatestBlock();
57
+ } catch (err) {
58
+ const newErr = new Error(`PollingBlockTracker - encountered an error while attempting to update latest block:\n${err.stack}`);
43
59
  try {
44
- await this._updateLatestBlock();
45
- await timeout(this.config.pollingInterval);
46
- } catch (err) {
47
- const newErr = new Error(`PollingBlockTracker - encountered an error while attempting to update latest block:\n${err.stack}`);
48
- try {
49
- this.emit("error", newErr);
50
- } catch {
51
- log.error(newErr);
52
- }
53
- await timeout(this.config.retryTimeout);
60
+ this.emit("error", newErr);
61
+ } catch {
62
+ log.error(newErr);
54
63
  }
64
+ await timeout(this.config.retryTimeout);
55
65
  }
56
66
  }
57
67
  async _updateLatestBlock() {
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
2
2
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
- import { BaseCurrencyController, idleTimeTracker } from '@toruslabs/base-controllers';
3
+ import { BaseCurrencyController, PollingManager } from '@toruslabs/base-controllers';
4
4
  import { get } from '@toruslabs/http-helpers';
5
5
  import log from 'loglevel';
6
6
 
@@ -8,13 +8,14 @@ class CurrencyController extends BaseCurrencyController {
8
8
  constructor({
9
9
  config,
10
10
  state,
11
+ idleTimeTracker,
11
12
  onNetworkChanged
12
13
  }) {
13
14
  super({
14
15
  config,
15
16
  state
16
17
  });
17
- _defineProperty(this, "conversionInterval", void 0);
18
+ _defineProperty(this, "pollingManager", void 0);
18
19
  this.defaultState = _objectSpread(_objectSpread({}, this.defaultState), {}, {
19
20
  commonDenomination: "USD",
20
21
  commonDenominatorPrice: 0
@@ -27,6 +28,7 @@ class CurrencyController extends BaseCurrencyController {
27
28
  this.updateConversionRate();
28
29
  }
29
30
  });
31
+ this.pollingManager = new PollingManager(idleTimeTracker, this.config.pollInterval);
30
32
  }
31
33
  setCommonDenomination(commonDenomination) {
32
34
  this.update({
@@ -50,15 +52,8 @@ class CurrencyController extends BaseCurrencyController {
50
52
  * stored at the controller's conversionInterval property. If it is called and such an id already exists, the
51
53
  * previous interval is clear and a new one is created.
52
54
  */
53
- scheduleConversionInterval() {
54
- if (this.conversionInterval) {
55
- window.clearInterval(this.conversionInterval);
56
- }
57
- this.conversionInterval = window.setInterval(() => {
58
- if (!idleTimeTracker.checkIfIdle()) {
59
- this.updateConversionRate();
60
- }
61
- }, this.config.pollInterval);
55
+ async scheduleConversionInterval() {
56
+ this.pollingManager.start(this.updateConversionRate.bind(this));
62
57
  }
63
58
 
64
59
  /**
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
2
  import { isHexString, addHexPrefix } from '@ethereumjs/util';
3
- import { BaseController, cloneDeep, idleTimeTracker } from '@toruslabs/base-controllers';
3
+ import { BaseController, PollingManager, cloneDeep } from '@toruslabs/base-controllers';
4
4
  import log from 'loglevel';
5
5
  import { GAS_ESTIMATE_TYPES } from '../utils/constants.js';
6
6
  import { fetchGasEstimates, fetchEthGasPriceEstimate, fetchLegacyGasPriceEstimates, fetchGasEstimatesViaEthFeeHistory, calculateTimeEstimate } from './gasUtil.js';
@@ -14,6 +14,7 @@ class GasFeeController extends BaseController {
14
14
  constructor({
15
15
  config,
16
16
  state,
17
+ idleTimeTracker,
17
18
  getNetworkIdentifier,
18
19
  getProvider,
19
20
  fetchGasEstimates: fetchGasEstimates$1 = fetchGasEstimates,
@@ -32,7 +33,6 @@ class GasFeeController extends BaseController {
32
33
  _defineProperty(this, "name", "GasFeeController");
33
34
  // https://0x.org/docs/introduction/0x-cheat-sheet#swap-api-endpoints
34
35
  _defineProperty(this, "API_SUPPORTED_CHAINIDS", new Set(["0x1", "0x5", "0xa4b1", "0xa86a", "0x2105", "0x38", "0xfa", "0xa", "0x89"]));
35
- _defineProperty(this, "intervalId", void 0);
36
36
  _defineProperty(this, "provider", void 0);
37
37
  _defineProperty(this, "currentChainId", void 0);
38
38
  _defineProperty(this, "getNetworkIdentifier", void 0);
@@ -44,6 +44,7 @@ class GasFeeController extends BaseController {
44
44
  _defineProperty(this, "getCurrentNetworkEIP1559Compatibility", void 0);
45
45
  _defineProperty(this, "getCurrentAccountEIP1559Compatibility", void 0);
46
46
  _defineProperty(this, "getCurrentNetworkLegacyGasAPICompatibility", void 0);
47
+ _defineProperty(this, "pollingManager", void 0);
47
48
  this.getNetworkIdentifier = getNetworkIdentifier;
48
49
  this.getProvider = getProvider;
49
50
  this.fetchGasEstimates = fetchGasEstimates$1;
@@ -70,6 +71,7 @@ class GasFeeController extends BaseController {
70
71
  onNetworkStateChange(() => {
71
72
  this.onNetworkStateChange();
72
73
  });
74
+ this.pollingManager = new PollingManager(idleTimeTracker, this.config.interval);
73
75
  }
74
76
  async onNetworkStateChange() {
75
77
  this.provider = this.getProvider();
@@ -103,9 +105,6 @@ class GasFeeController extends BaseController {
103
105
  this.stopPolling();
104
106
  }
105
107
  stopPolling() {
106
- if (this.intervalId) {
107
- clearInterval(this.intervalId);
108
- }
109
108
  this.resetState();
110
109
  }
111
110
 
@@ -179,17 +178,9 @@ class GasFeeController extends BaseController {
179
178
  return newState;
180
179
  }
181
180
  async _startPolling() {
182
- this._poll();
183
- }
184
- async _poll() {
185
- if (this.intervalId) {
186
- window.clearInterval(this.intervalId);
187
- }
188
- this.intervalId = window.setInterval(async () => {
189
- if (!idleTimeTracker.checkIfIdle()) {
190
- await this._fetchGasFeeEstimateData();
191
- }
192
- }, this.config.interval);
181
+ this.pollingManager.start(async () => {
182
+ await this._fetchGasFeeEstimateData();
183
+ });
193
184
  }
194
185
  resetState() {
195
186
  this.update(cloneDeep(this.defaultState));
@@ -13,7 +13,8 @@ const _excluded = ["chainId", "rpcTarget"];
13
13
  class NetworkController extends BaseController {
14
14
  constructor({
15
15
  config,
16
- state
16
+ state,
17
+ idleTimeTracker
17
18
  }) {
18
19
  super({
19
20
  config,
@@ -26,6 +27,7 @@ class NetworkController extends BaseController {
26
27
  _defineProperty(this, "provider", null);
27
28
  _defineProperty(this, "blockTracker", null);
28
29
  _defineProperty(this, "baseProviderHandlers", void 0);
30
+ _defineProperty(this, "idleTimeTracker", void 0);
29
31
  this.defaultState = {
30
32
  chainId: "loading",
31
33
  properties: {
@@ -39,6 +41,7 @@ class NetworkController extends BaseController {
39
41
  // then when connection succeeds,
40
42
  // we update the network
41
43
  this.initialize();
44
+ this.idleTimeTracker = idleTimeTracker;
42
45
  }
43
46
  getNetworkIdentifier() {
44
47
  return this.state.chainId;
@@ -182,7 +185,7 @@ class NetworkController extends BaseController {
182
185
  this.blockTracker = blockTracker;
183
186
  }
184
187
  configureStandardProvider(providerConfig) {
185
- const networkClient = createJsonRpcClient(providerConfig, this.config);
188
+ const networkClient = createJsonRpcClient(providerConfig, this.config, this.idleTimeTracker);
186
189
  log.info("networkClient", networkClient);
187
190
  this.setNetworkClient(networkClient);
188
191
  }
@@ -27,7 +27,7 @@ function createProviderConfigMiddleware(providerConfig) {
27
27
  return next();
28
28
  };
29
29
  }
30
- function createJsonRpcClient(providerConfig, networkConfig) {
30
+ function createJsonRpcClient(providerConfig, networkConfig, idleTimeTracker) {
31
31
  const {
32
32
  chainId,
33
33
  rpcTarget
@@ -40,7 +40,8 @@ function createJsonRpcClient(providerConfig, networkConfig) {
40
40
  config: _objectSpread(_objectSpread({}, networkConfig), {}, {
41
41
  provider: blockProvider
42
42
  }),
43
- state: {}
43
+ state: {},
44
+ idleTimeTracker
44
45
  });
45
46
  const networkMiddleware = mergeMiddleware([createChainIdMiddleware(chainId), createProviderConfigMiddleware(providerConfig),
46
47
  // No need for the following middlewares for web because all browser sessions are quite short lived and each session is limited to scope of a window/tab
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
2
2
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
- import { BaseController, idleTimeTracker } from '@toruslabs/base-controllers';
3
+ import { BaseController, PollingManager } from '@toruslabs/base-controllers';
4
4
  import deepmerge from 'deepmerge';
5
5
  import { BrowserProvider } from 'ethers';
6
6
  import log from 'loglevel';
@@ -16,7 +16,8 @@ class NftsController extends BaseController {
16
16
  getCustomNfts,
17
17
  getSimpleHashNfts,
18
18
  onPreferencesStateChange,
19
- onNetworkStateChange
19
+ onNetworkStateChange,
20
+ idleTimeTracker
20
21
  }) {
21
22
  super({
22
23
  config,
@@ -25,9 +26,9 @@ class NftsController extends BaseController {
25
26
  _defineProperty(this, "name", "NftsController");
26
27
  _defineProperty(this, "provider", void 0);
27
28
  _defineProperty(this, "ethersProvider", void 0);
28
- _defineProperty(this, "_timer", void 0);
29
29
  _defineProperty(this, "getCustomNfts", void 0);
30
30
  _defineProperty(this, "getSimpleHashNfts", void 0);
31
+ _defineProperty(this, "pollingManager", void 0);
31
32
  this.provider = provider;
32
33
  this.ethersProvider = new BrowserProvider(this.provider, "any");
33
34
  this.getCustomNfts = getCustomNfts;
@@ -60,6 +61,7 @@ class NftsController extends BaseController {
60
61
  this.restartNftDetection();
61
62
  }
62
63
  });
64
+ this.pollingManager = new PollingManager(idleTimeTracker, this.config.interval);
63
65
  }
64
66
  get userSelectedAddress() {
65
67
  return this.config.selectedAddress;
@@ -69,21 +71,6 @@ class NftsController extends BaseController {
69
71
  if (!this.userSelectedAddress) return [];
70
72
  return (_this$state$nfts$this = this.state.nfts[this.userSelectedAddress]) !== null && _this$state$nfts$this !== void 0 ? _this$state$nfts$this : [];
71
73
  }
72
- get interval() {
73
- return this.config.interval;
74
- }
75
- set interval(interval) {
76
- if (this._timer) window.clearInterval(this._timer);
77
- if (!interval) {
78
- return;
79
- }
80
- this._timer = window.setInterval(() => {
81
- if (!idleTimeTracker.checkIfIdle()) {
82
- this.detectNewNfts();
83
- this.refreshNftBalances();
84
- }
85
- }, interval);
86
- }
87
74
  startNftDetection(selectedAddress) {
88
75
  this.configure({
89
76
  selectedAddress
@@ -100,9 +87,10 @@ class NftsController extends BaseController {
100
87
  if (!this.userSelectedAddress) {
101
88
  return;
102
89
  }
103
- this.detectNewNfts();
104
- this.refreshNftBalances();
105
- this.config.interval = DEFAULT_INTERVAL;
90
+ this.pollingManager.start(() => {
91
+ this.detectNewNfts();
92
+ this.refreshNftBalances();
93
+ });
106
94
  }
107
95
  detectNewNfts() {
108
96
  const userAddress = this.userSelectedAddress;
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
2
2
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
- import { BaseController, idleTimeTracker } from '@toruslabs/base-controllers';
3
+ import { BaseController, PollingManager } from '@toruslabs/base-controllers';
4
4
  import { get } from '@toruslabs/http-helpers';
5
5
  import log from 'loglevel';
6
6
  import { COINGECKO_PLATFORMS_CHAIN_CODE_MAP, COINGECKO_SUPPORTED_CURRENCIES } from '../utils/constants.js';
@@ -13,6 +13,7 @@ class TokenRatesController extends BaseController {
13
13
  constructor({
14
14
  config,
15
15
  state,
16
+ idleTimeTracker,
16
17
  onPreferencesStateChange,
17
18
  onNetworkStateChange,
18
19
  onTokensStateChange
@@ -21,7 +22,7 @@ class TokenRatesController extends BaseController {
21
22
  config,
22
23
  state
23
24
  });
24
- _defineProperty(this, "conversionInterval", void 0);
25
+ _defineProperty(this, "pollingManager", void 0);
25
26
  this.defaultState = _objectSpread(_objectSpread({}, this.defaultState), {}, {
26
27
  contractExchangeRates: {}
27
28
  });
@@ -56,6 +57,7 @@ class TokenRatesController extends BaseController {
56
57
  this.updateExchangeRates();
57
58
  }
58
59
  });
60
+ this.pollingManager = new PollingManager(idleTimeTracker, this.config.pollInterval);
59
61
  }
60
62
 
61
63
  /**
@@ -63,15 +65,8 @@ class TokenRatesController extends BaseController {
63
65
  * stored at the controller's conversionInterval property. If it is called and such an id already exists, the
64
66
  * previous interval is clear and a new one is created.
65
67
  */
66
- scheduleConversionInterval() {
67
- if (this.conversionInterval) {
68
- window.clearInterval(this.conversionInterval);
69
- }
70
- this.conversionInterval = window.setInterval(() => {
71
- if (!idleTimeTracker.checkIfIdle()) {
72
- this.updateExchangeRates();
73
- }
74
- }, this.config.pollInterval);
68
+ async scheduleConversionInterval() {
69
+ this.pollingManager.start(this.updateExchangeRates.bind(this));
75
70
  }
76
71
  async updateExchangeRates() {
77
72
  const chainCodes = COINGECKO_PLATFORMS_CHAIN_CODE_MAP[this.config.chainId];
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from '@babel/runtime/helpers/objectSpread2';
2
2
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
- import { BaseController, idleTimeTracker } from '@toruslabs/base-controllers';
3
+ import { BaseController, PollingManager } from '@toruslabs/base-controllers';
4
4
  import { BrowserProvider, Contract, toQuantity } from 'ethers';
5
5
  import log from 'loglevel';
6
6
  import { singleBalanceCheckerAbi } from '../utils/abis.js';
@@ -14,6 +14,7 @@ class TokensController extends BaseController {
14
14
  config,
15
15
  state,
16
16
  provider,
17
+ idleTimeTracker,
17
18
  getCustomTokens,
18
19
  getEtherScanTokens,
19
20
  getProviderConfig,
@@ -27,7 +28,7 @@ class TokensController extends BaseController {
27
28
  _defineProperty(this, "name", "TokensController");
28
29
  _defineProperty(this, "provider", void 0);
29
30
  _defineProperty(this, "ethersProvider", void 0);
30
- _defineProperty(this, "_timer", void 0);
31
+ _defineProperty(this, "pollingManager", void 0);
31
32
  _defineProperty(this, "getProviderConfig", void 0);
32
33
  _defineProperty(this, "getCustomTokens", void 0);
33
34
  _defineProperty(this, "getEtherScanTokens", void 0);
@@ -64,6 +65,7 @@ class TokensController extends BaseController {
64
65
  this.restartTokenDetection();
65
66
  }
66
67
  });
68
+ this.pollingManager = new PollingManager(idleTimeTracker, this.config.interval);
67
69
  }
68
70
  get userSelectedAddress() {
69
71
  return this.config.selectedAddress;
@@ -73,21 +75,6 @@ class TokensController extends BaseController {
73
75
  if (!this.userSelectedAddress) return [];
74
76
  return (_this$state$tokens$th = this.state.tokens[this.userSelectedAddress]) !== null && _this$state$tokens$th !== void 0 ? _this$state$tokens$th : [];
75
77
  }
76
- get interval() {
77
- return this.config.interval;
78
- }
79
- set interval(interval) {
80
- if (this._timer) window.clearInterval(this._timer);
81
- if (!interval) {
82
- return;
83
- }
84
- this._timer = window.setInterval(() => {
85
- if (!idleTimeTracker.checkIfIdle()) {
86
- this.detectNewTokens();
87
- this.refreshTokenBalances();
88
- }
89
- }, interval);
90
- }
91
78
  startTokenDetection(selectedAddress) {
92
79
  this.configure({
93
80
  selectedAddress
@@ -104,9 +91,10 @@ class TokensController extends BaseController {
104
91
  if (!this.userSelectedAddress) {
105
92
  return;
106
93
  }
107
- this.detectNewTokens();
108
- this.refreshTokenBalances();
109
- this.config.interval = DEFAULT_INTERVAL;
94
+ this.pollingManager.start(async () => {
95
+ this.detectNewTokens();
96
+ await this.refreshTokenBalances();
97
+ });
110
98
  }
111
99
  detectNewTokens() {
112
100
  const userAddress = this.userSelectedAddress;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toruslabs/ethereum-controllers",
3
- "version": "8.4.4",
3
+ "version": "8.4.6",
4
4
  "homepage": "https://github.com/torusresearch/controllers#readme",
5
5
  "license": "ISC",
6
6
  "sideEffects": false,
@@ -21,7 +21,7 @@
21
21
  "dependencies": {
22
22
  "@ethereumjs/util": "^9.1.0",
23
23
  "@metamask/delegation-toolkit": "^0.11.0",
24
- "@toruslabs/base-controllers": "^8.4.4",
24
+ "@toruslabs/base-controllers": "^8.4.6",
25
25
  "@toruslabs/http-helpers": "^8.1.1",
26
26
  "@web3auth/auth": "^10.4.1",
27
27
  "async-mutex": "^0.5.0",
@@ -63,7 +63,7 @@
63
63
  "publishConfig": {
64
64
  "access": "public"
65
65
  },
66
- "gitHead": "7040c38814fe30e35f1dcd9713de118ded2e3d4a",
66
+ "gitHead": "9b83f0f321a2a91489825b2d440c172656bb91d7",
67
67
  "devDependencies": {
68
68
  "@typechain/ethers-v6": "^0.5.1",
69
69
  "typechain": "^8.3.2"