55import logging
66import os
77from http .server import BaseHTTPRequestHandler
8- from typing import Dict , Set , Tuple
8+ from typing import Any , Dict , Set , Tuple
99
1010from common .state .blob_storage import BlobConfig , BlobStorageHandler
1111from common .state .blockchain_fetcher import BlockchainData , BlockchainDataFetcher
12+ from common .state .blockchain_state import BlockchainState
1213
1314SUPPORTED_BLOCKCHAINS = ["ethereum" , "solana" , "ton" , "base" ]
1415ALLOWED_PROVIDERS = {"Chainstack" }
@@ -32,6 +33,7 @@ def __init__(self):
3233 raise ValueError ("Missing required blob storage configuration" )
3334
3435 self .blob_config = BlobConfig (store_id = store_id , token = token ) # type: ignore
36+ self .logger = logging .getLogger (__name__ )
3537
3638 async def _get_chainstack_endpoints (self ) -> Dict [str , str ]:
3739 """Get Chainstack endpoints for supported blockchains."""
@@ -54,18 +56,55 @@ async def _get_chainstack_endpoints(self) -> Dict[str, str]:
5456
5557 return chainstack_endpoints
5658
59+ async def _get_previous_data (self ) -> Dict [str , Any ]:
60+ """Fetch previous blockchain state data"""
61+ try :
62+ state = BlockchainState ()
63+ previous_data = {}
64+ for blockchain in SUPPORTED_BLOCKCHAINS :
65+ try :
66+ chain_data = await state .get_data (blockchain )
67+ if chain_data :
68+ previous_data [blockchain ] = chain_data
69+ except Exception as e :
70+ self .logger .warning (
71+ f"Failed to get previous data for { blockchain } : { e } "
72+ )
73+ return previous_data
74+ except Exception as e :
75+ self .logger .error (f"Failed to get previous state data: { e } " )
76+ return {}
77+
5778 async def _collect_blockchain_data (
58- self , providers : Dict [str , str ]
79+ self , providers : Dict [str , str ], previous_data : Dict [ str , Any ]
5980 ) -> Dict [str , dict ]:
6081 async def fetch_single (
6182 blockchain : str , endpoint : str
6283 ) -> Tuple [str , Dict [str , str ]]:
6384 try :
6485 fetcher = BlockchainDataFetcher (endpoint )
6586 data : BlockchainData = await fetcher .fetch_latest_data (blockchain )
66- return blockchain , {"block" : data .block_id , "tx" : data .transaction_id }
87+
88+ if data .block_id and data .transaction_id :
89+ return blockchain , {
90+ "block" : data .block_id ,
91+ "tx" : data .transaction_id ,
92+ }
93+
94+ if blockchain in previous_data :
95+ self .logger .warning (f"Using previous data for { blockchain } " )
96+ return blockchain , previous_data [blockchain ]
97+
98+ self .logger .warning (f"Returning empty data for { blockchain } " )
99+ return blockchain , {"block" : "" , "tx" : "" }
67100 except Exception as e :
68- logging .error (f"Failed to fetch { blockchain } data: { e } " )
101+ self .logger .error (f"Failed to fetch { blockchain } data: { e } " )
102+ if blockchain in previous_data :
103+ self .logger .warning (
104+ f"Using previous data for { blockchain } after error"
105+ )
106+ return blockchain , previous_data [blockchain ]
107+ self .logger .warning (f"Returning empty data for { blockchain } " )
69108 return blockchain , {"block" : "" , "tx" : "" }
70109
71110 tasks = [
@@ -85,21 +124,31 @@ async def update(self) -> str:
85124 return "Region not authorized for state updates"
86125
87126 try :
88- providers = await self ._get_chainstack_endpoints ()
89- blockchain_data = await self ._collect_blockchain_data (providers )
127+ previous_data = await self ._get_previous_data ()
128+
129+ chainstack_endpoints = await self ._get_chainstack_endpoints ()
130+ blockchain_data = await self ._collect_blockchain_data (
131+ chainstack_endpoints , previous_data
132+ )
133+
134+ # If we didn't get any data, use previous data
90135 if not blockchain_data :
91- return "No blockchain data collected"
136+ if previous_data :
137+ self .logger .warning ("Using complete previous state as fallback" )
138+ blockchain_data = previous_data
139+ else :
140+ return "No blockchain data collected and no previous data available"
92141
93142 blob_handler = BlobStorageHandler (self .blob_config )
94143 await blob_handler .update_data (blockchain_data )
95144
96145 return "State updated successfully"
97146
98147 except MissingEndpointsError as e :
99- logging .error (f"Configuration error: { e } " )
148+ self . logger .error (f"Configuration error: { e } " )
100149 raise
101150 except Exception as e :
102- logging .error (f"State update failed: { e } " )
151+ self . logger .error (f"State update failed: { e } " )
103152 raise
104153
105154
0 commit comments