|
|
@@ -6,11 +6,14 @@ from decimal import Decimal, ROUND_DOWN
|
|
|
|
|
|
from web3 import Web3
|
|
|
from web3.middleware import ExtraDataToPOAMiddleware # For PoA networks like Goerli, Sepolia, BSC etc.
|
|
|
+from web3.providers import HTTPProvider, WebSocketProvider
|
|
|
+
|
|
|
from eth_account import Account
|
|
|
from dotenv import load_dotenv
|
|
|
from checker.logger_config import get_logger
|
|
|
from encode_decode import decrypt
|
|
|
|
|
|
+from web3_providers import SyncWebSocketProvider
|
|
|
|
|
|
# 配置日志
|
|
|
logger = get_logger('as')
|
|
|
@@ -135,15 +138,34 @@ class EthClient:
|
|
|
if not _hash:
|
|
|
raise ValueError("HASH not provided or found in environment variables.")
|
|
|
|
|
|
- self.w3 = Web3(Web3.HTTPProvider(self.rpc_url))
|
|
|
-
|
|
|
- # 如果连接的是 PoA 网络 (如 Goerli, Sepolia, BSC, Polygon), 需要注入中间件
|
|
|
- # 对于主网,不需要此操作。可以根据 chain_id 动态判断,或者让用户明确。
|
|
|
- # 例如:if self.w3.eth.chain_id in [5, 11155111, 56, 137]: # Goerli, Sepolia, BSC, Polygon
|
|
|
- self.w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0)
|
|
|
+ self.rpc_url = rpc_url or os.getenv("RPC_URL")
|
|
|
|
|
|
+ if not self.rpc_url:
|
|
|
+ raise ValueError("RPC_URL must be provided or set in environment variables.")
|
|
|
+
|
|
|
+ # --- 主要改动在这里 ---
|
|
|
+ if self.rpc_url.startswith("ws://") or self.rpc_url.startswith("wss://"):
|
|
|
+ # 使用我们自定义的同步 WebSocket Provider
|
|
|
+ provider = SyncWebSocketProvider(self.rpc_url)
|
|
|
+ logger.info(f"Using custom SyncWebSocketProvider for {self.rpc_url}")
|
|
|
+ elif self.rpc_url.startswith("http://") or self.rpc_url.startswith("https://"):
|
|
|
+ provider = HTTPProvider(self.rpc_url)
|
|
|
+ logger.info(f"Using HTTPProvider for {self.rpc_url}")
|
|
|
+ else:
|
|
|
+ raise ValueError(f"Invalid RPC URL scheme: {self.rpc_url}.")
|
|
|
+
|
|
|
+ # 使用同步的provider
|
|
|
+ self.w3 = Web3(provider)
|
|
|
+ # 检查是否成功连接
|
|
|
if not self.w3.is_connected():
|
|
|
- raise ConnectionError(f"Failed to connect to Ethereum node at {self.rpc_url}")
|
|
|
+ raise ConnectionError(f"Failed to connect to RPC URL: {self.rpc_url}")
|
|
|
+
|
|
|
+ # 注入 PoA 中间件的逻辑保持不变
|
|
|
+ chain_id = self.w3.eth.chain_id
|
|
|
+ poa_chain_ids = {5, 11155111, 56, 97, 137, 80001, 8453, 42161}
|
|
|
+ if chain_id in poa_chain_ids:
|
|
|
+ self.w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0)
|
|
|
+ logger.warning(f"Injected ExtraDataToPOAMiddleware for Chain ID: {chain_id}")
|
|
|
|
|
|
self.account = Account.from_key(_hash)
|
|
|
self.address = self.account.address
|
|
|
@@ -380,6 +402,7 @@ if __name__ == "__main__":
|
|
|
|
|
|
pprint(ok_chain_client.api_config)
|
|
|
|
|
|
+ # client = EthClient('wss://ethereum-rpc.publicnode.com')
|
|
|
client = EthClient()
|
|
|
|
|
|
CHAIN_ID = 1
|