"use client"; import { useMemo, useState } from "react"; import { erc20Abi, formatEther, parseEther } from "viem"; import { useAccount, useReadContract } from "wagmi"; import { useScaffoldReadContract, useScaffoldWriteContract } from "~~/hooks/scaffold-eth"; const ETH_IN = "0.5"; const ORA_OUT = "100"; export const BuyOraWidget = () => { const { address: connectedAddress } = useAccount(); const [isBuying, setIsBuying] = useState(false); // NOTE: `deployedContracts.ts` is autogenerated from deployments. If ORA isn't listed yet, // the hook will show a "Target Contract is not deployed" notification until you run `yarn deploy`. // We keep TS compiling while deployments/ABIs are catching up. const { writeContractAsync: writeOraUnsafe } = useScaffoldWriteContract({ contractName: "ORA" as any }); const writeOra = writeOraUnsafe as any; // Read ORA balance using the token address wired into StakingOracle const { data: oracleTokenAddress } = useScaffoldReadContract({ contractName: "StakingOracle", functionName: "oracleToken", }); const { data: oraBalance, refetch: refetchOraBalance } = useReadContract({ address: oracleTokenAddress as `0x${string}` | undefined, abi: erc20Abi, functionName: "balanceOf", args: connectedAddress ? [connectedAddress] : undefined, query: { enabled: !!oracleTokenAddress && !!connectedAddress, refetchInterval: 5000 }, }); const oraBalanceFormatted = useMemo(() => { if (oraBalance === undefined) return "—"; return Number(formatEther(oraBalance as bigint)).toLocaleString(undefined, { maximumFractionDigits: 2 }); }, [oraBalance]); const handleBuy = async () => { setIsBuying(true); try { await writeOra({ functionName: "buy", value: parseEther(ETH_IN), }); // Ensure the widget updates immediately after the tx confirms (instead of waiting for polling). await refetchOraBalance(); } catch (e: any) { console.error(e); } finally { setIsBuying(false); } }; return (