Skip to main content
Sign plain text messages using Para’s secure signing infrastructure.

Prerequisites

You need Web3 libraries configured with Para authentication.

Sign Personal Messages

import { useParaEthersSigner, useParaEthersSignMessage } from "@getpara/react-sdk";
import { JsonRpcProvider } from "ethers";

const provider = new JsonRpcProvider("https://ethereum-sepolia-rpc.publicnode.com");

function SignMessage() {
  const { ethersSigner } = useParaEthersSigner({ provider });

  const {
    signMessageAsync,
    isPending,
    data: signature,
  } = useParaEthersSignMessage(ethersSigner);

  return (
    <div>
      <button
        disabled={isPending}
        onClick={() => signMessage("Hello from Para!")}
      >
        {isPending ? "Signing..." : "Sign Message"}
      </button>
      {signature && <p>Signature: {signature.slice(0, 20)}...</p>}
    </div>
  );
}

Sign Structured Messages

import { useParaEthersSigner, useParaEthersSignMessage } from "@getpara/react-sdk";
import { JsonRpcProvider } from "ethers";

const provider = new JsonRpcProvider("https://ethereum-sepolia-rpc.publicnode.com");

function SignStructuredMessage() {
  const { ethersSigner } = useParaEthersSigner({ provider });

  const {
    signMessageAsync,
    isPending,
    data: signature,
  } = useParaEthersSignMessage(ethersSigner);

  const handleSign = () => {
    const data = {
      action: "authenticate",
      timestamp: Date.now(),
      nonce: Math.random().toString(36).substring(7),
    };
    signMessage(JSON.stringify(data, null, 2));
  };

  return (
    <div>
      <button onClick={handleSign} disabled={isPending}>
        {isPending ? "Signing..." : "Sign Structured Data"}
      </button>
      {signature && <p>Signature: {signature.slice(0, 30)}...</p>}
    </div>
  );
}

Next Steps