@metamask/transaction-controller 40.0.0 → 41.0.0

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 (88) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/dist/TransactionController.cjs +169 -230
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +98 -52
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +98 -52
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +172 -233
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/api/accounts-api.cjs +47 -0
  11. package/dist/api/accounts-api.cjs.map +1 -0
  12. package/dist/api/accounts-api.d.cts +43 -0
  13. package/dist/api/accounts-api.d.cts.map +1 -0
  14. package/dist/api/accounts-api.d.mts +43 -0
  15. package/dist/api/accounts-api.d.mts.map +1 -0
  16. package/dist/api/accounts-api.mjs +43 -0
  17. package/dist/api/accounts-api.mjs.map +1 -0
  18. package/dist/errors.cjs +8 -1
  19. package/dist/errors.cjs.map +1 -1
  20. package/dist/errors.d.cts +4 -0
  21. package/dist/errors.d.cts.map +1 -1
  22. package/dist/errors.d.mts +4 -0
  23. package/dist/errors.d.mts.map +1 -1
  24. package/dist/errors.mjs +6 -0
  25. package/dist/errors.mjs.map +1 -1
  26. package/dist/helpers/EtherscanRemoteTransactionSource.cjs +13 -12
  27. package/dist/helpers/EtherscanRemoteTransactionSource.cjs.map +1 -1
  28. package/dist/helpers/EtherscanRemoteTransactionSource.d.cts.map +1 -1
  29. package/dist/helpers/EtherscanRemoteTransactionSource.d.mts.map +1 -1
  30. package/dist/helpers/EtherscanRemoteTransactionSource.mjs +13 -12
  31. package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +1 -1
  32. package/dist/helpers/GasFeePoller.cjs +4 -4
  33. package/dist/helpers/GasFeePoller.cjs.map +1 -1
  34. package/dist/helpers/GasFeePoller.d.cts +1 -1
  35. package/dist/helpers/GasFeePoller.d.cts.map +1 -1
  36. package/dist/helpers/GasFeePoller.d.mts +1 -1
  37. package/dist/helpers/GasFeePoller.d.mts.map +1 -1
  38. package/dist/helpers/GasFeePoller.mjs +4 -4
  39. package/dist/helpers/GasFeePoller.mjs.map +1 -1
  40. package/dist/helpers/IncomingTransactionHelper.cjs +18 -11
  41. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  42. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  43. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  44. package/dist/helpers/IncomingTransactionHelper.mjs +19 -12
  45. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  46. package/dist/helpers/MethodDataHelper.cjs +78 -0
  47. package/dist/helpers/MethodDataHelper.cjs.map +1 -0
  48. package/dist/helpers/MethodDataHelper.d.cts +14 -0
  49. package/dist/helpers/MethodDataHelper.d.cts.map +1 -0
  50. package/dist/helpers/MethodDataHelper.d.mts +14 -0
  51. package/dist/helpers/MethodDataHelper.d.mts.map +1 -0
  52. package/dist/helpers/MethodDataHelper.mjs +71 -0
  53. package/dist/helpers/MethodDataHelper.mjs.map +1 -0
  54. package/dist/helpers/MultichainTrackingHelper.cjs +87 -104
  55. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
  56. package/dist/helpers/MultichainTrackingHelper.d.cts +16 -22
  57. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
  58. package/dist/helpers/MultichainTrackingHelper.d.mts +16 -22
  59. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
  60. package/dist/helpers/MultichainTrackingHelper.mjs +88 -109
  61. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
  62. package/dist/helpers/PendingTransactionTracker.cjs +24 -22
  63. package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
  64. package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
  65. package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
  66. package/dist/helpers/PendingTransactionTracker.mjs +24 -22
  67. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
  68. package/dist/types.cjs.map +1 -1
  69. package/dist/types.d.cts +7 -3
  70. package/dist/types.d.cts.map +1 -1
  71. package/dist/types.d.mts +7 -3
  72. package/dist/types.d.mts.map +1 -1
  73. package/dist/types.mjs.map +1 -1
  74. package/dist/utils/etherscan.cjs +2 -1
  75. package/dist/utils/etherscan.cjs.map +1 -1
  76. package/dist/utils/etherscan.d.cts.map +1 -1
  77. package/dist/utils/etherscan.d.mts.map +1 -1
  78. package/dist/utils/etherscan.mjs +3 -2
  79. package/dist/utils/etherscan.mjs.map +1 -1
  80. package/dist/utils/validation.cjs +13 -1
  81. package/dist/utils/validation.cjs.map +1 -1
  82. package/dist/utils/validation.d.cts +7 -0
  83. package/dist/utils/validation.d.cts.map +1 -1
  84. package/dist/utils/validation.d.mts +7 -0
  85. package/dist/utils/validation.d.mts.map +1 -1
  86. package/dist/utils/validation.mjs +11 -0
  87. package/dist/utils/validation.mjs.map +1 -1
  88. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainTrackingHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultichainTrackingHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,iCAAiC,EAClC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gCAAgC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAiB;AACxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAC7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAW7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAChE,wBAAwB,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IACxE,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,YAAY,CAAC;IACnB,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,YAAY,CAAC;QAC3B,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,yBAAyB,CAAC;IAChC,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,yBAAyB,CAAC;IAChC,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;IAC7D,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;CACX,CAAC;AAEF,qBAAa,wBAAwB;;gBAiDvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,+BAA+B,EAC/B,6BAA6B,EAC7B,oBAAoB,GACrB,EAAE,+BAA+B;IA4BlC,UAAU;IAQV,GAAG,CAAC,eAAe,EAAE,eAAe;IAIpC;;;;;;;OAOG;IACG,6BAA6B,CAAC,EAClC,OAAO,EACP,GAAc,GACf,EAAE;QACD,OAAO,EAAE,GAAG,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAevB;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,SAAS,CAAC;IAwCrB,+BAA+B,CAAC,gBAAgB,CAAC,EAAE,eAAe,EAAE;IAUpE,8BAA8B,CAAC,gBAAgB,CAAC,EAAE,eAAe,EAAE;IAUnE,iCAAiC;IAM3B,0BAA0B,CAAC,gBAAgB,CAAC,EAAE,eAAe,EAAE;IAuBrE,yCAAyC,aAIvC;IAEF,eAAe;IAMf,gBAAgB,CAAC,EACf,OAAO,EACP,eAAe,EAAE,sBAAsB,GACxC,EAAE;QACD,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,eAAe,CAAC,EAAE,eAAe,CAAC;KACnC,GAAG,aAAa,GAAG;QAAE,EAAE,EAAE,eAAe,CAAA;KAAE;CAqJ5C"}
