diff --git a/ape_etherscan/verify.py b/ape_etherscan/verify.py index f2c0dd0..86d4cac 100644 --- a/ape_etherscan/verify.py +++ b/ape_etherscan/verify.py @@ -257,7 +257,30 @@ def attempt_verification(self): """ version = str(self.compiler.version) - settings = self.compiler.settings or self._get_new_settings(version) + + # TODO: Fix compiler output in ape-solidity + # and/or add more validation to ethpm_types.Compiler + compiler = self.compiler + valid = True + settings = {} + if compiler: + settings = self.compiler.settings or {} + output_contracts = settings.get("outputSelection", {}) + for contract_id in self.compiler.contractTypes or []: + parts = contract_id.split(":") + if len(parts) != 2: + # Bad compiler. + valid = False + continue + + _, cname = parts + if cname not in output_contracts: + valid = False + break + + if not valid: + settings = self._get_new_settings(version) + optimizer = settings.get("optimizer", {}) optimized = optimizer.get("enabled", False) runs = optimizer.get("runs", DEFAULT_OPTIMIZATION_RUNS) diff --git a/tests/conftest.py b/tests/conftest.py index 7bbcae2..078523d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -97,6 +97,11 @@ def standard_input_json(library): @pytest.fixture(autouse=True) def connection(explorer): with ape.networks.ethereum.mainnet.use_provider("infura") as provider: + # TODO: Figure out why this is still needed sometimes, + # even after https://github.com/ApeWorX/ape/pull/2022 + if not provider.is_connected: + provider.connect() + yield provider @@ -281,6 +286,7 @@ def get_url_f(testnet: bool = False, tld: str = "io"): "arbitrum": { "mainnet": url("arbiscan"), "goerli": testnet_url("goerli", "arbiscan"), + "sepolia": testnet_url("sepolia", "arbiscan"), }, "fantom": { "opera": com_url("ftmscan"), diff --git a/tests/test_etherscan.py b/tests/test_etherscan.py index fb7d37e..cc0fc56 100644 --- a/tests/test_etherscan.py +++ b/tests/test_etherscan.py @@ -177,21 +177,23 @@ def test_get_contract_type_ecosystems_and_networks( @pytest.mark.parametrize( "file_name", ("get_proxy_contract_response", ("get_vyper_contract_response")) ) -def test_get_contract_type_additional_types(mock_backend, file_name, explorer): +def test_get_contract_type_additional_types(mock_backend, file_name, explorer, connection): # This test parametrizes getting edge-case contract types. # NOTE: Purposely not merged with test above to avoid adding a new dimension # to the parametrization. + _ = connection # Needed for symbol lookup + mock_backend.set_network("ethereum", "mainnet") response = mock_backend.setup_mock_get_contract_type_response(file_name) actual = explorer.get_contract_type(response.expected_address).name expected = EXPECTED_CONTRACT_NAME_MAP[response.file_name] assert actual == expected -def test_get_contract_type_with_rate_limiting(mock_backend, explorer): +def test_get_contract_type_with_rate_limiting(mock_backend, explorer, connection): """ This test ensures the rate limiting logic in the Etherscan client works. """ - + _ = connection # Needed for calling symbol() on Vyper_contract file_name = "get_vyper_contract_response" setter_upper = mock_backend.setup_mock_get_contract_type_response_with_throttling throttler, response = setter_upper(file_name)