@metamask-previews/transaction-controller 67.0.0-preview-35bdba6 → 67.0.0-preview-a38b6cb

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.
@@ -176,17 +176,28 @@ class MultichainTrackingHelper {
176
176
  exports.MultichainTrackingHelper = MultichainTrackingHelper;
177
177
  _MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_initialized = new WeakMap(), _MultichainTrackingHelper_initInterval = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_waitForNetworkController = function _MultichainTrackingHelper_waitForNetworkController(onInitialized) {
178
178
  log('Waiting for NetworkController to be available');
179
- __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, setInterval(() => {
179
+ const tryInit = () => {
180
180
  try {
181
181
  const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
182
- clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
183
- __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
184
182
  __classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
185
183
  __classPrivateFieldSet(this, _MultichainTrackingHelper_initialized, true, "f");
186
184
  log('Initialized');
187
185
  onInitialized();
186
+ return true;
188
187
  }
189
188
  catch {
189
+ return false;
190
+ }
191
+ };
192
+ if (tryInit()) {
193
+ return;
194
+ }
195
+ __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, setInterval(() => {
196
+ if (tryInit()) {
197
+ clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
198
+ __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
199
+ }
200
+ else {
190
201
  log('NetworkController not yet available, retrying');
191
202
  }
192
203
  }, 10), "f");
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainTrackingHelper.cjs","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 { 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\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n onInitialized: () => 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 #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 #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n #initialized = false;\n\n #initInterval?: ReturnType<typeof setInterval>;\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 }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n onInitialized,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (!this.#initialized) {\n return;\n }\n\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 this.#waitForNetworkController(onInitialized);\n }\n\n #waitForNetworkController(onInitialized: () => void): void {\n log('Waiting for NetworkController to be available');\n\n this.#initInterval = setInterval(() => {\n try {\n const networkClients = this.#getNetworkClientRegistry();\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n this.#refreshTrackingMap(networkClients);\n this.#initialized = true;\n log('Initialized');\n onInitialized();\n } catch {\n log('NetworkController not yet available, retrying');\n }\n }, 10);\n }\n\n has(networkClientId: NetworkClientId): boolean {\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 - ${networkClientId}`,\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 = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n if (this.#initInterval) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n }\n\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 readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\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): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\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 const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"MultichainTrackingHelper.cjs","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 { 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\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n onInitialized: () => 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 #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 #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n #initialized = false;\n\n #initInterval?: ReturnType<typeof setInterval>;\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 }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n onInitialized,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (!this.#initialized) {\n return;\n }\n\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 this.#waitForNetworkController(onInitialized);\n }\n\n #waitForNetworkController(onInitialized: () => void): void {\n log('Waiting for NetworkController to be available');\n\n const tryInit = (): boolean => {\n try {\n const networkClients = this.#getNetworkClientRegistry();\n this.#refreshTrackingMap(networkClients);\n this.#initialized = true;\n log('Initialized');\n onInitialized();\n return true;\n } catch {\n return false;\n }\n };\n\n if (tryInit()) {\n return;\n }\n\n this.#initInterval = setInterval(() => {\n if (tryInit()) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n } else {\n log('NetworkController not yet available, retrying');\n }\n }, 10);\n }\n\n has(networkClientId: NetworkClientId): boolean {\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 - ${networkClientId}`,\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 = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n if (this.#initInterval) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n }\n\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 readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\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): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\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 const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainTrackingHelper.d.cts","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,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;IAExE,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,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;IACV,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,qBAAa,wBAAwB;;gBAoCvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,oBAAoB,EACpB,aAAa,GACd,EAAE,+BAA+B;IAgDlC,GAAG,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO;IAI9C;;;;;;;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;IAsCrB,yCAAyC,QAAO,IAAI,CAIlD;IAEF,eAAe,IAAI,IAAI;IAWvB,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;CAyG5C"}
1
+ {"version":3,"file":"MultichainTrackingHelper.d.cts","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,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;IAExE,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,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;IACV,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,qBAAa,wBAAwB;;gBAoCvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,oBAAoB,EACpB,aAAa,GACd,EAAE,+BAA+B;IA4DlC,GAAG,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO;IAI9C;;;;;;;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;IAsCrB,yCAAyC,QAAO,IAAI,CAIlD;IAEF,eAAe,IAAI,IAAI;IAWvB,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;CAyG5C"}
@@ -1 +1 @@
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,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;IAExE,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,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;IACV,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,qBAAa,wBAAwB;;gBAoCvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,oBAAoB,EACpB,aAAa,GACd,EAAE,+BAA+B;IAgDlC,GAAG,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO;IAI9C;;;;;;;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;IAsCrB,yCAAyC,QAAO,IAAI,CAIlD;IAEF,eAAe,IAAI,IAAI;IAWvB,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;CAyG5C"}
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,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;IAExE,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,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;IACV,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF,qBAAa,wBAAwB;;gBAoCvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,oBAAoB,EACpB,aAAa,GACd,EAAE,+BAA+B;IA4DlC,GAAG,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO;IAI9C;;;;;;;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;IAsCrB,yCAAyC,QAAO,IAAI,CAIlD;IAEF,eAAe,IAAI,IAAI;IAWvB,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;CAyG5C"}
@@ -172,17 +172,28 @@ export class MultichainTrackingHelper {
172
172
  }
173
173
  _MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_initialized = new WeakMap(), _MultichainTrackingHelper_initInterval = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_waitForNetworkController = function _MultichainTrackingHelper_waitForNetworkController(onInitialized) {
174
174
  log('Waiting for NetworkController to be available');
175
- __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, setInterval(() => {
175
+ const tryInit = () => {
176
176
  try {
177
177
  const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
178
- clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
179
- __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
180
178
  __classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
181
179
  __classPrivateFieldSet(this, _MultichainTrackingHelper_initialized, true, "f");
182
180
  log('Initialized');
183
181
  onInitialized();
182
+ return true;
184
183
  }
185
184
  catch {
185
+ return false;
186
+ }
187
+ };
188
+ if (tryInit()) {
189
+ return;
190
+ }
191
+ __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, setInterval(() => {
192
+ if (tryInit()) {
193
+ clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
194
+ __classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
195
+ }
196
+ else {
186
197
  log('NetworkController not yet available, retrying');
187
198
  }
188
199
  }, 10), "f");
@@ -1 +1 @@
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 { 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\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n onInitialized: () => 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 #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 #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n #initialized = false;\n\n #initInterval?: ReturnType<typeof setInterval>;\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 }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n onInitialized,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (!this.#initialized) {\n return;\n }\n\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 this.#waitForNetworkController(onInitialized);\n }\n\n #waitForNetworkController(onInitialized: () => void): void {\n log('Waiting for NetworkController to be available');\n\n this.#initInterval = setInterval(() => {\n try {\n const networkClients = this.#getNetworkClientRegistry();\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n this.#refreshTrackingMap(networkClients);\n this.#initialized = true;\n log('Initialized');\n onInitialized();\n } catch {\n log('NetworkController not yet available, retrying');\n }\n }, 10);\n }\n\n has(networkClientId: NetworkClientId): boolean {\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 - ${networkClientId}`,\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 = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n if (this.#initInterval) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n }\n\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 readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\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): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\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 const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\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 { 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\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n onInitialized: () => 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 #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 #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n #initialized = false;\n\n #initInterval?: ReturnType<typeof setInterval>;\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 }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n onInitialized,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (!this.#initialized) {\n return;\n }\n\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 this.#waitForNetworkController(onInitialized);\n }\n\n #waitForNetworkController(onInitialized: () => void): void {\n log('Waiting for NetworkController to be available');\n\n const tryInit = (): boolean => {\n try {\n const networkClients = this.#getNetworkClientRegistry();\n this.#refreshTrackingMap(networkClients);\n this.#initialized = true;\n log('Initialized');\n onInitialized();\n return true;\n } catch {\n return false;\n }\n };\n\n if (tryInit()) {\n return;\n }\n\n this.#initInterval = setInterval(() => {\n if (tryInit()) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n } else {\n log('NetworkController not yet available, retrying');\n }\n }, 10);\n }\n\n has(networkClientId: NetworkClientId): boolean {\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 - ${networkClientId}`,\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 = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n if (this.#initInterval) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n }\n\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 readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\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): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\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 const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/transaction-controller",
3
- "version": "67.0.0-preview-35bdba6",
3
+ "version": "67.0.0-preview-a38b6cb",
4
4
  "description": "Stores transactions alongside their periodically updated statuses and manages interactions such as approval and cancellation",
5
5
  "keywords": [
6
6
  "Ethereum",