2021-11-01 20:40:38 +00:00
|
|
|
import React, { useContext, useMemo } from "react";
|
2021-10-27 01:10:37 +00:00
|
|
|
import ContentFrame from "../ContentFrame";
|
2021-11-07 20:46:42 +00:00
|
|
|
import TransactionAddress from "../components/TransactionAddress";
|
2021-11-01 20:09:47 +00:00
|
|
|
import TraceItem from "./TraceItem";
|
2021-10-27 01:10:37 +00:00
|
|
|
import { TransactionData } from "../types";
|
2021-10-28 20:31:57 +00:00
|
|
|
import { useBatch4Bytes } from "../use4Bytes";
|
|
|
|
|
import { useTraceTransaction, useUniqueSignatures } from "../useErigonHooks";
|
2021-10-27 01:10:37 +00:00
|
|
|
import { RuntimeContext } from "../useRuntime";
|
2021-11-01 20:09:47 +00:00
|
|
|
import { ResolvedAddresses } from "../api/address-resolver";
|
2021-11-01 20:40:38 +00:00
|
|
|
import { tracesCollector, useResolvedAddresses } from "../useResolvedAddresses";
|
2021-10-27 01:10:37 +00:00
|
|
|
|
|
|
|
|
type TraceProps = {
|
|
|
|
|
txData: TransactionData;
|
2021-11-01 20:09:47 +00:00
|
|
|
resolvedAddresses: ResolvedAddresses | undefined;
|
2021-10-27 01:10:37 +00:00
|
|
|
};
|
|
|
|
|
|
2021-11-01 20:09:47 +00:00
|
|
|
const Trace: React.FC<TraceProps> = ({ txData, resolvedAddresses }) => {
|
2021-10-27 01:10:37 +00:00
|
|
|
const { provider } = useContext(RuntimeContext);
|
|
|
|
|
const traces = useTraceTransaction(provider, txData.transactionHash);
|
2021-10-28 20:21:01 +00:00
|
|
|
const uniqueSignatures = useUniqueSignatures(traces);
|
|
|
|
|
const sigMap = useBatch4Bytes(uniqueSignatures);
|
2021-10-27 01:10:37 +00:00
|
|
|
|
2021-11-01 20:40:38 +00:00
|
|
|
const addrCollector = useMemo(() => tracesCollector(traces), [traces]);
|
|
|
|
|
const traceResolvedAddresses = useResolvedAddresses(provider, addrCollector);
|
|
|
|
|
const mergedResolvedAddresses = useMemo(() => {
|
|
|
|
|
const merge = {};
|
|
|
|
|
if (resolvedAddresses) {
|
|
|
|
|
Object.assign(merge, resolvedAddresses);
|
|
|
|
|
}
|
|
|
|
|
if (traceResolvedAddresses) {
|
|
|
|
|
Object.assign(merge, traceResolvedAddresses);
|
|
|
|
|
}
|
|
|
|
|
return merge;
|
|
|
|
|
}, [resolvedAddresses, traceResolvedAddresses]);
|
|
|
|
|
|
2021-10-27 01:10:37 +00:00
|
|
|
return (
|
|
|
|
|
<ContentFrame tabs>
|
2021-10-27 04:34:44 +00:00
|
|
|
<div className="mt-4 mb-5 space-y-3 font-code text-sm flex flex-col items-start overflow-x-auto">
|
2021-11-07 20:42:10 +00:00
|
|
|
<div className="border hover:border-gray-500 rounded px-1 py-0.5">
|
2021-11-07 20:46:42 +00:00
|
|
|
<TransactionAddress
|
|
|
|
|
address={txData.from}
|
|
|
|
|
resolvedAddresses={resolvedAddresses}
|
|
|
|
|
/>
|
2021-10-27 01:10:37 +00:00
|
|
|
</div>
|
2021-11-07 20:52:29 +00:00
|
|
|
<div className="ml-5 space-y-3">
|
|
|
|
|
{traces?.map((t, i, a) => (
|
|
|
|
|
<TraceItem
|
|
|
|
|
key={i}
|
|
|
|
|
t={t}
|
|
|
|
|
last={i === a.length - 1}
|
|
|
|
|
fourBytesMap={sigMap}
|
|
|
|
|
resolvedAddresses={mergedResolvedAddresses}
|
|
|
|
|
/>
|
|
|
|
|
))}
|
2021-10-27 04:14:42 +00:00
|
|
|
</div>
|
2021-10-27 01:10:37 +00:00
|
|
|
</div>
|
|
|
|
|
</ContentFrame>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default React.memo(Trace);
|