walletconnect-monorepo: Does not receive any callback after signing message.

Im trying to sign simple message using ethers, wallet connect and metamask app on android.

      const provider = new WalletConnectProvider({
        infuraId: '--', // replace infuraId
      });
      await provider.enable();
      const web3 = new providers.Web3Provider(provider);
      const signer = web3.getSigner();
      const signature = await signer.signMessage('Hello World');
      console.log('ok')
      console.log(signature);

It did prompt on my phone to sign but I didnt receive any callback from it. This method works well for other providers such as fortmatic and metamask.

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Reactions: 16
  • Comments: 25

Most upvoted comments

Here’s another workaround (if you’re using web3Modal)

// configure web3Modal 
const web3 = await web3Modal.connect();
const provider = new providers.Web3Provider(web3);
const signer = provider.getSigner()
const address = await signer.getAddress();

let signedMessage;
if (web3.wc) {
    signedMessage = await provider.send(
        'personal_sign',
        [ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(rawMessage)), address.toLowerCase() ]
    );
}
else { 
    signedMessage = await signer.signMessage(rawMessage)
}

Can confirm this low-level way works.

if (connector instanceof WalletConnectConnector) {
  const messageLength = new Blob([rawMessage]).size
  const message = toUtf8Bytes(
    "\x19Ethereum Signed Message:\n" + messageLength + rawMessage
  )
  const hashedMessage = keccak256(message)
  connector.walletConnectProvider.connector.signMessage([account.toLowerCase(), hashedMessage])
    .then(response => {
      console.log(response)
    })
    .catch(error => {
      console.log(error)
    })
} else {
  // original way

@ming436534

    if (connector instanceof WalletConnectConnector) {
      const message = hexlify(toUtf8Bytes(messageToSign))

      connector.walletConnectProvider.connector
        .signPersonalMessage([message, account.toLowerCase()])
        .then(response => {
         ...
        })
        .catch(error => {
          ...
        })
    } else {

Here’s another workaround (if you’re using web3Modal)

// configure web3Modal 
const web3 = await web3Modal.connect();
const provider = new providers.Web3Provider(web3);
const signer = provider.getSigner()
const address = await signer.getAddress();

let signedMessage;
if (web3.wc) {
    signedMessage = await provider.send(
        'personal_sign',
        [ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(rawMessage)), address.toLowerCase() ]
    );
}
else { 
    signedMessage = await signer.signMessage(rawMessage)
}

Thank you so much @wslyvh , adapted this version for web3-react and the result is one function which works with MetaMask, WalletConnect and Coinbase Wallet (haven’t tested more).

Here is the web3-react version:

const { account, library } = useWeb3React();
let signedMessage;
try {
      signedMessage = await library.send(
        'personal_sign', 
        [ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(rawMessage)), account?.toLowerCase() ]);
} catch (error) {
      window.alert(`Failure!${error && error.message ? `\n\n${error.message}` : ''}`);
    }

@iserifith why did you close this issue? I think error still persist.

@malaDev In our project we fixed it using those patches and apply them using patch-package.

I had the same problem. The problem is described in this issue https://github.com/WalletConnect/walletconnect-utils/issues/3. I patched it using patch-package. @pedrouid Could you take a look on that?

I have the same issue while signing personal message. Not returning control to promise. Observed this more in IOS, android app has lesser compared to IOS.

import { useWalletConnect } from '@walletconnect/react-native-dapp';

  const connector = useWalletConnect();
  if(connector.connected){
       connector
      .signPersonalMessage([textMessage, connector.accounts[0]])
      .then(async data => {
        console.log('Success ---', data);
      })
      .catch(err => {
        console.log('Error ---', err);
      });
}

I have used MetaMask and trust wallet. MetaMask has connection issue . Its showing return to the browser toast on MetaMask app but the connector.connected is always false.

@Gaspachow thanks a lot – that worked for me! 😃

@StillFantastic It works! Thank you very much!