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.

Query validator information to make informed staking decisions on Cosmos chains using CosmJS.

Prerequisites

Setup CosmJS Libraries

Query Validators

import { useState } from "react";
import { useParaCosmjsProtoSigner } from "@getpara/react-sdk/cosmos";
import { StargateClient, setupStakingExtension, QueryClient } from "@cosmjs/stargate";
import { Tendermint37Client } from "@cosmjs/tendermint-rpc";

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

interface ValidatorInfo {
  name: string;
  operatorAddress: string;
  tokens: string;
  commission: string;
}

function ValidatorInfo() {
  const { protoSigner, isLoading } = useParaCosmjsProtoSigner();
  const [validators, setValidators] = useState<ValidatorInfo[]>([]);

  const address = protoSigner?.address;

  const queryValidators = async () => {
    const tmClient = await Tendermint37Client.connect(RPC_URL);
    const queryClient = QueryClient.withExtensions(tmClient, setupStakingExtension);

    try {
      const { validators: activeValidators } = await queryClient.staking.validators("BOND_STATUS_BONDED");

      const validatorInfo = activeValidators.slice(0, 10).map(validator => ({
        name: validator.description?.moniker || "Unknown",
        operatorAddress: validator.operatorAddress,
        tokens: validator.tokens,
        commission: validator.commission?.commissionRates?.rate || "0",
      }));

      setValidators(validatorInfo);

      if (address) {
        const delegations = await queryClient.staking.delegatorDelegations(address);
        console.log("Your delegations:", delegations);
      }
    } catch (error) {
      console.error("Failed to query validators:", error);
    }
  };

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

  return (
    <div>
      <p>Address: {address}</p>
      <button onClick={queryValidators}>Query Top Validators</button>
      {validators.map(v => (
        <div key={v.operatorAddress}>
          {v.name} - Commission: {v.commission}
        </div>
      ))}
    </div>
  );
}

Next Steps

Stake Tokens

Claim Rewards

Query Balances