Skip to content

Commit

Permalink
Refactor get_contract_metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
moisses89 committed Jan 2, 2025
1 parent 3063eb1 commit 8fc3664
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 33 deletions.
44 changes: 24 additions & 20 deletions safe_eth/eth/clients/blockscout_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,23 +178,35 @@ def _do_request(self, url: str, query: str) -> Optional[Dict[str, Any]]:

return response.json()

def get_contract_metadata(
self, address: ChecksumAddress
def _process_contract_metadata(
self, contract_data: dict[str, Any]
) -> Optional[ContractMetadata]:
query = '{address(hash: "%s") { hash, smartContract {name, abi} }}' % address
result = self._do_request(self.grahpql_url, query)
"""
Return a ContractMetadata from BlockScout response
:param contract_data:
:return:
"""
if (
result
and "error" not in result
and result.get("data", {}).get("address", {})
and result["data"]["address"]["smartContract"]
"error" not in contract_data
and contract_data.get("data", {}).get("address", {})
and contract_data["data"]["address"]["smartContract"]
):
smart_contract = result["data"]["address"]["smartContract"]
smart_contract = contract_data["data"]["address"]["smartContract"]
return ContractMetadata(
smart_contract["name"], json.loads(smart_contract["abi"]), False
)
return None

def get_contract_metadata(
self, address: ChecksumAddress
) -> Optional[ContractMetadata]:
query = '{address(hash: "%s") { hash, smartContract {name, abi} }}' % address
contract_data = self._do_request(self.grahpql_url, query)
if contract_data:
return self._process_contract_metadata(contract_data)
return None


class AsyncBlockscoutClient(BlockscoutClient):
def __init__(
Expand Down Expand Up @@ -227,15 +239,7 @@ async def async_get_contract_metadata(
self, address: ChecksumAddress
) -> Optional[ContractMetadata]:
query = '{address(hash: "%s") { hash, smartContract {name, abi} }}' % address
result = await self._async_do_request(self.grahpql_url, query)
if (
result
and "error" not in result
and result.get("data", {}).get("address", {})
and result["data"]["address"]["smartContract"]
):
smart_contract = result["data"]["address"]["smartContract"]
return ContractMetadata(
smart_contract["name"], json.loads(smart_contract["abi"]), False
)
contract_data = await self._async_do_request(self.grahpql_url, query)
if contract_data:
return self._process_contract_metadata(contract_data)
return None
4 changes: 2 additions & 2 deletions safe_eth/eth/clients/etherscan_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ def get_contract_metadata(
return None

@staticmethod
def _process_response(response):
def _process_get_contract_source_code_response(response):
if response and isinstance(response, list):
result = response[0]
abi_str = result.get("ABI")
Expand Down Expand Up @@ -406,7 +406,7 @@ def get_contract_source_code(self, contract_address: str, retry: bool = True):
f"module=contract&action=getsourcecode&address={contract_address}"
)
response = self._retry_request(url, retry=retry) # Returns a list
return self._process_response(response)
return self._process_get_contract_source_code_response(response)

def get_contract_abi(self, contract_address: str, retry: bool = True):
url = self.build_url(
Expand Down
2 changes: 1 addition & 1 deletion safe_eth/eth/clients/etherscan_client_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ async def async_get_contract_source_code(
f"module=contract&action=getsourcecode&address={contract_address}"
)
response = await self._async_do_request(url) # Returns a list
return self._process_response(response)
return self._process_get_contract_source_code_response(response)

async def async_get_contract_metadata(
self, contract_address: str
Expand Down
30 changes: 20 additions & 10 deletions safe_eth/eth/clients/sourcify_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,20 @@ def get_chains(self) -> Dict[str, Any]:
result = self._do_request(url)
return result or {}

def _process_contract_metadata(
self, contract_data: dict[str, Any], match_type: str
) -> ContractMetadata:
"""
Return a ContractMetadata from Sourcify response
:param contract_data:
:param match_type:
:return:
"""
abi = self._get_abi_from_metadata(contract_data)
name = self._get_name_from_metadata(contract_data)
return ContractMetadata(name, abi, match_type == "partial_match")

def get_contract_metadata(
self, contract_address: str
) -> Optional[ContractMetadata]:
Expand All @@ -103,11 +117,9 @@ def get_contract_metadata(
self.base_url_repo,
f"/contracts/{match_type}/{self.network.value}/{contract_address}/metadata.json",
)
metadata = self._do_request(url)
if metadata:
abi = self._get_abi_from_metadata(metadata)
name = self._get_name_from_metadata(metadata)
return ContractMetadata(name, abi, match_type == "partial_match")
contract_data = self._do_request(url)
if contract_data:
return self._process_contract_metadata(contract_data, match_type)
return None


Expand Down Expand Up @@ -155,9 +167,7 @@ async def async_get_contract_metadata(
self.base_url_repo,
f"/contracts/{match_type}/{self.network.value}/{contract_address}/metadata.json",
)
metadata = await self._async_do_request(url)
if metadata:
abi = self._get_abi_from_metadata(metadata)
name = self._get_name_from_metadata(metadata)
return ContractMetadata(name, abi, match_type == "partial_match")
contract_data = await self._async_do_request(url)
if contract_data:
return self._process_contract_metadata(contract_data, match_type)
return None

0 comments on commit 8fc3664

Please sign in to comment.