Skip to content

Commit 93b16b5

Browse files
refactor: migrate SmartTransactionController to @metamask/messenger (#543)
* refactor: migrate `SmartTransactionController` to `@metamask/messenger` * fix lint * set tsconfig `module` to `Node16` * chore: bump @metamask/base-controller from 8.3.0 to 9.0.0 * fix: changelog --------- Co-authored-by: Salah-Eddine Saakoun <[email protected]>
1 parent 6aa42cd commit 93b16b5

File tree

6 files changed

+197
-158
lines changed

6 files changed

+197
-158
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Changed
11+
12+
- **BREAKING:** Migrate `SmartTransactionsController` to new `Messenger` from `@metamask/messenger` ([#543](https://github.com/MetaMask/smart-transactions-controller/pull/543))
13+
- **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#543](https://github.com/MetaMask/smart-transactions-controller/pull/543))
14+
- **BREAKING:** Bump `@metamask/network-controller` peer dependency from `^24.0.O` to `^25.0.0` ([#543](https://github.com/MetaMask/smart-transactions-controller/pull/543))
15+
- **BREAKING:** Bump `@metamask/transaction-controller` peer dependency from `^60.4.0` to `^61.0.0` ([#543](https://github.com/MetaMask/smart-transactions-controller/pull/543))
16+
- Bump `@metamask/base-controller` from `^8.3.0` to `^9.0.0`([#543](https://github.com/MetaMask/smart-transactions-controller/pull/543))
17+
- Bump `@metamask/polling-controller` from `^14.0.0` to `^15.0.0`([#543](https://github.com/MetaMask/smart-transactions-controller/pull/543))
18+
- Set `moduleResolution` option to `Node16` ([#543](https://github.com/MetaMask/smart-transactions-controller/pull/543))
19+
1020
## [19.2.1]
1121

1222
### Fixed

package.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,12 @@
4545
"@ethersproject/bytes": "^5.7.0",
4646
"@ethersproject/keccak256": "^5.8.0",
4747
"@ethersproject/transactions": "^5.7.0",
48-
"@metamask/base-controller": "^8.3.0",
48+
"@metamask/base-controller": "^9.0.0",
4949
"@metamask/controller-utils": "^11.0.0",
5050
"@metamask/eth-json-rpc-provider": "^4.1.6",
5151
"@metamask/eth-query": "^4.0.0",
52-
"@metamask/polling-controller": "^14.0.0",
52+
"@metamask/messenger": "^0.3.0",
53+
"@metamask/polling-controller": "^15.0.0",
5354
"bignumber.js": "^9.0.1",
5455
"fast-json-patch": "^3.1.0",
5556
"lodash": "^4.17.21"
@@ -65,8 +66,8 @@
6566
"@metamask/eslint-config-typescript": "^12.1.0",
6667
"@metamask/gas-fee-controller": "^22.0.0",
6768
"@metamask/json-rpc-engine": "^10.0.1",
68-
"@metamask/network-controller": "^24.0.0",
69-
"@metamask/transaction-controller": "^60.4.0",
69+
"@metamask/network-controller": "^25.0.0",
70+
"@metamask/transaction-controller": "^61.0.0",
7071
"@ts-bridge/cli": "^0.6.3",
7172
"@types/jest": "^26.0.24",
7273
"@types/lodash": "^4.14.194",
@@ -92,8 +93,8 @@
9293
"typescript": "~4.8.4"
9394
},
9495
"peerDependencies": {
95-
"@metamask/network-controller": "^24.0.0",
96-
"@metamask/transaction-controller": "^60.4.0"
96+
"@metamask/network-controller": "^25.0.0",
97+
"@metamask/transaction-controller": "^61.0.0"
9798
},
9899
"peerDependenciesMeta": {
99100
"@metamask/accounts-controller": {

src/SmartTransactionsController.test.ts

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
import { deriveStateFromMetadata, Messenger } from '@metamask/base-controller';
1+
import { deriveStateFromMetadata } from '@metamask/base-controller';
22
import {
33
NetworkType,
44
convertHexToDecimal,
55
ChainId,
66
} from '@metamask/controller-utils';
77
import {
8-
type NetworkControllerGetNetworkClientByIdAction,
9-
type NetworkControllerGetStateAction,
10-
type NetworkControllerStateChangeEvent,
8+
Messenger,
9+
MOCK_ANY_NAMESPACE,
10+
type MessengerActions,
11+
type MessengerEvents,
12+
type MockAnyNamespace,
13+
} from '@metamask/messenger';
14+
import {
1115
NetworkStatus,
1216
RpcEndpointType,
1317
type NetworkState,
@@ -37,15 +41,18 @@ import {
3741
DEFAULT_INTERVAL,
3842
SmartTransactionsController,
3943
getDefaultSmartTransactionsControllerState,
40-
} from './SmartTransactionsController';
41-
import type {
42-
SmartTransactionsControllerActions,
43-
SmartTransactionsControllerEvents,
44+
type SmartTransactionsControllerMessenger,
4445
} from './SmartTransactionsController';
4546
import type { SmartTransaction, UnsignedTransaction, Hex } from './types';
4647
import { SmartTransactionStatuses, ClientId } from './types';
4748
import * as utils from './utils';
4849

50+
type AllActions = MessengerActions<SmartTransactionsControllerMessenger>;
51+
52+
type AllEvents = MessengerEvents<SmartTransactionsControllerMessenger>;
53+
54+
type RootMessenger = Messenger<MockAnyNamespace, AllActions, AllEvents>;
55+
4956
jest.mock('@metamask/eth-query', () => {
5057
const EthQuery = jest.requireActual('@metamask/eth-query');
5158
return class FakeEthQuery extends EthQuery {
@@ -2540,7 +2547,7 @@ describe('SmartTransactionsController', () => {
25402547
deriveStateFromMetadata(
25412548
controller.state,
25422549
controller.metadata,
2543-
'anonymous',
2550+
'includeInDebugSnapshot',
25442551
),
25452552
).toMatchInlineSnapshot(`
25462553
{
@@ -2717,17 +2724,10 @@ async function withController<ReturnValue>(
27172724
updateTransaction = jest.fn(),
27182725
} = rest;
27192726

2720-
const controllerMessenger = new Messenger<
2721-
| SmartTransactionsControllerActions
2722-
| NetworkControllerGetNetworkClientByIdAction
2723-
| NetworkControllerGetStateAction
2724-
| TransactionControllerGetNonceLockAction
2725-
| TransactionControllerConfirmExternalTransactionAction
2726-
| TransactionControllerGetTransactionsAction
2727-
| TransactionControllerUpdateTransactionAction,
2728-
SmartTransactionsControllerEvents | NetworkControllerStateChangeEvent
2729-
>();
2730-
controllerMessenger.registerActionHandler(
2727+
const rootMessenger: RootMessenger = new Messenger({
2728+
namespace: MOCK_ANY_NAMESPACE,
2729+
});
2730+
rootMessenger.registerActionHandler(
27312731
'NetworkController:getNetworkClientById',
27322732
jest.fn().mockImplementation((networkClientId) => {
27332733
switch (networkClientId) {
@@ -2750,7 +2750,7 @@ async function withController<ReturnValue>(
27502750
}
27512751
}),
27522752
);
2753-
controllerMessenger.registerActionHandler(
2753+
rootMessenger.registerActionHandler(
27542754
'NetworkController:getState',
27552755
jest.fn().mockReturnValue({
27562756
selectedNetworkClientId: NetworkType.mainnet,
@@ -2788,34 +2788,43 @@ async function withController<ReturnValue>(
27882788
},
27892789
}),
27902790
);
2791-
controllerMessenger.registerActionHandler(
2791+
rootMessenger.registerActionHandler(
27922792
'TransactionController:getNonceLock',
27932793
getNonceLock,
27942794
);
2795-
controllerMessenger.registerActionHandler(
2795+
rootMessenger.registerActionHandler(
27962796
'TransactionController:confirmExternalTransaction',
27972797
confirmExternalTransaction,
27982798
);
2799-
controllerMessenger.registerActionHandler(
2799+
rootMessenger.registerActionHandler(
28002800
'TransactionController:getTransactions',
28012801
getTransactions,
28022802
);
2803-
controllerMessenger.registerActionHandler(
2803+
rootMessenger.registerActionHandler(
28042804
'TransactionController:updateTransaction',
28052805
updateTransaction,
28062806
);
28072807

2808-
const messenger = controllerMessenger.getRestricted({
2809-
name: 'SmartTransactionsController',
2810-
allowedActions: [
2808+
const messenger = new Messenger<
2809+
'SmartTransactionsController',
2810+
AllActions,
2811+
AllEvents,
2812+
RootMessenger
2813+
>({
2814+
namespace: 'SmartTransactionsController',
2815+
parent: rootMessenger,
2816+
});
2817+
rootMessenger.delegate({
2818+
messenger,
2819+
actions: [
28112820
'NetworkController:getNetworkClientById',
28122821
'NetworkController:getState',
28132822
'TransactionController:getNonceLock',
28142823
'TransactionController:confirmExternalTransaction',
28152824
'TransactionController:getTransactions',
28162825
'TransactionController:updateTransaction',
28172826
],
2818-
allowedEvents: ['NetworkController:stateChange'],
2827+
events: ['NetworkController:stateChange'],
28192828
});
28202829

28212830
const controller = new SmartTransactionsController({
@@ -2834,7 +2843,7 @@ async function withController<ReturnValue>(
28342843
});
28352844

28362845
function triggerNetworStateChange(state: NetworkState) {
2837-
controllerMessenger.publish('NetworkController:stateChange', state, []);
2846+
rootMessenger.publish('NetworkController:stateChange', state, []);
28382847
}
28392848

28402849
triggerNetworStateChange({

src/SmartTransactionsController.ts

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { hexlify } from '@ethersproject/bytes';
22
import type {
33
ControllerGetStateAction,
44
ControllerStateChangeEvent,
5-
RestrictedMessenger,
65
StateMetadata,
76
} from '@metamask/base-controller';
87
import {
@@ -13,6 +12,7 @@ import {
1312
type TraceCallback,
1413
} from '@metamask/controller-utils';
1514
import EthQuery from '@metamask/eth-query';
15+
import type { Messenger } from '@metamask/messenger';
1616
import type {
1717
NetworkClientId,
1818
NetworkControllerGetNetworkClientByIdAction,
@@ -82,7 +82,7 @@ const controllerMetadata: StateMetadata<SmartTransactionsControllerState> = {
8282
smartTransactionsState: {
8383
includeInStateLogs: true,
8484
persist: false,
85-
anonymous: true,
85+
includeInDebugSnapshot: true,
8686
usedInUi: true,
8787
},
8888
};
@@ -187,12 +187,10 @@ type AllowedEvents = NetworkControllerStateChangeEvent;
187187
/**
188188
* The messenger of the {@link SmartTransactionsController}.
189189
*/
190-
export type SmartTransactionsControllerMessenger = RestrictedMessenger<
190+
export type SmartTransactionsControllerMessenger = Messenger<
191191
typeof controllerName,
192192
SmartTransactionsControllerActions | AllowedActions,
193-
SmartTransactionsControllerEvents | AllowedEvents,
194-
AllowedActions['type'],
195-
AllowedEvents['type']
193+
SmartTransactionsControllerEvents | AllowedEvents
196194
>;
197195

198196
type SmartTransactionsControllerOptions = {
@@ -294,13 +292,13 @@ export class SmartTransactionsController extends StaticIntervalPollingController
294292

295293
this.initializeSmartTransactionsForChainId();
296294

297-
this.messagingSystem.subscribe(
295+
this.messenger.subscribe(
298296
'NetworkController:stateChange',
299297
({ selectedNetworkClientId }) => {
300298
const {
301299
configuration: { chainId },
302300
provider,
303-
} = this.messagingSystem.call(
301+
} = this.messenger.call(
304302
'NetworkController:getNetworkClientById',
305303
selectedNetworkClientId,
306304
);
@@ -311,9 +309,8 @@ export class SmartTransactionsController extends StaticIntervalPollingController
311309
},
312310
);
313311

314-
this.messagingSystem.subscribe(
315-
`${controllerName}:stateChange`,
316-
(currentState) => this.checkPoll(currentState),
312+
this.messenger.subscribe(`${controllerName}:stateChange`, (currentState) =>
313+
this.checkPoll(currentState),
317314
);
318315
}
319316

@@ -430,7 +427,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
430427
let ethQuery = this.#ethQuery;
431428
let chainId = this.#chainId;
432429
if (networkClientId) {
433-
const { configuration, provider } = this.messagingSystem.call(
430+
const { configuration, provider } = this.messenger.call(
434431
'NetworkController:getNetworkClientById',
435432
networkClientId,
436433
);
@@ -565,7 +562,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
565562

566563
// We have to emit this event here, because then a txHash is returned to the TransactionController once it's available
567564
// and the #doesTransactionNeedConfirmation function will work properly, since it will find the txHash in the regular transactions list.
568-
this.messagingSystem.publish(
565+
this.messenger.publish(
569566
`SmartTransactionsController:smartTransaction`,
570567
nextSmartTransaction,
571568
);
@@ -580,9 +577,9 @@ export class SmartTransactionsController extends StaticIntervalPollingController
580577
markRegularTransactionAsFailed({
581578
smartTransaction: nextSmartTransaction,
582579
getRegularTransactions: () =>
583-
this.messagingSystem.call('TransactionController:getTransactions'),
580+
this.messenger.call('TransactionController:getTransactions'),
584581
updateTransaction: (transactionMeta: TransactionMeta, note: string) =>
585-
this.messagingSystem.call(
582+
this.messenger.call(
586583
'TransactionController:updateTransaction',
587584
transactionMeta,
588585
note,
@@ -650,7 +647,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
650647
if (!txHash) {
651648
return true;
652649
}
653-
const transactions = this.messagingSystem.call(
650+
const transactions = this.messenger.call(
654651
'TransactionController:getTransactions',
655652
);
656653
const foundTransaction = transactions?.find((tx) => {
@@ -733,7 +730,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
733730
: originalTxMeta;
734731

735732
if (this.#doesTransactionNeedConfirmation(txHash)) {
736-
this.messagingSystem.call(
733+
this.messenger.call(
737734
'TransactionController:confirmExternalTransaction',
738735
// TODO: Replace 'as' assertion with correct typing for `txMeta`
739736
txMeta as TransactionMeta,
@@ -763,7 +760,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
763760
});
764761
console.error('confirm error', error);
765762
} finally {
766-
this.messagingSystem.publish(
763+
this.messenger.publish(
767764
`SmartTransactionsController:smartTransactionConfirmationDone`,
768765
smartTransaction,
769766
);
@@ -829,7 +826,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
829826
transaction: UnsignedTransaction,
830827
networkClientId: NetworkClientId,
831828
): Promise<UnsignedTransaction> {
832-
const nonceLock = await this.messagingSystem.call(
829+
const nonceLock = await this.messenger.call(
833830
'TransactionController:getNonceLock',
834831
transaction.from,
835832
networkClientId,
@@ -861,8 +858,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
861858
): Promise<Fees> {
862859
const selectedNetworkClientId =
863860
networkClientId ??
864-
this.messagingSystem.call('NetworkController:getState')
865-
.selectedNetworkClientId;
861+
this.messenger.call('NetworkController:getState').selectedNetworkClientId;
866862
const chainId = this.#getChainId({
867863
networkClientId: selectedNetworkClientId,
868864
});
@@ -942,8 +938,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
942938
}) {
943939
const selectedNetworkClientId =
944940
networkClientId ??
945-
this.messagingSystem.call('NetworkController:getState')
946-
.selectedNetworkClientId;
941+
this.messenger.call('NetworkController:getState').selectedNetworkClientId;
947942
const chainId = this.#getChainId({
948943
networkClientId: selectedNetworkClientId,
949944
});
@@ -985,7 +980,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
985980
// This should only happen for Swaps. Non-swaps transactions should already have a nonce
986981
if (requiresNonce) {
987982
try {
988-
nonceLock = await this.messagingSystem.call(
983+
nonceLock = await this.messenger.call(
989984
'TransactionController:getNonceLock',
990985
txParams.from,
991986
selectedNetworkClientId,
@@ -1041,7 +1036,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
10411036
networkClientId,
10421037
}: { networkClientId?: NetworkClientId } = {}): Hex {
10431038
if (networkClientId) {
1044-
return this.messagingSystem.call(
1039+
return this.messenger.call(
10451040
'NetworkController:getNetworkClientById',
10461041
networkClientId,
10471042
).configuration.chainId;
@@ -1051,7 +1046,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
10511046
}
10521047

10531048
#getChainIds(): Hex[] {
1054-
const { networkConfigurationsByChainId } = this.messagingSystem.call(
1049+
const { networkConfigurationsByChainId } = this.messenger.call(
10551050
'NetworkController:getState',
10561051
);
10571052
return Object.keys(networkConfigurationsByChainId).filter(
@@ -1061,7 +1056,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
10611056
}
10621057

10631058
#getNetworkClientId({ chainId }: { chainId: string }): string {
1064-
const { networkConfigurationsByChainId } = this.messagingSystem.call(
1059+
const { networkConfigurationsByChainId } = this.messenger.call(
10651060
'NetworkController:getState',
10661061
);
10671062
return networkConfigurationsByChainId[chainId as Hex].rpcEndpoints[
@@ -1075,7 +1070,7 @@ export class SmartTransactionsController extends StaticIntervalPollingController
10751070
networkClientId?: NetworkClientId;
10761071
} = {}): EthQuery {
10771072
if (networkClientId) {
1078-
const { provider } = this.messagingSystem.call(
1073+
const { provider } = this.messenger.call(
10791074
'NetworkController:getNetworkClientById',
10801075
networkClientId,
10811076
);

0 commit comments

Comments
 (0)