on master help sign in
Merge pull request #1083 from urbit/t/1082-confirm-metamask-chain-id
aded1fetomholford
src/lib/constants.ts+7
@@ -226,6 +226,11 @@ const INITIAL_NETWORK_KEY_REVISION = 1;
226
226
227const EIP1559_TRANSACTION_TYPE = 2;
227const EIP1559_TRANSACTION_TYPE = 2;
228
228
229+// Chain IDs
230+// https://chainlist.org/?testnets=true
231+const ETHEREUM_MAINNET_CHAIN_ID = '0x1';
232+const ETHEREUM_GOERLI_CHAIN_ID = '0x5';
233+
229export {
234export {
230 CHECK_BLOCK_EVERY_MS,
235 CHECK_BLOCK_EVERY_MS,
231 DEFAULT_GAS_PRICE_GWEI,
236 DEFAULT_GAS_PRICE_GWEI,
@@ -275,4 +280,6 @@ export {
275 PASSPORT_TOOLTIP,
280 PASSPORT_TOOLTIP,
276 LOCKUP_TOOLTIP,
281 LOCKUP_TOOLTIP,
277 INITIAL_NETWORK_KEY_REVISION,
282 INITIAL_NETWORK_KEY_REVISION,
283+ ETHEREUM_MAINNET_CHAIN_ID,
284+ ETHEREUM_GOERLI_CHAIN_ID
278};
285};
src/lib/network.js+8−1
@@ -1,3 +1,6 @@
1+import { isMainnet } from "./flags";
2+import { ETHEREUM_GOERLI_CHAIN_ID, ETHEREUM_MAINNET_CHAIN_ID, } from './constants';
3+
1const NETWORK_TYPES = {
4const NETWORK_TYPES = {
2 OFFLINE: Symbol('OFFLINE'),
5 OFFLINE: Symbol('OFFLINE'),
3 LOCAL: Symbol('LOCAL'),
6 LOCAL: Symbol('LOCAL'),
@@ -27,4 +30,8 @@ const chainIdToNetworkType = chainId => {
27 }
30 }
28};
31};
29
32
33+const expectedChainId = () => {
34+ return isMainnet ? ETHEREUM_MAINNET_CHAIN_ID : ETHEREUM_GOERLI_CHAIN_ID;
35+}
36+
30−export { NETWORK_TYPES, renderNetworkType, chainIdToNetworkType };
37+export { NETWORK_TYPES, expectedChainId, renderNetworkType, chainIdToNetworkType };
src/views/Login/LoginSelector.tsx+15
@@ -21,6 +21,7 @@ import { useNetwork } from 'store/network';
21import { WALLET_TYPES } from 'lib/constants';
21import { WALLET_TYPES } from 'lib/constants';
22import { useWalletConnect } from 'lib/useWalletConnect';
22import { useWalletConnect } from 'lib/useWalletConnect';
23import { MetamaskWallet } from 'lib/metamask';
23import { MetamaskWallet } from 'lib/metamask';
24+import { expectedChainId } from 'lib/network';
24import useLoginView from 'lib/useLoginView';
25import useLoginView from 'lib/useLoginView';
25import { getAuthToken } from 'lib/authToken';
26import { getAuthToken } from 'lib/authToken';
26
27
@@ -94,6 +95,20 @@ export default function LoginSelector({
94 'Device does not have an Ethereum provider available (is Metamask or Brave Wallet installed?)'
95 'Device does not have an Ethereum provider available (is Metamask or Brave Wallet installed?)'
95 );
96 );
96 }
97 }
98+
99+ /**
100+ * Ensure wallet is connected to expected chain
101+ */
102+ if (window.ethereum.chainId !== expectedChainId() ) {
103+ console.log(`unexpected chain: ${window.ethereum.chainId}`);
104+ await window.ethereum.request({
105+ method: 'wallet_switchEthereumChain',
106+ params: [{ chainId: expectedChainId() }],
107+ });
108+ window.location.reload();
109+ return;
110+ }
111+
97 setMetamask(true);
112 setMetamask(true);
98 setMetamaskSelected(true);
113 setMetamaskSelected(true);
99
114