Skip to content

Commit 8d8a971

Browse files
committed
Merge branch 'main' into mikesposito/messenger/account-tree-controller
2 parents 6746c38 + 73a5aad commit 8d8a971

File tree

260 files changed

+19123
-3855
lines changed

Some content is hidden

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

260 files changed

+19123
-3855
lines changed

.github/CODEOWNERS

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
/packages/multichain-transactions-controller @MetaMask/accounts-engineers
1212
/packages/multichain-account-service @MetaMask/accounts-engineers
1313
/packages/account-tree-controller @MetaMask/accounts-engineers
14+
/packages/profile-sync-controller @MetaMask/accounts-engineers
1415

1516
## Assets Team
1617
/packages/assets-controllers @MetaMask/metamask-assets
@@ -54,11 +55,11 @@
5455
/packages/delegation-controller @MetaMask/vault
5556

5657
## Wallet API Platform Team
57-
/packages/chain-agnostic-permission @MetaMask/wallet-api-platform-engineers
58-
/packages/eip1193-permission-middleware @MetaMask/wallet-api-platform-engineers
59-
/packages/multichain-api-middleware @MetaMask/wallet-api-platform-engineers
60-
/packages/selected-network-controller @MetaMask/wallet-api-platform-engineers
61-
/packages/eip-5792-middleware @MetaMask/wallet-api-platform-engineers
58+
/packages/chain-agnostic-permission @MetaMask/wallet-integrations
59+
/packages/eip1193-permission-middleware @MetaMask/wallet-integrations
60+
/packages/multichain-api-middleware @MetaMask/wallet-integrations
61+
/packages/selected-network-controller @MetaMask/wallet-integrations
62+
/packages/eip-5792-middleware @MetaMask/wallet-integrations
6263

6364
## Core Platform Team
6465
/packages/base-controller @MetaMask/core-platform
@@ -73,25 +74,25 @@
7374
/packages/rate-limit-controller @MetaMask/core-platform
7475

7576
## Wallet UX Team
76-
/packages/announcement-controller @MetaMask/wallet-ux
77+
/packages/announcement-controller @MetaMask/core-extension-ux @MetaMask/mobile-core-ux
7778

7879
## Web3Auth Team
7980
/packages/seedless-onboarding-controller @MetaMask/web3auth
8081
/packages/shield-controller @MetaMask/web3auth
8182
/packages/subscription-controller @MetaMask/web3auth
8283

8384
## Joint team ownership
84-
/packages/eth-json-rpc-provider @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
85-
/packages/json-rpc-engine @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
86-
/packages/json-rpc-middleware-stream @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
85+
/packages/eth-json-rpc-provider @MetaMask/wallet-integrations @MetaMask/core-platform
86+
/packages/json-rpc-engine @MetaMask/wallet-integrations @MetaMask/core-platform
87+
/packages/json-rpc-middleware-stream @MetaMask/wallet-integrations @MetaMask/core-platform
8788
/packages/keyring-controller @MetaMask/accounts-engineers @MetaMask/core-platform
8889
/packages/multichain-network-controller @MetaMask/core-platform @MetaMask/accounts-engineers @MetaMask/metamask-assets
8990
/packages/network-controller @MetaMask/core-platform @MetaMask/metamask-assets
90-
/packages/permission-controller @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
91-
/packages/permission-log-controller @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
92-
/packages/profile-sync-controller @MetaMask/identity
91+
/packages/permission-controller @MetaMask/wallet-integrations @MetaMask/core-platform
92+
/packages/permission-log-controller @MetaMask/wallet-integrations @MetaMask/core-platform
9393
/packages/remote-feature-flag-controller @MetaMask/extension-platform @MetaMask/mobile-platform
9494
/packages/foundryup @MetaMask/mobile-platform @MetaMask/extension-platform
95+
/packages/core-backend @MetaMask/core-platform @MetaMask/metamask-assets
9596

