Skip to content

Commit d45f754

Browse files
authored
Merge branch 'develop' into feat/mmassets-432_network-filter-extension
2 parents 82255bc + 3d4bab3 commit d45f754

File tree

178 files changed

+3700
-1566
lines changed

Some content is hidden

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

178 files changed

+3700
-1566
lines changed

.github/CODEOWNERS

+6-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@ privacy-snapshot.json @MetaMask/extension-privacy-reviewers
5252
.devcontainer/ @MetaMask/library-admins @HowardBraham @plasmacorral
5353

5454
# Confirmations team to own code for confirmations on UI.
55-
ui/pages/confirmations @MetaMask/confirmations
55+
app/scripts/lib/ppom @MetaMask/confirmations
56+
app/scripts/lib/signature @MetaMask/confirmations
57+
app/scripts/lib/transaction/decode @MetaMask/confirmations
58+
app/scripts/lib/transaction/metrics.* @MetaMask/confirmations
59+
app/scripts/lib/transaction/util.* @MetaMask/confirmations
60+
ui/pages/confirmations @MetaMask/confirmations
5661

5762
# MMI team is responsible for code related with Institutioanl version of MetaMask
5863
ui/pages/institutional @MetaMask/mmi

.storybook/main.js

+3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ module.exports = {
5252
config.resolve.alias['../../../../../../store/actions'] = require.resolve(
5353
'../ui/__mocks__/actions.js',
5454
);
55+
config.resolve.alias['../../../store/actions'] = require.resolve(
56+
'../ui/__mocks__/actions.js',
57+
);
5558
// Import within controller-utils crashes storybook.
5659
config.resolve.alias['@ethereumjs/util'] = require.resolve(
5760
'../ui/__mocks__/ethereumjs-util.js',

.yarnrc.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ npmAuditIgnoreAdvisories:
117117
# Currently in use for the network list drag and drop functionality.
118118
# Maintenance has stopped and the project will be archived in 2025.
119119
- 'react-beautiful-dnd (deprecation)'
120-
120+
# New package name format for new versions: @ethereumjs/wallet.
121+
- 'ethereumjs-wallet (deprecation)'
121122
npmRegistries:
122123
'https://npm.pkg.github.com':
123124
npmAlwaysAuth: true

app/_locales/en/messages.json

+15-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/scripts/constants/sentry-state.ts

+11
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export const SENTRY_BACKGROUND_STATE = {
9898
BridgeController: {
9999
bridgeState: {
100100
bridgeFeatureFlags: {
101+
extensionConfig: false,
101102
extensionSupport: false,
102103
destNetworkAllowlist: [],
103104
srcNetworkAllowlist: [],
@@ -106,6 +107,15 @@ export const SENTRY_BACKGROUND_STATE = {
106107
destTopAssets: [],
107108
srcTokens: {},
108109
srcTopAssets: [],
110+
quoteRequest: {
111+
walletAddress: false,
112+
srcTokenAddress: true,
113+
slippage: true,
114+
srcChainId: true,
115+
destChainId: true,
116+
destTokenAddress: true,
117+
srcTokenAmount: true,
118+
},
109119
},
110120
},
111121
CronjobController: {
@@ -233,6 +243,7 @@ export const SENTRY_BACKGROUND_STATE = {
233243
showNativeTokenAsMainBalance: true,
234244
petnamesEnabled: true,
235245
showConfirmationAdvancedDetails: true,
246+
privacyMode: false,
236247
},
237248
useExternalServices: false,
238249
selectedAddress: false,

app/scripts/controllers/bridge/bridge-controller.test.ts

+85
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ describe('BridgeController', function () {
2929
nock(BRIDGE_API_BASE_URL)
3030
.get('/getAllFeatureFlags')
3131
.reply(200, {
32+
'extension-config': {
33+
refreshRate: 3,
34+
maxRefreshCount: 1,
35+
},
3236
'extension-support': true,
3337
'src-network-allowlist': [10, 534352],
3438
'dest-network-allowlist': [137, 42161],
@@ -55,6 +59,7 @@ describe('BridgeController', function () {
5559
symbol: 'ABC',
5660
},
5761
]);
62+
bridgeController.resetState();
5863
});
5964

6065
it('constructor should setup correctly', function () {
@@ -66,6 +71,10 @@ describe('BridgeController', function () {
6671
extensionSupport: true,
6772
destNetworkAllowlist: [CHAIN_IDS.POLYGON, CHAIN_IDS.ARBITRUM],
6873
srcNetworkAllowlist: [CHAIN_IDS.OPTIMISM, CHAIN_IDS.SCROLL],
74+
extensionConfig: {
75+
maxRefreshCount: 1,
76+
refreshRate: 3,
77+
},
6978
};
7079
expect(bridgeController.state).toStrictEqual(EMPTY_INIT_STATE);
7180

@@ -94,6 +103,11 @@ describe('BridgeController', function () {
94103
expect(bridgeController.state.bridgeState.destTopAssets).toStrictEqual([
95104
{ address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', symbol: 'ABC' },
96105
]);
106+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
107+
slippage: 0.5,
108+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
109+
walletAddress: undefined,
110+
});
97111
});
98112

99113
it('selectSrcNetwork should set the bridge src tokens and top assets', async function () {
@@ -118,5 +132,76 @@ describe('BridgeController', function () {
118132
symbol: 'ABC',
119133
},
120134
]);
135+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
136+
slippage: 0.5,
137+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
138+
walletAddress: undefined,
139+
});
140+
});
141+
142+
it('updateBridgeQuoteRequestParams should update the quoteRequest state', function () {
143+
bridgeController.updateBridgeQuoteRequestParams({ srcChainId: 1 });
144+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
145+
srcChainId: 1,
146+
slippage: 0.5,
147+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
148+
walletAddress: undefined,
149+
});
150+
151+
bridgeController.updateBridgeQuoteRequestParams({ destChainId: 10 });
152+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
153+
destChainId: 10,
154+
slippage: 0.5,
155+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
156+
walletAddress: undefined,
157+
});
158+
159+
bridgeController.updateBridgeQuoteRequestParams({ destChainId: undefined });
160+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
161+
destChainId: undefined,
162+
slippage: 0.5,
163+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
164+
walletAddress: undefined,
165+
});
166+
167+
bridgeController.updateBridgeQuoteRequestParams({
168+
srcTokenAddress: undefined,
169+
});
170+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
171+
slippage: 0.5,
172+
srcTokenAddress: undefined,
173+
walletAddress: undefined,
174+
});
175+
176+
bridgeController.updateBridgeQuoteRequestParams({
177+
srcTokenAmount: '100000',
178+
destTokenAddress: '0x123',
179+
slippage: 0.5,
180+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
181+
walletAddress: undefined,
182+
});
183+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
184+
srcTokenAmount: '100000',
185+
destTokenAddress: '0x123',
186+
slippage: 0.5,
187+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
188+
walletAddress: undefined,
189+
});
190+
191+
bridgeController.updateBridgeQuoteRequestParams({
192+
srcTokenAddress: '0x2ABC',
193+
});
194+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
195+
slippage: 0.5,
196+
srcTokenAddress: '0x2ABC',
197+
walletAddress: undefined,
198+
});
199+
200+
bridgeController.resetState();
201+
expect(bridgeController.state.bridgeState.quoteRequest).toStrictEqual({
202+
slippage: 0.5,
203+
srcTokenAddress: '0x0000000000000000000000000000000000000000',
204+
walletAddress: undefined,
205+
});
121206
});
122207
});

