otterscan/src/Transaction.tsx

117 lines
3.5 KiB
TypeScript
Raw Normal View History

2021-08-01 09:59:59 +00:00
import React, { useMemo, useContext } from "react";
2021-07-01 18:21:40 +00:00
import { Route, Switch, useParams } 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-09-15 17:43:36 +00:00
import { useSourcify, useTransactionDescription } from "./useSourcify";
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-07-01 18:21:40 +00:00
type TransactionParams = {
txhash: string;
};
const Transaction: React.FC = () => {
2021-07-09 05:07:20 +00:00
const { provider } = useContext(RuntimeContext);
2021-07-01 18:21:40 +00:00
const params = useParams<TransactionParams>();
const { txhash } = params;
2021-08-01 09:59:59 +00:00
const txData = useTxData(provider, txhash);
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 (
<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>
)}
2021-07-01 18:21:40 +00:00
{txData && (
<SelectionContext.Provider value={selectionCtx}>
2021-09-06 06:43:20 +00:00
<Tab.Group>
<Tab.List className="flex space-x-2 border-l border-r border-t rounded-t-lg bg-white">
<NavTab href={`/tx/${txhash}`}>Overview</NavTab>
{txData.confirmedData?.blockNumber !== undefined && (
<NavTab href={`/tx/${txhash}/logs`}>
Logs
{txData && ` (${txData.confirmedData?.logs?.length ?? 0})`}
</NavTab>
)}
</Tab.List>
</Tab.Group>
2021-10-24 04:04:18 +00:00
<React.Suspense fallback={null}>
<Switch>
<Route path="/tx/:txhash/" exact>
<Details
txData={txData}
txDesc={txDesc}
userDoc={metadata?.output.userdoc}
devDoc={metadata?.output.devdoc}
internalOps={internalOps}
sendsEthToMiner={sendsEthToMiner}
ethUSDPrice={blockETHUSDPrice}
/>
</Route>
<Route path="/tx/:txhash/logs/" exact>
<Logs txData={txData} metadata={metadata} />
</Route>
</Switch>
</React.Suspense>
</SelectionContext.Provider>
2021-07-01 18:21:40 +00:00
)}
</StandardFrame>
);
};
export default React.memo(Transaction);