Read and write smart contract data and handle events using Web3 libraries
Read data from smart contracts and execute write operations using Para’s wallet infrastructure.
You need Web3 libraries configured with Para authentication.
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
};
}
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;
}
}