From 0a79a186b9f0e66f1351223a7c4e8ddf19265c05 Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Wed, 21 Feb 2024 10:24:28 +0000 Subject: [PATCH 1/7] wip --- .../src/TransactionController.ts | 90 ++++++++++++++++++- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index 0823a4ce638..38e279d794f 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -330,6 +330,7 @@ export class TransactionController extends BaseControllerV1< private readonly inProcessOfSigning: Set = new Set(); private readonly nonceTracker: NonceTracker; + // private nonceTracker: NonceTracker; // TODO: Replace `any` with type // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -365,12 +366,19 @@ export class TransactionController extends BaseControllerV1< readonly #incomingTransactionOptions: IncomingTransactionOptions; private readonly incomingTransactionHelper: IncomingTransactionHelper; + // private incomingTransactionHelper: IncomingTransactionHelper; private readonly securityProviderRequest?: SecurityProviderRequest; readonly #pendingTransactionOptions: PendingTransactionOptions; private readonly pendingTransactionTracker: PendingTransactionTracker; + // private pendingTransactionTracker: PendingTransactionTracker; + + // private readonly onNetworkStateChange: (listener: (state: NetworkState) => void) => void; + // private readonly isMultichainEnabled: boolean; + // private readonly incomingTransactions: IncomingTransactionOptions; + // private readonly getNetworkClientRegistry: NetworkController['getNetworkClientRegistry']; private readonly signAbortCallbacks: Map void> = new Map(); @@ -427,7 +435,8 @@ export class TransactionController extends BaseControllerV1< return { registryMethod, parsedRegistryMethod }; } - #multichainTrackingHelper: MultichainTrackingHelper; + #multichainTrackingHelper: MultichainTrackingHelper + // #multichainTrackingHelper: MultichainTrackingHelper /** * EventEmitter instance used to listen to specific transactional events @@ -492,8 +501,9 @@ export class TransactionController extends BaseControllerV1< this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false; this.isHistoryDisabled = disableHistory ?? false; this.isSwapsDisabled = disableSwaps ?? false; - // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed - this.registry = new MethodRegistry({ provider }); + // // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed + // this.registry = new MethodRegistry({ provider }); + this.getSavedGasFees = getSavedGasFees ?? ((_chainId) => undefined); this.getCurrentAccountEIP1559Compatibility = getCurrentAccountEIP1559Compatibility ?? (() => Promise.resolve(true)); @@ -610,9 +620,83 @@ export class TransactionController extends BaseControllerV1< this.onBootCleanup(); }); + // this.onNetworkStateChange = onNetworkStateChange; + // this.isMultichainEnabled = isMultichainEnabled; + // this.incomingTransactions = incomingTransactions; + // this.getNetworkClientRegistry = getNetworkClientRegistry; + this.onBootCleanup(); } + delayedInit(passedProvider: Provider, passedBlockTracker: BlockTracker) { + // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed + this.registry = new MethodRegistry({ provider: passedProvider }); + + // this.nonceTracker = this.#createNonceTracker({ + // provider: passedProvider, + // blockTracker: passedBlockTracker, + // }); + + // this.#multichainTrackingHelper = new MultichainTrackingHelper({ + // isMultichainEnabled: this.isMultichainEnabled, + // provider: passedProvider, + // nonceTracker: this.nonceTracker, + // incomingTransactionOptions: this.incomingTransactions, + // findNetworkClientIdByChainId: (chainId: Hex) => { + // return this.messagingSystem.call( + // `NetworkController:findNetworkClientIdByChainId`, + // chainId, + // ); + // }, + // getNetworkClientById: ((networkClientId: NetworkClientId) => { + // return this.messagingSystem.call( + // `NetworkController:getNetworkClientById`, + // networkClientId, + // ); + // }) as NetworkController['getNetworkClientById'], + // getNetworkClientRegistry: this.getNetworkClientRegistry, + // removeIncomingTransactionHelperListeners: + // this.#removeIncomingTransactionHelperListeners.bind(this), + // removePendingTransactionTrackerListeners: + // this.#removePendingTransactionTrackerListeners.bind(this), + // createNonceTracker: this.#createNonceTracker.bind(this), + // createIncomingTransactionHelper: + // this.#createIncomingTransactionHelper.bind(this), + // createPendingTransactionTracker: + // this.#createPendingTransactionTracker.bind(this), + // onNetworkStateChange: (listener) => { + // this.messagingSystem.subscribe( + // 'NetworkController:stateChange', + // listener, + // ); + // }, + // }); + // this.#multichainTrackingHelper.initialize(); + + // const etherscanRemoteTransactionSource = + // new EtherscanRemoteTransactionSource({ + // includeTokenTransfers: this.incomingTransactions.includeTokenTransfers, + // }); + + // this.incomingTransactionHelper = this.#createIncomingTransactionHelper({ + // blockTracker: passedBlockTracker, + // etherscanRemoteTransactionSource, + // }); + + // this.pendingTransactionTracker = this.#createPendingTransactionTracker({ + // provider: passedProvider, + // blockTracker: passedBlockTracker, + // }); + + // // TODO once v2 is merged make sure this only runs when + // // selectedNetworkClientId changes + // this.onNetworkStateChange(() => { + // log('Detected network change', this.getChainId()); + // this.pendingTransactionTracker.startIfPendingTransactions(); + // this.onBootCleanup(); + // }); + } + /** * Stops polling and removes listeners to prepare the controller for garbage collection. */ From 5c8e388386c63652d8d76916a1732ff768187575 Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Wed, 21 Feb 2024 10:44:28 +0000 Subject: [PATCH 2/7] wip --- .../src/TransactionController.ts | 151 +++++++++--------- 1 file changed, 74 insertions(+), 77 deletions(-) diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index 38e279d794f..5ca53d512e8 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -329,8 +329,7 @@ export class TransactionController extends BaseControllerV1< private readonly inProcessOfSigning: Set = new Set(); - private readonly nonceTracker: NonceTracker; - // private nonceTracker: NonceTracker; + private nonceTracker: NonceTracker; // TODO: Replace `any` with type // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -365,20 +364,18 @@ export class TransactionController extends BaseControllerV1< readonly #incomingTransactionOptions: IncomingTransactionOptions; - private readonly incomingTransactionHelper: IncomingTransactionHelper; - // private incomingTransactionHelper: IncomingTransactionHelper; + private incomingTransactionHelper: IncomingTransactionHelper; private readonly securityProviderRequest?: SecurityProviderRequest; readonly #pendingTransactionOptions: PendingTransactionOptions; - private readonly pendingTransactionTracker: PendingTransactionTracker; - // private pendingTransactionTracker: PendingTransactionTracker; + private pendingTransactionTracker: PendingTransactionTracker; - // private readonly onNetworkStateChange: (listener: (state: NetworkState) => void) => void; - // private readonly isMultichainEnabled: boolean; - // private readonly incomingTransactions: IncomingTransactionOptions; - // private readonly getNetworkClientRegistry: NetworkController['getNetworkClientRegistry']; + private readonly onNetworkStateChange: (listener: (state: NetworkState) => void) => void; + private readonly isMultichainEnabled: boolean; + private readonly incomingTransactions: IncomingTransactionOptions; + private readonly getNetworkClientRegistry: NetworkController['getNetworkClientRegistry']; private readonly signAbortCallbacks: Map void> = new Map(); @@ -620,10 +617,10 @@ export class TransactionController extends BaseControllerV1< this.onBootCleanup(); }); - // this.onNetworkStateChange = onNetworkStateChange; - // this.isMultichainEnabled = isMultichainEnabled; - // this.incomingTransactions = incomingTransactions; - // this.getNetworkClientRegistry = getNetworkClientRegistry; + this.onNetworkStateChange = onNetworkStateChange; + this.isMultichainEnabled = isMultichainEnabled; + this.incomingTransactions = incomingTransactions; + this.getNetworkClientRegistry = getNetworkClientRegistry; this.onBootCleanup(); } @@ -632,69 +629,69 @@ export class TransactionController extends BaseControllerV1< // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed this.registry = new MethodRegistry({ provider: passedProvider }); - // this.nonceTracker = this.#createNonceTracker({ - // provider: passedProvider, - // blockTracker: passedBlockTracker, - // }); - - // this.#multichainTrackingHelper = new MultichainTrackingHelper({ - // isMultichainEnabled: this.isMultichainEnabled, - // provider: passedProvider, - // nonceTracker: this.nonceTracker, - // incomingTransactionOptions: this.incomingTransactions, - // findNetworkClientIdByChainId: (chainId: Hex) => { - // return this.messagingSystem.call( - // `NetworkController:findNetworkClientIdByChainId`, - // chainId, - // ); - // }, - // getNetworkClientById: ((networkClientId: NetworkClientId) => { - // return this.messagingSystem.call( - // `NetworkController:getNetworkClientById`, - // networkClientId, - // ); - // }) as NetworkController['getNetworkClientById'], - // getNetworkClientRegistry: this.getNetworkClientRegistry, - // removeIncomingTransactionHelperListeners: - // this.#removeIncomingTransactionHelperListeners.bind(this), - // removePendingTransactionTrackerListeners: - // this.#removePendingTransactionTrackerListeners.bind(this), - // createNonceTracker: this.#createNonceTracker.bind(this), - // createIncomingTransactionHelper: - // this.#createIncomingTransactionHelper.bind(this), - // createPendingTransactionTracker: - // this.#createPendingTransactionTracker.bind(this), - // onNetworkStateChange: (listener) => { - // this.messagingSystem.subscribe( - // 'NetworkController:stateChange', - // listener, - // ); - // }, - // }); - // this.#multichainTrackingHelper.initialize(); - - // const etherscanRemoteTransactionSource = - // new EtherscanRemoteTransactionSource({ - // includeTokenTransfers: this.incomingTransactions.includeTokenTransfers, - // }); - - // this.incomingTransactionHelper = this.#createIncomingTransactionHelper({ - // blockTracker: passedBlockTracker, - // etherscanRemoteTransactionSource, - // }); - - // this.pendingTransactionTracker = this.#createPendingTransactionTracker({ - // provider: passedProvider, - // blockTracker: passedBlockTracker, - // }); - - // // TODO once v2 is merged make sure this only runs when - // // selectedNetworkClientId changes - // this.onNetworkStateChange(() => { - // log('Detected network change', this.getChainId()); - // this.pendingTransactionTracker.startIfPendingTransactions(); - // this.onBootCleanup(); - // }); + this.nonceTracker = this.#createNonceTracker({ + provider: passedProvider, + blockTracker: passedBlockTracker, + }); + + this.#multichainTrackingHelper = new MultichainTrackingHelper({ + isMultichainEnabled: this.isMultichainEnabled, + provider: passedProvider, + nonceTracker: this.nonceTracker, + incomingTransactionOptions: this.incomingTransactions, + findNetworkClientIdByChainId: (chainId: Hex) => { + return this.messagingSystem.call( + `NetworkController:findNetworkClientIdByChainId`, + chainId, + ); + }, + getNetworkClientById: ((networkClientId: NetworkClientId) => { + return this.messagingSystem.call( + `NetworkController:getNetworkClientById`, + networkClientId, + ); + }) as NetworkController['getNetworkClientById'], + getNetworkClientRegistry: this.getNetworkClientRegistry, + removeIncomingTransactionHelperListeners: + this.#removeIncomingTransactionHelperListeners.bind(this), + removePendingTransactionTrackerListeners: + this.#removePendingTransactionTrackerListeners.bind(this), + createNonceTracker: this.#createNonceTracker.bind(this), + createIncomingTransactionHelper: + this.#createIncomingTransactionHelper.bind(this), + createPendingTransactionTracker: + this.#createPendingTransactionTracker.bind(this), + onNetworkStateChange: (listener) => { + this.messagingSystem.subscribe( + 'NetworkController:stateChange', + listener, + ); + }, + }); + this.#multichainTrackingHelper.initialize(); + + const etherscanRemoteTransactionSource = + new EtherscanRemoteTransactionSource({ + includeTokenTransfers: this.incomingTransactions.includeTokenTransfers, + }); + + this.incomingTransactionHelper = this.#createIncomingTransactionHelper({ + blockTracker: passedBlockTracker, + etherscanRemoteTransactionSource, + }); + + this.pendingTransactionTracker = this.#createPendingTransactionTracker({ + provider: passedProvider, + blockTracker: passedBlockTracker, + }); + + // TODO once v2 is merged make sure this only runs when + // selectedNetworkClientId changes + this.onNetworkStateChange(() => { + log('Detected network change', this.getChainId()); + this.pendingTransactionTracker.startIfPendingTransactions(); + this.onBootCleanup(); + }); } /** From 7a37034db89b308b7744583b6d009bae12793e15 Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Wed, 21 Feb 2024 10:46:53 +0000 Subject: [PATCH 3/7] wip --- .../src/TransactionController.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index 5ca53d512e8..dcebc4bb480 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -433,7 +433,6 @@ export class TransactionController extends BaseControllerV1< } #multichainTrackingHelper: MultichainTrackingHelper - // #multichainTrackingHelper: MultichainTrackingHelper /** * EventEmitter instance used to listen to specific transactional events @@ -498,8 +497,6 @@ export class TransactionController extends BaseControllerV1< this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false; this.isHistoryDisabled = disableHistory ?? false; this.isSwapsDisabled = disableSwaps ?? false; - // // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed - // this.registry = new MethodRegistry({ provider }); this.getSavedGasFees = getSavedGasFees ?? ((_chainId) => undefined); this.getCurrentAccountEIP1559Compatibility = @@ -625,6 +622,17 @@ export class TransactionController extends BaseControllerV1< this.onBootCleanup(); } + /** + * Initializes `registry`, `nonceTracker`, `#multichainTrackingHelper`, + * `incomingTransactionHelper`, `pendingTransactionTracker`, and passes a + * callback to `onNetworkStateChange`. + * + * This relies on the provider and block tracker being defined which may not + * have been the case at the time the Transaction Controller was instantiated. + * + * @param passedProvider - Reference to the provider proxy object + * @param passedBlockTracker - Reference to the block tracker proxy object + */ delayedInit(passedProvider: Provider, passedBlockTracker: BlockTracker) { // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed this.registry = new MethodRegistry({ provider: passedProvider }); From 63f0f3c75e5b234fcad85f4951e2c37df039a57b Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Thu, 22 Feb 2024 11:34:51 +0000 Subject: [PATCH 4/7] fix tests --- .../src/TransactionController.test.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/transaction-controller/src/TransactionController.test.ts b/packages/transaction-controller/src/TransactionController.test.ts index eb2f5af802a..189504d7089 100644 --- a/packages/transaction-controller/src/TransactionController.test.ts +++ b/packages/transaction-controller/src/TransactionController.test.ts @@ -2068,6 +2068,11 @@ describe('TransactionController', () => { }, ], }); + + const testProvider = MAINNET_PROVIDER; + const testBlockTracker = buildMockBlockTracker('0x102833C'); + controller.delayedInit(testProvider, testBlockTracker); + const registry = await controller.handleMethodData('0xf39b5b9b'); expect(registry.parsedRegistryMethod).toStrictEqual({ @@ -2109,6 +2114,10 @@ describe('TransactionController', () => { ], }); + const testProvider = MAINNET_PROVIDER; + const testBlockTracker = buildMockBlockTracker('0x102833C'); + controller.delayedInit(testProvider, testBlockTracker); + await controller.handleMethodData('0xf39b5b9b'); const registryLookup = jest.spyOn( From a59a7631d5d4d63edb28cf5c398a68831bb6d0ac Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Thu, 22 Feb 2024 11:59:13 +0000 Subject: [PATCH 5/7] fix linting --- .../src/TransactionController.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index dcebc4bb480..fab5939e5e9 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -372,9 +372,14 @@ export class TransactionController extends BaseControllerV1< private pendingTransactionTracker: PendingTransactionTracker; - private readonly onNetworkStateChange: (listener: (state: NetworkState) => void) => void; + private readonly onNetworkStateChange: ( + listener: (state: NetworkState) => void, + ) => void; + private readonly isMultichainEnabled: boolean; + private readonly incomingTransactions: IncomingTransactionOptions; + private readonly getNetworkClientRegistry: NetworkController['getNetworkClientRegistry']; private readonly signAbortCallbacks: Map void> = new Map(); @@ -432,7 +437,7 @@ export class TransactionController extends BaseControllerV1< return { registryMethod, parsedRegistryMethod }; } - #multichainTrackingHelper: MultichainTrackingHelper + #multichainTrackingHelper: MultichainTrackingHelper; /** * EventEmitter instance used to listen to specific transactional events @@ -497,7 +502,7 @@ export class TransactionController extends BaseControllerV1< this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false; this.isHistoryDisabled = disableHistory ?? false; this.isSwapsDisabled = disableSwaps ?? false; - + this.getSavedGasFees = getSavedGasFees ?? ((_chainId) => undefined); this.getCurrentAccountEIP1559Compatibility = getCurrentAccountEIP1559Compatibility ?? (() => Promise.resolve(true)); From d6187c58c57c315a60463014d91fd66fbe3ba08e Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Tue, 27 Feb 2024 11:09:11 +0000 Subject: [PATCH 6/7] Deduplicate initialization logic --- .vscode/settings.json | 9 ++ .../network-controller/.vscode/settings.json | 9 ++ .../src/TransactionController.ts | 128 +++++------------- 3 files changed, 50 insertions(+), 96 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 packages/network-controller/.vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..cc6b9b6d77a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", + "editor.formatOnType": false, // required + "editor.formatOnPaste": true, // optional + "editor.formatOnSave": true, // optional + "editor.formatOnSaveMode": "file", // required to format on save + "files.autoSave": "onFocusChange", // optional but recommended + "vs-code-prettier-eslint.prettierLast": false // set as "true" to run 'prettier' last not first +} \ No newline at end of file diff --git a/packages/network-controller/.vscode/settings.json b/packages/network-controller/.vscode/settings.json new file mode 100644 index 00000000000..cc6b9b6d77a --- /dev/null +++ b/packages/network-controller/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", + "editor.formatOnType": false, // required + "editor.formatOnPaste": true, // optional + "editor.formatOnSave": true, // optional + "editor.formatOnSaveMode": "file", // required to format on save + "files.autoSave": "onFocusChange", // optional but recommended + "vs-code-prettier-eslint.prettierLast": false // set as "true" to run 'prettier' last not first +} \ No newline at end of file diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index fab5939e5e9..388c591425e 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -329,7 +329,7 @@ export class TransactionController extends BaseControllerV1< private readonly inProcessOfSigning: Set = new Set(); - private nonceTracker: NonceTracker; + private nonceTracker!: NonceTracker; // TODO: Replace `any` with type // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -337,7 +337,7 @@ export class TransactionController extends BaseControllerV1< private readonly mutex = new Mutex(); - private readonly gasFeeFlows: GasFeeFlow[]; + private gasFeeFlows!: GasFeeFlow[]; private readonly getSavedGasFees: (chainId: Hex) => SavedGasFees | undefined; @@ -364,13 +364,13 @@ export class TransactionController extends BaseControllerV1< readonly #incomingTransactionOptions: IncomingTransactionOptions; - private incomingTransactionHelper: IncomingTransactionHelper; + private incomingTransactionHelper!: IncomingTransactionHelper; private readonly securityProviderRequest?: SecurityProviderRequest; readonly #pendingTransactionOptions: PendingTransactionOptions; - private pendingTransactionTracker: PendingTransactionTracker; + private pendingTransactionTracker!: PendingTransactionTracker; private readonly onNetworkStateChange: ( listener: (state: NetworkState) => void, @@ -437,7 +437,7 @@ export class TransactionController extends BaseControllerV1< return { registryMethod, parsedRegistryMethod }; } - #multichainTrackingHelper: MultichainTrackingHelper; + #multichainTrackingHelper!: MultichainTrackingHelper; /** * EventEmitter instance used to listen to specific transactional events @@ -530,101 +530,10 @@ export class TransactionController extends BaseControllerV1< this.publish = hooks?.publish ?? (() => Promise.resolve({ transactionHash: undefined })); - this.nonceTracker = this.#createNonceTracker({ - provider, - blockTracker, - }); - - this.#multichainTrackingHelper = new MultichainTrackingHelper({ - isMultichainEnabled, - provider, - nonceTracker: this.nonceTracker, - incomingTransactionOptions: incomingTransactions, - findNetworkClientIdByChainId: (chainId: Hex) => { - return this.messagingSystem.call( - `NetworkController:findNetworkClientIdByChainId`, - chainId, - ); - }, - getNetworkClientById: ((networkClientId: NetworkClientId) => { - return this.messagingSystem.call( - `NetworkController:getNetworkClientById`, - networkClientId, - ); - }) as NetworkController['getNetworkClientById'], - getNetworkClientRegistry, - removeIncomingTransactionHelperListeners: - this.#removeIncomingTransactionHelperListeners.bind(this), - removePendingTransactionTrackerListeners: - this.#removePendingTransactionTrackerListeners.bind(this), - createNonceTracker: this.#createNonceTracker.bind(this), - createIncomingTransactionHelper: - this.#createIncomingTransactionHelper.bind(this), - createPendingTransactionTracker: - this.#createPendingTransactionTracker.bind(this), - onNetworkStateChange: (listener) => { - this.messagingSystem.subscribe( - 'NetworkController:stateChange', - listener, - ); - }, - }); - this.#multichainTrackingHelper.initialize(); - - const etherscanRemoteTransactionSource = - new EtherscanRemoteTransactionSource({ - includeTokenTransfers: incomingTransactions.includeTokenTransfers, - }); - - this.incomingTransactionHelper = this.#createIncomingTransactionHelper({ - blockTracker, - etherscanRemoteTransactionSource, - }); - - this.pendingTransactionTracker = this.#createPendingTransactionTracker({ - provider, - blockTracker, - }); - - this.gasFeeFlows = this.#getGasFeeFlows(); - - const gasFeePoller = new GasFeePoller({ - // Default gas fee polling is not yet supported by the clients - gasFeeFlows: this.gasFeeFlows.slice(0, -1), - getEthQuery: (chainId, networkClientId) => - this.#multichainTrackingHelper.getEthQuery({ - networkClientId, - chainId, - }), - getGasFeeControllerEstimates: this.getGasFeeEstimates, - getTransactions: () => this.state.transactions, - onStateChange: (listener) => { - this.subscribe(listener); - }, - }); - - gasFeePoller.hub.on('transaction-updated', (transactionMeta) => - this.#updateTransactionInternal(transactionMeta, { skipHistory: true }), - ); - - // when transactionsController state changes - // check for pending transactions and start polling if there are any - this.subscribe(this.#checkForPendingTransactionAndStartPolling); - - // TODO once v2 is merged make sure this only runs when - // selectedNetworkClientId changes - onNetworkStateChange(() => { - log('Detected network change', this.getChainId()); - this.pendingTransactionTracker.startIfPendingTransactions(); - this.onBootCleanup(); - }); - this.onNetworkStateChange = onNetworkStateChange; this.isMultichainEnabled = isMultichainEnabled; this.incomingTransactions = incomingTransactions; this.getNetworkClientRegistry = getNetworkClientRegistry; - - this.onBootCleanup(); } /** @@ -698,6 +607,31 @@ export class TransactionController extends BaseControllerV1< blockTracker: passedBlockTracker, }); + this.gasFeeFlows = this.#getGasFeeFlows(); + + const gasFeePoller = new GasFeePoller({ + // Default gas fee polling is not yet supported by the clients + gasFeeFlows: this.gasFeeFlows.slice(0, -1), + getEthQuery: (chainId, networkClientId) => + this.#multichainTrackingHelper.getEthQuery({ + networkClientId, + chainId, + }), + getGasFeeControllerEstimates: this.getGasFeeEstimates, + getTransactions: () => this.state.transactions, + onStateChange: (listener) => { + this.subscribe(listener); + }, + }); + + gasFeePoller.hub.on('transaction-updated', (transactionMeta) => + this.#updateTransactionInternal(transactionMeta, { skipHistory: true }), + ); + + // when transactionsController state changes + // check for pending transactions and start polling if there are any + this.subscribe(this.#checkForPendingTransactionAndStartPolling); + // TODO once v2 is merged make sure this only runs when // selectedNetworkClientId changes this.onNetworkStateChange(() => { @@ -705,6 +639,8 @@ export class TransactionController extends BaseControllerV1< this.pendingTransactionTracker.startIfPendingTransactions(); this.onBootCleanup(); }); + + this.onBootCleanup(); } /** From 474e81448553ffe7e71c4ba593050243b5b6baa0 Mon Sep 17 00:00:00 2001 From: Pedro Figueiredo Date: Thu, 29 Feb 2024 10:40:35 +0000 Subject: [PATCH 7/7] stop passing in the provider and block tracker --- .vscode/settings.json | 9 --- .../network-controller/.vscode/settings.json | 9 --- .../src/TransactionController.ts | 73 +++++++++++++------ 3 files changed, 49 insertions(+), 42 deletions(-) delete mode 100644 .vscode/settings.json delete mode 100644 packages/network-controller/.vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index cc6b9b6d77a..00000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", - "editor.formatOnType": false, // required - "editor.formatOnPaste": true, // optional - "editor.formatOnSave": true, // optional - "editor.formatOnSaveMode": "file", // required to format on save - "files.autoSave": "onFocusChange", // optional but recommended - "vs-code-prettier-eslint.prettierLast": false // set as "true" to run 'prettier' last not first -} \ No newline at end of file diff --git a/packages/network-controller/.vscode/settings.json b/packages/network-controller/.vscode/settings.json deleted file mode 100644 index cc6b9b6d77a..00000000000 --- a/packages/network-controller/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "editor.defaultFormatter": "rvest.vs-code-prettier-eslint", - "editor.formatOnType": false, // required - "editor.formatOnPaste": true, // optional - "editor.formatOnSave": true, // optional - "editor.formatOnSaveMode": "file", // required to format on save - "files.autoSave": "onFocusChange", // optional but recommended - "vs-code-prettier-eslint.prettierLast": false // set as "true" to run 'prettier' last not first -} \ No newline at end of file diff --git a/packages/transaction-controller/src/TransactionController.ts b/packages/transaction-controller/src/TransactionController.ts index 388c591425e..f09f7775dfb 100644 --- a/packages/transaction-controller/src/TransactionController.ts +++ b/packages/transaction-controller/src/TransactionController.ts @@ -105,6 +105,8 @@ import { validateTransactionOrigin, validateTxParams, } from './utils/validation'; +import { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider'; +import { ProxyWithAccessibleTarget } from '@metamask/network-controller/src/create-auto-managed-network-client'; export const HARDFORK = Hardfork.London; @@ -372,15 +374,15 @@ export class TransactionController extends BaseControllerV1< private pendingTransactionTracker!: PendingTransactionTracker; - private readonly onNetworkStateChange: ( + readonly #onNetworkStateChange: ( listener: (state: NetworkState) => void, ) => void; - private readonly isMultichainEnabled: boolean; + readonly #isMultichainEnabled: boolean; - private readonly incomingTransactions: IncomingTransactionOptions; + readonly #incomingTransactions: IncomingTransactionOptions; - private readonly getNetworkClientRegistry: NetworkController['getNetworkClientRegistry']; + readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry']; private readonly signAbortCallbacks: Map void> = new Map(); @@ -530,10 +532,10 @@ export class TransactionController extends BaseControllerV1< this.publish = hooks?.publish ?? (() => Promise.resolve({ transactionHash: undefined })); - this.onNetworkStateChange = onNetworkStateChange; - this.isMultichainEnabled = isMultichainEnabled; - this.incomingTransactions = incomingTransactions; - this.getNetworkClientRegistry = getNetworkClientRegistry; + this.#onNetworkStateChange = onNetworkStateChange; + this.#isMultichainEnabled = isMultichainEnabled; + this.#incomingTransactions = incomingTransactions; + this.#getNetworkClientRegistry = getNetworkClientRegistry; } /** @@ -543,24 +545,23 @@ export class TransactionController extends BaseControllerV1< * * This relies on the provider and block tracker being defined which may not * have been the case at the time the Transaction Controller was instantiated. - * - * @param passedProvider - Reference to the provider proxy object - * @param passedBlockTracker - Reference to the block tracker proxy object */ - delayedInit(passedProvider: Provider, passedBlockTracker: BlockTracker) { + initialization() { + const { provider, blockTracker } = this.getProviderAndBlockTracker() + // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed - this.registry = new MethodRegistry({ provider: passedProvider }); + this.registry = new MethodRegistry({ provider }); this.nonceTracker = this.#createNonceTracker({ - provider: passedProvider, - blockTracker: passedBlockTracker, + provider, + blockTracker, }); this.#multichainTrackingHelper = new MultichainTrackingHelper({ - isMultichainEnabled: this.isMultichainEnabled, - provider: passedProvider, + isMultichainEnabled: this.#isMultichainEnabled, + provider, nonceTracker: this.nonceTracker, - incomingTransactionOptions: this.incomingTransactions, + incomingTransactionOptions: this.#incomingTransactions, findNetworkClientIdByChainId: (chainId: Hex) => { return this.messagingSystem.call( `NetworkController:findNetworkClientIdByChainId`, @@ -573,7 +574,7 @@ export class TransactionController extends BaseControllerV1< networkClientId, ); }) as NetworkController['getNetworkClientById'], - getNetworkClientRegistry: this.getNetworkClientRegistry, + getNetworkClientRegistry: this.#getNetworkClientRegistry, removeIncomingTransactionHelperListeners: this.#removeIncomingTransactionHelperListeners.bind(this), removePendingTransactionTrackerListeners: @@ -594,17 +595,17 @@ export class TransactionController extends BaseControllerV1< const etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource({ - includeTokenTransfers: this.incomingTransactions.includeTokenTransfers, + includeTokenTransfers: this.#incomingTransactions.includeTokenTransfers, }); this.incomingTransactionHelper = this.#createIncomingTransactionHelper({ - blockTracker: passedBlockTracker, + blockTracker, etherscanRemoteTransactionSource, }); this.pendingTransactionTracker = this.#createPendingTransactionTracker({ - provider: passedProvider, - blockTracker: passedBlockTracker, + provider, + blockTracker, }); this.gasFeeFlows = this.#getGasFeeFlows(); @@ -634,7 +635,7 @@ export class TransactionController extends BaseControllerV1< // TODO once v2 is merged make sure this only runs when // selectedNetworkClientId changes - this.onNetworkStateChange(() => { + this.#onNetworkStateChange(() => { log('Detected network change', this.getChainId()); this.pendingTransactionTracker.startIfPendingTransactions(); this.onBootCleanup(); @@ -643,6 +644,30 @@ export class TransactionController extends BaseControllerV1< this.onBootCleanup(); } + /** + * Get the relevant provider and blockTracker instance. + * + * @returns Provider and BlockTracker instances. + */ + getProviderAndBlockTracker(): { provider: Provider, blockTracker: BlockTracker } { + const selectedNetworkClientId = this.getNetworkState().selectedNetworkClientId; + const networkClient = this.messagingSystem.call( + `NetworkController:getNetworkClientById`, + selectedNetworkClientId, + ) + const provider = networkClient.provider; + + if (provider === undefined) { + const MISSING_PROVIDER_ERROR = 'TransactionController failed to set the provider correctly. A provider must be set for this method to be available'; + + throw new Error(MISSING_PROVIDER_ERROR); + } + + const blockTracker = networkClient.blockTracker; + + return { provider, blockTracker }; + } + /** * Stops polling and removes listeners to prepare the controller for garbage collection. */