1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-10-22 19:26:13 +02:00

Fix built-in networks switch-ethereum-chain, Including RPC url in switchEthereumChain requestData (#11268)

* Moving RPC Urls to network constants

* Including RPC url in switchEthereumChain requestData

* Setting project id to var

* Fix built-in networks switch-ethereum-chain

`switch-ethereum-chain` did not work correctly with built-in networks.
It was treating them as custom networks, rather than as built-in
networks. This affected how they were displayed in the network
dropdown, and resulted in slight differences to the network stack used
as well.

The problem was that `updateRpcTarget` was used, which was meant for
custom networks only. Now that `setProviderType` is used in the case of
a built-in network, the behaviour should match the network switcher
exactly.

Co-authored-by: Mark Stacey <markjstacey@gmail.com>
This commit is contained in:
ryanml 2021-06-09 15:18:38 -07:00
parent 6124a221e4
commit 523c04b47a
5 changed files with 59 additions and 34 deletions

View File

@ -5,6 +5,7 @@ import {
ETH_SYMBOL, ETH_SYMBOL,
CHAIN_ID_TO_TYPE_MAP, CHAIN_ID_TO_TYPE_MAP,
NETWORK_TO_NAME_MAP, NETWORK_TO_NAME_MAP,
CHAIN_ID_TO_RPC_URL_MAP,
} from '../../../../../shared/constants/network'; } from '../../../../../shared/constants/network';
import { import {
isPrefixedFormattedHexString, isPrefixedFormattedHexString,
@ -21,8 +22,10 @@ function findExistingNetwork(chainId, findCustomRpcBy) {
if (chainId in CHAIN_ID_TO_TYPE_MAP) { if (chainId in CHAIN_ID_TO_TYPE_MAP) {
return { return {
chainId, chainId,
nickname: NETWORK_TO_NAME_MAP[chainId],
ticker: ETH_SYMBOL, ticker: ETH_SYMBOL,
nickname: NETWORK_TO_NAME_MAP[chainId],
rpcUrl: CHAIN_ID_TO_RPC_URL_MAP[chainId],
type: CHAIN_ID_TO_TYPE_MAP[chainId],
}; };
} }
@ -34,7 +37,13 @@ async function switchEthereumChainHandler(
res, res,
_next, _next,
end, end,
{ getCurrentChainId, findCustomRpcBy, updateRpcTarget, requestUserApproval }, {
getCurrentChainId,
findCustomRpcBy,
setProviderType,
updateRpcTarget,
requestUserApproval,
},
) { ) {
if (!req.params?.[0] || typeof req.params[0] !== 'object') { if (!req.params?.[0] || typeof req.params[0] !== 'object') {
return end( return end(
@ -78,26 +87,24 @@ async function switchEthereumChainHandler(
); );
} }
const existingNetwork = findExistingNetwork(_chainId, findCustomRpcBy); const requestData = findExistingNetwork(_chainId, findCustomRpcBy);
if (requestData) {
if (existingNetwork) {
const currentChainId = getCurrentChainId(); const currentChainId = getCurrentChainId();
if (currentChainId === _chainId) { if (currentChainId === _chainId) {
res.result = null; res.result = null;
return end(); return end();
} }
try { try {
await updateRpcTarget( const approvedRequestData = await requestUserApproval({
await requestUserApproval({ origin,
origin, type: MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN,
type: MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN, requestData,
requestData: { });
chainId: existingNetwork.chainId, if (chainId in CHAIN_ID_TO_TYPE_MAP) {
nickname: existingNetwork.nickname, setProviderType(approvedRequestData.type);
ticker: existingNetwork.ticker, } else {
}, await updateRpcTarget(approvedRequestData);
}), }
);
res.result = null; res.result = null;
} catch (error) { } catch (error) {
return end(error); return end(error);

View File

@ -2192,6 +2192,9 @@ export default class MetamaskController extends EventEmitter {
nickname, nickname,
); );
}, },
setProviderType: this.networkController.setProviderType.bind(
this.networkController,
),
addCustomRpc: async ({ addCustomRpc: async ({
chainId, chainId,
blockExplorerUrl, blockExplorerUrl,

View File

@ -32,6 +32,16 @@ export const KOVAN_DISPLAY_NAME = 'Kovan';
export const MAINNET_DISPLAY_NAME = 'Ethereum Mainnet'; export const MAINNET_DISPLAY_NAME = 'Ethereum Mainnet';
export const GOERLI_DISPLAY_NAME = 'Goerli'; export const GOERLI_DISPLAY_NAME = 'Goerli';
const infuraProjectId = process.env.INFURA_PROJECT_ID;
const getRpcUrl = (network) =>
`https://${network}.infura.io/v3/${infuraProjectId}`;
export const ROPSTEN_RPC_URL = getRpcUrl('ropsten');
export const RINKEBY_RPC_URL = getRpcUrl('rinkeby');
export const KOVAN_RPC_URL = getRpcUrl('kovan');
export const MAINNET_RPC_URL = getRpcUrl('mainnet');
export const GOERLI_RPC_URL = getRpcUrl('goerli');
export const ETH_SYMBOL = 'ETH'; export const ETH_SYMBOL = 'ETH';
export const WETH_SYMBOL = 'WETH'; export const WETH_SYMBOL = 'WETH';
export const TEST_ETH_SYMBOL = 'TESTETH'; export const TEST_ETH_SYMBOL = 'TESTETH';
@ -50,6 +60,9 @@ export const TEST_CHAINS = [
KOVAN_CHAIN_ID, KOVAN_CHAIN_ID,
]; ];
/**
* Map of all build-in Infura networks to their network and chain IDs.
*/
export const NETWORK_TYPE_TO_ID_MAP = { export const NETWORK_TYPE_TO_ID_MAP = {
[ROPSTEN]: { networkId: ROPSTEN_NETWORK_ID, chainId: ROPSTEN_CHAIN_ID }, [ROPSTEN]: { networkId: ROPSTEN_NETWORK_ID, chainId: ROPSTEN_CHAIN_ID },
[RINKEBY]: { networkId: RINKEBY_NETWORK_ID, chainId: RINKEBY_CHAIN_ID }, [RINKEBY]: { networkId: RINKEBY_NETWORK_ID, chainId: RINKEBY_CHAIN_ID },
@ -85,6 +98,14 @@ export const CHAIN_ID_TO_TYPE_MAP = Object.entries(
return chainIdToTypeMap; return chainIdToTypeMap;
}, {}); }, {});
export const CHAIN_ID_TO_RPC_URL_MAP = {
[ROPSTEN_CHAIN_ID]: ROPSTEN_RPC_URL,
[RINKEBY_CHAIN_ID]: RINKEBY_RPC_URL,
[KOVAN_CHAIN_ID]: KOVAN_RPC_URL,
[GOERLI_CHAIN_ID]: GOERLI_RPC_URL,
[MAINNET_CHAIN_ID]: MAINNET_RPC_URL,
};
export const CHAIN_ID_TO_NETWORK_ID_MAP = Object.values( export const CHAIN_ID_TO_NETWORK_ID_MAP = Object.values(
NETWORK_TYPE_TO_ID_MAP, NETWORK_TYPE_TO_ID_MAP,
).reduce((chainIdToNetworkIdMap, { chainId, networkId }) => { ).reduce((chainIdToNetworkIdMap, { chainId, networkId }) => {

View File

@ -1,8 +1,5 @@
import { ethErrors } from 'eth-rpc-errors'; import { ethErrors } from 'eth-rpc-errors';
import { import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network';
CHAIN_ID_TO_TYPE_MAP,
NETWORK_TYPE_RPC,
} from '../../../../shared/constants/network';
import { import {
JUSTIFY_CONTENT, JUSTIFY_CONTENT,
SEVERITIES, SEVERITIES,
@ -27,14 +24,6 @@ async function getAlerts() {
return [PENDING_TX_DROP_NOTICE]; return [PENDING_TX_DROP_NOTICE];
} }
function getNetworkType(chainId) {
if (chainId in CHAIN_ID_TO_TYPE_MAP) {
return CHAIN_ID_TO_TYPE_MAP[chainId];
}
return NETWORK_TYPE_RPC;
}
function getValues(pendingApproval, t, actions) { function getValues(pendingApproval, t, actions) {
return { return {
content: [ content: [
@ -76,7 +65,7 @@ function getValues(pendingApproval, t, actions) {
colored: false, colored: false,
outline: true, outline: true,
targetNetwork: { targetNetwork: {
type: getNetworkType(pendingApproval.requestData.chainId), type: pendingApproval.requestData.type || NETWORK_TYPE_RPC,
nickname: pendingApproval.requestData.nickname, nickname: pendingApproval.requestData.nickname,
}, },
}, },

View File

@ -1,14 +1,19 @@
import { import {
GOERLI, GOERLI,
GOERLI_CHAIN_ID, GOERLI_CHAIN_ID,
GOERLI_RPC_URL,
KOVAN, KOVAN,
KOVAN_CHAIN_ID, KOVAN_CHAIN_ID,
KOVAN_RPC_URL,
MAINNET, MAINNET,
MAINNET_CHAIN_ID, MAINNET_CHAIN_ID,
MAINNET_RPC_URL,
RINKEBY, RINKEBY,
RINKEBY_CHAIN_ID, RINKEBY_CHAIN_ID,
RINKEBY_RPC_URL,
ROPSTEN, ROPSTEN,
ROPSTEN_CHAIN_ID, ROPSTEN_CHAIN_ID,
ROPSTEN_RPC_URL,
} from '../../../../shared/constants/network'; } from '../../../../shared/constants/network';
const defaultNetworksData = [ const defaultNetworksData = [
@ -16,7 +21,7 @@ const defaultNetworksData = [
labelKey: MAINNET, labelKey: MAINNET,
iconColor: '#29B6AF', iconColor: '#29B6AF',
providerType: MAINNET, providerType: MAINNET,
rpcUrl: `https://mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, rpcUrl: MAINNET_RPC_URL,
chainId: MAINNET_CHAIN_ID, chainId: MAINNET_CHAIN_ID,
ticker: 'ETH', ticker: 'ETH',
blockExplorerUrl: 'https://etherscan.io', blockExplorerUrl: 'https://etherscan.io',
@ -25,7 +30,7 @@ const defaultNetworksData = [
labelKey: ROPSTEN, labelKey: ROPSTEN,
iconColor: '#FF4A8D', iconColor: '#FF4A8D',
providerType: ROPSTEN, providerType: ROPSTEN,
rpcUrl: `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, rpcUrl: ROPSTEN_RPC_URL,
chainId: ROPSTEN_CHAIN_ID, chainId: ROPSTEN_CHAIN_ID,
ticker: 'ETH', ticker: 'ETH',
blockExplorerUrl: 'https://ropsten.etherscan.io', blockExplorerUrl: 'https://ropsten.etherscan.io',
@ -34,7 +39,7 @@ const defaultNetworksData = [
labelKey: RINKEBY, labelKey: RINKEBY,
iconColor: '#F6C343', iconColor: '#F6C343',
providerType: RINKEBY, providerType: RINKEBY,
rpcUrl: `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, rpcUrl: RINKEBY_RPC_URL,
chainId: RINKEBY_CHAIN_ID, chainId: RINKEBY_CHAIN_ID,
ticker: 'ETH', ticker: 'ETH',
blockExplorerUrl: 'https://rinkeby.etherscan.io', blockExplorerUrl: 'https://rinkeby.etherscan.io',
@ -43,7 +48,7 @@ const defaultNetworksData = [
labelKey: GOERLI, labelKey: GOERLI,
iconColor: '#3099f2', iconColor: '#3099f2',
providerType: GOERLI, providerType: GOERLI,
rpcUrl: `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, rpcUrl: GOERLI_RPC_URL,
chainId: GOERLI_CHAIN_ID, chainId: GOERLI_CHAIN_ID,
ticker: 'ETH', ticker: 'ETH',
blockExplorerUrl: 'https://goerli.etherscan.io', blockExplorerUrl: 'https://goerli.etherscan.io',
@ -52,7 +57,7 @@ const defaultNetworksData = [
labelKey: KOVAN, labelKey: KOVAN,
iconColor: '#9064FF', iconColor: '#9064FF',
providerType: KOVAN, providerType: KOVAN,
rpcUrl: `https://kovan.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, rpcUrl: KOVAN_RPC_URL,
chainId: KOVAN_CHAIN_ID, chainId: KOVAN_CHAIN_ID,
ticker: 'ETH', ticker: 'ETH',
blockExplorerUrl: 'https://kovan.etherscan.io', blockExplorerUrl: 'https://kovan.etherscan.io',