Skip to content

Commit f283f24

Browse files
committed
Merge branch 'main' into handle-missing-subscription-in-nc
2 parents 04c2748 + d158e46 commit f283f24

File tree

104 files changed

+9889
-2355
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+9889
-2355
lines changed

.github/CODEOWNERS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
## Accounts Team
1010
/packages/accounts-controller @MetaMask/accounts-engineers
1111
/packages/keyring-controller @MetaMask/accounts-engineers
12+
/packages/multichain-transactions-controller @MetaMask/accounts-engineers
1213

1314
## Assets Team
1415
/packages/assets-controllers @MetaMask/metamask-assets
@@ -103,5 +104,7 @@
103104
/packages/transaction-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/wallet-framework-engineers
104105
/packages/user-operation-controller/package.json @MetaMask/confirmations @MetaMask/wallet-framework-engineers
105106
/packages/user-operation-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/wallet-framework-engineers
107+
/packages/multichain-transactions-controller/package.json @MetaMask/accounts-engineers @MetaMask/wallet-framework-engineers
108+
/packages/multichain-transactions-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/wallet-framework-engineers
106109
/packages/token-search-discovery-controller/package.json @MetaMask/portfolio @MetaMask/wallet-framework-engineers
107110
/packages/token-search-discovery-controller/CHANGELOG.md @MetaMask/portfolio @MetaMask/wallet-framework-engineers

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Each package in this repository has its own README where you can find installati
3838
- [`@metamask/logging-controller`](packages/logging-controller)
3939
- [`@metamask/message-manager`](packages/message-manager)
4040
- [`@metamask/multichain`](packages/multichain)
41+
- [`@metamask/multichain-transactions-controller`](packages/multichain-transactions-controller)
4142
- [`@metamask/name-controller`](packages/name-controller)
4243
- [`@metamask/network-controller`](packages/network-controller)
4344
- [`@metamask/notification-services-controller`](packages/notification-services-controller)
@@ -49,6 +50,7 @@ Each package in this repository has its own README where you can find installati
4950
- [`@metamask/profile-sync-controller`](packages/profile-sync-controller)
5051
- [`@metamask/queued-request-controller`](packages/queued-request-controller)
5152
- [`@metamask/rate-limit-controller`](packages/rate-limit-controller)
53+
- [`@metamask/remote-feature-flag-controller`](packages/remote-feature-flag-controller)
5254
- [`@metamask/selected-network-controller`](packages/selected-network-controller)
5355
- [`@metamask/signature-controller`](packages/signature-controller)
5456
- [`@metamask/token-search-discovery-controller`](packages/token-search-discovery-controller)
@@ -81,6 +83,7 @@ linkStyle default opacity:0.5
8183
logging_controller(["@metamask/logging-controller"]);
8284
message_manager(["@metamask/message-manager"]);
8385
multichain(["@metamask/multichain"]);
86+
multichain_transactions_controller(["@metamask/multichain-transactions-controller"]);
8487
name_controller(["@metamask/name-controller"]);
8588
network_controller(["@metamask/network-controller"]);
8689
notification_services_controller(["@metamask/notification-services-controller"]);

