import { ReactElement, useState } from "react"; import { TransactionBase, TransactionReceipt, formatEther, isAddress, isHex } from "viem"; import { ArrowsRightLeftIcon } from "@heroicons/react/24/solid"; import { Address } from "~~/components/scaffold-eth"; import { replacer } from "~~/utils/scaffold-eth/common"; type DisplayContent = | string | number | bigint | Record | TransactionBase | TransactionReceipt | undefined | unknown; type ResultFontSize = "sm" | "base" | "xs" | "lg" | "xl" | "2xl" | "3xl"; export const displayTxResult = ( displayContent: DisplayContent | DisplayContent[], fontSize: ResultFontSize = "base", ): string | ReactElement | number => { if (displayContent == null) { return ""; } if (typeof displayContent === "bigint") { return ; } if (typeof displayContent === "string") { if (isAddress(displayContent)) { return
; } if (isHex(displayContent)) { return displayContent; // don't add quotes } } if (Array.isArray(displayContent)) { return ; } if (typeof displayContent === "object") { return ; } return JSON.stringify(displayContent, replacer, 2); }; const NumberDisplay = ({ value }: { value: bigint }) => { const [isEther, setIsEther] = useState(false); const asNumber = Number(value); if (asNumber <= Number.MAX_SAFE_INTEGER && asNumber >= Number.MIN_SAFE_INTEGER) { return String(value); } return (
{isEther ? "Ξ" + formatEther(value) : String(value)}
); }; export const ObjectFieldDisplay = ({ name, value, size, leftPad = true, }: { name: string; value: DisplayContent; size: ResultFontSize; leftPad?: boolean; }) => { return (
{name}: {displayTxResult(value, size)}
); }; const ArrayDisplay = ({ values, size }: { values: DisplayContent[]; size: ResultFontSize }) => { return (
{values.length ? "array" : "[]"} {values.map((v, i) => ( ))}
); }; const StructDisplay = ({ struct, size }: { struct: Record; size: ResultFontSize }) => { return (
struct {Object.entries(struct).map(([k, v]) => ( ))}
); };