diff --git a/js/connectMetaMask.js b/js/connectMetaMask.js
index 51b570a33..a87260b18 100644
--- a/js/connectMetaMask.js
+++ b/js/connectMetaMask.js
@@ -38,103 +38,56 @@ const supportedNetworks = {
},
};
-// If user clicks on "Connect Wallet", show the networks they can connect to
-const connectMetaMaskNav = document.querySelector('.connectMetaMask-nav');
-connectMetaMaskNav.addEventListener('click', async (e) => {
- e.preventDefault();
-
- // Is user already connected? If so, to which network and which account?
- // If not, throw an error
- if (provider) {
- networkModalContainer.style.display = 'block';
- // Get the connected network
- const { connectedMoonbeamNetwork, connectedMoonbeamNetworkButton } = await getConnectedNetwork();
- const accounts = await provider.request({ method: 'eth_accounts' });
-
- // If you have added Moonbeam to your wallet and have an account connected to Moonbeam, display it
- // Otherwise, don't display the account
- if (connectedMoonbeamNetwork && accounts.length > 0) {
- await displayConnectedAccount(connectedMoonbeamNetwork, connectedMoonbeamNetworkButton);
- }
- } else {
- const errorMessage = `It looks like you don't have any Ethereum-compatible wallets installed. Please install an Ethereum-compatible wallet, such as MetaMask, and try again.`;
- handleError(errorMessage);
- }
-
- // Add logic for connecting to any of the Moonbeam networks
- const moonbeamNetworkButtons = document.querySelectorAll(`.connect-network`);
- if (moonbeamNetworkButtons) {
- moonbeamNetworkButtons.forEach((button) => {
- e.preventDefault();
- // If user isn't already connected to a network, allow them to connect to it
- // and then hide the modal
- if (!button.classList.contains('disabled-button')) {
- button.addEventListener('click', (e) => {
- connectNetwork(e.target.attributes['data-value'].value);
- networkModalContainer.style.display = 'none';
- });
- }
- });
- }
-});
-
+/*
+ -connectNetwork - Add or switch to the specified network, then request accounts
+ -NOTE: This calls "eth_requestAccounts" at the end, which prompts for wallet connection
+ */
const connectNetwork = async (network) => {
try {
const targetNetwork = { ...supportedNetworks[network] };
- delete targetNetwork.name;
+ delete targetNetwork.name; // remove 'name' property if needed
await provider.request({
method: 'wallet_addEthereumChain',
params: [targetNetwork],
});
+ // This line requests user accounts, which triggers a "connect" prompt if not already connected:
await provider.request({ method: 'eth_requestAccounts' });
-
} catch (e) {
- /** Code 4001 is user rejected, we don't need to notify the user if they rejected the request */
+ // 4001: user rejected, -32002: request already pending
if (e.code !== 4001 && e.code !== -32002) {
handleError(e.message);
}
}
};
-// Get the network that the user is currently connected to
+// Original getConnectedNetwork
const getConnectedNetwork = async () => {
- // Get the chain ID of the connected account
- const chainId = await provider.request({
- method: 'eth_chainId',
- });
-
- // Check if the connected network is a Moonbeam network
+ const chainId = await provider.request({ method: 'eth_chainId' });
const connectedMoonbeamNetwork = Object.values(supportedNetworks).find(
(network) => network.chainId === chainId
);
-
- // If the connected network is a Moonbeam network, update the button text
- // to say "Connected" along with the address of the connected account
if (connectedMoonbeamNetwork) {
const connectedMoonbeamNetworkButton = document.querySelector(
`.connect-network[data-value="${connectedMoonbeamNetwork.name}"]`
);
-
return { connectedMoonbeamNetwork, connectedMoonbeamNetworkButton };
} else {
return { connectedMoonbeamNetwork: null, connectedMoonbeamNetworkButton: null };
}
};
-// Display the account that is connected and the Moonbeam network the account is connected to
+// Original displayConnectedAccount
const displayConnectedAccount = async (connectedNetwork, networkButton) => {
- // Get the connected accounts
const accounts = await provider.request({ method: 'eth_requestAccounts' });
+ if (!accounts || accounts.length === 0) return;
- const shortenedAccount = `${accounts[0].slice(0, 6)}...${accounts[0].slice(
- -4
- )}`;
+ const shortenedAccount = `${accounts[0].slice(0, 6)}...${accounts[0].slice(-4)}`;
networkButton.innerHTML = `Connected to ${connectedNetwork.chainName}: ${shortenedAccount}`;
- networkButton.className +=
- ' disabled-button';
+ networkButton.className += ' disabled-button';
};
+// Original handleError
const handleError = (message) => {
const errorModalContainer = document.querySelector('.error-modal-container');
const errorMessage = document.querySelector('.error-message');
@@ -142,15 +95,77 @@ const handleError = (message) => {
errorMessage.innerHTML = message;
};
+/*
+ -NAV BUTTON: Already working code (DON'T touch it THIS IS FINE)
+ -Shows modal and sets up .connect-network links inside the modal
+*/
+
+const connectMetaMaskNav = document.querySelector('.connectMetaMask-nav');
+connectMetaMaskNav.addEventListener('click', async (e) => {
+ e.preventDefault();
+
+ if (provider) {
+ networkModalContainer.style.display = 'block';
+ const { connectedMoonbeamNetwork, connectedMoonbeamNetworkButton } = await getConnectedNetwork();
+ const accounts = await provider.request({ method: 'eth_accounts' });
+
+ if (connectedMoonbeamNetwork && accounts.length > 0) {
+ await displayConnectedAccount(connectedMoonbeamNetwork, connectedMoonbeamNetworkButton);
+ }
+ } else {
+ const errorMessage = `It looks like you don't have any Ethereum-compatible wallets installed. Please install an Ethereum-compatible wallet, such as MetaMask, and try again.`;
+ handleError(errorMessage);
+ }
+
+ // Attach click handlers to .connect-network buttons in the modal
+ const moonbeamNetworkButtons = document.querySelectorAll('.connect-network');
+ if (moonbeamNetworkButtons) {
+ moonbeamNetworkButtons.forEach((button) => {
+
+ if (!button.classList.contains('disabled-button')) {
+ button.addEventListener('click', (ev) => {
+ ev.preventDefault();
+ connectNetwork(ev.target.getAttribute('data-value'));
+ networkModalContainer.style.display = 'none';
+ });
+ }
+ });
+ }
+});
+
+/*
+ - BODY BUTTON: NEW code
+ - Directly connect to the network specified in 'value'
+ */
+const connectMetaMaskBodyButtons = document.querySelectorAll('.connectMetaMask');
+connectMetaMaskBodyButtons.forEach((btn) => {
+ btn.addEventListener('click', async (e) => {
+ e.preventDefault();
+
+ if (!provider) {
+ handleError(`No Ethereum-compatible wallet found. Please install MetaMask.`);
+ return;
+ }
+
+
+ const network = btn.getAttribute('value');
+ if (!network || !supportedNetworks[network]) {
+ handleError(`The network "${network}" is not supported or not defined.`);
+ return;
+ }
+
+
+ await connectNetwork(network);
+ });
+});
+
+
if (provider) {
- /** Reload the page if the chain changes */
provider.on('chainChanged', () => {
window.location.reload();
});
- /** When the account changes update the button text */
provider.on('accountsChanged', async (accounts) => {
if (accounts.length > 0) {
- // Get the connected network
const { connectedMoonbeamNetwork, connectedMoonbeamNetworkButton } = await getConnectedNetwork();
if (connectedMoonbeamNetwork) {
await displayConnectedAccount(connectedMoonbeamNetwork, connectedMoonbeamNetworkButton);