diff --git a/app/images/MegaETH-logo-testnet.svg b/app/images/MegaETH-logo-testnet.svg new file mode 100644 index 000000000000..430f2e1365bd --- /dev/null +++ b/app/images/MegaETH-logo-testnet.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 585a20e0619d..aee5002576e1 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -177,6 +177,9 @@ import { NETWORK_TYPES, NetworkStatus, MAINNET_DISPLAY_NAME, + MEGAETH_TESTNET_DISPLAY_NAME, + TEST_NETWORK_TICKER_MAP, + MEGAETH_TESTNET_IMAGE_URL, } from '../../shared/constants/network'; import { getAllowedSmartTransactionsChainIds } from '../../shared/constants/smartTransactions'; @@ -575,10 +578,28 @@ export default class MetamaskController extends EventEmitter { networks[CHAIN_IDS.MAINNET].name = MAINNET_DISPLAY_NAME; delete networks[CHAIN_IDS.GOERLI]; delete networks[CHAIN_IDS.LINEA_GOERLI]; + // Add MegaETH Testnet as a default network + networks[CHAIN_IDS.MEGAETH_TESTNET] = { + chainId: CHAIN_IDS.MEGAETH_TESTNET, + name: MEGAETH_TESTNET_DISPLAY_NAME, + nativeCurrency: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.MEGAETH_TESTNET], + blockExplorerUrls: ['https://www.megaexplorer.xyz'], + defaultRpcEndpointIndex: 0, + rpcEndpoints: [ + { + networkClientId: 'megaeth-testnet', + url: 'https://carrot.megaeth.com/rpc', + type: 'custom', + }, + ], + imageUrl: MEGAETH_TESTNET_IMAGE_URL, + }; Object.values(networks).forEach((network) => { const id = network.rpcEndpoints[0].networkClientId; - network.blockExplorerUrls = [BlockExplorerUrl[id]]; + if (id !== 'megaeth-testnet') { // Skip for our custom network + network.blockExplorerUrls = [BlockExplorerUrl[id]]; + } network.defaultBlockExplorerUrlIndex = 0; }); diff --git a/shared/constants/network.ts b/shared/constants/network.ts index 8f017f612407..6fcea0d62e3c 100644 --- a/shared/constants/network.ts +++ b/shared/constants/network.ts @@ -87,6 +87,7 @@ export const NETWORK_TYPES = { LINEA_GOERLI: 'linea-goerli', LINEA_SEPOLIA: 'linea-sepolia', LINEA_MAINNET: 'linea-mainnet', + MEGAETH_TESTNET: 'megaeth-testnet', } as const; export type NetworkTypes = (typeof NETWORK_TYPES)[keyof typeof NETWORK_TYPES]; @@ -178,6 +179,7 @@ export const CHAIN_IDS = { INK: '0xdef1', MODE_SEPOLIA: '0x397', MODE: '0x868b', + MEGAETH_TESTNET: '0x18c6', } as const; export const CHAINLIST_CHAIN_IDS_MAP = { @@ -295,6 +297,7 @@ export const SCROLL_SEPOLIA_DISPLAY_NAME = 'Scroll Sepolia'; export const OP_BNB_DISPLAY_NAME = 'opBNB'; export const BERACHAIN_DISPLAY_NAME = 'Berachain Artio'; export const METACHAIN_ONE_DISPLAY_NAME = 'Metachain One Mainnet'; +export const MEGAETH_TESTNET_DISPLAY_NAME = 'MegaETH Testnet'; export const LISK_DISPLAY_NAME = 'Lisk'; export const LISK_SEPOLIA_DISPLAY_NAME = 'Lisk Sepolia'; export const INK_SEPOLIA_DISPLAY_NAME = 'Ink Sepolia'; @@ -328,6 +331,7 @@ export const LINEA_MAINNET_RPC_URL = getRpcUrl({ network: NETWORK_TYPES.LINEA_MAINNET, }); export const LOCALHOST_RPC_URL = 'http://localhost:8545'; +export const MEGAETH_TESTNET_RPC_URL = 'https://carrot.megaeth.com/rpc'; /** * An object containing the token symbols for various tokens that are either @@ -523,6 +527,7 @@ export const SONEIUM_IMAGE_URL = './images/soneium.svg'; export const MODE_SEPOLIA_IMAGE_URL = './images/mode-sepolia.svg'; export const MODE_IMAGE_URL = './images/mode.svg'; export const UNICHAIN_IMAGE_URL = './images/unichain.svg'; +export const MEGAETH_TESTNET_IMAGE_URL = './images/MegaETH-logo-testnet.svg'; export const INFURA_PROVIDER_TYPES = [ NETWORK_TYPES.MAINNET, @@ -535,6 +540,7 @@ export const TEST_CHAINS: Hex[] = [ CHAIN_IDS.SEPOLIA, CHAIN_IDS.LINEA_SEPOLIA, CHAIN_IDS.LOCALHOST, + CHAIN_IDS.MEGAETH_TESTNET, ]; export const MAINNET_CHAINS = [ @@ -559,6 +565,7 @@ export const TEST_NETWORK_TICKER_MAP: { }`, [NETWORK_TYPES.LINEA_GOERLI]: `Linea${CURRENCY_SYMBOLS.ETH}`, [NETWORK_TYPES.LINEA_SEPOLIA]: `Linea${CURRENCY_SYMBOLS.ETH}`, + [NETWORK_TYPES.MEGAETH_TESTNET]: CURRENCY_SYMBOLS.ETH, }; /** @@ -588,6 +595,11 @@ export const BUILT_IN_NETWORKS = { [NETWORK_TYPES.LOCALHOST]: { chainId: CHAIN_IDS.LOCALHOST, }, + [NETWORK_TYPES.MEGAETH_TESTNET]: { + chainId: CHAIN_IDS.MEGAETH_TESTNET, + ticker: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.MEGAETH_TESTNET], + blockExplorerUrl: 'https://www.megaexplorer.xyz', + }, } as const; export const BUILT_IN_INFURA_NETWORKS = pick( @@ -613,6 +625,7 @@ export const NETWORK_TO_NAME_MAP = { [NETWORK_TYPES.LINEA_MAINNET]: LINEA_MAINNET_DISPLAY_NAME, [NETWORK_TYPES.LOCALHOST]: LOCALHOST_DISPLAY_NAME, [NETWORK_TYPES.SEPOLIA]: SEPOLIA_DISPLAY_NAME, + [NETWORK_TYPES.MEGAETH_TESTNET]: MEGAETH_TESTNET_DISPLAY_NAME, [CHAIN_IDS.ARBITRUM]: ARBITRUM_DISPLAY_NAME, [CHAIN_IDS.AVALANCHE]: AVALANCHE_DISPLAY_NAME, @@ -635,6 +648,7 @@ export const NETWORK_TO_NAME_MAP = { [CHAIN_IDS.METACHAIN_ONE]: METACHAIN_ONE_DISPLAY_NAME, [CHAIN_IDS.LISK]: LISK_DISPLAY_NAME, [CHAIN_IDS.LISK_SEPOLIA]: LISK_SEPOLIA_DISPLAY_NAME, + [CHAIN_IDS.MEGAETH_TESTNET]: MEGAETH_TESTNET_DISPLAY_NAME, } as const; export const CHAIN_ID_TO_CURRENCY_SYMBOL_MAP = { @@ -787,6 +801,7 @@ export const CHAIN_ID_TO_TYPE_MAP = { [CHAIN_IDS.LINEA_SEPOLIA]: NETWORK_TYPES.LINEA_SEPOLIA, [CHAIN_IDS.LINEA_MAINNET]: NETWORK_TYPES.LINEA_MAINNET, [CHAIN_IDS.LOCALHOST]: NETWORK_TYPES.LOCALHOST, + [CHAIN_IDS.MEGAETH_TESTNET]: NETWORK_TYPES.MEGAETH_TESTNET, } as const; export const CHAIN_ID_TO_RPC_URL_MAP = { @@ -797,6 +812,7 @@ export const CHAIN_ID_TO_RPC_URL_MAP = { [CHAIN_IDS.MAINNET]: MAINNET_RPC_URL, [CHAIN_IDS.LINEA_MAINNET]: LINEA_MAINNET_RPC_URL, [CHAIN_IDS.LOCALHOST]: LOCALHOST_RPC_URL, + [CHAIN_IDS.MEGAETH_TESTNET]: MEGAETH_TESTNET_RPC_URL, } as const; export const CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP: Record = { @@ -815,6 +831,7 @@ export const CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP: Record = { [CHAIN_IDS.CELO]: CELO_TOKEN_IMAGE_URL, [CHAIN_IDS.GNOSIS]: GNOSIS_TOKEN_IMAGE_URL, [CHAIN_IDS.ZKSYNC_ERA]: ZK_SYNC_ERA_TOKEN_IMAGE_URL, + [CHAIN_IDS.MEGAETH_TESTNET]: MEGAETH_TESTNET_IMAGE_URL, [CHAIN_IDS.NEAR]: NEAR_IMAGE_URL, [CHAIN_IDS.NEAR_TESTNET]: NEAR_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.ACALA_NETWORK]: ACALA_TOKEN_IMAGE_URL, @@ -898,6 +915,7 @@ export const CHAIN_ID_TO_ETHERS_NETWORK_NAME_MAP = { [CHAIN_IDS.LINEA_SEPOLIA]: NETWORK_TYPES.LINEA_SEPOLIA, [CHAIN_IDS.MAINNET]: NETWORK_NAMES.HOMESTEAD, [CHAIN_IDS.LINEA_MAINNET]: NETWORK_TYPES.LINEA_MAINNET, + [CHAIN_IDS.MEGAETH_TESTNET]: NETWORK_TYPES.MEGAETH_TESTNET, } as const; export const CHAIN_ID_TOKEN_IMAGE_MAP = { @@ -922,6 +940,7 @@ export const CHAIN_ID_TOKEN_IMAGE_MAP = { [CHAIN_IDS.NEAR_TESTNET]: NEAR_IMAGE_URL, [CHAIN_IDS.MOONRIVER]: MOONRIVER_TOKEN_IMAGE_URL, [CHAIN_IDS.MOONBEAM]: MOONBEAM_TOKEN_IMAGE_URL, + [CHAIN_IDS.MEGAETH_TESTNET]: MEGAETH_TESTNET_IMAGE_URL, [CHAINLIST_CHAIN_IDS_MAP.IOTEX_MAINNET]: IOTEX_TOKEN_IMAGE_URL, [CHAIN_IDS.B3]: B3_IMAGE_URL, [CHAIN_IDS.B3_TESTNET]: B3_IMAGE_URL, @@ -1254,6 +1273,7 @@ export const TEST_NETWORKS = [ SEPOLIA_DISPLAY_NAME, LINEA_GOERLI_DISPLAY_NAME, LINEA_SEPOLIA_DISPLAY_NAME, + MEGAETH_TESTNET_DISPLAY_NAME, ]; export const TEST_NETWORK_IDS = [ @@ -1262,4 +1282,5 @@ export const TEST_NETWORK_IDS = [ CHAIN_IDS.LINEA_GOERLI, CHAIN_IDS.LINEA_SEPOLIA, CHAIN_IDS.ARBITRUM_SEPOLIA, + CHAIN_IDS.MEGAETH_TESTNET, ];