import React, { useState, useEffect, useContext } from "react"; import { ethers } from "ethers"; import ContentFrame from "../ContentFrame"; import Highlight from "react-highlight"; import InfoRow from "../components/InfoRow"; import { sourcifyMetadata } from "../url"; import { RuntimeContext } from "../useRuntime"; import "highlight.js/styles/stackoverflow-light.css"; import hljs from "highlight.js"; import hljsDefineSolidity from "highlightjs-solidity"; hljsDefineSolidity(hljs); hljs.initHighlightingOnLoad(); type ContractProps = { checksummedAddress: string; }; const Contract: React.FC = ({ checksummedAddress }) => { const { provider } = useContext(RuntimeContext); const [rawMetadata, setRawMetadata] = useState(); useEffect(() => { if (!checksummedAddress) { return; } const fetchMetadata = async () => { try { const result = await fetch( sourcifyMetadata(checksummedAddress, provider!.network.chainId) ); if (result.ok) { const json = await result.json(); console.log(json); setRawMetadata(json); setSelected(Object.keys(json.sources)[0]); } else { setRawMetadata(null); } } catch (err) { console.error(err); setRawMetadata(null); } }; fetchMetadata(); }, [provider, checksummedAddress]); const [selected, setSelected] = useState(); const optimizer = rawMetadata?.settings?.optimizer; return ( {rawMetadata && ( <> {rawMetadata.compiler?.version} {optimizer?.enabled ? ( Yes with{" "} {ethers.utils.commify(optimizer?.runs)} {" "} runs ) : ( No )} )}
{rawMetadata === null && ( Couldn't find contract metadata in Sourcify repository. )} {rawMetadata !== undefined && rawMetadata !== null && (
{Object.entries(rawMetadata.sources).map(([k]) => ( ))} {selected && ( {rawMetadata.sources[selected].content} )}
)}
); }; export default React.memo(Contract);