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.

Delegate your tokens to validators on Cosmos chains to earn staking rewards using CosmJS in React Native.

Prerequisites

Stake Tokens

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 { MsgDelegate } from 'cosmjs-types/cosmos/staking/v1beta1/tx';

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

function StakeTokens() {
  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 delegateToValidator = async () => {
    if (!protoSigner || !address) return;

    const validator = 'cosmosvaloper1...';

    const msgDelegate = {
      typeUrl: '/cosmos.staking.v1beta1.MsgDelegate',
      value: MsgDelegate.fromPartial({
        delegatorAddress: address,
        validatorAddress: validator,
        amount: {
          denom: 'uatom',
          amount: '1000000',
        },
      }),
    };

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

    try {
      const result = await signAndBroadcastAsync({
        messages: [msgDelegate],
        fee,
        memo: 'Staking with Para',
      });

      console.log('Delegation successful:', result.transactionHash);
    } catch (error) {
      console.error('Delegation failed:', error);
    }
  };

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

  return (
    <View>
      <Text>Delegator: {address}</Text>
      <Button
        title={isPending ? 'Staking...' : 'Stake 1 ATOM'}
        onPress={delegateToValidator}
        disabled={isPending}
      />
    </View>
  );
}

Next Steps