• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

safe-global / safe-eth-py / 13901669081

17 Mar 2025 02:14PM UTC coverage: 93.993% (+0.04%) from 93.954%
13901669081

Pull #1596

github

web-flow
Merge ed47bf68c into 8a65f95d7
Pull Request #1596: Update Tx Service v2 API endpoints

7 of 7 new or added lines in 3 files covered. (100.0%)

1 existing line in 1 file now uncovered.

9514 of 10122 relevant lines covered (93.99%)

5.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.28
/safe_eth/eth/tests/clients/test_etherscan_client_v2.py
1
import os
6✔
2
import unittest
6✔
3

4
from django.test import TestCase
6✔
5

6
import pytest
6✔
7

8
from ... import EthereumNetwork
6✔
9
from ...clients import EtherscanClientV2, EtherscanRateLimitError
6✔
10
from ...clients.etherscan_client_v2 import AsyncEtherscanClientV2
6✔
11
from .mocks import sourcify_safe_metadata
6✔
12

13

14
class TestEtherscanClientV2(TestCase):
6✔
15
    @classmethod
6✔
16
    def get_etherscan_api(cls, network: EthereumNetwork):
6✔
17
        etherscan_api_key_variable_name = "ETHERSCAN_API_KEY"
6✔
18
        etherscan_api_key = os.environ.get(etherscan_api_key_variable_name)
6✔
19
        if not etherscan_api_key:
6✔
20
            pytest.skip(f"{etherscan_api_key_variable_name} needs to be defined")
×
21

22
        return EtherscanClientV2(network, api_key=etherscan_api_key)
6✔
23

24
    @pytest.mark.flaky(reruns=5)
6✔
25
    def test_etherscan_get_abi(self):
6✔
26
        try:
6✔
27
            etherscan_api = self.get_etherscan_api(EthereumNetwork.MAINNET)
6✔
28
            safe_master_copy_abi = sourcify_safe_metadata["output"]["abi"]
6✔
29
            safe_master_copy_address = "0x6851D6fDFAfD08c0295C392436245E5bc78B0185"
6✔
30
            self.assertEqual(
6✔
31
                etherscan_api.get_contract_abi(safe_master_copy_address),
32
                safe_master_copy_abi,
33
            )
34

35
            contract_metadata = etherscan_api.get_contract_metadata(
6✔
36
                safe_master_copy_address
37
            )
38
            self.assertEqual(contract_metadata.name, "GnosisSafe")
6✔
39
            self.assertEqual(contract_metadata.abi, safe_master_copy_abi)
6✔
40
            self.assertIsNone(contract_metadata.implementation)
6✔
41

42
            random_address = "0xaE32496491b53841efb51829d6f886387708F99a"
6✔
43
            self.assertIsNone(etherscan_api.get_contract_abi(random_address))
6✔
44
            self.assertIsNone(etherscan_api.get_contract_metadata(random_address))
6✔
UNCOV
45
        except EtherscanRateLimitError:
4✔
46
            self.skipTest("Etherscan rate limit reached")
×
47

48
    @pytest.mark.flaky(reruns=5)
6✔
49
    def test_etherscan_get_contract_metadata(self):
6✔
50
        try:
6✔
51
            etherscan_api = self.get_etherscan_api(EthereumNetwork.MAINNET)
6✔
52
            proxy_address = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
6✔
53

54
            contract_metadata = etherscan_api.get_contract_metadata(proxy_address)
6✔
55
            self.assertEqual(contract_metadata.name, "FiatTokenProxy")
6✔
56
            self.assertEqual(
6✔
57
                contract_metadata.implementation,
58
                "0x43506849d7c04f9138d1a2050bbf3a0c054402dd",
59
            )
60

61
        except EtherscanRateLimitError:
5✔
62
            self.skipTest("Etherscan rate limit reached")
×
63

64
    @pytest.mark.flaky(reruns=5)
6✔
65
    def test_is_supported_network(self):
6✔
66
        try:
6✔
67
            self.assertTrue(
6✔
68
                EtherscanClientV2.is_supported_network(EthereumNetwork.GNOSIS)
69
            )
70
            self.assertFalse(
6✔
71
                EtherscanClientV2.is_supported_network(EthereumNetwork.UNKNOWN)
72
            )
73
        except EtherscanRateLimitError:
×
74
            self.skipTest("Etherscan rate limit reached")
×
75

76

77
class TestAsyncEtherscanClientV2(unittest.IsolatedAsyncioTestCase):
6✔
78
    @classmethod
6✔
79
    def get_etherscan_api(cls, network: EthereumNetwork):
6✔
80
        etherscan_api_key_variable_name = "ETHERSCAN_API_KEY"
6✔
81
        etherscan_api_key = os.environ.get(etherscan_api_key_variable_name)
6✔
82
        if not etherscan_api_key:
6✔
83
            pytest.skip(f"{etherscan_api_key_variable_name} needs to be defined")
×
84

85
        return AsyncEtherscanClientV2(network, api_key=etherscan_api_key)
6✔
86

87
    @pytest.mark.flaky(reruns=5)
6✔
88
    async def test_async_etherscan_get_abi(self):
6✔
89
        try:
6✔
90
            etherscan_api = self.get_etherscan_api(EthereumNetwork.MAINNET)
6✔
91
            safe_master_copy_abi = sourcify_safe_metadata["output"]["abi"]
6✔
92
            safe_master_copy_address = "0x6851D6fDFAfD08c0295C392436245E5bc78B0185"
6✔
93
            self.assertEqual(
6✔
94
                await etherscan_api.async_get_contract_abi(safe_master_copy_address),
95
                safe_master_copy_abi,
96
            )
97

98
            contract_metadata = await etherscan_api.async_get_contract_metadata(
6✔
99
                safe_master_copy_address
100
            )
101
            self.assertEqual(contract_metadata.name, "GnosisSafe")
6✔
102
            self.assertEqual(contract_metadata.abi, safe_master_copy_abi)
6✔
103

104
            random_address = "0xaE32496491b53841efb51829d6f886387708F99a"
6✔
105
            self.assertIsNone(
6✔
106
                await etherscan_api.async_get_contract_abi(random_address)
107
            )
108
            self.assertIsNone(
6✔
109
                await etherscan_api.async_get_contract_metadata(random_address)
110
            )
111
        except EtherscanRateLimitError:
1✔
112
            self.skipTest("Etherscan rate limit reached")
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc