otterscan/src/address/Contract.tsx

102 lines
3.1 KiB
TypeScript
Raw Normal View History

2021-07-24 23:04:49 +00:00
import React, { useState, useEffect, useContext } from "react";
2021-07-23 18:36:31 +00:00
import { ethers } from "ethers";
import ContentFrame from "../ContentFrame";
import Highlight from "react-highlight";
2021-07-23 18:36:31 +00:00
import InfoRow from "../components/InfoRow";
2021-07-24 23:04:49 +00:00
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<ContractProps> = ({ checksummedAddress }) => {
2021-07-24 23:04:49 +00:00
const { provider } = useContext(RuntimeContext);
2021-07-23 18:36:31 +00:00
const [rawMetadata, setRawMetadata] = useState<any>();
useEffect(() => {
if (!checksummedAddress) {
return;
}
const fetchMetadata = async () => {
try {
const result = await fetch(
2021-07-24 23:04:49 +00:00
sourcifyMetadata(checksummedAddress, provider!.network.chainId)
);
if (result.ok) {
const json = await result.json();
console.log(json);
2021-07-23 18:36:31 +00:00
setRawMetadata(json);
setSelected(Object.keys(json.sources)[0]);
} else {
2021-07-23 18:36:31 +00:00
setRawMetadata(null);
}
} catch (err) {
console.error(err);
2021-07-23 18:36:31 +00:00
setRawMetadata(null);
}
};
fetchMetadata();
2021-07-24 23:04:49 +00:00
}, [provider, checksummedAddress]);
const [selected, setSelected] = useState<string>();
2021-07-23 18:36:31 +00:00
const optimizer = rawMetadata?.settings?.optimizer;
return (
<ContentFrame tabs>
2021-07-23 18:36:31 +00:00
{rawMetadata && (
<>
<InfoRow title="Compiler">
<span>{rawMetadata.compiler?.version}</span>
</InfoRow>
<InfoRow title="Optimizer Enabled">
{optimizer?.enabled ? (
<span>
<span className="font-bold text-green-600">Yes</span> with{" "}
<span className="font-bold text-green-600">
{ethers.utils.commify(optimizer?.runs)}
</span>{" "}
runs
</span>
) : (
<span className="font-bold text-red-600">No</span>
)}
</InfoRow>
</>
)}
<div className="py-5">
2021-07-23 18:36:31 +00:00
{rawMetadata === null && (
<span>Couldn't find contract metadata in Sourcify repository.</span>
)}
2021-07-23 18:36:31 +00:00
{rawMetadata !== undefined && rawMetadata !== null && (
<div>
{Object.entries(rawMetadata.sources).map(([k]) => (
<button
className={`border-b-2 border-transparent rounded-t text-sm px-2 py-1 bg-gray-200 text-gray-500 ${
selected === k ? "border-orange-300 font-bold" : ""
}`}
>
{k}
</button>
))}
{selected && (
<Highlight className="w-full h-full border focus:outline-none font-code text-base">
2021-07-23 18:36:31 +00:00
{rawMetadata.sources[selected].content}
</Highlight>
)}
2021-07-23 18:36:31 +00:00
</div>
)}
</div>
</ContentFrame>
);
};
export default React.memo(Contract);