diff --git a/src/App.tsx b/src/App.tsx index 19249bd5..2a358a1d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -47,6 +47,7 @@ import { LazySettings, LazySubscriptions, LazySupporters, + LazyTokenDetails, LazyTx, LazyTxs, } from "./components/LazyComponents"; @@ -105,6 +106,7 @@ function AppContent() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/components/LazyComponents.tsx b/src/components/LazyComponents.tsx index 70262c97..64102e83 100644 --- a/src/components/LazyComponents.tsx +++ b/src/components/LazyComponents.tsx @@ -9,6 +9,7 @@ const Block = lazy(() => import("./pages/block")); const Txs = lazy(() => import("./pages/txs")); const Tx = lazy(() => import("./pages/tx")); const Address = lazy(() => import("./pages/address")); +const TokenDetails = lazy(() => import("./pages/tokenDetails")); const Mempool = lazy(() => import("./pages/mempool")); const Settings = lazy(() => import("./pages/settings")); const DevTools = lazy(() => import("./pages/devtools")); @@ -38,6 +39,7 @@ export const LazyBlock = withSuspense(Block); export const LazyTxs = withSuspense(Txs); export const LazyTx = withSuspense(Tx); export const LazyAddress = withSuspense(Address); +export const LazyTokenDetails = withSuspense(TokenDetails); export const LazyMempool = withSuspense(Mempool); export const LazySettings = withSuspense(Settings); export const LazyDevTools = withSuspense(DevTools); diff --git a/src/components/pages/address/AddressDisplay.tsx b/src/components/pages/address/AddressDetails.tsx similarity index 62% rename from src/components/pages/address/AddressDisplay.tsx rename to src/components/pages/address/AddressDetails.tsx index 0aeecd6b..4f25202b 100644 --- a/src/components/pages/address/AddressDisplay.tsx +++ b/src/components/pages/address/AddressDetails.tsx @@ -19,7 +19,7 @@ import type { Transaction, } from "../../../types"; import { RPCIndicator } from "../../common/RPCIndicator"; -import ENSRecordsDisplay from "./ENSRecordsDisplay"; +import ENSRecordsDisplay from "./shared/ENSRecordsDisplay"; interface AddressDisplayProps { address: Address; @@ -325,28 +325,11 @@ const AddressDisplay: React.FC = React.memo( return (
-
+
Address {(ensName || reverseResult?.ensName) && ( - - {ensName || reverseResult?.ensName} - + {ensName || reverseResult?.ensName} )} {addressHash}
@@ -659,14 +642,7 @@ const AddressDisplay: React.FC = React.memo( {/* Contract ABI */} {contractData.abi && contractData.abi.length > 0 && (
-
+
Functions {({ @@ -691,11 +667,7 @@ const AddressDisplay: React.FC = React.memo(
{(() => { @@ -704,25 +676,7 @@ const AddressDisplay: React.FC = React.memo( @@ -734,16 +688,7 @@ const AddressDisplay: React.FC = React.memo( @@ -751,38 +696,17 @@ const AddressDisplay: React.FC = React.memo( } return ( -
+
@@ -811,7 +726,7 @@ const AddressDisplay: React.FC = React.memo( }}
-
+
{/* Read Functions (view/pure) */} {(() => { const readFunctions = contractData.abi.filter( @@ -822,24 +737,11 @@ const AddressDisplay: React.FC = React.memo( ); return ( readFunctions.length > 0 && ( -
-
+
+
Read Functions ({readFunctions.length})
-
+
{readFunctions.map((func: FunctionABI) => ( @@ -900,24 +774,11 @@ const AddressDisplay: React.FC = React.memo( ); return ( writeFunctions.length > 0 && ( -
-
+
+
Write Functions ({writeFunctions.length})
-
+
{writeFunctions.map((func: FunctionABI) => ( @@ -970,53 +803,24 @@ const AddressDisplay: React.FC = React.memo( {/* Events */} {contractData.abi.filter((item: ABI) => item.type === "event").length > 0 && ( -
-
+
+
Events ( {contractData.abi.filter((item: ABI) => item.type === "event").length} )
-
+
{contractData.abi .filter((item: ABI): item is EventABI => item.type === "event") .slice(0, 10) .map((event: EventABI) => ( - + {event.name} ))} {contractData.abi.filter((item: ABI) => item.type === "event") .length > 10 && ( - + + {contractData.abi.filter((item: ABI) => item.type === "event") .length - 10}{" "} @@ -1029,48 +833,21 @@ const AddressDisplay: React.FC = React.memo( {/* Read Function Form */} {selectedReadFunction && ( -
-
+
+
{selectedReadFunction.name}
{selectedReadFunction.inputs && selectedReadFunction.inputs.length > 0 ? ( -
+
{selectedReadFunction.inputs.map( (input: ABIParameter, idx: number) => ( ), )}
) : ( -
- No parameters required -
+
No parameters required
)} {/* Read Result */} {readFunctionResult !== null && (
-
+
{readFunctionResult?.startsWith("Error") ? "❌ Error" : "✅ Result"} @@ -1148,36 +884,12 @@ const AddressDisplay: React.FC = React.memo(
)} -
+
@@ -1187,23 +899,7 @@ const AddressDisplay: React.FC = React.memo( setSelectedReadFunction(null); setReadFunctionResult(null); }} - style={{ - padding: "10px 16px", - background: "rgba(239, 68, 68, 0.2)", - color: "#ef4444", - border: "1px solid rgba(239, 68, 68, 0.4)", - borderRadius: "6px", - fontSize: "0.85rem", - fontWeight: "600", - cursor: "pointer", - transition: "all 0.2s", - }} - onMouseEnter={(e) => { - e.currentTarget.style.background = "rgba(239, 68, 68, 0.3)"; - }} - onMouseLeave={(e) => { - e.currentTarget.style.background = "rgba(239, 68, 68, 0.2)"; - }} + className="btn-cancel" > Cancel @@ -1213,65 +909,24 @@ const AddressDisplay: React.FC = React.memo( {/* Write Function Form */} {selectedWriteFunction && ( -
-
+
+
{selectedWriteFunction.name} {selectedWriteFunction.stateMutability === "payable" && ( - - payable - + payable )}
{selectedWriteFunction.inputs && selectedWriteFunction.inputs.length > 0 ? ( -
+
{selectedWriteFunction.inputs.map( (input: ABIParameter, idx: number) => ( ), )}
) : ( -
- No parameters required -
+
No parameters required
)} {selectedWriteFunction.stateMutability === "payable" && ( -