import React, { useState, useEffect, useContext } from "react"; import { useParams, useNavigate, Routes, Route, useSearchParams, } from "react-router-dom"; import { getAddress, isAddress } from "@ethersproject/address"; import { Tab } from "@headlessui/react"; import Blockies from "react-blockies"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCircleNotch } from "@fortawesome/free-solid-svg-icons/faCircleNotch"; import { faQuestionCircle } from "@fortawesome/free-regular-svg-icons/faQuestionCircle"; import StandardFrame from "./StandardFrame"; import StandardSubtitle from "./StandardSubtitle"; import Copy from "./components/Copy"; import NavTab from "./components/NavTab"; import SourcifyLogo from "./sourcify/SourcifyLogo"; import AddressTransactionResults from "./address/AddressTransactionResults"; import Contracts from "./address/Contracts"; import { RuntimeContext } from "./useRuntime"; import { useAppConfigContext } from "./useAppConfig"; import { useSingleMetadata } from "./useSourcify"; const AddressTransactions: React.FC = () => { const { provider } = useContext(RuntimeContext); const { addressOrName, direction } = useParams(); if (addressOrName === undefined) { throw new Error("addressOrName couldn't be undefined here"); } const navigate = useNavigate(); const [searchParams] = useSearchParams(); const [checksummedAddress, setChecksummedAddress] = useState< string | undefined >(); const [isENS, setENS] = useState(); const [error, setError] = useState(); // If it looks like it is an ENS name, try to resolve it useEffect(() => { // TODO: handle and offer fallback to bad checksummed addresses if (isAddress(addressOrName)) { setENS(false); setError(false); // Normalize to checksummed address const _checksummedAddress = getAddress(addressOrName); if (_checksummedAddress !== addressOrName) { // Request came with a non-checksummed address; fix the URL navigate( `/address/${_checksummedAddress}${ direction ? "/" + direction : "" }?${searchParams.toString()}`, { replace: true } ); return; } setChecksummedAddress(_checksummedAddress); document.title = `Address ${_checksummedAddress} | Otterscan`; return; } if (!provider) { return; } const resolveName = async () => { const resolvedAddress = await provider.resolveName(addressOrName); if (resolvedAddress !== null) { setENS(true); setError(false); setChecksummedAddress(resolvedAddress); document.title = `Address ${addressOrName} | Otterscan`; } else { setENS(false); setError(true); setChecksummedAddress(undefined); } }; resolveName(); }, [provider, addressOrName, navigate, direction, searchParams]); const { sourcifySource } = useAppConfigContext(); const addressMetadata = useSingleMetadata( checksummedAddress, provider?.network.chainId, sourcifySource ); return ( {error ? ( "{addressOrName}" is not an ETH address or ENS name. ) : ( checksummedAddress && ( <>
Address {checksummedAddress} {isENS && ( ENS: {addressOrName} )}
Overview Contract {addressMetadata === undefined ? ( ) : addressMetadata === null ? ( ) : ( )} } /> } /> ) )}
); }; export default AddressTransactions;