Skip to content

Commit

Permalink
Detect contract deployments
Browse files Browse the repository at this point in the history
  • Loading branch information
Uxio0 committed Oct 22, 2024
1 parent ea305a6 commit dde5c94
Show file tree
Hide file tree
Showing 3 changed files with 151 additions and 3 deletions.
32 changes: 30 additions & 2 deletions safe_transaction_service/history/services/safe_service.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import logging
from dataclasses import dataclass, replace
from datetime import datetime
from typing import Optional, Union
from typing import Any, Optional, Union

from eth_typing import ChecksumAddress
from eth_utils import event_abi_to_log_topic
from hexbytes import HexBytes
from safe_eth.eth import EthereumClient, get_auto_ethereum_client
from safe_eth.eth.contracts import (
get_cpk_factory_contract,
get_proxy_factory_V1_3_0_contract,
get_proxy_factory_V1_4_1_contract,
)
from safe_eth.eth.utils import fast_to_checksum_address
from safe_eth.safe import Safe
from safe_eth.safe.exceptions import CannotRetrieveSafeInfoException
from safe_eth.safe.multi_send import MultiSend
Expand Down Expand Up @@ -99,6 +102,9 @@ def __init__(
self.gelato_relay_1_balance_v2_contract = dummy_w3.eth.contract(
abi=gelato_relay_1_balance_v2_abi
)
self.proxy_creation_event_topic = event_abi_to_log_topic(
self.proxy_factory_v1_4_1_contract.events.ProxyCreation().abi
)

def get_safe_creation_info(self, safe_address: str) -> Optional[SafeCreationInfo]:
"""
Expand Down Expand Up @@ -135,8 +141,16 @@ def get_safe_creation_info(self, safe_address: str) -> Optional[SafeCreationInfo
# A regular ether transfer could trigger a Safe deployment, so it's not guaranteed that there will be
# ``data`` for the transaction
results = self._decode_creation_data(data_tx.data)

if len(results) > 1:
# If there are more than one deployment, we need to know which one is for the providen Safe
deployed_safes = self._get_deployed_safes(creation_ethereum_tx.logs)
if len(deployed_safes) == len(results):
for deployed_safe, result in zip(deployed_safes, results):
if safe_address == deployed_safes:
results = [result]

if len(results) == 1:
# TODO Support multiple Proxy deployments in the same transaction
result = results[0]
singleton = result.singleton
initializer = result.initializer
Expand Down Expand Up @@ -217,6 +231,20 @@ def get_safe_info_from_db(self, safe_address: ChecksumAddress) -> SafeInfo:
except SafeLastStatus.DoesNotExist as exc:
raise CannotGetSafeInfoFromDB(safe_address) from exc

def _get_deployed_safes(self, logs: list[dict[str, Any]]) -> list[ChecksumAddress]:
"""
:param logs:
:return: list of Safes deployed
"""

return [
fast_to_checksum_address(HexBytes(log["topics"][1])[12:])
for log in logs
if log["topics"]
and len(log["topics"]) == 2
and HexBytes(log["topics"][0]) == self.proxy_creation_event_topic
]

def _decode_creation_data(self, data: Union[bytes, str]) -> list[ProxyCreationData]:
"""
Decode creation data for Safe ProxyFactory deployments.
Expand Down
100 changes: 100 additions & 0 deletions safe_transaction_service/history/tests/mocks/mock_safe_creation.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Safe created using MultiSend on BSC
# https://bscscan.com/tx/0x35868d8794c36e1f539c9459385159ecc248cf3ebb02b98447861ad519019bc2
from hexbytes import HexBytes

multisend_creation_mock = {
"data": b"\x8d\x80\xff\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xf2\x00\xa6\xb7\x1e&\xc5\xe0\x84_t\xc8\x12\x10,\xa7\x11Kj\x89j\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x04\x16\x88\xf0\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\\cdNh5I\x05[\x9b\xe8e=\xe2n\x0bL\xd3n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01d\xb6>\x80\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x8f+-*SN@$\x87\xb3\xee|\x18\xc3:\xec\x0f\xe5\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00L<8\xa4Y\xf0\xba\xab\xb7c)\x01\x11\xb6n\xd0\x1b_\xef\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xce^j\xc7r\x10\xaf{&\xf3\x15\x92]\xf8:?\x84w\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02Djv\x12\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\xce^j\xc7r\x10\xaf{&\xf3\x15\x92]\xf8:?\x84w\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\rX/\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00e\xf8#c\t\xe5\xa9\x9f\xf0\xd1)\xd0NHn\xbc\xe2\r\xc7\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A_\xc5\xee>+\x15\x10>\xbb\xb6\xa4\xf2\xa4\x12\x13\x01\x8d}O\x8a\xea\xae\xe7\xe4\xde\x83\xba\xe3\xe1[\xf0\x1d\n8\tV\x02\x87\x84?p\xa1%\xc5\x99qA\xb2\xf2\xe6\xe8\x10\xf3\xa31\x9d\x8bM1'\x10D$U\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
"expected_singleton": "0x3E5c63644E683549055b9Be8653de26E0B4CD36E",
Expand All @@ -20,4 +22,102 @@
# https://sepolia.etherscan.io/tx/0xd7ac4624be0751020697d00455c84813b2a5942d954dd3cee312310772e05b32
multiple_safes_same_tx_creation_mock = {
"data": b'\x8d\x80\xff\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xb2\x00N\x1d\xcfz\xd4\xe4`\xcf\xd3\x07\x91\xcc\xc4\xf9\xc8\xa4\xf8 \xecg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x04\x16\x88\xf0\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ag\\\t\x9f24\x1b\xf8K\xfcS\x82\xafSM\xf5\xc7F\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01d\xb6>\x80\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x072\xdc\x9e0?\t\xfc\xef:s\x88\xad\x10\xa84Y\xec\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Z\xc2U\x88\x98\x82\xac\xd3\xda*\xa99g\x9e?=L\xea"\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00N\x1d\xcfz\xd4\xe4`\xcf\xd3\x07\x91\xcc\xc4\xf9\xc8\xa4\xf8 \xecg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x04\x16\x88\xf0\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Ag\\\t\x9f24\x1b\xf8K\xfcS\x82\xafSM\xf5\xc7F\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0009\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01d\xb6>\x80\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x072\xdc\x9e0?\t\xfc\xef:s\x88\xad\x10\xa84Y\xec\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Z\xc2U\x88\x98\x82\xac\xd3\xda*\xa99g\x9e?=L\xea"\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
"tx_logs": [
{
"address": "0xf9418A8bd460e6Bc187155106109E83dC6366Ea4",
"topics": [
HexBytes(
"0x141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8"
),
HexBytes(
"0x0000000000000000000000004e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67"
),
],
"data": HexBytes(
"0x000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd0732dc9e303f09fcef3a7388ad10a83459ec9900000000000000000000000000000000000000000000000000000000000000010000000000000000000000005ac255889882acd3da2aa939679e3f3d4cea221e"
),
"blockNumber": 6922487,
"transactionHash": HexBytes(
"0xd7ac4624be0751020697d00455c84813b2a5942d954dd3cee312310772e05b32"
),
"transactionIndex": 125,
"blockHash": HexBytes(
"0x252334b050fb1a2db3e9b46eed5dab5ac7f90f7c354de38b7f5e223f09f99580"
),
"logIndex": 220,
"removed": False,
},
{
"address": "0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67",
"topics": [
HexBytes(
"0x4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235"
),
HexBytes(
"0x000000000000000000000000f9418a8bd460e6bc187155106109e83dc6366ea4"
),
],
"data": HexBytes(
"0x00000000000000000000000041675c099f32341bf84bfc5382af534df5c7461a"
),
"blockNumber": 6922487,
"transactionHash": HexBytes(
"0xd7ac4624be0751020697d00455c84813b2a5942d954dd3cee312310772e05b32"
),
"transactionIndex": 125,
"blockHash": HexBytes(
"0x252334b050fb1a2db3e9b46eed5dab5ac7f90f7c354de38b7f5e223f09f99580"
),
"logIndex": 221,
"removed": False,
},
{
"address": "0x8FdA41dB43D5676c8fcc95d2E508d9f4070381d8",
"topics": [
HexBytes(
"0x141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a8"
),
HexBytes(
"0x0000000000000000000000004e1dcf7ad4e460cfd30791ccc4f9c8a4f820ec67"
),
],
"data": HexBytes(
"0x000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd0732dc9e303f09fcef3a7388ad10a83459ec9900000000000000000000000000000000000000000000000000000000000000010000000000000000000000005ac255889882acd3da2aa939679e3f3d4cea221e"
),
"blockNumber": 6922487,
"transactionHash": HexBytes(
"0xd7ac4624be0751020697d00455c84813b2a5942d954dd3cee312310772e05b32"
),
"transactionIndex": 125,
"blockHash": HexBytes(
"0x252334b050fb1a2db3e9b46eed5dab5ac7f90f7c354de38b7f5e223f09f99580"
),
"logIndex": 222,
"removed": False,
},
{
"address": "0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67",
"topics": [
HexBytes(
"0x4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235"
),
HexBytes(
"0x0000000000000000000000008fda41db43d5676c8fcc95d2e508d9f4070381d8"
),
],
"data": HexBytes(
"0x00000000000000000000000041675c099f32341bf84bfc5382af534df5c7461a"
),
"blockNumber": 6922487,
"transactionHash": HexBytes(
"0xd7ac4624be0751020697d00455c84813b2a5942d954dd3cee312310772e05b32"
),
"transactionIndex": 125,
"blockHash": HexBytes(
"0x252334b050fb1a2db3e9b46eed5dab5ac7f90f7c354de38b7f5e223f09f99580"
),
"logIndex": 223,
"removed": False,
},
],
}
22 changes: 21 additions & 1 deletion safe_transaction_service/history/tests/test_safe_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,13 @@
SafeInfo,
SafeServiceProvider,
)
from .factories import InternalTxFactory, SafeLastStatusFactory, SafeMasterCopyFactory
from ..utils import clean_receipt_log
from .factories import (
EthereumTxFactory,
InternalTxFactory,
SafeLastStatusFactory,
SafeMasterCopyFactory,
)
from .mocks.mock_safe_creation import (
gelato_relay_creation_mock,
multiple_safes_same_tx_creation_mock,
Expand Down Expand Up @@ -188,3 +194,17 @@ def test_decode_creation_data_multiple_safes_same_tx(self):
multiple_safes_same_tx_creation_mock["data"]
)
self.assertEqual(len(results), 2)
ethereum_tx = EthereumTxFactory(
logs=[
clean_receipt_log(log)
for log in multiple_safes_same_tx_creation_mock["tx_logs"]
]
)
safes = self.safe_service._get_safes_deployed(ethereum_tx.logs)
self.assertEqual(
safes,
[
"0xf9418A8bd460e6Bc187155106109E83dC6366Ea4",
"0x8FdA41dB43D5676c8fcc95d2E508d9f4070381d8",
],
)

0 comments on commit dde5c94

Please sign in to comment.