app/scripts/controllers/bridge/bridge-controller.ts

+24
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import {
99
// TODO: Remove restricted import
1010
// eslint-disable-next-line import/no-restricted-paths
1111
import { fetchTopAssetsList } from '../../../../ui/pages/swaps/swaps.util';
12+
// TODO: Remove restricted import
13+
// eslint-disable-next-line import/no-restricted-paths
14+
import { QuoteRequest } from '../../../../ui/pages/bridge/types';
1215
import {
1316
BRIDGE_CONTROLLER_NAME,
1417
DEFAULT_BRIDGE_CONTROLLER_STATE,
@@ -47,8 +50,29 @@ export default class BridgeController extends BaseController<
4750
`${BRIDGE_CONTROLLER_NAME}:selectDestNetwork`,
4851
this.selectDestNetwork.bind(this),
4952
);
53+
this.messagingSystem.registerActionHandler(
54+
`${BRIDGE_CONTROLLER_NAME}:updateBridgeQuoteRequestParams`,
55+
this.updateBridgeQuoteRequestParams.bind(this),
56+
);
5057
}
5158

59+
updateBridgeQuoteRequestParams = (paramsToUpdate: Partial<QuoteRequest>) => {
60+
const { bridgeState } = this.state;
61+
const updatedQuoteRequest = {
62+
...DEFAULT_BRIDGE_CONTROLLER_STATE.quoteRequest,
63+
...paramsToUpdate,
64+
};
65+
66+
this.update((_state) => {
67+
_state.bridgeState = {
68+
...bridgeState,
69+
quoteRequest: {
70+
...updatedQuoteRequest,
71+
},
72+
};
73+
});
74+
};
75+
5276
resetState = () => {
5377
this.update((_state) => {
5478
_state.bridgeState = {

app/scripts/controllers/bridge/constants.ts

+13
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
1+
import { zeroAddress } from 'ethereumjs-util';
12
import { BridgeControllerState, BridgeFeatureFlagsKey } from './types';
23

34
export const BRIDGE_CONTROLLER_NAME = 'BridgeController';
5+
export const REFRESH_INTERVAL_MS = 30 * 1000;
6+
const DEFAULT_MAX_REFRESH_COUNT = 5;
7+
const DEFAULT_SLIPPAGE = 0.5;
48

59
export const DEFAULT_BRIDGE_CONTROLLER_STATE: BridgeControllerState = {
610
bridgeFeatureFlags: {
11+
[BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {
12+
refreshRate: REFRESH_INTERVAL_MS,
13+
maxRefreshCount: DEFAULT_MAX_REFRESH_COUNT,
14+
},
715
[BridgeFeatureFlagsKey.EXTENSION_SUPPORT]: false,
816
[BridgeFeatureFlagsKey.NETWORK_SRC_ALLOWLIST]: [],
917
[BridgeFeatureFlagsKey.NETWORK_DEST_ALLOWLIST]: [],
@@ -12,4 +20,9 @@ export const DEFAULT_BRIDGE_CONTROLLER_STATE: BridgeControllerState = {
1220
srcTopAssets: [],
1321
destTokens: {},
1422
destTopAssets: [],
23+
quoteRequest: {
24+
walletAddress: undefined,
25+
srcTokenAddress: zeroAddress(),
26+
slippage: DEFAULT_SLIPPAGE,
27+
},
1528
};

app/scripts/controllers/bridge/types.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,24 @@ import {
44
} from '@metamask/base-controller';
55
import { Hex } from '@metamask/utils';
66
import { SwapsTokenObject } from '../../../../shared/constants/swaps';
7+
// TODO: Remove restricted import
8+
// eslint-disable-next-line import/no-restricted-paths
9+
import { QuoteRequest } from '../../../../ui/pages/bridge/types';
710
import BridgeController from './bridge-controller';
811
import { BRIDGE_CONTROLLER_NAME } from './constants';
912

1013
export enum BridgeFeatureFlagsKey {
14+
EXTENSION_CONFIG = 'extensionConfig',
1115
EXTENSION_SUPPORT = 'extensionSupport',
1216
NETWORK_SRC_ALLOWLIST = 'srcNetworkAllowlist',
1317
NETWORK_DEST_ALLOWLIST = 'destNetworkAllowlist',
1418
}
1519

1620
export type BridgeFeatureFlags = {
21+
[BridgeFeatureFlagsKey.EXTENSION_CONFIG]: {
22+
refreshRate: number;
23+
maxRefreshCount: number;
24+
};
1725
[BridgeFeatureFlagsKey.EXTENSION_SUPPORT]: boolean;
1826
[BridgeFeatureFlagsKey.NETWORK_SRC_ALLOWLIST]: Hex[];
1927
[BridgeFeatureFlagsKey.NETWORK_DEST_ALLOWLIST]: Hex[];
@@ -25,11 +33,13 @@ export type BridgeControllerState = {
2533
srcTopAssets: { address: string }[];
2634
destTokens: Record<string, SwapsTokenObject>;
2735
destTopAssets: { address: string }[];
36+
quoteRequest: Partial<QuoteRequest>;
2837
};
2938

3039
export enum BridgeUserAction {
3140
SELECT_SRC_NETWORK = 'selectSrcNetwork',
3241
SELECT_DEST_NETWORK = 'selectDestNetwork',
42+
UPDATE_QUOTE_PARAMS = 'updateBridgeQuoteRequestParams',
3343
}
3444
export enum BridgeBackgroundAction {
3545
SET_FEATURE_FLAGS = 'setBridgeFeatureFlags',
@@ -44,7 +54,8 @@ type BridgeControllerAction<FunctionName extends keyof BridgeController> = {
4454
type BridgeControllerActions =
4555
| BridgeControllerAction<BridgeBackgroundAction.SET_FEATURE_FLAGS>
4656
| BridgeControllerAction<BridgeUserAction.SELECT_SRC_NETWORK>
47-
| BridgeControllerAction<BridgeUserAction.SELECT_DEST_NETWORK>;
57+
| BridgeControllerAction<BridgeUserAction.SELECT_DEST_NETWORK>
58+
| BridgeControllerAction<BridgeUserAction.UPDATE_QUOTE_PARAMS>;
4859

4960
type BridgeControllerEvents = ControllerStateChangeEvent<
5061
typeof BRIDGE_CONTROLLER_NAME,

app/scripts/controllers/mmi-controller.test.ts

-2
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,6 @@ describe('MMIController', function () {
237237
messenger: mockMessenger,
238238
}),
239239
isEthSignEnabled: jest.fn(),
240-
getAllState: jest.fn(),
241-
getCurrentChainId: jest.fn(),
242240
}),
243241
appStateController: new AppStateController({
244242
addUnlockListener: jest.fn(),

app/scripts/controllers/preferences-controller.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,7 @@ describe('preferences controller', () => {
730730
expect(controller.state.preferences).toStrictEqual({
731731
autoLockTimeLimit: undefined,
732732
showExtensionInFullSizeView: false,
733+
privacyMode: false,
733734
showFiatInTestnets: false,
734735
showTestNetworks: false,
735736
smartTransactionsOptInStatus: null,
@@ -765,6 +766,7 @@ describe('preferences controller', () => {
765766
useNativeCurrencyAsPrimaryCurrency: true,
766767
hideZeroBalanceTokens: false,
767768
petnamesEnabled: true,
769+
privacyMode: false,
768770
redesignedConfirmationsEnabled: true,
769771
redesignedTransactionsEnabled: true,
770772
shouldShowAggregatedBalancePopover: true,

app/scripts/controllers/preferences-controller.ts

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export type Preferences = {
112112
redesignedTransactionsEnabled: boolean;
113113
featureNotificationsEnabled: boolean;
114114
showMultiRpcModal: boolean;
115+
privacyMode: boolean;
115116
isRedesignedConfirmationsDeveloperEnabled: boolean;
116117
showConfirmationAdvancedDetails: boolean;
117118
tokenSortConfig: {
@@ -215,6 +216,7 @@ export const getDefaultPreferencesControllerState =
215216
isRedesignedConfirmationsDeveloperEnabled: false,
216217
showConfirmationAdvancedDetails: false,
217218
showMultiRpcModal: false,
219+
privacyMode: false,
218220
shouldShowAggregatedBalancePopover: true, // by default user should see popover;
219221
tokenSortConfig: {
220222
key: 'tokenFiatAmount',

app/scripts/fixtures/with-preferences.js

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export const FIXTURES_PREFERENCES = {
1313
showNftAutodetectModal: false,
1414
isRedesignedConfirmationsDeveloperEnabled: false,
1515
showConfirmationAdvancedDetails: false,
16+
privacyMode: false,
1617
},
1718
featureFlags: {
1819
sendHexData: true,

0 commit comments

Comments
 (0)