@@ -9,25 +9,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  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");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_isMultichainEnabled, _MultichainTrackingHelper_provider, _MultichainTrackingHelper_nonceTracker, _MultichainTrackingHelper_incomingTransactionOptions, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removeIncomingTransactionHelperListeners, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createIncomingTransactionHelper, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId, _MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources, _MultichainTrackingHelper_getNetworkClient;
13
- function $importDefault(module) {
14
- if (module?.__esModule) {
15
- return module.default;
16
- }
17
- return module;
18
- }
19
- import $EthQuery from "@metamask/eth-query";
20
- const EthQuery = $importDefault($EthQuery);
12
+ var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removeIncomingTransactionHelperListeners, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createIncomingTransactionHelper, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_createRemoteTransactionSource, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_remoteTransactionSourcesMap, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId, _MultichainTrackingHelper_refreshRemoteTransactionSources;
21
13
  import { Mutex } from "async-mutex";
22
- import { incomingTransactionsLogger as log } from "../logger.mjs";
23
- import { EtherscanRemoteTransactionSource } from "./EtherscanRemoteTransactionSource.mjs";
14
+ import { createModuleLogger, projectLogger } from "../logger.mjs";
15
+ const log = createModuleLogger(projectLogger, 'multichain-tracking');
24
16
  export class MultichainTrackingHelper {
25
- constructor({ isMultichainEnabled, provider, nonceTracker, incomingTransactionOptions, findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removeIncomingTransactionHelperListeners, removePendingTransactionTrackerListeners, createNonceTracker, createIncomingTransactionHelper, createPendingTransactionTracker, onNetworkStateChange, }) {
17
+ constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removeIncomingTransactionHelperListeners, removePendingTransactionTrackerListeners, createNonceTracker, createIncomingTransactionHelper, createPendingTransactionTracker, createRemoteTransactionSource, onNetworkStateChange, }) {
26
18
  _MultichainTrackingHelper_instances.add(this);
27
- _MultichainTrackingHelper_isMultichainEnabled.set(this, void 0);
28
- _MultichainTrackingHelper_provider.set(this, void 0);
29
- _MultichainTrackingHelper_nonceTracker.set(this, void 0);
30
- _MultichainTrackingHelper_incomingTransactionOptions.set(this, void 0);
31
19
  _MultichainTrackingHelper_findNetworkClientIdByChainId.set(this, void 0);
32
20
  _MultichainTrackingHelper_getNetworkClientById.set(this, void 0);
33
21
  _MultichainTrackingHelper_getNetworkClientRegistry.set(this, void 0);
@@ -36,16 +24,17 @@ export class MultichainTrackingHelper {
36
24
  _MultichainTrackingHelper_createNonceTracker.set(this, void 0);
37
25
  _MultichainTrackingHelper_createIncomingTransactionHelper.set(this, void 0);
38
26
  _MultichainTrackingHelper_createPendingTransactionTracker.set(this, void 0);
27
+ _MultichainTrackingHelper_createRemoteTransactionSource.set(this, void 0);
39
28
  _MultichainTrackingHelper_nonceMutexesByChainId.set(this, new Map());
40
29
  _MultichainTrackingHelper_trackingMap.set(this, new Map());
41
- _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap.set(this, new Map());
30
+ _MultichainTrackingHelper_remoteTransactionSourcesMap.set(this, new Map());
42
31
  this.checkForPendingTransactionAndStartPolling = () => {
43
32
  for (const [, trackers] of __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")) {
44
33
  trackers.pendingTransactionTracker.startIfPendingTransactions();
45
34
  }
46
35
  };
47
36
  _MultichainTrackingHelper_refreshTrackingMap.set(this, (networkClients) => {
48
- __classPrivateFieldGet(this, _MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources, "f").call(this, networkClients);
37
+ __classPrivateFieldGet(this, _MultichainTrackingHelper_refreshRemoteTransactionSources, "f").call(this, networkClients);
49
38
  const networkClientIds = Object.keys(networkClients);
50
39
  const existingNetworkClientIds = Array.from(__classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").keys());
51
40
  // Remove tracking for NetworkClientIds that no longer exist
@@ -58,23 +47,22 @@ export class MultichainTrackingHelper {
58
47
  networkClientIdsToAdd.forEach((id) => {
59
48
  __classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_startTrackingByNetworkClientId).call(this, id);
60
49
  });
50
+ if (networkClientIdsToAdd.length) {
51
+ log('Added trackers', networkClientIdsToAdd);
52
+ }
53
+ if (networkClientIdsToRemove.length) {
54
+ log('Removed trackers', networkClientIdsToRemove);
55
+ }
61
56
  });
62
- _MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources.set(this, (networkClients) => {
63
- // this will be prettier when we have consolidated network clients with a single chainId:
64
- // check if there are still other network clients using the same chainId
65
- // if not remove the etherscanRemoteTransaction source from the map
57
+ _MultichainTrackingHelper_refreshRemoteTransactionSources.set(this, (networkClients) => {
66
58
  const chainIdsInRegistry = new Set();
67
59
  Object.values(networkClients).forEach((networkClient) => chainIdsInRegistry.add(networkClient.configuration.chainId));
68
- const existingChainIds = Array.from(__classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").keys());
60
+ const existingChainIds = Array.from(__classPrivateFieldGet(this, _MultichainTrackingHelper_remoteTransactionSourcesMap, "f").keys());
69
61
  const chainIdsToRemove = existingChainIds.filter((chainId) => !chainIdsInRegistry.has(chainId));
70
62
  chainIdsToRemove.forEach((chainId) => {
71
- __classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").delete(chainId);
63
+ __classPrivateFieldGet(this, _MultichainTrackingHelper_remoteTransactionSourcesMap, "f").delete(chainId);
72
64
  });
73
65
  });
74
- __classPrivateFieldSet(this, _MultichainTrackingHelper_isMultichainEnabled, isMultichainEnabled, "f");
75
- __classPrivateFieldSet(this, _MultichainTrackingHelper_provider, provider, "f");
76
- __classPrivateFieldSet(this, _MultichainTrackingHelper_nonceTracker, nonceTracker, "f");
77
- __classPrivateFieldSet(this, _MultichainTrackingHelper_incomingTransactionOptions, incomingTransactionOptions, "f");
78
66
  __classPrivateFieldSet(this, _MultichainTrackingHelper_findNetworkClientIdByChainId, findNetworkClientIdByChainId, "f");
79
67
  __classPrivateFieldSet(this, _MultichainTrackingHelper_getNetworkClientById, getNetworkClientById, "f");
80
68
  __classPrivateFieldSet(this, _MultichainTrackingHelper_getNetworkClientRegistry, getNetworkClientRegistry, "f");
@@ -83,45 +71,26 @@ export class MultichainTrackingHelper {
83
71
  __classPrivateFieldSet(this, _MultichainTrackingHelper_createNonceTracker, createNonceTracker, "f");
84
72
  __classPrivateFieldSet(this, _MultichainTrackingHelper_createIncomingTransactionHelper, createIncomingTransactionHelper, "f");
85
73
  __classPrivateFieldSet(this, _MultichainTrackingHelper_createPendingTransactionTracker, createPendingTransactionTracker, "f");
74
+ __classPrivateFieldSet(this, _MultichainTrackingHelper_createRemoteTransactionSource, createRemoteTransactionSource, "f");
86
75
  onNetworkStateChange((_, patches) => {
87
- if (__classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
88
- const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
89
- patches.forEach(({ op, path }) => {
90
- if (op === 'remove' && path[0] === 'networkConfigurations') {
91
- const networkClientId = path[1];
92
- delete networkClients[networkClientId];
93
- }
94
- });
95
- __classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
96
- }
76
+ const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
77
+ patches.forEach(({ op, path }) => {
78
+ if (op === 'remove' && path[0] === 'networkConfigurations') {
79
+ const networkClientId = path[1];
80
+ delete networkClients[networkClientId];
81
+ }
82
+ });
83
+ __classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
97
84
  });
98
85
  }
99
86
  initialize() {
100
- if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
101
- return;
102
- }
103
87
  const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
104
88
  __classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
89
+ log('Initialized');
105
90
  }
106
91
  has(networkClientId) {
107
92
  return __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").has(networkClientId);
108
93
  }
109
- getEthQuery({ networkClientId, chainId, } = {}) {
110
- if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
111
- return new EthQuery(this.getProvider());
112
- }
113
- return new EthQuery(this.getProvider({ networkClientId, chainId }));
114
- }
115
- getProvider({ networkClientId, chainId, } = {}) {
116
- if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
117
- return __classPrivateFieldGet(this, _MultichainTrackingHelper_provider, "f");
118
- }
119
- const networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_getNetworkClient).call(this, {
120
- networkClientId,
121
- chainId,
122
- });
123
- return networkClient?.provider || __classPrivateFieldGet(this, _MultichainTrackingHelper_provider, "f");
124
- }
125
94
  /**
126
95
  * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .
127
96
  *
@@ -152,19 +121,14 @@ export class MultichainTrackingHelper {
152
121
  * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.
153
122
  */
154
123
  async getNonceLock(address, networkClientId) {
155
- let releaseLockForChainIdKey;
156
- let nonceTracker = __classPrivateFieldGet(this, _MultichainTrackingHelper_nonceTracker, "f");
157
- if (networkClientId && __classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
158
- const networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
159
- releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({
160
- chainId: networkClient.configuration.chainId,
161
- key: address,
162
- });
163
- const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
164
- if (!trackers) {
165
- throw new Error('missing nonceTracker for networkClientId');
166
- }
167
- nonceTracker = trackers.nonceTracker;
124
+ const networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
125
+ const releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({
126
+ chainId: networkClient.configuration.chainId,
127
+ key: address,
128
+ });
129
+ const nonceTracker = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId)?.nonceTracker;
130
+ if (!nonceTracker) {
131
+ throw new Error(`Missing nonce tracker for network client ID - ${networkClientId}`);
168
132
  }
169
133
  // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then
170
134
  // couples them together by replacing the nonceLock's releaseLock method with
@@ -172,12 +136,13 @@ export class MultichainTrackingHelper {
172
136
  // lock for the chainId.
173
137
  try {
174
138
  const nonceLock = await nonceTracker.getNonceLock(address);
139
+ const releaseLock = () => {
140
+ nonceLock.releaseLock();
141
+ releaseLockForChainIdKey?.();
142
+ };
175
143
  return {
176
144
  ...nonceLock,
177
- releaseLock: () => {
178
- nonceLock.releaseLock();
179
- releaseLockForChainIdKey?.();
180
- },
145
+ releaseLock,
181
146
  };
182
147
  }
183
148
  catch (err) {
@@ -185,13 +150,19 @@ export class MultichainTrackingHelper {
185
150
  throw err;
186
151
  }
187
152
  }
188
- startIncomingTransactionPolling(networkClientIds = []) {
189
- networkClientIds.forEach((networkClientId) => {
153
+ startIncomingTransactionPolling(networkClientIds) {
154
+ const finalNetworkClientIds = networkClientIds ?? [
155
+ ...__classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").keys(),
156
+ ];
157
+ finalNetworkClientIds.forEach((networkClientId) => {
190
158
  __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId)?.incomingTransactionHelper.start();
191
159
  });
192
160
  }
193
- stopIncomingTransactionPolling(networkClientIds = []) {
194
- networkClientIds.forEach((networkClientId) => {
161
+ stopIncomingTransactionPolling(networkClientIds) {
162
+ const finalNetworkClientIds = networkClientIds ?? [
163
+ ...__classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").keys(),
164
+ ];
165
+ finalNetworkClientIds.forEach((networkClientId) => {
195
166
  __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId)?.incomingTransactionHelper.stop();
196
167
  });
197
168
  }
@@ -200,8 +171,11 @@ export class MultichainTrackingHelper {
200
171
  trackers.incomingTransactionHelper.stop();
201
172
  }
202
173
  }
203
- async updateIncomingTransactions(networkClientIds = []) {
204
- const promises = await Promise.allSettled(networkClientIds.map(async (networkClientId) => {
174
+ async updateIncomingTransactions(networkClientIds) {
175
+ const finalNetworkClientIds = networkClientIds ?? [
176
+ ...__classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").keys(),
177
+ ];
178
+ const promises = await Promise.allSettled(finalNetworkClientIds.map(async (networkClientId) => {
205
179
  return await __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")
206
180
  .get(networkClientId)
207
181
  ?.incomingTransactionHelper.update();
@@ -209,7 +183,7 @@ export class MultichainTrackingHelper {
209
183
  promises
210
184
  .filter((result) => result.status === 'rejected')
211
185
  .forEach((result) => {
212
- log('failed to update incoming transactions', result.reason);
186
+ log('Failed to update incoming transactions', result.reason);
213
187
  });
214
188
  }
215
189
  stopAllTracking() {
@@ -217,8 +191,34 @@ export class MultichainTrackingHelper {
217
191
  __classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_stopTrackingByNetworkClientId).call(this, networkClientId);
218
192
  }
219
193
  }
194
+ getNetworkClient({ chainId, networkClientId: requestNetworkClientId, }) {
195
+ if (!requestNetworkClientId && !chainId) {
196
+ throw new Error('Cannot locate network client without networkClientId or chainId');
197
+ }
198
+ let networkClient;
199
+ let networkClientId = requestNetworkClientId;
200
+ try {
201
+ if (requestNetworkClientId) {
202
+ networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, requestNetworkClientId);
203
+ }
204
+ }
205
+ catch (error) {
206
+ log('No network client found with ID', requestNetworkClientId);
207
+ if (!chainId) {
208
+ throw error;
209
+ }
210
+ }
211
+ if (!networkClient && chainId) {
212
+ networkClientId = __classPrivateFieldGet(this, _MultichainTrackingHelper_findNetworkClientIdByChainId, "f").call(this, chainId);
213
+ networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
214
+ }
215
+ return {
216
+ ...networkClient,
217
+ id: networkClientId,
218
+ };
219
+ }
220
220
  }
221
- _MultichainTrackingHelper_isMultichainEnabled = new WeakMap(), _MultichainTrackingHelper_provider = new WeakMap(), _MultichainTrackingHelper_nonceTracker = new WeakMap(), _MultichainTrackingHelper_incomingTransactionOptions = new WeakMap(), _MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removeIncomingTransactionHelperListeners = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createIncomingTransactionHelper = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_stopTrackingByNetworkClientId = function _MultichainTrackingHelper_stopTrackingByNetworkClientId(networkClientId) {
221
+ _MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removeIncomingTransactionHelperListeners = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createIncomingTransactionHelper = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_createRemoteTransactionSource = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_remoteTransactionSourcesMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_refreshRemoteTransactionSources = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_stopTrackingByNetworkClientId = function _MultichainTrackingHelper_stopTrackingByNetworkClientId(networkClientId) {
222
222
  const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
223
223
  if (trackers) {
224
224
  trackers.pendingTransactionTracker.stop();
@@ -233,12 +233,11 @@ _MultichainTrackingHelper_isMultichainEnabled = new WeakMap(), _MultichainTracki
233
233
  return;
234
234
  }
235
235
  const { provider, blockTracker, configuration: { chainId }, } = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
236
- let etherscanRemoteTransactionSource = __classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").get(chainId);
237
- if (!etherscanRemoteTransactionSource) {
238
- etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource({
239
- includeTokenTransfers: __classPrivateFieldGet(this, _MultichainTrackingHelper_incomingTransactionOptions, "f").includeTokenTransfers,
240
- });
241
- __classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").set(chainId, etherscanRemoteTransactionSource);
236
+ let remoteTransactionSource = __classPrivateFieldGet(this, _MultichainTrackingHelper_remoteTransactionSourcesMap, "f").get(chainId);
237
+ if (!remoteTransactionSource) {
238
+ remoteTransactionSource = __classPrivateFieldGet(this, _MultichainTrackingHelper_createRemoteTransactionSource, "f").call(this);
239
+ __classPrivateFieldGet(this, _MultichainTrackingHelper_remoteTransactionSourcesMap, "f").set(chainId, remoteTransactionSource);
240
+ log('Created remote transaction source', chainId);
242
241
  }
243
242
  const nonceTracker = __classPrivateFieldGet(this, _MultichainTrackingHelper_createNonceTracker, "f").call(this, {
244
243
  provider,
@@ -247,7 +246,7 @@ _MultichainTrackingHelper_isMultichainEnabled = new WeakMap(), _MultichainTracki
247
246
  });
248
247
  const incomingTransactionHelper = __classPrivateFieldGet(this, _MultichainTrackingHelper_createIncomingTransactionHelper, "f").call(this, {
249
248
  blockTracker,
250
- etherscanRemoteTransactionSource,
249
+ remoteTransactionSource,
251
250
  chainId,
252
251
  });
253
252
  const pendingTransactionTracker = __classPrivateFieldGet(this, _MultichainTrackingHelper_createPendingTransactionTracker, "f").call(this, {
@@ -260,25 +259,5 @@ _MultichainTrackingHelper_isMultichainEnabled = new WeakMap(), _MultichainTracki
260
259
  incomingTransactionHelper,
261
260
  pendingTransactionTracker,
262
261
  });
263
- }, _MultichainTrackingHelper_getNetworkClient = function _MultichainTrackingHelper_getNetworkClient({ networkClientId, chainId, } = {}) {
264
- let networkClient;
265
- if (networkClientId) {
266
- try {
267
- networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
268
- }
269
- catch (err) {
270
- log('failed to get network client by networkClientId');
271
- }
272
- }
273
- if (!networkClient && chainId) {
274
- try {
275
- const networkClientIdForChainId = __classPrivateFieldGet(this, _MultichainTrackingHelper_findNetworkClientIdByChainId, "f").call(this, chainId);
276
- networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientIdForChainId);
277
- }
278
- catch (err) {
279
- log('failed to get network client by chainId');
280
- }
281
- }
282
- return networkClient;
283
262
  };
284
263
  //# sourceMappingURL=MultichainTrackingHelper.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainTrackingHelper.mjs","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,SAAQ,4BAA4B;;AAW3C,OAAO,EAAE,KAAK,EAAE,oBAAoB;AAEpC,OAAO,EAAE,0BAA0B,IAAI,GAAG,EAAE,sBAAkB;AAC9D,OAAO,EAAE,gCAAgC,EAAE,+CAA2C;AAoDtF,MAAM,OAAO,wBAAwB;IAyDnC,YAAY,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,0BAA0B,EAC1B,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,+BAA+B,EAC/B,oBAAoB,GACY;;QAtElC,gEAA8B;QAErB,qDAAoB;QAEpB,yDAA4B;QAE5B,uEAAwD;QAExD,yEAAiF;QAEjF,iEAAiE;QAEjE,qEAAyE;QAEzE,qFAEC;QAED,qFAEC;QAED,+DAIU;QAEV,4EAIuB;QAEvB,4EAIuB;QAEvB,0DAAyB,IAAI,GAAG,EAA2B,EAAC;QAE5D,gDAOL,IAAI,GAAG,EAAE,EAAC;QAEL,yEAGL,IAAI,GAAG,EAAE,EAAC;QA6Md,8CAAyC,GAAG,GAAG,EAAE;YAC/C,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,uBAAA,IAAI,6CAAa,EAAE;gBAC5C,QAAQ,CAAC,yBAAyB,CAAC,0BAA0B,EAAE,CAAC;aACjE;QACH,CAAC,CAAC;QAQF,uDAAsB,CAAC,cAAqC,EAAE,EAAE;YAC9D,uBAAA,IAAI,0EAA0C,MAA9C,IAAI,EAA2C,cAAc,CAAC,CAAC;YAE/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACrD,MAAM,wBAAwB,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAA,IAAI,6CAAa,CAAC,IAAI,EAAE,CAAC,CAAC;YAEtE,4DAA4D;YAC5D,MAAM,wBAAwB,GAAG,wBAAwB,CAAC,MAAM,CAC9D,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CACvC,CAAC;YACF,wBAAwB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBACtC,uBAAA,IAAI,oGAA+B,MAAnC,IAAI,EAAgC,EAAE,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,wDAAwD;YACxD,MAAM,qBAAqB,GAAG,gBAAgB,CAAC,MAAM,CACnD,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC/C,CAAC;YACF,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBACnC,uBAAA,IAAI,qGAAgC,MAApC,IAAI,EAAiC,EAAE,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAmEF,6EAA4C,CAC1C,cAAqC,EACrC,EAAE;YACF,yFAAyF;YACzF,wEAAwE;YACxE,mEAAmE;YACnE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE,CACtD,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAC5D,CAAC;YACF,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACjC,uBAAA,IAAI,sEAAsC,CAAC,IAAI,EAAE,CAClD,CAAC;YACF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAC9C,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAC9C,CAAC;YAEF,gBAAgB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACnC,uBAAA,IAAI,sEAAsC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QApTA,uBAAA,IAAI,iDAAwB,mBAAmB,MAAA,CAAC;QAChD,uBAAA,IAAI,sCAAa,QAAQ,MAAA,CAAC;QAC1B,uBAAA,IAAI,0CAAiB,YAAY,MAAA,CAAC;QAClC,uBAAA,IAAI,wDAA+B,0BAA0B,MAAA,CAAC;QAE9D,uBAAA,IAAI,0DAAiC,4BAA4B,MAAA,CAAC;QAClE,uBAAA,IAAI,kDAAyB,oBAAoB,MAAA,CAAC;QAClD,uBAAA,IAAI,sDAA6B,wBAAwB,MAAA,CAAC;QAE1D,uBAAA,IAAI,sEACF,wCAAwC,MAAA,CAAC;QAC3C,uBAAA,IAAI,sEACF,wCAAwC,MAAA,CAAC;QAC3C,uBAAA,IAAI,gDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,6DAAoC,+BAA+B,MAAA,CAAC;QACxE,uBAAA,IAAI,6DAAoC,+BAA+B,MAAA,CAAC;QAExE,oBAAoB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;YAClC,IAAI,uBAAA,IAAI,qDAAqB,EAAE;gBAC7B,MAAM,cAAc,GAAG,uBAAA,IAAI,0DAA0B,MAA9B,IAAI,CAA4B,CAAC;gBACxD,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC/B,IAAI,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,uBAAuB,EAAE;wBAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAoB,CAAC;wBACnD,OAAO,cAAc,CAAC,eAAe,CAAC,CAAC;qBACxC;gBACH,CAAC,CAAC,CAAC;gBAEH,uBAAA,IAAI,oDAAoB,MAAxB,IAAI,EAAqB,cAAc,CAAC,CAAC;aAC1C;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,IAAI,CAAC,uBAAA,IAAI,qDAAqB,EAAE;YAC9B,OAAO;SACR;QACD,MAAM,cAAc,GAAG,uBAAA,IAAI,0DAA0B,MAA9B,IAAI,CAA4B,CAAC;QACxD,uBAAA,IAAI,oDAAoB,MAAxB,IAAI,EAAqB,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,eAAgC;QAClC,OAAO,uBAAA,IAAI,6CAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC;IAED,WAAW,CAAC,EACV,eAAe,EACf,OAAO,MAIL,EAAE;QACJ,IAAI,CAAC,uBAAA,IAAI,qDAAqB,EAAE;YAC9B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;SACzC;QACD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,WAAW,CAAC,EACV,eAAe,EACf,OAAO,MAIL,EAAE;QACJ,IAAI,CAAC,uBAAA,IAAI,qDAAqB,EAAE;YAC9B,OAAO,uBAAA,IAAI,0CAAU,CAAC;SACvB;QAED,MAAM,aAAa,GAAG,uBAAA,IAAI,uFAAkB,MAAtB,IAAI,EAAmB;YAC3C,eAAe;YACf,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,aAAa,EAAE,QAAQ,IAAI,uBAAA,IAAI,0CAAU,CAAC;IACnD,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,6BAA6B,CAAC,EAClC,OAAO,EACP,GAAG,GAAG,QAAQ,GAIf;QACC,IAAI,sBAAsB,GAAG,uBAAA,IAAI,uDAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,sBAAsB,EAAE;YAC3B,sBAAsB,GAAG,IAAI,GAAG,EAAiB,CAAC;YAClD,uBAAA,IAAI,uDAAuB,CAAC,GAAG,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;SAClE;QACD,IAAI,gBAAgB,GAAG,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,gBAAgB,EAAE;YACrB,gBAAgB,GAAG,IAAI,KAAK,EAAE,CAAC;YAC/B,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;SACnD;QAED,OAAO,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,OAAe,EACf,eAAiC;QAEjC,IAAI,wBAAkD,CAAC;QACvD,IAAI,YAAY,GAAG,uBAAA,IAAI,8CAAc,CAAC;QACtC,IAAI,eAAe,IAAI,uBAAA,IAAI,qDAAqB,EAAE;YAChD,MAAM,aAAa,GAAG,uBAAA,IAAI,sDAAsB,MAA1B,IAAI,EAAuB,eAAe,CAAC,CAAC;YAClE,wBAAwB,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC;gBAClE,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,OAAO;gBAC5C,GAAG,EAAE,OAAO;aACb,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,uBAAA,IAAI,6CAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;aAC7D;YACD,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;SACtC;QAED,4FAA4F;QAC5F,6EAA6E;QAC7E,gFAAgF;QAChF,wBAAwB;QACxB,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC3D,OAAO;gBACL,GAAG,SAAS;gBACZ,WAAW,EAAE,GAAG,EAAE;oBAChB,SAAS,CAAC,WAAW,EAAE,CAAC;oBACxB,wBAAwB,EAAE,EAAE,CAAC;gBAC/B,CAAC;aACF,CAAC;SACH;QAAC,OAAO,GAAG,EAAE;YACZ,wBAAwB,EAAE,EAAE,CAAC;YAC7B,MAAM,GAAG,CAAC;SACX;IACH,CAAC;IAED,+BAA+B,CAAC,mBAAsC,EAAE;QACtE,gBAAgB,CAAC,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;YAC3C,uBAAA,IAAI,6CAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC,KAAK,EAAE,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8BAA8B,CAAC,mBAAsC,EAAE;QACrE,gBAAgB,CAAC,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE;YAC3C,uBAAA,IAAI,6CAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC,IAAI,EAAE,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iCAAiC;QAC/B,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,uBAAA,IAAI,6CAAa,EAAE;YAC5C,QAAQ,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;SAC3C;IACH,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,mBAAsC,EAAE;QACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CACvC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,EAAE;YAC7C,OAAO,MAAM,uBAAA,IAAI,6CAAa;iBAC3B,GAAG,CAAC,eAAe,CAAC;gBACrB,EAAE,yBAAyB,CAAC,MAAM,EAAE,CAAC;QACzC,CAAC,CAAC,CACH,CAAC;QAEF,QAAQ;aACL,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;aAChD,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAClB,GAAG,CACD,wCAAwC,EACvC,MAAgC,CAAC,MAAM,CACzC,CAAC;QACJ,CAAC,CAAC,CAAC;IACP,CAAC;IAQD,eAAe;QACb,KAAK,MAAM,CAAC,eAAe,CAAC,IAAI,uBAAA,IAAI,6CAAa,EAAE;YACjD,uBAAA,IAAI,oGAA+B,MAAnC,IAAI,EAAgC,eAAe,CAAC,CAAC;SACtD;IACH,CAAC;CA2IF;m0CAlHgC,eAAgC;IAC7D,MAAM,QAAQ,GAAG,uBAAA,IAAI,6CAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACxD,IAAI,QAAQ,EAAE;QACZ,QAAQ,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;QAC1C,uBAAA,IAAI,0EAA0C,MAA9C,IAAI,EACF,QAAQ,CAAC,yBAAyB,CACnC,CAAC;QACF,QAAQ,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC;QAC1C,uBAAA,IAAI,0EAA0C,MAA9C,IAAI,EACF,QAAQ,CAAC,yBAAyB,CACnC,CAAC;QACF,uBAAA,IAAI,6CAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;KAC3C;AACH,CAAC,+HAE+B,eAAgC;IAC9D,MAAM,QAAQ,GAAG,uBAAA,IAAI,6CAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACxD,IAAI,QAAQ,EAAE;QACZ,OAAO;KACR;IAED,MAAM,EACJ,QAAQ,EACR,YAAY,EACZ,aAAa,EAAE,EAAE,OAAO,EAAE,GAC3B,GAAG,uBAAA,IAAI,sDAAsB,MAA1B,IAAI,EAAuB,eAAe,CAAC,CAAC;IAEhD,IAAI,gCAAgC,GAClC,uBAAA,IAAI,sEAAsC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,gCAAgC,EAAE;QACrC,gCAAgC,GAAG,IAAI,gCAAgC,CAAC;YACtE,qBAAqB,EACnB,uBAAA,IAAI,4DAA4B,CAAC,qBAAqB;SACzD,CAAC,CAAC;QACH,uBAAA,IAAI,sEAAsC,CAAC,GAAG,CAC5C,OAAO,EACP,gCAAgC,CACjC,CAAC;KACH;IAED,MAAM,YAAY,GAAG,uBAAA,IAAI,oDAAoB,MAAxB,IAAI,EAAqB;QAC5C,QAAQ;QACR,YAAY;QACZ,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,uBAAA,IAAI,iEAAiC,MAArC,IAAI,EAAkC;QACtE,YAAY;QACZ,gCAAgC;QAChC,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,yBAAyB,GAAG,uBAAA,IAAI,iEAAiC,MAArC,IAAI,EAAkC;QACtE,QAAQ;QACR,YAAY;QACZ,OAAO;KACR,CAAC,CAAC;IAEH,uBAAA,IAAI,6CAAa,CAAC,GAAG,CAAC,eAAe,EAAE;QACrC,YAAY;QACZ,yBAAyB;QACzB,yBAAyB;KAC1B,CAAC,CAAC;AACL,CAAC,mGAwBiB,EAChB,eAAe,EACf,OAAO,MAIL,EAAE;IACJ,IAAI,aAAwC,CAAC;IAE7C,IAAI,eAAe,EAAE;QACnB,IAAI;YACF,aAAa,GAAG,uBAAA,IAAI,sDAAsB,MAA1B,IAAI,EAAuB,eAAe,CAAC,CAAC;SAC7D;QAAC,OAAO,GAAG,EAAE;YACZ,GAAG,CAAC,iDAAiD,CAAC,CAAC;SACxD;KACF;IACD,IAAI,CAAC,aAAa,IAAI,OAAO,EAAE;QAC7B,IAAI;YACF,MAAM,yBAAyB,GAC7B,uBAAA,IAAI,8DAA8B,MAAlC,IAAI,EAA+B,OAAO,CAAC,CAAC;YAC9C,aAAa,GAAG,uBAAA,IAAI,sDAAsB,MAA1B,IAAI,EAAuB,yBAAyB,CAAC,CAAC;SACvE;QAAC,OAAO,GAAG,EAAE;YACZ,GAAG,CAAC,yCAAyC,CAAC,CAAC;SAChD;KACF;IACD,OAAO,aAAa,CAAC;AACvB,CAAC","sourcesContent":["import EthQuery from '@metamask/eth-query';\nimport type {\n NetworkClientId,\n NetworkController,\n NetworkClient,\n BlockTracker,\n Provider,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NonceLock, NonceTracker } from '@metamask/nonce-tracker';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { incomingTransactionsLogger as log } from '../logger';\nimport { EtherscanRemoteTransactionSource } from './EtherscanRemoteTransactionSource';\nimport type {\n IncomingTransactionHelper,\n IncomingTransactionOptions,\n} from './IncomingTransactionHelper';\nimport type { PendingTransactionTracker } from './PendingTransactionTracker';\n\n/**\n * Registry of network clients provided by the NetworkController\n */\ntype NetworkClientRegistry = ReturnType<\n NetworkController['getNetworkClientRegistry']\n>;\n\nexport type MultichainTrackingHelperOptions = {\n isMultichainEnabled: boolean;\n provider: Provider;\n nonceTracker: NonceTracker;\n incomingTransactionOptions: IncomingTransactionOptions;\n\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n removeIncomingTransactionHelperListeners: (\n IncomingTransactionHelper: IncomingTransactionHelper,\n ) => void;\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId?: Hex;\n }) => NonceTracker;\n createIncomingTransactionHelper: (opts: {\n blockTracker: BlockTracker;\n etherscanRemoteTransactionSource: EtherscanRemoteTransactionSource;\n chainId?: Hex;\n }) => IncomingTransactionHelper;\n createPendingTransactionTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId?: Hex;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n};\n\nexport class MultichainTrackingHelper {\n #isMultichainEnabled: boolean;\n\n readonly #provider: Provider;\n\n readonly #nonceTracker: NonceTracker;\n\n readonly #incomingTransactionOptions: IncomingTransactionOptions;\n\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n readonly #removeIncomingTransactionHelperListeners: (\n IncomingTransactionHelper: IncomingTransactionHelper,\n ) => void;\n\n readonly #removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n\n readonly #createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId?: Hex;\n }) => NonceTracker;\n\n readonly #createIncomingTransactionHelper: (opts: {\n blockTracker: BlockTracker;\n chainId?: Hex;\n etherscanRemoteTransactionSource: EtherscanRemoteTransactionSource;\n }) => IncomingTransactionHelper;\n\n readonly #createPendingTransactionTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId?: Hex;\n }) => PendingTransactionTracker;\n\n readonly #nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n readonly #trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n incomingTransactionHelper: IncomingTransactionHelper;\n }\n > = new Map();\n\n readonly #etherscanRemoteTransactionSourcesMap: Map<\n Hex,\n EtherscanRemoteTransactionSource\n > = new Map();\n\n constructor({\n isMultichainEnabled,\n provider,\n nonceTracker,\n incomingTransactionOptions,\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removeIncomingTransactionHelperListeners,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createIncomingTransactionHelper,\n createPendingTransactionTracker,\n onNetworkStateChange,\n }: MultichainTrackingHelperOptions) {\n this.#isMultichainEnabled = isMultichainEnabled;\n this.#provider = provider;\n this.#nonceTracker = nonceTracker;\n this.#incomingTransactionOptions = incomingTransactionOptions;\n\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removeIncomingTransactionHelperListeners =\n removeIncomingTransactionHelperListeners;\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createIncomingTransactionHelper = createIncomingTransactionHelper;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (this.#isMultichainEnabled) {\n const networkClients = this.#getNetworkClientRegistry();\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n }\n });\n }\n\n initialize() {\n if (!this.#isMultichainEnabled) {\n return;\n }\n const networkClients = this.#getNetworkClientRegistry();\n this.#refreshTrackingMap(networkClients);\n }\n\n has(networkClientId: NetworkClientId) {\n return this.#trackingMap.has(networkClientId);\n }\n\n getEthQuery({\n networkClientId,\n chainId,\n }: {\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n } = {}): EthQuery {\n if (!this.#isMultichainEnabled) {\n return new EthQuery(this.getProvider());\n }\n return new EthQuery(this.getProvider({ networkClientId, chainId }));\n }\n\n getProvider({\n networkClientId,\n chainId,\n }: {\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n } = {}): Provider {\n if (!this.#isMultichainEnabled) {\n return this.#provider;\n }\n\n const networkClient = this.#getNetworkClient({\n networkClientId,\n chainId,\n });\n\n return networkClient?.provider || this.#provider;\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.#nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.#nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId?: NetworkClientId,\n ): Promise<NonceLock> {\n let releaseLockForChainIdKey: (() => void) | undefined;\n let nonceTracker = this.#nonceTracker;\n if (networkClientId && this.#isMultichainEnabled) {\n const networkClient = this.#getNetworkClientById(networkClientId);\n releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n const trackers = this.#trackingMap.get(networkClientId);\n if (!trackers) {\n throw new Error('missing nonceTracker for networkClientId');\n }\n nonceTracker = trackers.nonceTracker;\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n return {\n ...nonceLock,\n releaseLock: () => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n },\n };\n } catch (err) {\n releaseLockForChainIdKey?.();\n throw err;\n }\n }\n\n startIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n networkClientIds.forEach((networkClientId) => {\n this.#trackingMap.get(networkClientId)?.incomingTransactionHelper.start();\n });\n }\n\n stopIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n networkClientIds.forEach((networkClientId) => {\n this.#trackingMap.get(networkClientId)?.incomingTransactionHelper.stop();\n });\n }\n\n stopAllIncomingTransactionPolling() {\n for (const [, trackers] of this.#trackingMap) {\n trackers.incomingTransactionHelper.stop();\n }\n }\n\n async updateIncomingTransactions(networkClientIds: NetworkClientId[] = []) {\n const promises = await Promise.allSettled(\n networkClientIds.map(async (networkClientId) => {\n return await this.#trackingMap\n .get(networkClientId)\n ?.incomingTransactionHelper.update();\n }),\n );\n\n promises\n .filter((result) => result.status === 'rejected')\n .forEach((result) => {\n log(\n 'failed to update incoming transactions',\n (result as PromiseRejectedResult).reason,\n );\n });\n }\n\n checkForPendingTransactionAndStartPolling = () => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking() {\n for (const [networkClientId] of this.#trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n\n #refreshTrackingMap = (networkClients: NetworkClientRegistry) => {\n this.#refreshEtherscanRemoteTransactionSources(networkClients);\n\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.#trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n trackers.incomingTransactionHelper.stop();\n this.#removeIncomingTransactionHelperListeners(\n trackers.incomingTransactionHelper,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n\n const {\n provider,\n blockTracker,\n configuration: { chainId },\n } = this.#getNetworkClientById(networkClientId);\n\n let etherscanRemoteTransactionSource =\n this.#etherscanRemoteTransactionSourcesMap.get(chainId);\n if (!etherscanRemoteTransactionSource) {\n etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource({\n includeTokenTransfers:\n this.#incomingTransactionOptions.includeTokenTransfers,\n });\n this.#etherscanRemoteTransactionSourcesMap.set(\n chainId,\n etherscanRemoteTransactionSource,\n );\n }\n\n const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const incomingTransactionHelper = this.#createIncomingTransactionHelper({\n blockTracker,\n etherscanRemoteTransactionSource,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n incomingTransactionHelper,\n pendingTransactionTracker,\n });\n }\n\n #refreshEtherscanRemoteTransactionSources = (\n networkClients: NetworkClientRegistry,\n ) => {\n // this will be prettier when we have consolidated network clients with a single chainId:\n // check if there are still other network clients using the same chainId\n // if not remove the etherscanRemoteTransaction source from the map\n const chainIdsInRegistry = new Set();\n Object.values(networkClients).forEach((networkClient) =>\n chainIdsInRegistry.add(networkClient.configuration.chainId),\n );\n const existingChainIds = Array.from(\n this.#etherscanRemoteTransactionSourcesMap.keys(),\n );\n const chainIdsToRemove = existingChainIds.filter(\n (chainId) => !chainIdsInRegistry.has(chainId),\n );\n\n chainIdsToRemove.forEach((chainId) => {\n this.#etherscanRemoteTransactionSourcesMap.delete(chainId);\n });\n };\n\n #getNetworkClient({\n networkClientId,\n chainId,\n }: {\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n } = {}): NetworkClient | undefined {\n let networkClient: NetworkClient | undefined;\n\n if (networkClientId) {\n try {\n networkClient = this.#getNetworkClientById(networkClientId);\n } catch (err) {\n log('failed to get network client by networkClientId');\n }\n }\n if (!networkClient && chainId) {\n try {\n const networkClientIdForChainId =\n this.#findNetworkClientIdByChainId(chainId);\n networkClient = this.#getNetworkClientById(networkClientIdForChainId);\n } catch (err) {\n log('failed to get network client by chainId');\n }\n }\n return networkClient;\n }\n}\n"]}
1
+ {"version":3,"file":"MultichainTrackingHelper.mjs","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n NetworkClientId,\n NetworkController,\n NetworkClient,\n BlockTracker,\n Provider,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NonceLock, NonceTracker } from '@metamask/nonce-tracker';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { RemoteTransactionSource } from '../types';\nimport type { IncomingTransactionHelper } from './IncomingTransactionHelper';\nimport type { PendingTransactionTracker } from './PendingTransactionTracker';\n\n/**\n * Registry of network clients provided by the NetworkController\n */\ntype NetworkClientRegistry = ReturnType<\n NetworkController['getNetworkClientRegistry']\n>;\n\nconst log = createModuleLogger(projectLogger, 'multichain-tracking');\n\nexport type MultichainTrackingHelperOptions = {\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n removeIncomingTransactionHelperListeners: (\n IncomingTransactionHelper: IncomingTransactionHelper,\n ) => void;\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createIncomingTransactionHelper: (opts: {\n blockTracker: BlockTracker;\n remoteTransactionSource: RemoteTransactionSource;\n chainId: Hex;\n }) => IncomingTransactionHelper;\n createPendingTransactionTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => PendingTransactionTracker;\n createRemoteTransactionSource: () => RemoteTransactionSource;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n};\n\nexport class MultichainTrackingHelper {\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n readonly #removeIncomingTransactionHelperListeners: (\n IncomingTransactionHelper: IncomingTransactionHelper,\n ) => void;\n\n readonly #removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n\n readonly #createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n\n readonly #createIncomingTransactionHelper: (opts: {\n blockTracker: BlockTracker;\n chainId: Hex;\n remoteTransactionSource: RemoteTransactionSource;\n }) => IncomingTransactionHelper;\n\n readonly #createPendingTransactionTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => PendingTransactionTracker;\n\n readonly #createRemoteTransactionSource: () => RemoteTransactionSource;\n\n readonly #nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n readonly #trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n incomingTransactionHelper: IncomingTransactionHelper;\n }\n > = new Map();\n\n readonly #remoteTransactionSourcesMap: Map<Hex, RemoteTransactionSource> =\n new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removeIncomingTransactionHelperListeners,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createIncomingTransactionHelper,\n createPendingTransactionTracker,\n createRemoteTransactionSource,\n onNetworkStateChange,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removeIncomingTransactionHelperListeners =\n removeIncomingTransactionHelperListeners;\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createIncomingTransactionHelper = createIncomingTransactionHelper;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n this.#createRemoteTransactionSource = createRemoteTransactionSource;\n\n onNetworkStateChange((_, patches) => {\n const networkClients = this.#getNetworkClientRegistry();\n\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n });\n }\n\n initialize() {\n const networkClients = this.#getNetworkClientRegistry();\n\n this.#refreshTrackingMap(networkClients);\n\n log('Initialized');\n }\n\n has(networkClientId: NetworkClientId) {\n return this.#trackingMap.has(networkClientId);\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.#nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.#nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId: NetworkClientId,\n ): Promise<NonceLock> {\n const networkClient = this.#getNetworkClientById(networkClientId);\n\n const releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n\n const nonceTracker = this.#trackingMap.get(networkClientId)?.nonceTracker;\n\n if (!nonceTracker) {\n throw new Error(\n `Missing nonce tracker for network client ID - ${\n networkClientId as string\n }`,\n );\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n\n const releaseLock = () => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (err) {\n releaseLockForChainIdKey?.();\n throw err;\n }\n }\n\n startIncomingTransactionPolling(networkClientIds?: NetworkClientId[]) {\n const finalNetworkClientIds = networkClientIds ?? [\n ...this.#trackingMap.keys(),\n ];\n\n finalNetworkClientIds.forEach((networkClientId) => {\n this.#trackingMap.get(networkClientId)?.incomingTransactionHelper.start();\n });\n }\n\n stopIncomingTransactionPolling(networkClientIds?: NetworkClientId[]) {\n const finalNetworkClientIds = networkClientIds ?? [\n ...this.#trackingMap.keys(),\n ];\n\n finalNetworkClientIds.forEach((networkClientId) => {\n this.#trackingMap.get(networkClientId)?.incomingTransactionHelper.stop();\n });\n }\n\n stopAllIncomingTransactionPolling() {\n for (const [, trackers] of this.#trackingMap) {\n trackers.incomingTransactionHelper.stop();\n }\n }\n\n async updateIncomingTransactions(networkClientIds?: NetworkClientId[]) {\n const finalNetworkClientIds = networkClientIds ?? [\n ...this.#trackingMap.keys(),\n ];\n\n const promises = await Promise.allSettled(\n finalNetworkClientIds.map(async (networkClientId) => {\n return await this.#trackingMap\n .get(networkClientId)\n ?.incomingTransactionHelper.update();\n }),\n );\n\n promises\n .filter((result) => result.status === 'rejected')\n .forEach((result) => {\n log(\n 'Failed to update incoming transactions',\n (result as PromiseRejectedResult).reason,\n );\n });\n }\n\n checkForPendingTransactionAndStartPolling = () => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking() {\n for (const [networkClientId] of this.#trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n\n getNetworkClient({\n chainId,\n networkClientId: requestNetworkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): NetworkClient & { id: NetworkClientId } {\n if (!requestNetworkClientId && !chainId) {\n throw new Error(\n 'Cannot locate network client without networkClientId or chainId',\n );\n }\n\n let networkClient: NetworkClient | undefined;\n let networkClientId = requestNetworkClientId;\n\n try {\n if (requestNetworkClientId) {\n networkClient = this.#getNetworkClientById(requestNetworkClientId);\n }\n } catch (error) {\n log('No network client found with ID', requestNetworkClientId);\n\n if (!chainId) {\n throw error;\n }\n }\n\n if (!networkClient && chainId) {\n networkClientId = this.#findNetworkClientIdByChainId(chainId);\n networkClient = this.#getNetworkClientById(networkClientId);\n }\n\n return {\n ...(networkClient as NetworkClient),\n id: networkClientId as NetworkClientId,\n };\n }\n\n #refreshTrackingMap = (networkClients: NetworkClientRegistry) => {\n this.#refreshRemoteTransactionSources(networkClients);\n\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.#trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n\n if (networkClientIdsToAdd.length) {\n log('Added trackers', networkClientIdsToAdd);\n }\n\n if (networkClientIdsToRemove.length) {\n log('Removed trackers', networkClientIdsToRemove);\n }\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n trackers.incomingTransactionHelper.stop();\n this.#removeIncomingTransactionHelperListeners(\n trackers.incomingTransactionHelper,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n\n const {\n provider,\n blockTracker,\n configuration: { chainId },\n } = this.#getNetworkClientById(networkClientId);\n\n let remoteTransactionSource =\n this.#remoteTransactionSourcesMap.get(chainId);\n\n if (!remoteTransactionSource) {\n remoteTransactionSource = this.#createRemoteTransactionSource();\n this.#remoteTransactionSourcesMap.set(chainId, remoteTransactionSource);\n\n log('Created remote transaction source', chainId);\n }\n\n const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const incomingTransactionHelper = this.#createIncomingTransactionHelper({\n blockTracker,\n remoteTransactionSource,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n incomingTransactionHelper,\n pendingTransactionTracker,\n });\n }\n\n #refreshRemoteTransactionSources = (\n networkClients: NetworkClientRegistry,\n ) => {\n const chainIdsInRegistry = new Set();\n\n Object.values(networkClients).forEach((networkClient) =>\n chainIdsInRegistry.add(networkClient.configuration.chainId),\n );\n\n const existingChainIds = Array.from(\n this.#remoteTransactionSourcesMap.keys(),\n );\n\n const chainIdsToRemove = existingChainIds.filter(\n (chainId) => !chainIdsInRegistry.has(chainId),\n );\n\n chainIdsToRemove.forEach((chainId) => {\n this.#remoteTransactionSourcesMap.delete(chainId);\n });\n };\n}\n"]}