Read data from smart contracts and execute write operations using Para’s wallet infrastructure.

Prerequisites

You need Web3 libraries configured with Para authentication.

Setup Web3 Libraries

Read Contract Data

import { ethers } from "ethers";

const CONTRACT_ABI = [
  "function balanceOf(address owner) view returns (uint256)",
  "function totalSupply() view returns (uint256)",
  "function name() view returns (string)",
  "function symbol() view returns (string)",
  "function decimals() view returns (uint8)"
];

async function readContractData(
  provider: ethers.Provider,
  contractAddress: string,
  userAddress: string
) {
  const contract = new ethers.Contract(
    contractAddress,
    CONTRACT_ABI,
    provider
  );
  
  const [balance, totalSupply, name, symbol, decimals] = await Promise.all([
    contract.balanceOf(userAddress),
    contract.totalSupply(),
    contract.name(),
    contract.symbol(),
    contract.decimals()
  ]);
  
  return {
    balance: ethers.formatUnits(balance, decimals),
    totalSupply: ethers.formatUnits(totalSupply, decimals),
    name,
    symbol,
    decimals
  };
}

Write Contract Data

const STAKING_ABI = [
  "function stake(uint256 amount) payable",
  "function unstake(uint256 amount)",
  "function getStakedBalance(address user) view returns (uint256)",
  "event Staked(address indexed user, uint256 amount)",
  "event Unstaked(address indexed user, uint256 amount)"
];

async function stakeTokens(
  signer: any,
  contractAddress: string,
  amount: string,
  decimals: number
) {
  try {
    const contract = new ethers.Contract(
      contractAddress,
      STAKING_ABI,
      signer
    );
    
    const parsedAmount = ethers.parseUnits(amount, decimals);
    
    const tx = await contract.stake(parsedAmount);
    console.log("Staking transaction:", tx.hash);
    
    const receipt = await tx.wait();
    console.log("Transaction confirmed");
    
    const stakedEvent = receipt.logs.find(
      log => log.topics[0] === contract.interface.getEvent("Staked").topicHash
    );
    
    if (stakedEvent) {
      const parsedEvent = contract.interface.parseLog(stakedEvent);
      console.log("Staked amount:", parsedEvent.args.amount.toString());
    }
    
    const newBalance = await contract.getStakedBalance(
      await signer.getAddress()
    );
    
    return {
      hash: tx.hash,
      stakedAmount: ethers.formatUnits(newBalance, decimals)
    };
  } catch (error) {
    console.error("Staking failed:", error);
    throw error;
  }
}

Next Steps