A provider reads; a signer writes. Reads are free `eth_call`s; writes cost gas and return a transaction you must await.
const c = new ethers.Contract(addr, abi, signer); const bal = await c.balanceOf(user); // read const tx = await c.stake(amount); // write const receipt = await tx.wait(1);
Estimate gas and simulate with `staticCall` first to surface a revert reason before the user pays.