Read a uint from a contract
This recipe demonstrates how to read data from contract functions that accept some arguments (parameters) or no arguments at all and displays it on the UI.
Here is the full code, which we will be implementing in the guide below:
import { useAccount } from "wagmi";
import { useScaffoldContractRead } from "~~/hooks/scaffold-eth";
export const GreetingsCount = () => {
const { address: connectedAddress } = useAccount();
const { data: totalCounter, isLoading: isTotalCounterLoading } = useScaffoldContractRead({
contractName: "YourContract",
functionName: "totalCounter",
watch: true,
});
const { data: connectedAddressCounter, isLoading: isConnectedAddressCounterLoading } = useScaffoldContractRead({
contractName: "YourContract",
functionName: "userGreetingCounter",
args: [connectedAddress], // passing args to function
watch: true,
});
return (
<div className="card card-compact w-64 bg-secondary text-primary-content shadow-xl m-4">
<div className="card-body items-center text-center">
<h2 className="card-title">Greetings Count</h2>
<div className="card-actions items-center flex-col gap-1 text-lg">
<h2 className="font-bold m-0">Total Greetings count:</h2>
{isTotalCounterLoading ? (
<span className="loading loading-spinner"></span>
) : (
<p className="m-0">{totalCounter ? totalCounter.toString() : 0}</p>
)}
<h2 className="font-bold m-0">Your Greetings count:</h2>
{isConnectedAddressCounterLoading ? (
<span className="loading loading-spinner"></span>
) : (
<p className="m-0">{connectedAddressCounter ? connectedAddressCounter.toString() : 0}</p>
)}
</div>
</div>
</div>
);
};
Implementation guideโ
Step 1: Create a new Componentโ
Begin by creating a new component in the "components" folder of your application.
export const GreetingsCount = () => {
return (
<div>
<h2 className="font-bold m-0">Total Greetings count:</h2>
<h2 className="font-bold m-0">Your Greetings count:</h2>
</div>
);
};
Step 2: Retrieve total greetings countโ
Initialize the useScaffoldContractRead hook to read from the contract. This hook provides the data
which contains the return value of the function.
import { useScaffoldContractRead } from "~~/hooks/scaffold-eth";
export const GreetingsCount = () => {
const { data: totalCounter } = useScaffoldContractRead({
contractName: "YourContract",
functionName: "totalCounter",
watch: true,
});
return (
<div>
<h2 className="font-bold m-0">Total Greetings count:</h2>
<p>{totalCounter ? totalCounter.toString() : 0}</p>
<h2 className="font-bold m-0">Your Greetings count:</h2>
</div>
);
};
const {data: totalCounter} = useScaffoldContractRead({...})
here we are using destructuring asssignment to assign data
to new name totalCounter
.
totalCounter
in contract returns an uint
value, which is represented as BigInt
in javascript and can be converted to readable string using .toString()
.
Step 3: Retrieve connected address greetings countโ
We can access connected address using useAccount hook and pass it to args
key in useScaffoldContractRead
hooks configuration which will be used as an argument to the read contract function.
import { useScaffoldContractRead } from "~~/hooks/scaffold-eth";
import { useAccount } from "wagmi";
export const GreetingsCount = () => {
const { address: connectedAddress } = useAccount();
const { data: totalCounter } = useScaffoldContractRead({
contractName: "YourContract",
functionName: "totalCounter",
watch: true,
});
const { data: connectedAddressCounter } = useScaffoldContractRead({
contractName: "YourContract",
functionName: "userGreetingCounter",
args: [connectedAddress], // passing args to function
watch: true,
});
return (
<div>
<h2>Total Greetings count:</h2>
<p>{totalCounter ? totalCounter.toString() : 0}</p>
<h2>Your Greetings count:</h2>
<p>{connectedAddressCounter ? connectedAddressCounter.toString() : 0}</p>
</div>
);
};
Step 4: Bonus adding loading stateโ
We can use isLoading
returned from useScaffoldContractRead
which is set to true
while fetching the data from contract.
import { useScaffoldContractRead } from "~~/hooks/scaffold-eth";
import { useAccount } from "wagmi";
export const GreetingsCount = () => {
const { address: connectedAddress } = useAccount();
const { data: totalCounter, isLoading: isTotalCounterLoading } = useScaffoldContractRead({
contractName: "YourContract",
functionName: "totalCounter",
watch: true,
});
const { data: connectedAddressCounter, isLoading: isConnectedAddressCounterLoading } = useScaffoldContractRead({
contractName: "YourContract",
functionName: "userGreetingCounter",
args: [connectedAddress], // passing args to function
watch: true,
});
return (
<div>
<h2>Total Greetings count:</h2>
{isTotalCounterLoading ? "Loading..." : <p>{totalCounter ? totalCounter.toString() : 0}</p>}
<h2>Your Greetings count:</h2>
{isConnectedAddressCounterLoading ? (
"Loading..."
) : (
<p>{connectedAddressCounter ? connectedAddressCounter.toString() : 0}</p>
)}
</div>
);
};