import React, { createContext, ReactNode, useCallback, useContext, useEffect } from 'react' import { useAccount, useReadContract, useWriteContract } from 'wagmi' import contractAbi from "../../../out/RaidGeld.sol/RaidGeld.json" import { parseEther } from 'viem' const contractAddress = "0xbd06B0878888bf4c6895704fa603a5ADf7e65c66" const abi = contractAbi.abi export interface Player { created_at: bigint, last_raided_at: bigint, total_minted: bigint } export interface Army { anointed: { level: number } apprentice: { level: number } champion: { level: number } moloch_denier: { level: number } profit_per_second: bigint } export interface PlayerContextType { isRegistered: boolean, player: null | Player, army: null | Army, balance: bigint, register: () => void, raid: () => void, addUnit: (unit: number) => void } const PlayerContext = createContext({ isRegistered: false, player: null, army: null, balance: BigInt(0), register: () => { }, raid: () => { }, addUnit: () => { } }); const PlayerProvider = ({ children }: { children: ReactNode }) => { const { address, isConnected } = useAccount(); const { writeContract, error } = useWriteContract(); useEffect(() => { console.warn(error) }, [error]) const { data: isRegistered } = useReadContract({ address: contractAddress, abi, functionName: 'isRegistered', args: [address], query: { enabled: isConnected, refetchInterval: 5, } }); const { data: balance, } = useReadContract({ address: contractAddress, abi, functionName: 'balanceOf', args: [address], query: { refetchInterval: 5, enabled: isConnected } }); const { data: player } = useReadContract({ address: contractAddress, abi, functionName: 'getPlayer', args: [address], query: { enabled: isConnected, refetchInterval: 15 } }); const { data: army } = useReadContract({ address: contractAddress, abi, functionName: 'getArmy', args: [address], query: { enabled: isConnected, refetchInterval: 15 } }); console.log(player) const register = useCallback(() => { writeContract({ abi, address: contractAddress, functionName: 'register', value: parseEther("0.0005"), }) }, [writeContract]) const raid = useCallback(() => { writeContract({ abi, address: contractAddress, functionName: 'raid', }) }, [writeContract]) const addUnit = useCallback((unit: number) => { writeContract({ abi, address: contractAddress, functionName: 'addUnit', args: [unit, 1] }) }, [writeContract]) return ( {children} ); } export const usePlayer = () => { return useContext(PlayerContext); } export default PlayerProvider