otterscan/src/Transaction.tsx

155 lines
4.8 KiB
TypeScript
Raw Normal View History

2021-08-01 09:59:59 +00:00
import React, { useMemo, useContext } from "react";
2021-11-25 09:28:45 +00:00
import { useParams, Routes, Route } from "react-router-dom";
2021-09-06 06:43:20 +00:00
import { Tab } from "@headlessui/react";
2021-07-01 18:21:40 +00:00
import StandardFrame from "./StandardFrame";
import StandardSubtitle from "./StandardSubtitle";
import ContentFrame from "./ContentFrame";
2021-09-06 06:34:13 +00:00
import NavTab from "./components/NavTab";
2021-07-09 05:07:20 +00:00
import { RuntimeContext } from "./useRuntime";
import { SelectionContext, useSelection } from "./useSelection";
2021-08-01 09:59:59 +00:00
import { useInternalOperations, useTxData } from "./useErigonHooks";
import { useETHUSDOracle } from "./usePriceOracle";
import { useAppConfigContext } from "./useAppConfig";
2021-11-25 18:50:59 +00:00
import { useSourcify, useTransactionDescription } from "./sourcify/useSourcify";
import {
transactionDataCollector,
useResolvedAddresses,
} from "./useResolvedAddresses";
import { SelectedTransactionContext } from "./useSelectedTransaction";
2021-07-01 18:21:40 +00:00
2021-10-24 04:04:18 +00:00
const Details = React.lazy(
() =>
import(
/* webpackChunkName: "txdetails", webpackPrefetch: true */
"./transaction/Details"
)
);
const Logs = React.lazy(
() =>
import(
/* webpackChunkName: "txlogs", webpackPrefetch: true */ "./transaction/Logs"
)
);
2021-10-27 01:10:37 +00:00
const Trace = React.lazy(
() =>
import(
/* webpackChunkName: "txtrace", webpackPrefetch: true */ "./transaction/Trace"
)
);
2021-10-24 04:04:18 +00:00
2021-07-01 18:21:40 +00:00
const Transaction: React.FC = () => {
2021-07-09 05:07:20 +00:00
const { provider } = useContext(RuntimeContext);
2021-11-25 09:28:45 +00:00
const { txhash } = useParams();
if (txhash === undefined) {
throw new Error("txhash couldn't be undefined here");
}
2021-07-01 18:21:40 +00:00
2021-08-01 09:59:59 +00:00
const txData = useTxData(provider, txhash);
const addrCollector = useMemo(
() => transactionDataCollector(txData),
[txData]
);
const resolvedAddresses = useResolvedAddresses(provider, addrCollector);
2021-07-01 18:21:40 +00:00
2021-07-21 19:06:51 +00:00
const internalOps = useInternalOperations(provider, txData);
2021-07-05 21:08:52 +00:00
const sendsEthToMiner = useMemo(() => {
2021-07-21 19:06:51 +00:00
if (!txData || !internalOps) {
2021-07-05 21:08:52 +00:00
return false;
}
2021-07-21 19:06:51 +00:00
for (const t of internalOps) {
if (t.to === txData.confirmedData?.miner) {
2021-07-05 21:08:52 +00:00
return true;
}
}
return false;
2021-07-21 19:06:51 +00:00
}, [txData, internalOps]);
2021-07-01 18:21:40 +00:00
const selectionCtx = useSelection();
const blockETHUSDPrice = useETHUSDOracle(
provider,
txData?.confirmedData?.blockNumber
);
const { sourcifySource } = useAppConfigContext();
2021-09-15 17:43:36 +00:00
const metadata = useSourcify(
txData?.to,
provider?.network.chainId,
sourcifySource
2021-09-15 17:43:36 +00:00
);
const txDesc = useTransactionDescription(metadata, txData);
2021-07-01 18:21:40 +00:00
return (
<SelectedTransactionContext.Provider value={txData}>
<StandardFrame>
<StandardSubtitle>Transaction Details</StandardSubtitle>
{txData === null && (
<ContentFrame>
<div className="py-4 text-sm">
Transaction <span className="font-hash">{txhash}</span> not found.
</div>
</ContentFrame>
)}
{txData && (
<SelectionContext.Provider value={selectionCtx}>
<Tab.Group>
<Tab.List className="flex space-x-2 border-l border-r border-t rounded-t-lg bg-white">
2021-11-25 09:28:45 +00:00
<NavTab href=".">Overview</NavTab>
{txData.confirmedData?.blockNumber !== undefined && (
2021-11-25 09:28:45 +00:00
<NavTab href="logs">
Logs
{txData && ` (${txData.confirmedData?.logs?.length ?? 0})`}
</NavTab>
)}
2021-11-25 09:28:45 +00:00
<NavTab href="trace">Trace</NavTab>
</Tab.List>
</Tab.Group>
<React.Suspense fallback={null}>
2021-11-25 09:28:45 +00:00
<Routes>
<Route
index
element={
<Details
txData={txData}
txDesc={txDesc}
2021-12-14 00:03:13 +00:00
toMetadata={metadata}
2021-11-25 09:28:45 +00:00
userDoc={metadata?.output.userdoc}
devDoc={metadata?.output.devdoc}
internalOps={internalOps}
sendsEthToMiner={sendsEthToMiner}
ethUSDPrice={blockETHUSDPrice}
resolvedAddresses={resolvedAddresses}
/>
}
/>
<Route
path="logs"
element={
<Logs
txData={txData}
metadata={metadata}
resolvedAddresses={resolvedAddresses}
/>
}
/>
<Route
path="trace"
element={
<Trace
txData={txData}
resolvedAddresses={resolvedAddresses}
/>
}
/>
</Routes>
</React.Suspense>
</SelectionContext.Provider>
)}
</StandardFrame>
</SelectedTransactionContext.Provider>
2021-07-01 18:21:40 +00:00
);
};
2021-11-25 09:28:45 +00:00
export default Transaction;