"use client"; import { useEffect, useState } from "react"; import type { NextPage } from "next"; import { useReadContracts } from "wagmi"; import { AssertedTable } from "~~/components/oracle/optimistic/AssertedTable"; import { AssertionModal } from "~~/components/oracle/optimistic/AssertionModal"; import { DisputedTable } from "~~/components/oracle/optimistic/DisputedTable"; import { ExpiredTable } from "~~/components/oracle/optimistic/ExpiredTable"; import { ProposedTable } from "~~/components/oracle/optimistic/ProposedTable"; import { SettledTable } from "~~/components/oracle/optimistic/SettledTable"; import { SubmitAssertionButton } from "~~/components/oracle/optimistic/SubmitAssertionButton"; import { useDeployedContractInfo, useScaffoldReadContract } from "~~/hooks/scaffold-eth"; import { useChallengeState } from "~~/services/store/challengeStore"; // Loading spinner component const LoadingSpinner = () => (
); const Home: NextPage = () => { const setRefetchAssertionStates = useChallengeState(state => state.setRefetchAssertionStates); const [isInitialLoading, setIsInitialLoading] = useState(true); const { data: nextAssertionId, isLoading: isLoadingNextAssertionId } = useScaffoldReadContract({ contractName: "OptimisticOracle", functionName: "nextAssertionId", query: { placeholderData: (previousData: any) => previousData, }, }); // get deployed contract address const { data: deployedContractAddress, isLoading: isLoadingDeployedContract } = useDeployedContractInfo({ contractName: "OptimisticOracle", }); // Create contracts array to get state for all assertions from 1 to nextAssertionId-1 const assertionContracts = nextAssertionId ? Array.from({ length: Number(nextAssertionId) - 1 }, (_, i) => ({ address: deployedContractAddress?.address as `0x${string}`, abi: deployedContractAddress?.abi, functionName: "getState", args: [BigInt(i + 1)], })).filter(contract => contract.address && contract.abi) : []; const { data: assertionStates, refetch: refetchAssertionStates, isLoading: isLoadingAssertionStates, } = useReadContracts({ contracts: assertionContracts, query: { placeholderData: (previousData: any) => previousData, }, }); // Set the refetch function in the global store useEffect(() => { if (refetchAssertionStates) { setRefetchAssertionStates(refetchAssertionStates); } }, [refetchAssertionStates, setRefetchAssertionStates]); // Map assertion IDs to their states and filter out expired ones (state 5) const assertionStateMap = nextAssertionId && assertionStates ? Array.from({ length: Number(nextAssertionId) - 1 }, (_, i) => ({ assertionId: i + 1, state: (assertionStates[i]?.result as number) || 0, // Default to 0 (Invalid) if no result })) : []; // Track when initial loading is complete const isFirstLoading = isInitialLoading && (isLoadingNextAssertionId || isLoadingAssertionStates || isLoadingDeployedContract); // Mark as initially loaded when all data is available useEffect(() => { if (isInitialLoading && !isLoadingNextAssertionId && !isLoadingDeployedContract && !isLoadingAssertionStates) { setIsInitialLoading(false); } }, [isInitialLoading, isLoadingNextAssertionId, isLoadingDeployedContract, isLoadingAssertionStates]); return (
{/* Show loading spinner only during initial load */} {isFirstLoading ? ( ) : ( <> {/* Submit Assertion Button with Modal */} {/* Tables */}

Asserted

assertion.state === 1)} />

Proposed

assertion.state === 2)} />

Disputed

assertion.state === 3)} />

Settled

assertion.state === 4)} />

Expired

assertion.state === 5)} /> )}
); }; export default Home;