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:
parent
6124a221e4
commit
523c04b47a
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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 }) => {
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -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',
|
||||||
|
Loading…
Reference in New Issue
Block a user