Read and write smart contract data and handle events using Web3 libraries
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;
}
}