Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.getpara.com/llms.txt

Use this file to discover all available pages before exploring further.

Execute custom messages and interact with Cosmos modules using CosmJS with Para wallets in React Native.

Prerequisites

Execute Custom Messages

import { useMemo } from 'react';
import { View, Text, Button } from 'react-native';
import { useParaCosmjsProtoSigner, useParaCosmjsSignAndBroadcast } from '@getpara/react-native-wallet/cosmos';
import { SigningStargateClient, coins } from '@cosmjs/stargate';
import { MsgSend } from 'cosmjs-types/cosmos/bank/v1beta1/tx';

const RPC_URL = 'https://rpc.cosmos.directory/cosmoshub';

function CustomTransaction() {
  const { protoSigner, isLoading } = useParaCosmjsProtoSigner();

  const address = protoSigner?.address;

  const client = useMemo(
    () => protoSigner ? SigningStargateClient.connectWithSigner(RPC_URL, protoSigner) : undefined,
    [protoSigner]
  );

  const { signAndBroadcastAsync, isPending } = useParaCosmjsSignAndBroadcast(protoSigner, client);

  const executeCustomMessage = async () => {
    if (!protoSigner || !address) return;

    const msgSend = {
      typeUrl: '/cosmos.bank.v1beta1.MsgSend',
      value: MsgSend.fromPartial({
        fromAddress: address,
        toAddress: 'cosmos1...',
        amount: coins(1000000, 'uatom'),
      }),
    };

    const fee = {
      amount: coins(5000, 'uatom'),
      gas: '200000',
    };

    try {
      const result = await signAndBroadcastAsync({
        messages: [msgSend],
        fee,
        memo: 'Custom message via Para',
      });

      console.log('Transaction hash:', result.transactionHash);
      console.log('Code:', result.code);
    } catch (error) {
      console.error('Transaction failed:', error);
    }
  };

  if (isLoading) return <Text>Loading...</Text>;

  return (
    <View>
      <Text>From: {address}</Text>
      <Button
        title={isPending ? 'Executing...' : 'Execute Custom Message'}
        onPress={executeCustomMessage}
        disabled={isPending}
      />
    </View>
  );
}

Next Steps