Prerequisites
You need Web3 libraries configured with Para authentication.Setup Web3 Libraries
Sign Personal Messages
- Ethers.js
- Viem
- Wagmi
Copy
Ask AI
import { ethers } from "ethers";
import { ParaEthersSigner } from "@getpara/ethers-v6-integration";
async function signMessage(signer: ParaEthersSigner, message: string) {
const signature = await signer.signMessage(message);
const address = await signer.getAddress();
const recoveredAddress = ethers.verifyMessage(message, signature);
return {
signature,
address,
isValid: address.toLowerCase() === recoveredAddress.toLowerCase()
};
}
Copy
Ask AI
import { verifyMessage } from "viem";
async function signMessage(
walletClient: any,
address: `0x${string}`,
message: string
) {
const signature = await walletClient.signMessage({ message });
const isValid = await verifyMessage({ address, message, signature });
return { signature, address, isValid };
}
Copy
Ask AI
import { useSignMessage } from "wagmi";
import { verifyMessage } from "viem";
function SignMessage() {
const { data: signature, isPending, signMessage } = useSignMessage();
return (
<div>
<button
onClick={() => signMessage({ message: "Hello from Para!" })}
disabled={isPending}
>
{isPending ? "Signing..." : "Sign Message"}
</button>
{signature && <p>Signature: {signature.slice(0, 20)}...</p>}
</div>
);
}
Sign Structured Messages
- Ethers.js
- Viem
- Wagmi
Copy
Ask AI
async function signStructuredMessage(signer: ParaEthersSigner, data: any) {
const message = JSON.stringify(data, null, 2);
const signature = await signer.signMessage(message);
const signerAddress = await signer.getAddress();
const recoveredAddress = ethers.verifyMessage(message, signature);
return {
signature,
isValid: signerAddress.toLowerCase() === recoveredAddress.toLowerCase()
};
}
Copy
Ask AI
import { recoverMessageAddress } from "viem";
async function signStructuredMessage(
walletClient: any,
address: `0x${string}`,
data: any
) {
const message = JSON.stringify(data, null, 2);
const signature = await walletClient.signMessage({ message });
const recoveredAddress = await recoverMessageAddress({ message, signature });
return {
signature,
isValid: address.toLowerCase() === recoveredAddress.toLowerCase()
};
}
Copy
Ask AI
import { useSignMessage } from "wagmi";
function SignStructuredMessage() {
const { signMessage, data: signature, isPending } = useSignMessage();
const handleSign = () => {
const data = {
action: "authenticate",
timestamp: Date.now(),
nonce: Math.random().toString(36).substring(7)
};
signMessage({ message: 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>
);
}