From 5ea36e8958ba96315999f069aeb69159f2d64d74 Mon Sep 17 00:00:00 2001 From: defiQUG Date: Thu, 16 Apr 2026 14:00:20 -0700 Subject: [PATCH] Default contract interactions to read-only --- frontend/src/pages/addresses/[address].tsx | 34 ++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/addresses/[address].tsx b/frontend/src/pages/addresses/[address].tsx index b9be8fe..ec9545d 100644 --- a/frontend/src/pages/addresses/[address].tsx +++ b/frontend/src/pages/addresses/[address].tsx @@ -36,11 +36,17 @@ function isValidAddress(value: string) { return /^0x[a-fA-F0-9]{40}$/.test(value) } +function isContractWriteExecutionEnabled() { + const value = (process.env.NEXT_PUBLIC_ENABLE_CONTRACT_WRITES || '').trim().toLowerCase() + return value === '1' || value === 'true' || value === 'yes' +} + export default function AddressDetailPage() { const router = useRouter() const address = typeof router.query.address === 'string' ? router.query.address : '' const isValidAddressParam = address !== '' && isValidAddress(address) const chainId = parseInt(process.env.NEXT_PUBLIC_CHAIN_ID || '138') + const contractWriteExecutionEnabled = isContractWriteExecutionEnabled() const [addressInfo, setAddressInfo] = useState(null) const [transactions, setTransactions] = useState([]) @@ -537,7 +543,24 @@ export default function AddressDetailPage() {
{contractProfile?.has_custom_methods_read ? : } - {contractProfile?.has_custom_methods_write ? : } + {contractProfile?.has_custom_methods_write ? ( + + ) : } +
+
+ +
+
+ +
+
+ {contractWriteExecutionEnabled + ? 'This session allows direct contract write prompts from the explorer. Use only in controlled operator environments.' + : 'State-changing contract execution is disabled in the default explorer experience so investigation stays read-only and easier to govern.'} +
@@ -681,7 +704,7 @@ export default function AddressDetailPage() { )} - {contractProfile?.write_methods && contractProfile.write_methods.length > 0 && ( + {contractProfile?.write_methods && contractProfile.write_methods.length > 0 && contractWriteExecutionEnabled && (
{contractProfile.write_methods.slice(0, 6).map((method) => ( @@ -742,6 +765,13 @@ export default function AddressDetailPage() {
)} + {contractProfile?.write_methods && contractProfile.write_methods.length > 0 && !contractWriteExecutionEnabled && ( + +
+ Direct write execution is disabled in this explorer environment. Review the ABI and method signatures here, then use a separate operator-approved contract console if execution is required. +
+
+ )} {contractProfile?.creation_bytecode && (