eslint-warning-thresholds.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@
33
"@typescript-eslint/no-base-to-string": 3,
44
"@typescript-eslint/no-duplicate-enum-values": 2,
55
"@typescript-eslint/no-unsafe-enum-comparison": 34,
6-
"@typescript-eslint/no-unused-vars": 36,
7-
"@typescript-eslint/prefer-promise-reject-errors": 13,
8-
"@typescript-eslint/prefer-readonly": 145,
6+
"@typescript-eslint/no-unused-vars": 41,
7+
"@typescript-eslint/prefer-promise-reject-errors": 33,
8+
"@typescript-eslint/prefer-readonly": 142,
99
"import-x/namespace": 189,
1010
"import-x/no-named-as-default": 1,
1111
"import-x/no-named-as-default-member": 8,
12-
"import-x/order": 205,
13-
"jest/no-conditional-in-test": 129,
12+
"import-x/order": 211,
13+
"jest/no-conditional-in-test": 113,
1414
"jest/prefer-lowercase-title": 2,
1515
"jest/prefer-strict-equal": 2,
1616
"jsdoc/check-tag-names": 375,
17-
"jsdoc/require-returns": 22,
18-
"jsdoc/tag-lines": 328,
17+
"jsdoc/require-returns": 25,
18+
"jsdoc/tag-lines": 334,
1919
"n/no-unsupported-features/node-builtins": 4,
2020
"n/prefer-global/text-encoder": 4,
2121
"n/prefer-global/text-decoder": 4,
22-
"prettier/prettier": 115,
22+
"prettier/prettier": 116,
2323
"promise/always-return": 3,
2424
"promise/catch-or-return": 2,
2525
"promise/param-names": 8,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metamask/core-monorepo",
3-
"version": "285.0.0",
3+
"version": "289.0.0",
44
"private": true,
55
"description": "Monorepo for packages shared between MetaMask clients",
66
"repository": {

packages/accounts-controller/CHANGELOG.md

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

88
## [Unreleased]
99

10+
## [21.0.2]
11+
12+
### Changed
13+
14+
- Bump `@metamask/keyring-api` from `^13.0.0` to `^14.0.0` ([#5177](https://github.com/MetaMask/core/pull/5177))
15+
- Bump `@metamask/keyring-internal-api` from `^2.0.0` to `^2.0.1` ([#5177](https://github.com/MetaMask/core/pull/5177))
16+
- Bump `@metamask/eth-snap-keyring` from `^8.1.0` to `^8.1.1` ([#5177](https://github.com/MetaMask/core/pull/5177))
17+
1018
## [21.0.1]
1119

1220
### Changed
@@ -394,7 +402,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
394402

395403
- Initial release ([#1637](https://github.com/MetaMask/core/pull/1637))
396404

397-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@21.0.1...HEAD
405+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@21.0.2...HEAD
406+
[21.0.2]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@21.0.1...@metamask/accounts-controller@21.0.2
398407
[21.0.1]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@21.0.0...@metamask/accounts-controller@21.0.1
399408
[21.0.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@20.0.2...@metamask/accounts-controller@21.0.0
400409
[20.0.2]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@20.0.1...@metamask/accounts-controller@20.0.2

packages/accounts-controller/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metamask/accounts-controller",
3-
"version": "21.0.1",
3+
"version": "21.0.2",
44
"description": "Manages internal accounts",
55
"keywords": [
66
"MetaMask",
@@ -49,9 +49,9 @@
4949
"dependencies": {
5050
"@ethereumjs/util": "^8.1.0",
5151
"@metamask/base-controller": "^7.1.1",
52-
"@metamask/eth-snap-keyring": "^8.1.0",
53-
"@metamask/keyring-api": "^13.0.0",
54-
"@metamask/keyring-internal-api": "^2.0.0",
52+
"@metamask/eth-snap-keyring": "^9.0.0",
53+
"@metamask/keyring-api": "^15.0.0",
54+
"@metamask/keyring-internal-api": "^3.0.0",
5555
"@metamask/snaps-sdk": "^6.7.0",
5656
"@metamask/snaps-utils": "^8.3.0",
5757
"@metamask/utils": "^11.0.1",
@@ -62,7 +62,7 @@
6262
},
6363
"devDependencies": {
6464
"@metamask/auto-changelog": "^3.4.4",
65-
"@metamask/keyring-controller": "^19.0.3",
65+
"@metamask/keyring-controller": "^19.0.4",
6666
"@metamask/providers": "^18.1.1",
6767
"@metamask/snaps-controllers": "^9.10.0",
6868
"@types/jest": "^27.4.1",

packages/accounts-controller/src/AccountsController.test.ts

Lines changed: 122 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
import { ControllerMessenger } from '@metamask/base-controller';
2+
import type {
3+
AccountAssetListUpdatedEventPayload,
4+
AccountBalancesUpdatedEventPayload,
5+
AccountTransactionsUpdatedEventPayload,
6+
} from '@metamask/keyring-api';
27
import {
38
BtcAccountType,
49
EthAccountType,
@@ -134,7 +139,7 @@ const mockAccount4: InternalAccount = {
134139
};
135140

136141
class MockNormalAccountUUID {
137-
#accountIds: Record<string, string> = {};
142+
readonly #accountIds: Record<string, string> = {};
138143

139144
constructor(accounts: InternalAccount[]) {
140145
for (const account of accounts) {
@@ -299,6 +304,9 @@ function buildAccountsControllerMessenger(messenger = buildMessenger()) {
299304
allowedEvents: [
300305
'SnapController:stateChange',
301306
'KeyringController:stateChange',
307+
'SnapKeyring:accountAssetListUpdated',
308+
'SnapKeyring:accountBalancesUpdated',
309+
'SnapKeyring:accountTransactionsUpdated',
302310
],
303311
allowedActions: [
304312
'KeyringController:getAccounts',
@@ -1393,6 +1401,119 @@ describe('AccountsController', () => {
13931401
);
13941402
});
13951403

1404+
describe('onSnapKeyringEvents', () => {
1405+
const setupTest = () => {
1406+
const account = createExpectedInternalAccount({
1407+
id: 'mock-id',
1408+
name: 'Bitcoin Account',
1409+
address: 'tb1q4q7h8wuplrpmkxqvv6rrrq7qyhhjsj5uqcsxqu',
1410+
keyringType: KeyringTypes.snap,
1411+
snapId: 'mock-snap',
1412+
type: BtcAccountType.P2wpkh,
1413+
});
1414+
1415+
const messenger = buildMessenger();
1416+
const { accountsController } = setupAccountsController({
1417+
initialState: {
1418+
internalAccounts: {
1419+
accounts: {
1420+
[account.id]: account,
1421+
},
1422+
selectedAccount: account.id,
1423+
},
1424+
},
1425+
messenger,
1426+
});
1427+
1428+
return { messenger, account, accountsController };
1429+
};
1430+
1431+
it('re-publishes keyring events: SnapKeyring:accountBalancesUpdated', () => {
1432+
const { account, messenger } = setupTest();
1433+
1434+
const payload: AccountBalancesUpdatedEventPayload = {
1435+
balances: {
1436+
[account.id]: {
1437+
'bip122:000000000019d6689c085ae165831e93/slip44:0': {
1438+
amount: '0.1',
1439+
unit: 'BTC',
1440+
},
1441+
},
1442+
},
1443+
};
1444+
1445+
const mockRePublishedCallback = jest.fn();
1446+
messenger.subscribe(
1447+
'AccountsController:accountBalancesUpdated',
1448+
mockRePublishedCallback,
1449+
);
1450+
messenger.publish('SnapKeyring:accountBalancesUpdated', payload);
1451+
expect(mockRePublishedCallback).toHaveBeenCalledWith(payload);
1452+
});
1453+
1454+
it('re-publishes keyring events: SnapKeyring:accountAssetListUpdated', () => {
1455+
const { account, messenger } = setupTest();
1456+
1457+
const payload: AccountAssetListUpdatedEventPayload = {
1458+
assets: {
1459+
[account.id]: {
1460+
added: ['bip122:000000000019d6689c085ae165831e93/slip44:0'],
1461+
removed: ['bip122:000000000933ea01ad0ee984209779ba/slip44:0'],
1462+
},
1463+
},
1464+
};
1465+
1466+
const mockRePublishedCallback = jest.fn();
1467+
messenger.subscribe(
1468+
'AccountsController:accountAssetListUpdated',
1469+
mockRePublishedCallback,
1470+
);
1471+
messenger.publish('SnapKeyring:accountAssetListUpdated', payload);
1472+
expect(mockRePublishedCallback).toHaveBeenCalledWith(payload);
1473+
});
1474+
1475+
it('re-publishes keyring events: SnapKeyring:accountTransactionsUpdated', () => {
1476+
const { account, messenger } = setupTest();
1477+
1478+
const payload: AccountTransactionsUpdatedEventPayload = {
1479+
transactions: {
1480+
[account.id]: [
1481+
{
1482+
id: 'f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6',
1483+
timestamp: null,
1484+
chain: 'bip122:000000000019d6689c085ae165831e93',
1485+
status: 'submitted',
1486+
type: 'receive',
1487+
account: account.id,
1488+
from: [],
1489+
to: [],
1490+
fees: [
1491+
{
1492+
type: 'base',
1493+
asset: {
1494+
fungible: true,
1495+
type: 'bip122:000000000019d6689c085ae165831e93/slip44:0',
1496+
unit: 'BTC',
1497+
amount: '0.0001',
1498+
},
1499+
},
1500+
],
1501+
events: [],
1502+
},
1503+
],
1504+
},
1505+
};
1506+
1507+
const mockRePublishedCallback = jest.fn();
1508+
messenger.subscribe(
1509+
'AccountsController:accountTransactionsUpdated',
1510+
mockRePublishedCallback,
1511+
);
1512+
messenger.publish('SnapKeyring:accountTransactionsUpdated', payload);
1513+
expect(mockRePublishedCallback).toHaveBeenCalledWith(payload);
1514+
});
1515+
});
1516+
13961517
describe('updateAccounts', () => {
13971518
const mockAddress1 = '0x123';
13981519
const mockAddress2 = '0x456';

packages/accounts-controller/src/AccountsController.ts

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
import type {
22
ControllerGetStateAction,
33
ControllerStateChangeEvent,
4+
ExtractEventPayload,
45
RestrictedControllerMessenger,
56
} from '@metamask/base-controller';
67
import { BaseController } from '@metamask/base-controller';
8+
import type {
9+
SnapKeyringAccountAssetListUpdatedEvent,
10+
SnapKeyringAccountBalancesUpdatedEvent,
11+
SnapKeyringAccountTransactionsUpdatedEvent,
12+
} from '@metamask/eth-snap-keyring';
713
import { SnapKeyring } from '@metamask/eth-snap-keyring';
814
import {
915
EthAccountType,
@@ -161,15 +167,38 @@ export type AccountsControllerAccountRenamedEvent = {
161167
payload: [InternalAccount];
162168
};
163169

164-
export type AllowedEvents = SnapStateChange | KeyringControllerStateChangeEvent;
170+
export type AccountsControllerAccountBalancesUpdatesEvent = {
171+
type: `${typeof controllerName}:accountBalancesUpdated`;
172+
payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];
173+
};
174+
175+
export type AccountsControllerAccountTransactionsUpdatedEvent = {
176+
type: `${typeof controllerName}:accountTransactionsUpdated`;
177+
payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];
178+
};
179+
180+
export type AccountsControllerAccountAssetListUpdatedEvent = {
181+
type: `${typeof controllerName}:accountAssetListUpdated`;
182+
payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];
183+
};
184+
185+
export type AllowedEvents =
186+
| SnapStateChange
187+
| KeyringControllerStateChangeEvent
188+
| SnapKeyringAccountAssetListUpdatedEvent
189+
| SnapKeyringAccountBalancesUpdatedEvent
190+
| SnapKeyringAccountTransactionsUpdatedEvent;
165191

166192
export type AccountsControllerEvents =
167193
| AccountsControllerChangeEvent
168194
| AccountsControllerSelectedAccountChangeEvent
169195
| AccountsControllerSelectedEvmAccountChangeEvent
170196
| AccountsControllerAccountAddedEvent
171197
| AccountsControllerAccountRemovedEvent
172-
| AccountsControllerAccountRenamedEvent;
198+
| AccountsControllerAccountRenamedEvent
199+
| AccountsControllerAccountBalancesUpdatesEvent
200+
| AccountsControllerAccountTransactionsUpdatedEvent
201+
| AccountsControllerAccountAssetListUpdatedEvent;
173202

174203
export type AccountsControllerMessenger = RestrictedControllerMessenger<
175204
typeof controllerName,
@@ -261,6 +290,33 @@ export class AccountsController extends BaseController<
261290
(keyringState) => this.#handleOnKeyringStateChange(keyringState),
262291
);
263292

293+
this.messagingSystem.subscribe(
294+
'SnapKeyring:accountAssetListUpdated',
295+
(snapAccountEvent) =>
296+
this.#handleOnSnapKeyringAccountEvent(
297+
'AccountsController:accountAssetListUpdated',
298+
snapAccountEvent,
299+
),
300+
);
301+
302+
this.messagingSystem.subscribe(
303+
'SnapKeyring:accountBalancesUpdated',
304+
(snapAccountEvent) =>
305+
this.#handleOnSnapKeyringAccountEvent(
306+
'AccountsController:accountBalancesUpdated',
307+
snapAccountEvent,
308+
),
309+
);
310+
311+
this.messagingSystem.subscribe(
312+
'SnapKeyring:accountTransactionsUpdated',
313+
(snapAccountEvent) =>
314+
this.#handleOnSnapKeyringAccountEvent(
315+
'AccountsController:accountTransactionsUpdated',
316+
snapAccountEvent,
317+
),
318+
);
319+
264320
this.#registerMessageHandlers();
265321
}
266322

@@ -677,6 +733,23 @@ export class AccountsController extends BaseController<
677733
return internalAccounts;
678734
}
679735

736+
/**
737+
* Re-publish an account event.
738+
*
739+
* @param event - The event type. This is a unique identifier for this event.
740+
* @param payload - The event payload. The type of the parameters for each event handler must
741+
* match the type of this payload.
742+
* @template EventType - A Snap keyring event type.
743+
*/
744+
#handleOnSnapKeyringAccountEvent<
745+
EventType extends AccountsControllerEvents['type'],
746+
>(
747+
event: EventType,
748+
...payload: ExtractEventPayload<AccountsControllerEvents, EventType>
749+
): void {
750+
this.messagingSystem.publish(event, ...payload);
751+
}
752+
680753
/**
681754
* Handles changes in the keyring state, specifically when new accounts are added or removed.
682755
*

0 commit comments

Comments
 (0)