Skip to content

Commit 6f2c53d

Browse files
committed
merge: upgrade network controller to v21
1 parent ea3948c commit 6f2c53d

File tree

66 files changed

+4706
-3905
lines changed

Some content is hidden

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

66 files changed

+4706
-3905
lines changed

app/components/UI/AccountInfoCard/index.test.tsx

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import {
99
MOCK_ADDRESS_1,
1010
} from '../../../util/test/accountsControllerTestUtils';
1111
import { RootState } from '../../../reducers';
12+
import { RpcEndpointType } from '@metamask/network-controller';
13+
import { mockNetworkState } from '../../../util/test/network';
1214

1315
jest.mock('../../../core/Engine', () => ({
1416
resetState: jest.fn(),
@@ -48,20 +50,13 @@ const mockInitialState: DeepPartial<RootState> = {
4850
},
4951
},
5052
NetworkController: {
51-
selectedNetworkClientId: 'sepolia',
52-
networksMetadata: {},
53-
networkConfigurations: {
54-
sepolia: {
55-
id: 'sepolia',
56-
rpcUrl: 'http://localhost/v3/',
57-
chainId: '0xaa36a7',
58-
ticker: 'ETH',
59-
nickname: 'sepolia',
60-
rpcPrefs: {
61-
blockExplorerUrl: 'https://etherscan.com',
62-
},
63-
},
64-
},
53+
...mockNetworkState({
54+
chainId: '0xaa36a7',
55+
id: 'mainnet',
56+
nickname: 'Sepolia',
57+
ticker: 'SepoliaETH',
58+
type: RpcEndpointType.Infura,
59+
}),
6560
},
6661
TokenBalancesController: {
6762
contractBalances: {},

app/components/UI/NetworkModal/index.tsx

Lines changed: 144 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ import { useMetrics } from '../../../components/hooks/useMetrics';
3636
import { toHex } from '@metamask/controller-utils';
3737
import { rpcIdentifierUtility } from '../../../components/hooks/useSafeChains';
3838
import Logger from '../../../util/Logger';
39+
import { selectNetworkConfigurations } from '../../../selectors/networkController';
40+
import {
41+
NetworkConfiguration,
42+
RpcEndpointType,
43+
AddNetworkFields,
44+
} from '@metamask/network-controller';
3945

4046
export interface SafeChain {
4147
chainId: string;
@@ -162,6 +168,10 @@ const NetworkModals = (props: NetworkProps) => {
162168
selectUseSafeChainsListValidation,
163169
);
164170

171+
const networkConfigurationByChainId = useSelector(
172+
selectNetworkConfigurations,
173+
);
174+
165175
const customNetworkInformation = {
166176
chainId,
167177
blockExplorerUrl,
@@ -189,52 +199,153 @@ const NetworkModals = (props: NetworkProps) => {
189199
checkNetwork();
190200
}, [checkNetwork]);
191201

192-
const closeModal = () => {
202+
const closeModal = async () => {
193203
const { NetworkController } = Engine.context;
194204
const url = new URLPARSE(rpcUrl);
195205
!isPrivateConnection(url.hostname) && url.set('protocol', 'https:');
196-
NetworkController.upsertNetworkConfiguration(
197-
{
198-
rpcUrl: url.href,
206+
207+
const existingNetwork = networkConfigurationByChainId[chainId];
208+
209+
if (existingNetwork) {
210+
const updatedNetwork = await NetworkController.updateNetwork(
211+
existingNetwork.chainId,
212+
existingNetwork,
213+
existingNetwork.chainId === chainId
214+
? {
215+
replacementSelectedRpcEndpointIndex:
216+
existingNetwork.defaultRpcEndpointIndex,
217+
}
218+
: undefined,
219+
);
220+
221+
const { networkClientId } =
222+
updatedNetwork?.rpcEndpoints?.[
223+
updatedNetwork.defaultRpcEndpointIndex
224+
] ?? {};
225+
226+
await NetworkController.setActiveNetwork(networkClientId);
227+
} else {
228+
const addedNetwork = await NetworkController.addNetwork({
199229
chainId,
200-
ticker,
201-
nickname,
202-
rpcPrefs: { blockExplorerUrl },
203-
},
204-
{
205-
// Metrics-related properties required, but the metric event is a no-op
206-
// TODO: Use events for controller metric events
207-
referrer: 'ignored',
208-
source: 'ignored',
209-
},
210-
);
230+
blockExplorerUrls: [blockExplorerUrl],
231+
defaultRpcEndpointIndex: 0,
232+
defaultBlockExplorerUrlIndex: 0,
233+
name: nickname,
234+
nativeCurrency: ticker,
235+
rpcEndpoints: [
236+
{
237+
url: rpcUrl,
238+
name: nickname,
239+
type: RpcEndpointType.Custom,
240+
},
241+
],
242+
});
243+
244+
const { networkClientId } =
245+
addedNetwork?.rpcEndpoints?.[addedNetwork.defaultRpcEndpointIndex] ??
246+
{};
247+
248+
await NetworkController.setActiveNetwork(networkClientId);
249+
}
211250
onClose();
212251
};
213252

214-
const switchNetwork = () => {
253+
const handleExistingNetwork = async (
254+
existingNetwork: NetworkConfiguration,
255+
networkId: string,
256+
) => {
257+
const { NetworkController } = Engine.context;
258+
const updatedNetwork = await NetworkController.updateNetwork(
259+
existingNetwork.chainId,
260+
existingNetwork,
261+
existingNetwork.chainId === networkId
262+
? {
263+
replacementSelectedRpcEndpointIndex:
264+
existingNetwork.defaultRpcEndpointIndex,
265+
}
266+
: undefined,
267+
);
268+
269+
const { networkClientId } =
270+
updatedNetwork?.rpcEndpoints?.[updatedNetwork.defaultRpcEndpointIndex] ??
271+
{};
272+
273+
await NetworkController.setActiveNetwork(networkClientId);
274+
};
275+
276+
const handleNewNetwork = async (
277+
networkId: `0x${string}`,
278+
networkRpcUrl: string,
279+
name: string,
280+
nativeCurrency: string,
281+
networkBlockExplorerUrl: string,
282+
) => {
283+
const { NetworkController } = Engine.context;
284+
const networkConfig = {
285+
chainId: networkId,
286+
blockExplorerUrls: networkBlockExplorerUrl
287+
? [networkBlockExplorerUrl]
288+
: [],
289+
defaultRpcEndpointIndex: 0,
290+
defaultBlockExplorerUrlIndex: blockExplorerUrl ? 0 : undefined,
291+
name,
292+
nativeCurrency,
293+
rpcEndpoints: [
294+
{
295+
url: networkRpcUrl,
296+
name,
297+
type: RpcEndpointType.Custom,
298+
},
299+
],
300+
} as AddNetworkFields;
301+
302+
return NetworkController.addNetwork(networkConfig);
303+
};
304+
305+
const handleNavigation = (
306+
onSwitchNetwork: () => void,
307+
networkSwitchPopToWallet: boolean,
308+
) => {
309+
if (onSwitchNetwork) {
310+
onSwitchNetwork();
311+
} else {
312+
networkSwitchPopToWallet
313+
? navigation.navigate('WalletView')
314+
: navigation.goBack();
315+
}
316+
};
317+
318+
const switchNetwork = async () => {
215319
const { NetworkController, CurrencyRateController } = Engine.context;
216320
const url = new URLPARSE(rpcUrl);
321+
const existingNetwork = networkConfigurationByChainId[chainId];
322+
217323
CurrencyRateController.updateExchangeRate(ticker);
218-
!isPrivateConnection(url.hostname) && url.set('protocol', 'https:');
219-
NetworkController.upsertNetworkConfiguration(
220-
{
221-
rpcUrl: url.href,
324+
325+
if (!isPrivateConnection(url.hostname)) {
326+
url.set('protocol', 'https:');
327+
}
328+
329+
if (existingNetwork) {
330+
await handleExistingNetwork(existingNetwork, chainId);
331+
} else {
332+
const addedNetwork = await handleNewNetwork(
222333
chainId,
223-
ticker,
334+
rpcUrl,
224335
nickname,
225-
rpcPrefs: { blockExplorerUrl },
226-
},
227-
{
228-
setActive: true,
229-
// Metrics-related properties required, but the metric event is a no-op
230-
// TODO: Use events for controller metric events
231-
referrer: 'ignored',
232-
source: 'ignored',
233-
},
234-
);
235-
closeModal();
336+
ticker,
337+
blockExplorerUrl,
338+
);
339+
const { networkClientId } =
340+
addedNetwork?.rpcEndpoints?.[addedNetwork.defaultRpcEndpointIndex] ??
341+
{};
342+
343+
NetworkController.setActiveNetwork(networkClientId);
344+
}
345+
onClose();
346+
236347
if (onNetworkSwitch) {
237-
onNetworkSwitch();
348+
handleNavigation(onNetworkSwitch, shouldNetworkSwitchPopToWallet);
238349
} else {
239350
shouldNetworkSwitchPopToWallet
240351
? navigation.navigate('WalletView')

app/components/UI/Ramp/Views/NetworkSwitcher/NetworkSwitcher.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ function render(Component: React.ComponentType, chainId?: `0x${string}`) {
9090
chainId: '0x89',
9191
id: 'networkId1',
9292
nickname: 'Polygon Mainnet',
93-
ticker: 'MATIC',
93+
ticker: 'POL',
9494
},
9595
),
9696
},

app/components/UI/Ramp/Views/NetworkSwitcher/NetworkSwitcher.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,16 +154,22 @@ function NetworkSwitcher() {
154154
const switchNetwork = useCallback(
155155
(networkConfiguration) => {
156156
const { CurrencyRateController, NetworkController } = Engine.context;
157-
const entry = Object.entries(networkConfigurations).find(
158-
([_a, { chainId }]) => chainId === networkConfiguration.chainId,
157+
const config = Object.values(networkConfigurations).find(
158+
({ chainId }) => chainId === networkConfiguration.chainId,
159159
);
160160

161-
if (entry) {
162-
const [networkConfigurationId] = entry;
163-
const { ticker } = networkConfiguration;
161+
if (config) {
162+
const {
163+
nativeCurrency: ticker,
164+
rpcEndpoints,
165+
defaultRpcEndpointIndex,
166+
} = config;
167+
168+
const { networkClientId } =
169+
rpcEndpoints?.[defaultRpcEndpointIndex] ?? {};
164170

165171
CurrencyRateController.updateExchangeRate(ticker);
166-
NetworkController.setActiveNetwork(networkConfigurationId);
172+
NetworkController.setActiveNetwork(networkClientId);
167173
navigateToGetStarted();
168174
}
169175
},

app/components/UI/ReceiveRequest/index.test.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
import { cloneDeep } from 'lodash';
2+
import { RpcEndpointType } from '@metamask/network-controller';
23
import ReceiveRequest from './';
34
import { renderScreen } from '../../../util/test/renderWithProvider';
45
import { backgroundState } from '../../../util/test/initial-root-state';
56
import { MOCK_ACCOUNTS_CONTROLLER_STATE } from '../../../util/test/accountsControllerTestUtils';
7+
import { mockNetworkState } from '../../../util/test/network';
68

79
const initialState = {
810
engine: {
911
backgroundState: {
1012
...backgroundState,
1113
NetworkController: {
12-
providerConfig: {
13-
type: 'mainnet',
14-
chainId: '0x1',
14+
...mockNetworkState({
15+
id: 'mainnet',
16+
nickname: 'Ethereum',
1517
ticker: 'ETH',
16-
},
18+
chainId: '0x1',
19+
type: RpcEndpointType.Infura,
20+
}),
1721
},
1822
AccountsController: MOCK_ACCOUNTS_CONTROLLER_STATE,
1923
},
@@ -47,20 +51,19 @@ describe('ReceiveRequest', () => {
4751
const { toJSON } = renderScreen(
4852
ReceiveRequest,
4953
{ name: 'ReceiveRequest' },
50-
// @ts-expect-error initialBackgroundState throws error
5154
{ state: initialState },
5255
);
5356
expect(toJSON()).toMatchSnapshot();
5457
});
5558

5659
it('render with different ticker matches snapshot', () => {
5760
const state = cloneDeep(initialState);
58-
state.engine.backgroundState.NetworkController.providerConfig.ticker =
59-
'DIFF';
61+
state.engine.backgroundState.NetworkController.networkConfigurationsByChainId[
62+
'0x1'
63+
].nativeCurrency = 'DIFF';
6064
const { toJSON } = renderScreen(
6165
ReceiveRequest,
6266
{ name: 'ReceiveRequest' },
63-
// @ts-expect-error initialBackgroundState throws error
6467
{ state },
6568
);
6669
expect(toJSON()).toMatchSnapshot();
@@ -74,7 +77,6 @@ describe('ReceiveRequest', () => {
7477
const { toJSON } = renderScreen(
7578
ReceiveRequest,
7679
{ name: 'ReceiveRequest' },
77-
// @ts-expect-error initialBackgroundState throws error
7880
{ state },
7981
);
8082
expect(toJSON()).toMatchSnapshot();

app/components/Views/AssetDetails/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import { useMetrics } from '../../../components/hooks/useMetrics';
4646
import { RootState } from 'app/reducers';
4747
import { Colors } from '../../../util/theme/models';
4848
import { Hex } from '@metamask/utils';
49+
import { RpcEndpointType } from '@metamask/network-controller';
4950

5051
const createStyles = (colors: Colors) =>
5152
StyleSheet.create({
@@ -138,8 +139,7 @@ const AssetDetails = (props: Props) => {
138139
* removes goerli from provider config types
139140
*/
140141
// eslint-disable-next-line @typescript-eslint/no-explicit-any
141-
(Networks as any)[providerConfig.type]?.name ||
142-
{ ...Networks.rpc, color: null }.name;
142+
(Networks as any)[providerConfig?.type ?? RpcEndpointType.Custom];
143143
}
144144
return name;
145145
};

0 commit comments

Comments
 (0)