Skip to content

Commit ccb9706

Browse files
authored
Merge pull request #27733 from MetaMask/Version-v12.4.1
Version v12.4.1 RC
2 parents 73ad771 + ac46289 commit ccb9706

File tree

6 files changed

+208
-3
lines changed

6 files changed

+208
-3
lines changed

CHANGELOG.md

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

77
## [Unreleased]
88

9+
## [12.4.1]
10+
### Fixed
11+
- Fix crash on swaps review page ([#27708](https://github.com/MetaMask/metamask-extension/pull/27708))
12+
- Fix bug that could prevent the phishing detection feature from having the most up to date info on which web pages to block ([#27743](https://github.com/MetaMask/metamask-extension/pull/27743))
13+
914
## [12.4.0]
1015
### Added
1116
- Added a receive button to the home screen, allowing users to easily get their address or QR-code for receiving cryptocurrency ([#26148](https://github.com/MetaMask/metamask-extension/pull/26148))
@@ -5139,7 +5144,8 @@ Update styles and spacing on the critical error page ([#20350](https://github.c
51395144
- Added the ability to restore accounts from seed words.
51405145

51415146

5142-
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v12.4.0...HEAD
5147+
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v12.4.1...HEAD
5148+
[12.4.1]: https://github.com/MetaMask/metamask-extension/compare/v12.4.0...v12.4.1
51435149
[12.4.0]: https://github.com/MetaMask/metamask-extension/compare/v12.3.1...v12.4.0
51445150
[12.3.1]: https://github.com/MetaMask/metamask-extension/compare/v12.3.0...v12.3.1
51455151
[12.3.0]: https://github.com/MetaMask/metamask-extension/compare/v12.2.4...v12.3.0
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import { migrate, version } from './126.1';
2+
3+
const oldVersion = 126.1;
4+
5+
const mockPhishingListMetaMask = {
6+
allowlist: [],
7+
blocklist: ['malicious1.com'],
8+
c2DomainBlocklist: ['malicious2.com'],
9+
fuzzylist: [],
10+
tolerance: 0,
11+
version: 1,
12+
lastUpdated: Date.now(),
13+
name: 'MetaMask',
14+
};
15+
16+
const mockPhishingListPhishfort = {
17+
allowlist: [],
18+
blocklist: ['phishfort1.com'],
19+
c2DomainBlocklist: ['phishfort2.com'],
20+
fuzzylist: [],
21+
tolerance: 0,
22+
version: 1,
23+
lastUpdated: Date.now(),
24+
name: 'Phishfort',
25+
};
26+
27+
describe(`migration #${version}`, () => {
28+
it('updates the version metadata', async () => {
29+
const oldStorage = {
30+
meta: { version: oldVersion },
31+
data: {},
32+
};
33+
34+
const newStorage = await migrate(oldStorage);
35+
36+
expect(newStorage.meta).toStrictEqual({ version });
37+
});
38+
39+
it('keeps only the MetaMask phishing list in PhishingControllerState', async () => {
40+
const oldState = {
41+
PhishingController: {
42+
phishingLists: [mockPhishingListMetaMask, mockPhishingListPhishfort],
43+
whitelist: [],
44+
hotlistLastFetched: 0,
45+
stalelistLastFetched: 0,
46+
c2DomainBlocklistLastFetched: 0,
47+
},
48+
};
49+
50+
const transformedState = await migrate({
51+
meta: { version: oldVersion },
52+
data: oldState,
53+
});
54+
55+
const updatedPhishingController = transformedState.data
56+
.PhishingController as Record<string, unknown>;
57+
58+
expect(updatedPhishingController.phishingLists).toStrictEqual([
59+
mockPhishingListMetaMask,
60+
]);
61+
});
62+
63+
it('removes all phishing lists if MetaMask is not present', async () => {
64+
const oldState = {
65+
PhishingController: {
66+
phishingLists: [mockPhishingListPhishfort],
67+
whitelist: [],
68+
hotlistLastFetched: 0,
69+
stalelistLastFetched: 0,
70+
c2DomainBlocklistLastFetched: 0,
71+
},
72+
};
73+
74+
const transformedState = await migrate({
75+
meta: { version: oldVersion },
76+
data: oldState,
77+
});
78+
79+
const updatedPhishingController = transformedState.data
80+
.PhishingController as Record<string, unknown>;
81+
82+
expect(updatedPhishingController.phishingLists).toStrictEqual([]);
83+
});
84+
85+
it('does nothing if PhishingControllerState is empty', async () => {
86+
const oldState = {
87+
PhishingController: {
88+
phishingLists: [],
89+
whitelist: [],
90+
hotlistLastFetched: 0,
91+
stalelistLastFetched: 0,
92+
c2DomainBlocklistLastFetched: 0,
93+
},
94+
};
95+
96+
const transformedState = await migrate({
97+
meta: { version: oldVersion },
98+
data: oldState,
99+
});
100+
101+
const updatedPhishingController = transformedState.data
102+
.PhishingController as Record<string, unknown>;
103+
104+
expect(updatedPhishingController.phishingLists).toStrictEqual([]);
105+
});
106+
107+
it('does nothing if PhishingController is not in the state', async () => {
108+
const oldState = {
109+
NetworkController: {
110+
providerConfig: {
111+
chainId: '0x1',
112+
},
113+
},
114+
};
115+
116+
const transformedState = await migrate({
117+
meta: { version: oldVersion },
118+
data: oldState,
119+
});
120+
121+
expect(transformedState.data).toStrictEqual(oldState);
122+
});
123+
124+
it('does nothing if phishingLists is not an array (null)', async () => {
125+
const oldState: Record<string, unknown> = {
126+
PhishingController: {
127+
phishingLists: null,
128+
whitelist: [],
129+
hotlistLastFetched: 0,
130+
stalelistLastFetched: 0,
131+
c2DomainBlocklistLastFetched: 0,
132+
},
133+
};
134+
135+
const transformedState = await migrate({
136+
meta: { version: oldVersion },
137+
data: oldState,
138+
});
139+
140+
expect(transformedState.data).toStrictEqual(oldState);
141+
});
142+
});

app/scripts/migrations/126.1.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { hasProperty, isObject } from '@metamask/utils';
2+
import { cloneDeep } from 'lodash';
3+
4+
type VersionedData = {
5+
meta: { version: number };
6+
data: Record<string, unknown>;
7+
};
8+
9+
export const version = 126.1;
10+
11+
/**
12+
* This migration removes `providerConfig` from the network controller state.
13+
*
14+
* @param originalVersionedData - Versioned MetaMask extension state, exactly what we persist to dist.
15+
* @param originalVersionedData.meta - State metadata.
16+
* @param originalVersionedData.meta.version - The current state version.
17+
* @param originalVersionedData.data - The persisted MetaMask state, keyed by controller.
18+
* @returns Updated versioned MetaMask extension state.
19+
*/
20+
export async function migrate(
21+
originalVersionedData: VersionedData,
22+
): Promise<VersionedData> {
23+
const versionedData = cloneDeep(originalVersionedData);
24+
versionedData.meta.version = version;
25+
transformState(versionedData.data);
26+
return versionedData;
27+
}
28+
29+
function transformState(
30+
state: Record<string, unknown>,
31+
): Record<string, unknown> {
32+
if (
33+
hasProperty(state, 'PhishingController') &&
34+
isObject(state.PhishingController) &&
35+
hasProperty(state.PhishingController, 'phishingLists')
36+
) {
37+
const phishingController = state.PhishingController;
38+
39+
if (!Array.isArray(phishingController.phishingLists)) {
40+
console.error(
41+
`Migration ${version}: Invalid PhishingController.phishingLists state`,
42+
);
43+
return state;
44+
}
45+
46+
phishingController.phishingLists = phishingController.phishingLists.filter(
47+
(list) => list.name === 'MetaMask',
48+
);
49+
50+
state.PhishingController = phishingController;
51+
}
52+
53+
return state;
54+
}

app/scripts/migrations/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ const migrations = [
146146
require('./125'),
147147
require('./125.1'),
148148
require('./126'),
149+
require('./126.1'),
149150
];
150151

151152
export default migrations;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "metamask-crx",
3-
"version": "12.4.0",
3+
"version": "12.4.1",
44
"private": true,
55
"repository": {
66
"type": "git",

ui/pages/swaps/prepare-swap-page/prepare-swap-page.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import {
5252
getTransactionSettingsOpened,
5353
setTransactionSettingsOpened,
5454
getLatestAddedTokenTo,
55+
getUsedQuote,
5556
} from '../../../ducks/swaps/swaps';
5657
import {
5758
getSwapsDefaultToken,
@@ -190,9 +191,10 @@ export default function PrepareSwapPage({
190191
const rpcPrefs = useSelector(getRpcPrefsForCurrentProvider, shallowEqual);
191192
const tokenList = useSelector(getTokenList, isEqual);
192193
const quotes = useSelector(getQuotes, isEqual);
194+
const usedQuote = useSelector(getUsedQuote, isEqual);
193195
const latestAddedTokenTo = useSelector(getLatestAddedTokenTo, isEqual);
194196
const numberOfQuotes = Object.keys(quotes).length;
195-
const areQuotesPresent = numberOfQuotes > 0;
197+
const areQuotesPresent = numberOfQuotes > 0 && usedQuote;
196198
const swapsErrorKey = useSelector(getSwapsErrorKey);
197199
const aggregatorMetadata = useSelector(getAggregatorMetadata, shallowEqual);
198200
const transactionSettingsOpened = useSelector(

0 commit comments

Comments
 (0)