Skip to main content
Sign plain text messages using Para’s secure signing infrastructure.
Wagmi is not available on React Native. Use Ethers.js or Viem for EVM operations.

Sign Personal Messages

import { useParaEthersSigner, useParaEthersSignMessage } from "@getpara/react-native-wallet/evm/ethers";
import { ethers } from "ethers";
import { JsonRpcProvider } from "ethers";
import { View, Text, TouchableOpacity } from "react-native";

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

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

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

  return (
    <View>
      <TouchableOpacity
        disabled={isPending}
        onPress={() => signMessageAsync("Hello from Para!")}
      >
        <Text>{isPending ? "Signing..." : "Sign Message"}</Text>
      </TouchableOpacity>
      {signature && <Text>Signature: {signature.slice(0, 20)}...</Text>}
    </View>
  );
}

Sign Structured Messages

import { useParaEthersSigner, useParaEthersSignMessage } from "@getpara/react-native-wallet/evm/ethers";
import { JsonRpcProvider } from "ethers";
import { View, Text, TouchableOpacity } from "react-native";

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),
    };
    signMessageAsync(JSON.stringify(data, null, 2));
  };

  return (
    <View>
      <TouchableOpacity onPress={handleSign} disabled={isPending}>
        <Text>{isPending ? "Signing..." : "Sign Structured Data"}</Text>
      </TouchableOpacity>
      {signature && <Text>Signature: {signature.slice(0, 30)}...</Text>}
    </View>
  );
}

Next Steps