Skip to main content
Sign arbitrary messages for authentication or verification using CosmJS with Para wallets in React Native.

Prerequisites

Sign Messages

Sign arbitrary messages using the ADR-036 standard for Cosmos authentication.
import { useState } from 'react';
import { View, Text, Button } from 'react-native';
import { useClient, useAccount } from '@getpara/react-native-wallet';
import { ParaAminoSigner } from '@getpara/cosmjs-v0-integration';
import { makeSignDoc } from '@cosmjs/amino';

const CHAIN_ID = 'cosmoshub-4';

function MessageSigning() {
  const para = useClient();
  const { isConnected } = useAccount();
  const [signature, setSignature] = useState<string>();

  const aminoSigner = para && isConnected ? new ParaAminoSigner(para, 'cosmos') : null;
  const address = aminoSigner?.address;

  const signArbitraryMessage = async () => {
    if (!aminoSigner || !address) return;

    const message = 'Sign this message to authenticate with Para';

    const signDoc = makeSignDoc(
      [{ type: 'sign/MsgSignData', value: { signer: address, data: btoa(message) } }],
      { amount: [], gas: '0' },
      CHAIN_ID,
      '',
      0,
      0
    );

    try {
      const { signature: sig } = await aminoSigner.signAmino(address, signDoc);
      setSignature(sig.signature);
      console.log('Signature:', sig.signature);
    } catch (error) {
      console.error('Signing failed:', error);
    }
  };

  if (!para) return <Text>Loading...</Text>;

  return (
    <View>
      <Text>Address: {address}</Text>
      <Button title="Sign Message" onPress={signArbitraryMessage} />
      {signature && <Text>Signature: {signature}</Text>}
    </View>
  );
}

Next Steps