Sign plain text messages using Para’s secure signing infrastructure.

Prerequisites

You need Web3 libraries configured with Para authentication.

Setup Web3 Libraries

Sign Personal Messages

import { ethers } from "ethers";
import { ParaEthersSigner } from "@getpara/ethers-v6-integration@alpha";

async function signMessage(
  signer: ParaEthersSigner,
  message: string
) {
  try {
    const signature = await signer.signMessage(message);
    console.log("Signature:", signature);
    
    const address = await signer.getAddress();
    const recoveredAddress = ethers.verifyMessage(message, signature);
    console.log("Signer address:", address);
    console.log("Recovered address:", recoveredAddress);
    console.log("Signature valid:", address === recoveredAddress);
    
    return {
      signature,
      address,
      message,
      isValid: address.toLowerCase() === recoveredAddress.toLowerCase()
    };
  } catch (error) {
    console.error("Failed to sign message:", error);
    throw error;
  }
}

Sign Structured Messages

async function signStructuredMessage(
  signer: ParaEthersSigner,
  data: any
) {
  try {
    const message = JSON.stringify(data, null, 2);
    const messageHash = ethers.hashMessage(message);
    console.log("Message hash:", messageHash);
    
    const signature = await signer.signMessage(message);
    
    const signerAddress = await signer.getAddress();
    const recoveredAddress = ethers.recoverAddress(
      messageHash,
      signature
    );
    
    return {
      message,
      messageHash,
      signature,
      signerAddress,
      recoveredAddress,
      isValid: signerAddress.toLowerCase() === recoveredAddress.toLowerCase()
    };
  } catch (error) {
    console.error("Failed to sign structured message:", error);
    throw error;
  }
}

Next Steps