Source code for ethereum_gasprice.providers.etherscan_provider

from typing import Dict, Optional, Tuple

from ethereum_gasprice.consts import GaspriceStrategy
from ethereum_gasprice.providers.base import BaseAsyncAPIGaspriceProvider, BaseSyncAPIGaspriceProvider

__all__ = ["EtherscanProvider", "AsyncEtherscanProvider"]


[docs]class EtherscanProvider(BaseSyncAPIGaspriceProvider): """Provider for Etherscan Gas Tracker (https://etherscan.io/gasTracker)""" title: str = "etherscan" api_url: str = "https://api.etherscan.io/api/" secret_env_var_title: str = "ETHGASPRICE_ETHERSCAN_SECRET"
[docs] def request(self) -> Tuple[bool, dict]: """Make request to API.""" try: response = self.client.get( url=self.api_url, params={"module": "gastracker", "action": "gasoracle", "apikey": self.get_secret()} ) response_data = response.json() if response.status_code == 200 and response_data.get("status") == "1": return True, response_data except Exception: pass return False, {}
def _proceed_response_data(self, response_data: dict) -> Dict[GaspriceStrategy, Optional[int]]: """Unify data from response.""" data = self._data_template.copy() if not response_data: return data data.update( { GaspriceStrategy.REGULAR: response_data["result"].get("SafeGasPrice"), GaspriceStrategy.FAST: response_data["result"].get("ProposeGasPrice"), GaspriceStrategy.FASTEST: response_data["result"].get("FastGasPrice"), } ) return data
[docs]class AsyncEtherscanProvider(BaseAsyncAPIGaspriceProvider, EtherscanProvider):
[docs] async def request(self) -> Tuple[bool, dict]: """Make request to API.""" try: response = await self.client.get( url=self.api_url, params={"module": "gastracker", "action": "gasoracle", "apikey": self.get_secret()} ) response_data = response.json() if response.status_code == 200 and response_data.get("status") == "1": return True, response_data except Exception: pass return False, {}