Skip to main content

Before the Start

You can start this tutorial if you already have a NextJS dapp with MetaMask functionality.

Configuring the WalletConnect Connector

  1. Open thepages/signin.jsx file and add WalletConnectConnector as a connector to connectAsync(). You should have your Project ID for the WalletConnect configuration and replace xxx with it in the code below.
import { WalletConnectConnector } from "wagmi/connectors/walletConnect";
import { signIn } from "next-auth/react";
import { useAccount, useConnect, useSignMessage, useDisconnect } from "wagmi";
import { useRouter } from "next/router";
import { useAuthRequestChallengeEvm } from "@moralisweb3/next";

function SignIn() {
  const { connectAsync } = useConnect({
    connector: new WalletConnectConnector({
      options: { projectId: "xxx", showQrModal: true },
    }),
  });
  const { disconnectAsync } = useDisconnect();
  const { isConnected } = useAccount();
  const { signMessageAsync } = useSignMessage();
  const { requestChallengeAsync } = useAuthRequestChallengeEvm();
  const { push } = useRouter();

  const handleAuth = async () => {
    if (isConnected) {
      await disconnectAsync();
    }

    const { account, chain } = await connectAsync();

    const { message } = await requestChallengeAsync({
      address: account,
      chainId: chain.id,
    });

    const signature = await signMessageAsync({ message });

    // redirect user after success authentication to '/user' page
    const { url } = await signIn("moralis-auth", {
      message,
      signature,
      redirect: false,
      callbackUrl: "/user",
    });
    /**
     * instead of using signIn(..., redirect: "/user")
     * we get the url from callback and push it to the router to avoid page refreshing
     */
    push(url);
  };

  return (
    <div>
      <h3>Web3 Authentication</h3>
      <button onClick={handleAuth}>Authenticate via WalletConnect</button>
    </div>
  );
}

export default SignIn;

Testing the WalletConnect Connector

Visit http://localhost:3000/signin to test authentication.
  1. Click on Authenticate via WalletConnect
  2. Scan the QR code with your wallet
  3. Connect your wallet
  4. Sign the message:
  5. Visit http://localhost:3000/user to test the user session’s functionality: