@@ -19,6 +19,7 @@ import type { ProtocolSnapshot } from '../shared/protocol/index.ts';
1919
2020const MAINNET_REGISTRY_ADDRESS = '0x35b22e09Ee0390539439E24f06Da43D83f90e298' as Address ;
2121const TESTNET_REGISTRY_ADDRESS = '0xA0BFb1B494FB49041e5c6e8c2C1BE09cD171c6Ba' as Address ;
22+ const MONITOR_SESSION_CACHE_MS = 10 * 60 * 1_000 ;
2223
2324const createConfig = ( isTestnet : boolean , rpcOverride : string | null ) : MonitorConfigInput => {
2425 const chainId = isTestnet ? 11155111 : 1 ;
@@ -44,6 +45,9 @@ export function App() {
4445 testnet : getRpcOverride ( 11_155_111 ) ,
4546 } ) ) ;
4647 const [ scannerGeneration , setScannerGeneration ] = useState ( 0 ) ;
48+ const [ isScannerMounted , setIsScannerMounted ] = useState (
49+ ( ) => location . view === 'monitor' ,
50+ ) ;
4751 const [ protocolGuide , setProtocolGuide ] = useState < {
4852 isOpen : boolean ;
4953 protocol : ProtocolSnapshot | null ;
@@ -67,12 +71,10 @@ export function App() {
6771 const next = urlForView ( window . location . href , view ) ;
6872 window . history . pushState ( { } , '' , next ) ;
6973 if ( location . view !== view ) setCurrentProtocol ( null ) ;
70- if ( location . view === 'pingme' && view !== 'pingme' ) {
71- restartScanner ( ) ;
72- }
74+ if ( view === 'monitor' ) setIsScannerMounted ( true ) ;
7375 setLocation ( parseAppSearch ( next . search ) ) ;
7476 window . scrollTo ( { top : 0 , behavior : 'smooth' } ) ;
75- } , [ location . view , restartScanner ] ) ;
77+ } , [ location . view ] ) ;
7678
7779 const toggleNetwork = useCallback ( ( ) => {
7880 const network = isTestnet ? 'mainnet' : 'testnet' ;
@@ -129,14 +131,24 @@ export function App() {
129131 useEffect ( ( ) => {
130132 const handlePopState = ( ) => {
131133 const next = parseAppSearch ( window . location . search ) ;
132- if ( next . network !== location . network || ( location . view === 'pingme' && next . view === 'monitor' ) ) {
134+ if ( next . network !== location . network ) {
133135 restartScanner ( ) ;
134136 }
137+ if ( next . view === 'monitor' ) setIsScannerMounted ( true ) ;
135138 setLocation ( next ) ;
136139 } ;
137140 window . addEventListener ( 'popstate' , handlePopState ) ;
138141 return ( ) => window . removeEventListener ( 'popstate' , handlePopState ) ;
139- } , [ location . network , location . view , restartScanner ] ) ;
142+ } , [ location . network , restartScanner ] ) ;
143+
144+ useEffect ( ( ) => {
145+ if ( location . view === 'monitor' || ! isScannerMounted ) return ;
146+ const timeout = window . setTimeout ( ( ) => {
147+ resetMonitor ( ) ;
148+ setIsScannerMounted ( false ) ;
149+ } , MONITOR_SESSION_CACHE_MS ) ;
150+ return ( ) => window . clearTimeout ( timeout ) ;
151+ } , [ isScannerMounted , location . view , resetMonitor ] ) ;
140152
141153 return (
142154 < div className = "min-h-screen bg-brand-black text-white" >
@@ -150,6 +162,13 @@ export function App() {
150162 onNavigate = { navigateTo }
151163 onOpenProtocolGuide = { ( ) => openProtocolGuide ( currentProtocol ) }
152164 />
165+ { isScannerMounted && (
166+ < ScannerRuntime
167+ key = { `${ location . network } :${ scannerGeneration } ` }
168+ config = { config }
169+ active = { location . view === 'monitor' }
170+ />
171+ ) }
153172 { location . view === 'pingme' ? (
154173 < main className = "mx-auto max-w-7xl px-4 py-8" >
155174 < BackendOverview
@@ -164,28 +183,31 @@ export function App() {
164183 />
165184 </ main >
166185 ) : (
167- < >
168- < ScannerRuntime key = { `${ location . network } :${ scannerGeneration } ` } config = { config } />
169- < Dashboard
170- key = { `${ location . network } :${ location . watchlistAddresses . join ( ',' ) } ` }
171- configInput = { config }
172- network = { location . network }
173- linkedAddresses = { location . watchlistAddresses }
174- selectedCaseId = { location . selectedCaseId }
175- onResetRpc = { resetRpc }
176- onToggleNetwork = { toggleNetwork }
177- onUpdateRpc = { updateRpc }
178- onWatchlistChange = { updateWatchlist }
179- onOpenProtocolGuide = { openProtocolGuide }
180- onProtocolChange = { updateCurrentProtocol }
181- />
182- </ >
186+ < Dashboard
187+ key = { `${ location . network } :${ location . watchlistAddresses . join ( ',' ) } ` }
188+ configInput = { config }
189+ network = { location . network }
190+ linkedAddresses = { location . watchlistAddresses }
191+ selectedCaseId = { location . selectedCaseId }
192+ onResetRpc = { resetRpc }
193+ onToggleNetwork = { toggleNetwork }
194+ onUpdateRpc = { updateRpc }
195+ onWatchlistChange = { updateWatchlist }
196+ onOpenProtocolGuide = { openProtocolGuide }
197+ onProtocolChange = { updateCurrentProtocol }
198+ />
183199 ) }
184200 </ div >
185201 ) ;
186202}
187203
188- function ScannerRuntime ( { config } : { config : MonitorConfigInput } ) {
189- useSlashingMonitor ( config ) ;
204+ function ScannerRuntime ( {
205+ config,
206+ active,
207+ } : {
208+ config : MonitorConfigInput ;
209+ active : boolean ;
210+ } ) {
211+ useSlashingMonitor ( config , active ) ;
190212 return null ;
191213}
0 commit comments