9697
## Package Release related
9798
/packages/account-tree-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform
@@ -100,22 +101,22 @@
100101
/packages/accounts-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform
101102
/packages/address-book-controller/package.json @MetaMask/confirmations @MetaMask/core-platform
102103
/packages/address-book-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform
103-
/packages/announcement-controller/package.json @MetaMask/wallet-ux @MetaMask/core-platform
104-
/packages/announcement-controller/CHANGELOG.md @MetaMask/wallet-ux @MetaMask/core-platform
104+
/packages/announcement-controller/package.json @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform
105+
/packages/announcement-controller/CHANGELOG.md @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform
105106
/packages/approval-controller/package.json @MetaMask/confirmations @MetaMask/core-platform
106107
/packages/approval-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform
107108
/packages/assets-controllers/package.json @MetaMask/metamask-assets @MetaMask/core-platform
108109
/packages/assets-controllers/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform
109-
/packages/chain-agnostic-permission/package.json @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
110-
/packages/chain-agnostic-permission/CHANGELOG.md @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
110+
/packages/chain-agnostic-permission/package.json @MetaMask/wallet-integrations @MetaMask/core-platform
111+
/packages/chain-agnostic-permission/CHANGELOG.md @MetaMask/wallet-integrations @MetaMask/core-platform
111112
/packages/delegation-controller/package.json @MetaMask/vault @MetaMask/core-platform
112113
/packages/delegation-controller/CHANGELOG.md @MetaMask/vault @MetaMask/core-platform
113114
/packages/earn-controller/package.json @MetaMask/earn @MetaMask/core-platform
114115
/packages/earn-controller/CHANGELOG.md @MetaMask/earn @MetaMask/core-platform
115-
/packages/eip-5792-middleware/package.json @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
116-
/packages/eip-5792-middleware/CHANGELOG.md @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
117-
/packages/eip1193-permission-middleware/package.json @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
118-
/packages/eip1193-permission-middleware/CHANGELOG.md @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
116+
/packages/eip-5792-middleware/package.json @MetaMask/wallet-integrations @MetaMask/core-platform
117+
/packages/eip-5792-middleware/CHANGELOG.md @MetaMask/wallet-integrations @MetaMask/core-platform
118+
/packages/eip1193-permission-middleware/package.json @MetaMask/wallet-integrations @MetaMask/core-platform
119+
/packages/eip1193-permission-middleware/CHANGELOG.md @MetaMask/wallet-integrations @MetaMask/core-platform
119120
/packages/ens-controller/package.json @MetaMask/confirmations @MetaMask/core-platform
120121
/packages/ens-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform
121122
/packages/gas-fee-controller/package.json @MetaMask/confirmations @MetaMask/core-platform
@@ -130,18 +131,18 @@
130131
/packages/message-manager/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform
131132
/packages/multichain-account-service/package.json @MetaMask/accounts-engineers @MetaMask/core-platform
132133
/packages/multichain-account-service/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform
133-
/packages/multichain-api-middleware/package.json @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
134-
/packages/multichain-api-middleware/CHANGELOG.md @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
134+
/packages/multichain-api-middleware/package.json @MetaMask/wallet-integrations @MetaMask/core-platform
135+
/packages/multichain-api-middleware/CHANGELOG.md @MetaMask/wallet-integrations @MetaMask/core-platform
135136
/packages/name-controller/package.json @MetaMask/confirmations @MetaMask/core-platform
136137
/packages/name-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform
137138
/packages/notification-services-controller/package.json @MetaMask/notifications @MetaMask/core-platform
138139
/packages/notification-services-controller/CHANGELOG.md @MetaMask/notifications @MetaMask/core-platform
139140
/packages/phishing-controller/package.json @MetaMask/product-safety @MetaMask/core-platform
140141
/packages/phishing-controller/CHANGELOG.md @MetaMask/product-safety @MetaMask/core-platform
141-
/packages/profile-sync-controller/package.json @MetaMask/identity @MetaMask/core-platform
142-
/packages/profile-sync-controller/CHANGELOG.md @MetaMask/identity @MetaMask/core-platform
143-
/packages/selected-network-controller/package.json @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
144-
/packages/selected-network-controller/CHANGELOG.md @MetaMask/wallet-api-platform-engineers @MetaMask/core-platform
142+
/packages/profile-sync-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform
143+
/packages/profile-sync-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform
144+
/packages/selected-network-controller/package.json @MetaMask/wallet-integrations @MetaMask/core-platform
145+
/packages/selected-network-controller/CHANGELOG.md @MetaMask/wallet-integrations @MetaMask/core-platform
145146
/packages/signature-controller/package.json @MetaMask/confirmations @MetaMask/core-platform
146147
/packages/signature-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform
147148
/packages/transaction-controller/package.json @MetaMask/confirmations @MetaMask/core-platform
@@ -170,3 +171,5 @@
170171
/packages/network-enablement-controller/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform
171172
/packages/subscription-controller/package.json @MetaMask/web3auth @MetaMask/core-platform
172173
/packages/subscription-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform
174+
/packages/core-backend/package.json @MetaMask/core-platform @MetaMask/metamask-assets
175+
/packages/core-backend/CHANGELOG.md @MetaMask/core-platform @MetaMask/metamask-assets
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
# Real-Time Balance Updates and Status Management Flow
2+
3+
This document describes the architecture and flow for real-time balance updates and WebSocket status management in MetaMask Core, specifically focusing on the `AccountActivityService:balanceUpdated` and `AccountActivityService:statusChanged` events.
4+
5+
## Overview
6+
7+
The system provides real-time balance updates and intelligent polling management through a multi-layered architecture that combines WebSocket streaming with fallback HTTP polling. The key components work together to ensure users receive timely balance updates while optimizing network usage and battery consumption.
8+
9+
## Architecture Components
10+
11+
### 1. BackendWebSocketService
12+
13+
- **Purpose**: Low-level WebSocket connection management
14+
- **Responsibilities**:
15+
- Maintains WebSocket connection with automatic reconnection
16+
- Handles subscription management
17+
- Routes incoming messages to registered callbacks
18+
- Publishes connection state changes
19+
20+
### 2. AccountActivityService
21+
22+
- **Purpose**: High-level account activity monitoring
23+
- **Responsibilities**:
24+
- Subscribes to selected account activity
25+
- Processes transaction and balance updates
26+
- Emits `balanceUpdated` and `statusChanged` events
27+
- Manages chain status based on WebSocket connectivity and system notifications
28+
29+
### 3. TokenBalancesController
30+
31+
- **Purpose**: Token balance state management and intelligent polling
32+
- **Responsibilities**:
33+
- Maintains token balance state for all accounts
34+
- Implements per-chain configurable polling intervals
35+
- Responds to real-time balance updates from AccountActivityService
36+
- Dynamically adjusts polling based on WebSocket availability
37+
- Imports newly detected tokens via TokenDetectionController
38+
39+
## Event Flow
40+
41+
### Balance Update Flow
42+
43+
```
44+
┌─────────────────────────────────────────────────────────────────────────┐
45+
│ BALANCE UPDATE FLOW │
46+
└─────────────────────────────────────────────────────────────────────────┘
47+
48+
1. WebSocket receives account activity message
49+
50+
2. BackendWebSocketService routes message to registered callback
51+
52+
3. AccountActivityService processes AccountActivityMessage
53+
{
54+
address: "0x123...",
55+
tx: { hash: "0x...", chain: "eip155:1", status: "completed", ... },
56+
updates: [
57+
{
58+
asset: { fungible: true, type: "eip155:1/erc20:0x...", unit: "USDT" },
59+
postBalance: { amount: "1254.75" },
60+
transfers: [{ from: "0x...", to: "0x...", amount: "500.00" }]
61+
}
62+
]
63+
}
64+
65+
4. AccountActivityService publishes separate events:
66+
- AccountActivityService:transactionUpdated (transaction data)
67+
- AccountActivityService:balanceUpdated (balance updates)
68+
69+
5. TokenBalancesController receives balanceUpdated event
70+
71+
6. TokenBalancesController processes balance updates:
72+
a. Parses CAIP chain ID (e.g., "eip155:1" → "0x1")
73+
b. Parses asset types:
74+
- ERC20 tokens: "eip155:1/erc20:0x..." → token address
75+
- Native tokens: "eip155:1/slip44:60" → zero address
76+
c. Validates addresses and checksums them
77+
d. Checks if tokens are tracked (imported or detected)
78+
79+
7. For tracked tokens:
80+
- Updates tokenBalances state immediately
81+
- Updates AccountTrackerController for native balances
82+
83+
8. For untracked ERC20 tokens:
84+
- Queues tokens for import via TokenDetectionController
85+
- Triggers fallback polling to fetch newly imported token balances
86+
87+
9. On errors:
88+
- Falls back to HTTP polling for the affected chain
89+
```
90+
91+
### Status Change Flow
92+
93+
The system manages chain status through two primary mechanisms:
94+
95+
#### A. WebSocket Connection State Changes
96+
97+
```
98+
┌─────────────────────────────────────────────────────────────────────────┐
99+
│ WEBSOCKET CONNECTION STATUS FLOW │
100+
└─────────────────────────────────────────────────────────────────────────┘
101+
102+
1. BackendWebSocketService detects connection state change
103+
(CONNECTING → CONNECTED | DISCONNECTED | ERROR)
104+
105+
2. BackendWebSocketService publishes:
106+
BackendWebSocketService:connectionStateChanged
107+
108+
3. AccountActivityService receives connection state change
109+
110+
4. AccountActivityService determines affected chains:
111+
- Fetches list of supported chains from backend API
112+
- Example: ["eip155:1", "eip155:137", "eip155:56"]
113+
114+
5. AccountActivityService publishes status based on connection state:
115+
116+
IF state === CONNECTED:
117+
→ Publishes: statusChanged { chainIds: [...], status: 'up' }
118+
→ Triggers resubscription to selected account
119+
120+
IF state === DISCONNECTED || ERROR:
121+
→ Publishes: statusChanged { chainIds: [...], status: 'down' }
122+
123+
6. TokenBalancesController receives statusChanged event
124+
125+
7. TokenBalancesController applies debouncing (5 second window)
126+
- Accumulates status changes to prevent excessive updates
127+
- Latest status wins for each chain
128+
129+
8. After debounce period, processes accumulated changes:
130+
- Converts CAIP format to hex (e.g., "eip155:1" → "0x1")
131+
- Calculates new polling intervals:
132+
* status = 'down' → Uses default interval (30 seconds)
133+
* status = 'up' → Uses extended interval (5 minutes)
134+
135+
9. Adds jitter delay (0 to default interval)
136+
- Prevents synchronized requests across instances
137+
138+
10. Updates chain polling configurations
139+
- Triggers immediate balance fetch
140+
- Restarts polling with new intervals
141+
```
142+
143+
#### B. System Notifications (Per-Chain Status)
144+
145+
```
146+
┌─────────────────────────────────────────────────────────────────────────┐
147+
│ SYSTEM NOTIFICATION STATUS FLOW │
148+
└─────────────────────────────────────────────────────────────────────────┘
149+
150+
1. WebSocket receives system notification message
151+
{
152+
type: 'system',
153+
chainIds: ['eip155:1'], // Specific affected chains
154+
status: 'down' // or 'up'
155+
}
156+
157+
2. BackendWebSocketService routes to AccountActivityService
158+
159+
3. AccountActivityService validates notification:
160+
- Ensures chainIds array is present and valid
161+
- Ensures status is present
162+
163+
4. AccountActivityService publishes delta update:
164+
AccountActivityService:statusChanged
165+
{
166+
chainIds: ['eip155:1'], // Only affected chains
167+
status: 'down'
168+
}
169+
170+
5. TokenBalancesController processes (same as WebSocket flow above)
171+
```
172+
173+
#### Status Change Event Format
174+
175+
```typescript
176+
// Event published by AccountActivityService
177+
AccountActivityService:statusChanged
178+
Payload: {
179+
chainIds: string[]; // Array of CAIP chain IDs (e.g., ["eip155:1", "eip155:137"])
180+
status: 'up' | 'down'; // Connection status
181+
}
182+
```
183+
184+
## Polling Strategy
185+
186+
The TokenBalancesController implements intelligent polling that adapts based on WebSocket availability:
187+
188+
### Polling Intervals
189+
190+
| Scenario | Interval | Reason |
191+
| ----------------------------------------- | -------------------- | --------------------------------------------------- |
192+
| WebSocket Connected (`status: 'up'`) | 5 minutes | Real-time updates available, polling is backup only |
193+
| WebSocket Disconnected (`status: 'down'`) | 30 seconds (default) | Primary update mechanism, needs faster polling |
194+
| Per-chain custom configuration | Configurable | Allows fine-tuning per chain requirements |
195+
196+
### Debouncing Strategy
197+
198+
To prevent excessive HTTP calls during unstable connections:
199+
200+
1. **Accumulation Window**: 5 seconds
201+
202+
- All status changes within this window are accumulated
203+
- Latest status wins for each chain
204+
205+
2. **Jitter Addition**: Random delay (0 to default interval)
206+
207+
- Prevents synchronized requests across multiple instances
208+
- Reduces backend load spikes
209+
210+
3. **Batch Processing**: After debounce + jitter
211+
- All accumulated changes applied at once
212+
- Single polling configuration update
213+
- Immediate balance fetch triggered
214+
215+
### Per-Chain Polling Configuration
216+
217+
TokenBalancesController supports per-chain polling intervals:
218+
219+
```typescript
220+
// Configure custom intervals for specific chains
221+
tokenBalancesController.updateChainPollingConfigs({
222+
'0x1': { interval: 30000 }, // Ethereum: 30 seconds (default)
223+
'0x89': { interval: 15000 }, // Polygon: 15 seconds (faster)
224+
'0xa4b1': { interval: 60000 }, // Arbitrum: 1 minute (slower)
225+
});
226+
```
227+
228+
## Token Discovery Flow
229+
230+
When balance updates include previously unknown tokens:
231+
232+
```
233+
1. TokenBalancesController receives balance update for unknown token
234+
235+
2. Checks if token is tracked (in allTokens or allIgnoredTokens)
236+
237+
3. If NOT tracked:
238+
a. Queues token for import
239+
b. Calls TokenDetectionController:addDetectedTokensViaWs
240+
c. Token is added to detected tokens list
241+
242+
4. Triggers balance fetch for the chain
243+
244+
5. New token balance is fetched and state is updated
245+
```
246+
247+
## References
248+
249+
- [`TokenBalancesController.ts`](../packages/assets-controllers/src/TokenBalancesController.ts) - Main controller implementation
250+
- [`AccountActivityService.ts`](../packages/core-backend/src/AccountActivityService.ts) - Account activity monitoring
251+
- [`BackendWebSocketService.ts`](../packages/core-backend/src/BackendWebSocketService.ts) - WebSocket connection management
252+
- [`types.ts`](../packages/core-backend/src/types.ts) - Type definitions
253+
- [Core Backend README](../packages/core-backend/README.md) - Package overview

0 commit comments

Comments
 (0)