Selendra

Documentation

React Components Reference

Complete reference for Selendra React components and hooks.

Provider Components

SelendraProvider

Context provider making the SDK available to all child components.

Props

PropTypeRequiredDescription
childrenReactNodeYesChild components
sdkSelendraSDKYesSDK instance
autoConnectbooleanNoAuto-connect on mount
onError(error: Error) => voidNoError handler callback

Example

import { SelendraProvider, SelendraSDK } from "@selendrajs/sdk/react";

const sdk = new SelendraSDK({
  network: "mainnet",
  wsEndpoint: "wss://rpc.selendra.org",
});

function App() {
  return (
    <SelendraProvider sdk={sdk} autoConnect>
      <MyApp />
    </SelendraProvider>
  );
}

NetworkProvider

Provides network configuration and switching capabilities.

Props

PropTypeRequiredDescription
childrenReactNodeYesChild components
networksNetworkConfig[]YesAvailable networks
defaultNetworkstringNoDefault network ID
onNetworkChange(network: string) => voidNoNetwork change callback

Core Hooks

useSelendra()

Access the Selendra SDK instance from context.

Returns

SelendraSDK;

Example

import { useSelendra } from "@selendrajs/sdk/react";

function ChainInfo() {
  const sdk = useSelendra();
  const [chainInfo, setChainInfo] = useState(null);

  useEffect(() => {
    sdk.getChainInfo().then(setChainInfo);
  }, [sdk]);

  return chainInfo ? <div>Chain: {chainInfo.chainName}</div> : null;
}

useAccount()

Manages account connection and state.

Returns

interface UseAccountReturn {
  account: Account | null;
  isConnected: boolean;
  isConnecting: boolean;
  error: Error | null;
  connect: () => Promise<void>;
  disconnect: () => Promise<void>;
  switchAccount: (address: string) => Promise<void>;
  accounts: Account[];
}

Example

function WalletConnect() {
  const { account, isConnected, isConnecting, connect, disconnect } =
    useAccount();

  if (isConnecting) return <div>Connecting...</div>;

  return isConnected ? (
    <div>
      <p>Connected: {account?.address}</p>
      <button onClick={disconnect}>Disconnect</button>
    </div>
  ) : (
    <button onClick={connect}>Connect Wallet</button>
  );
}

useBalance()

Gets and monitors account balance.

Parameters

interface UseBalanceOptions {
  address?: string;
  token?: string;
  refreshInterval?: number;
}

Returns

interface UseBalanceReturn {
  balance: Balance | null;
  loading: boolean;
  error: Error | null;
  refetch: () => Promise<void>;
}

Example

function BalanceDisplay({ address }) {
  const { balance, loading, error } = useBalance({
    address,
    refreshInterval: 5000, // Refresh every 5 seconds
  });

  if (loading) return <div>Loading balance...</div>;
  if (error) return <div>Error: {error.message}</div>;

  return (
    <div>
      Balance: {balance?.free} {balance?.tokenSymbol}
    </div>
  );
}

useNetwork()

Manages network selection and switching.

Returns

interface UseNetworkReturn {
  network: NetworkConfig;
  networks: NetworkConfig[];
  isSwitching: boolean;
  switchNetwork: (networkId: string) => Promise<void>;
  addNetwork: (network: NetworkConfig) => void;
}

Example

function NetworkSelector() {
  const { network, networks, switchNetwork } = useNetwork();

  return (
    <select value={network.id} onChange={(e) => switchNetwork(e.target.value)}>
      {networks.map((net) => (
        <option key={net.id} value={net.id}>
          {net.name}
        </option>
      ))}
    </select>
  );
}

useTransaction()

Handles transaction creation and submission.

Returns

interface UseTransactionReturn {
  send: (options: SendTransactionOptions) => Promise<Transaction>;
  estimateGas: (options: SendTransactionOptions) => Promise<bigint>;
  transaction: Transaction | null;
  isLoading: boolean;
  error: Error | null;
  reset: () => void;
}

Example

function TransferForm() {
  const [recipient, setRecipient] = useState("");
  const [amount, setAmount] = useState("");
  const { send, isLoading, error } = useTransaction();

  const handleTransfer = async () => {
    try {
      const tx = await send({
        to: recipient,
        amount: BigInt(amount),
      });
      console.log("Transaction sent:", tx.hash);
    } catch (err) {
      console.error("Transfer failed:", err);
    }
  };

  return (
    <div>
      <input
        placeholder="Recipient address"
        value={recipient}
        onChange={(e) => setRecipient(e.target.value)}
      />
      <input
        type="number"
        placeholder="Amount"
        value={amount}
        onChange={(e) => setAmount(e.target.value)}
      />
      <button onClick={handleTransfer} disabled={isLoading}>
        {isLoading ? "Sending..." : "Send"}
      </button>
      {error && <div>Error: {error.message}</div>}
    </div>
  );
}

useContract()

Options & Returns

interface UseContractOptions {
  address: string;
  abi: any[];
  autoConnect?: boolean;
}

interface UseContractReturn {
  contract: Contract | null;
  call: (functionName: string, ...args: any[]) => Promise<any>;
  send: (
    functionName: string,
    options?: ContractSendOptions,
    ...args: any[]
  ) => Promise<Transaction>;
  isLoading: boolean;
  error: Error | null;
}

useEventListener()

Options & Returns

interface UseEventListenerOptions {
  contract?: Contract;
  eventName?: string;
  fromBlock?: number;
  filters?: Record<string, any>;
}

interface UseEventListenerReturn {
  events: Event[];
  isLoading: boolean;
  error: Error | null;
  unsubscribe: () => void;
}

UI Components

ComponentPropsDescription
<AddressDisplay />address, format, showCopy, showExplorerDisplay address with formatting and copy functionality
<BalanceDisplay />balance, format, showSymbol, decimalsDisplay formatted balance with symbol
<NetworkBadge />network, size, showIconDisplay network status badge
<TransactionStatus />transaction, showHash, showDetailsShow transaction status with details

Example

<AddressDisplay address={account.address} format="short" showCopy showExplorer />
<BalanceDisplay balance={balance} format="compact" showSymbol />

Form Components

ComponentPropsDescription
<AddressInput />value, onChange, placeholder, requiredInput with address validation
<AmountInput />value, onChange, token, decimals, maxAmountInput with balance formatting
<WalletSelector />selectedWallet, onWalletSelect, walletsWallet selection dropdown
<TransactionForm />fields, onSubmit, validation, loadingComplete transaction form

TypeScript Types

Core Types

interface Account {
  address: string;
  name?: string;
  type: "substrate" | "evm";
  publicKey: string;
}

interface Balance {
  free: bigint;
  reserved: bigint;
  frozen: bigint;
  total: bigint;
  tokenSymbol: string;
  decimals: number;
}

interface Transaction {
  hash: string;
  from: string;
  to: string;
  amount?: bigint;
  status: "pending" | "included" | "finalized" | "failed";
  events: TransactionEvent[];
}

interface NetworkConfig {
  id: string;
  name: string;
  rpcUrl: string;
  explorerUrl?: string;
  chainId: number;
}

This React components reference covers all major components and hooks. For complete examples, check our examples directory and tutorials.

Contribute

Found an issue or want to contribute?

Help us improve this documentation by editing this page on GitHub.

Edit this page on GitHub