From 874d148777d8068dc59883ae8a38ab36e7585dec Mon Sep 17 00:00:00 2001 From: smypmsa Date: Tue, 5 Aug 2025 16:09:05 +0000 Subject: [PATCH] fix(core): use logger exception --- src/core/client.py | 14 +++++----- src/core/priority_fee/dynamic_fee.py | 6 ++-- src/monitoring/universal_block_listener.py | 12 ++++---- src/monitoring/universal_geyser_listener.py | 13 ++++----- src/monitoring/universal_logs_listener.py | 12 ++++---- .../universal_pumpportal_listener.py | 12 ++++---- src/platforms/letsbonk/curve_manager.py | 6 ++-- .../letsbonk/pumpportal_processor.py | 4 +-- src/platforms/pumpfun/curve_manager.py | 6 ++-- src/platforms/pumpfun/event_parser.py | 4 +-- src/platforms/pumpfun/pumpportal_processor.py | 4 +-- src/trading/universal_trader.py | 28 +++++++++---------- src/utils/idl_manager.py | 2 +- 13 files changed, 60 insertions(+), 63 deletions(-) diff --git a/src/core/client.py b/src/core/client.py index 1bda0ab..08febce 100644 --- a/src/core/client.py +++ b/src/core/client.py @@ -186,7 +186,7 @@ class SolanaClient: except Exception as e: if attempt == max_retries - 1: - logger.error( + logger.exception( f"Failed to send transaction after {max_retries} attempts" ) raise @@ -215,8 +215,8 @@ class SolanaClient: signature, commitment=commitment, sleep_seconds=1 ) return True - except Exception as e: - logger.error(f"Failed to confirm transaction {signature}: {e!s}") + except Exception: + logger.exception(f"Failed to confirm transaction {signature}") return False async def post_rpc(self, body: dict[str, Any]) -> dict[str, Any] | None: @@ -238,9 +238,9 @@ class SolanaClient: ) as response: response.raise_for_status() return await response.json() - except aiohttp.ClientError as e: - logger.error(f"RPC request failed: {e!s}", exc_info=True) + except aiohttp.ClientError: + logger.exception("RPC request failed") return None - except json.JSONDecodeError as e: - logger.error(f"Failed to decode RPC response: {e!s}", exc_info=True) + except json.JSONDecodeError: + logger.exception("Failed to decode RPC response") return None diff --git a/src/core/priority_fee/dynamic_fee.py b/src/core/priority_fee/dynamic_fee.py index b04235d..aaf579c 100644 --- a/src/core/priority_fee/dynamic_fee.py +++ b/src/core/priority_fee/dynamic_fee.py @@ -62,8 +62,6 @@ class DynamicPriorityFee(PriorityFeePlugin): return prior_fee - except Exception as e: - logger.error( - f"Failed to fetch recent priority fee: {str(e)}", exc_info=True - ) + except Exception: + logger.exception("Failed to fetch recent priority fee") return None diff --git a/src/monitoring/universal_block_listener.py b/src/monitoring/universal_block_listener.py index 3b66fbb..1daa42e 100644 --- a/src/monitoring/universal_block_listener.py +++ b/src/monitoring/universal_block_listener.py @@ -129,8 +129,8 @@ class UniversalBlockListener(BaseTokenListener): logger.warning("WebSocket connection closed. Reconnecting...") ping_task.cancel() - except Exception as e: - logger.error(f"WebSocket connection error: {e!s}") + except Exception: + logger.exception("WebSocket connection error") logger.info("Reconnecting in 5 seconds...") await asyncio.sleep(5) @@ -183,8 +183,8 @@ class UniversalBlockListener(BaseTokenListener): return except asyncio.CancelledError: pass - except Exception as e: - logger.error(f"Ping error: {e!s}") + except Exception: + logger.exception("Ping error") async def _wait_for_token_creation(self, websocket) -> TokenInfo | None: """Wait for token creation event from any platform. @@ -234,7 +234,7 @@ class UniversalBlockListener(BaseTokenListener): except websockets.exceptions.ConnectionClosed: logger.warning("WebSocket connection closed") raise - except Exception as e: - logger.error(f"Error processing WebSocket message: {e!s}") + except Exception: + logger.exception("Error processing WebSocket message") return None \ No newline at end of file diff --git a/src/monitoring/universal_geyser_listener.py b/src/monitoring/universal_geyser_listener.py index 40dfcd0..84de51a 100644 --- a/src/monitoring/universal_geyser_listener.py +++ b/src/monitoring/universal_geyser_listener.py @@ -160,18 +160,17 @@ class UniversalGeyserListener(BaseTokenListener): await token_callback(token_info) except Exception as e: - import grpc if isinstance(e, grpc.aio.AioRpcError): - logger.error(f"gRPC error: {e.details()}") + logger.exception(f"gRPC error: {e.details()}") else: - logger.error(f"Geyser error: {e}") + logger.exception("Geyser error occurred") await asyncio.sleep(5) finally: await channel.close() - except Exception as e: - logger.error(f"Geyser connection error: {e}") + except Exception: + logger.exception("Geyser connection error") logger.info("Reconnecting in 10 seconds...") await asyncio.sleep(10) @@ -208,6 +207,6 @@ class UniversalGeyserListener(BaseTokenListener): return None - except Exception as e: - logger.error(f"Error processing Geyser update: {e}") + except Exception: + logger.exception("Error processing Geyser update") return None \ No newline at end of file diff --git a/src/monitoring/universal_logs_listener.py b/src/monitoring/universal_logs_listener.py index e76dcf9..b6fe49c 100644 --- a/src/monitoring/universal_logs_listener.py +++ b/src/monitoring/universal_logs_listener.py @@ -127,8 +127,8 @@ class UniversalLogsListener(BaseTokenListener): logger.warning("WebSocket connection closed. Reconnecting...") ping_task.cancel() - except Exception as e: - logger.error(f"WebSocket connection error: {e!s}") + except Exception: + logger.exception("WebSocket connection error") logger.info("Reconnecting in 5 seconds...") await asyncio.sleep(5) @@ -177,8 +177,8 @@ class UniversalLogsListener(BaseTokenListener): return except asyncio.CancelledError: pass - except Exception as e: - logger.error(f"Ping error: {e!s}") + except Exception: + logger.exception("Ping error") async def _wait_for_token_creation(self, websocket) -> TokenInfo | None: """Wait for token creation events from any platform.""" @@ -206,7 +206,7 @@ class UniversalLogsListener(BaseTokenListener): except websockets.exceptions.ConnectionClosed: logger.warning("WebSocket connection closed") raise - except Exception as e: - logger.error(f"Error processing WebSocket message: {e!s}") + except Exception: + logger.exception("Error processing WebSocket message") return None \ No newline at end of file diff --git a/src/monitoring/universal_pumpportal_listener.py b/src/monitoring/universal_pumpportal_listener.py index a3778b5..5a4818e 100644 --- a/src/monitoring/universal_pumpportal_listener.py +++ b/src/monitoring/universal_pumpportal_listener.py @@ -156,8 +156,8 @@ class UniversalPumpPortalListener(BaseTokenListener): return except asyncio.CancelledError: pass - except Exception as e: - logger.error(f"Ping error: {e}") + except Exception: + logger.exception("Ping error") async def _wait_for_token_creation(self, websocket) -> TokenInfo | None: """Wait for token creation event from PumpPortal. @@ -208,9 +208,9 @@ class UniversalPumpPortalListener(BaseTokenListener): except websockets.exceptions.ConnectionClosed: logger.warning("PumpPortal WebSocket connection closed") raise - except json.JSONDecodeError as e: - logger.error(f"Failed to decode PumpPortal message: {e}") - except Exception as e: - logger.error(f"Error processing PumpPortal WebSocket message: {e}") + except json.JSONDecodeError: + logger.exception("Failed to decode PumpPortal message") + except Exception: + logger.exception("Error processing PumpPortal WebSocket message") return None \ No newline at end of file diff --git a/src/platforms/letsbonk/curve_manager.py b/src/platforms/letsbonk/curve_manager.py index 395fe6e..2b46594 100644 --- a/src/platforms/letsbonk/curve_manager.py +++ b/src/platforms/letsbonk/curve_manager.py @@ -60,7 +60,7 @@ class LetsBonkCurveManager(CurveManager): return pool_state_data except Exception as e: - logger.error(f"Failed to get pool state: {e!s}") + logger.exception("Failed to get pool state") raise ValueError(f"Invalid pool state: {e!s}") async def calculate_price(self, pool_address: Pubkey) -> float: @@ -239,6 +239,6 @@ class LetsBonkCurveManager(CurveManager): return True - except Exception as e: - logger.error(f"Pool state validation failed: {e}") + except Exception: + logger.exception("Pool state validation failed") return False \ No newline at end of file diff --git a/src/platforms/letsbonk/pumpportal_processor.py b/src/platforms/letsbonk/pumpportal_processor.py index 4af1431..ce03b08 100644 --- a/src/platforms/letsbonk/pumpportal_processor.py +++ b/src/platforms/letsbonk/pumpportal_processor.py @@ -113,6 +113,6 @@ class LetsBonkPumpPortalProcessor: creator=creator, ) - except Exception as e: - logger.error(f"Failed to process PumpPortal LetsBonk token data: {e}") + except Exception: + logger.exception("Failed to process PumpPortal LetsBonk token data") return None \ No newline at end of file diff --git a/src/platforms/pumpfun/curve_manager.py b/src/platforms/pumpfun/curve_manager.py index b113c3c..b4948e6 100644 --- a/src/platforms/pumpfun/curve_manager.py +++ b/src/platforms/pumpfun/curve_manager.py @@ -58,7 +58,7 @@ class PumpFunCurveManager(CurveManager): return curve_state_data except Exception as e: - logger.error(f"Failed to get curve state: {e!s}") + logger.exception("Failed to get curve state") raise ValueError(f"Invalid bonding curve state: {e!s}") async def calculate_price(self, pool_address: Pubkey) -> float: @@ -317,6 +317,6 @@ class PumpFunCurveManager(CurveManager): return True - except Exception as e: - logger.error(f"Curve state validation failed: {e}") + except Exception: + logger.exception("Curve state validation failed") return False \ No newline at end of file diff --git a/src/platforms/pumpfun/event_parser.py b/src/platforms/pumpfun/event_parser.py index b3e1405..3ff620d 100644 --- a/src/platforms/pumpfun/event_parser.py +++ b/src/platforms/pumpfun/event_parser.py @@ -191,8 +191,8 @@ class PumpFunEventParser(EventParser): logger.info("❌ No valid CreateEvent found in any Program data entries") return None - except Exception as e: - logger.error(f"Failed to parse token creation from logs: {e}") + except Exception: + logger.exception("Failed to parse token creation from logs") return None def parse_token_creation_from_instruction( diff --git a/src/platforms/pumpfun/pumpportal_processor.py b/src/platforms/pumpfun/pumpportal_processor.py index dc98d6b..1c56123 100644 --- a/src/platforms/pumpfun/pumpportal_processor.py +++ b/src/platforms/pumpfun/pumpportal_processor.py @@ -99,6 +99,6 @@ class PumpFunPumpPortalProcessor: creator_vault=creator_vault, ) - except Exception as e: - logger.error(f"Failed to process PumpPortal token data: {e}") + except Exception: + logger.exception("Failed to process PumpPortal token data") return None \ No newline at end of file diff --git a/src/trading/universal_trader.py b/src/trading/universal_trader.py index 9cbe827..3b50da6 100644 --- a/src/trading/universal_trader.py +++ b/src/trading/universal_trader.py @@ -110,8 +110,8 @@ class UniversalTrader: from platforms import platform_factory if not platform_factory.registry.is_platform_supported(self.platform): raise ValueError(f"Platform {self.platform.value} is not supported") - except Exception as e: - logger.error(f"Platform validation failed: {e}") + except Exception: + logger.exception("Platform validation failed") raise # Get platform-specific implementations @@ -234,8 +234,8 @@ class UniversalTrader: self.match_string, self.bro_address, ) - except Exception as e: - logger.error(f"Token listening stopped due to error: {e!s}") + except Exception: + logger.exception("Token listening stopped due to error") finally: processor_task.cancel() try: @@ -243,8 +243,8 @@ class UniversalTrader: except asyncio.CancelledError: pass - except Exception as e: - logger.error(f"Trading stopped due to error: {e!s}") + except Exception: + logger.exception("Trading stopped due to error") finally: await self._cleanup_resources() @@ -306,8 +306,8 @@ class UniversalTrader: self.cleanup_with_priority_fee, self.cleanup_force_close_with_burn, ) - except Exception as e: - logger.error(f"Error during cleanup: {e!s}") + except Exception: + logger.exception("Error during cleanup") old_keys = {k for k in self.token_timestamps if k not in self.processed_tokens} for key in old_keys: @@ -352,8 +352,8 @@ class UniversalTrader: except asyncio.CancelledError: logger.info("Token queue processor was cancelled") break - except Exception as e: - logger.error(f"Error in token queue processor: {e!s}") + except Exception: + logger.exception("Error in token queue processor") finally: self.token_queue.task_done() @@ -385,8 +385,8 @@ class UniversalTrader: logger.info(f"YOLO mode enabled. Waiting {self.wait_time_before_new_token} seconds before looking for next token...") await asyncio.sleep(self.wait_time_before_new_token) - except Exception as e: - logger.error(f"Error handling token {token_info.symbol}: {e!s}") + except Exception: + logger.exception(f"Error handling token {token_info.symbol}") async def _handle_successful_buy(self, token_info: TokenInfo, buy_result: TradeResult) -> None: """Handle successful token purchase.""" @@ -526,8 +526,8 @@ class UniversalTrader: # Wait before next price check await asyncio.sleep(self.price_check_interval) - except Exception as e: - logger.error(f"Error monitoring position: {e}") + except Exception: + logger.exception("Error monitoring position") await asyncio.sleep(self.price_check_interval) # Continue monitoring despite errors def _get_pool_address(self, token_info: TokenInfo) -> Pubkey: diff --git a/src/utils/idl_manager.py b/src/utils/idl_manager.py index 576a7b2..e8fb69a 100644 --- a/src/utils/idl_manager.py +++ b/src/utils/idl_manager.py @@ -242,7 +242,7 @@ class IDLManager: "event_count": len(event_names), } except Exception as e: - logger.error(f"Failed to get capabilities for {platform.value}: {e}") + logger.exception(f"Failed to get capabilities for {platform.value}") return { "platform": platform.value, "has_idl_support": False,