Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: allow ecosystems to still load when default provider or network not found #1049

Merged
14 changes: 11 additions & 3 deletions src/ape/managers/networks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from ape.api import EcosystemAPI, ProviderAPI, ProviderContextManager
from ape.api.networks import LOCAL_NETWORK_NAME, NetworkAPI
from ape.exceptions import NetworkError
from ape.logging import logger

from .base import BaseManager

Expand Down Expand Up @@ -101,7 +102,11 @@ def ecosystems(self) -> Dict[str, EcosystemAPI]:
ecosystem_config = self.config_manager.get_config(plugin_name).dict()
default_network = ecosystem_config.get("default_network", LOCAL_NETWORK_NAME)

ecosystem.set_default_network(default_network)
try:
ecosystem.set_default_network(default_network)
except NetworkError as err:
message = f"Failed setting default network: {err}"
logger.error(message)

if ecosystem_config:
for network_name, network in ecosystem.networks.items():
Expand All @@ -115,7 +120,11 @@ def ecosystems(self) -> Dict[str, EcosystemAPI]:

default_provider = network_config["default_provider"]
if default_provider:
network.set_default_provider(default_provider)
try:
network.set_default_provider(default_provider)
except NetworkError as err:
message = f"Failed setting default provider: {err}"
logger.error(message)

ecosystem_dict[plugin_name] = ecosystem

Expand Down Expand Up @@ -240,7 +249,6 @@ def get_network_choices(
ecosystem_items = {n: e for n, e in ecosystem_items.items() if n in ecosystem_filter}

for ecosystem_name, ecosystem in ecosystem_items.items():

network_items = ecosystem.networks
if network_filter:
network_items = {n: net for n, net in network_items.items() if n in network_filter}
Expand Down
25 changes: 12 additions & 13 deletions src/ape_geth/providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,20 +215,19 @@ def connect(self):
if not self._web3.isConnected():
self._geth.disconnect()
raise ConnectionError("Unable to connect to locally running geth.")
elif "geth" in self.client_version.lower():
logger.info(f"Connecting to existing Geth node at '{self._clean_uri}'.")
antazoey marked this conversation as resolved.
Show resolved Hide resolved
elif "erigon" in self.client_version.lower():
logger.info(f"Connecting to existing Erigon node at '{self._clean_uri}'.")
self.concurrency = 8
self.block_page_size = 40_000
elif "nethermind" in self.client_version.lower():
logger.info(f"Connecting to existing Nethermind node at '{self._clean_uri}'.")
self.concurrency = 32
self.block_page_size = 50_000
else:
if "geth" in self.client_version.lower():
logger.info(f"Connecting to existing Geth node at '{self._clean_uri}'.")
elif "erigon" in self.client_version.lower():
logger.info(f"Connecting to existing Erigon node at '{self._clean_uri}'.")
self.concurrency = 8
self.block_page_size = 40_000
elif "nethermind" in self.client_version.lower():
logger.info(f"Connecting to existing Nethermind node at '{self._clean_uri}'.")
self.concurrency = 32
self.block_page_size = 50_000
else:
client_name = self.client_version.split("/")[0]
logger.warning(f"Connecting Geth plugin to non-Geth client '{client_name}'.")
client_name = self.client_version.split("/")[0]
logger.warning(f"Connecting Geth plugin to non-Geth client '{client_name}'.")

self._web3.eth.set_gas_price_strategy(rpc_gas_price_strategy)

Expand Down
26 changes: 26 additions & 0 deletions tests/functional/test_networks.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,3 +209,29 @@ def test_parse_network_choice_multiple_contexts(get_provider_with_unused_chain_i

def test_block_times(ethereum):
assert ethereum.rinkeby.block_time == 15


def test_ecosystems_when_default_network_not_exists(temp_config, caplog, networks):
bad_network = "NOT_EXISTS"
config = {"ethereum": {"default_network": bad_network}}
with temp_config(config):
assert networks.ecosystems

err = caplog.records[-1].message
assert err == (
f"Failed setting default network: "
f"'{bad_network}' is not a valid network for ecosystem 'ethereum'."
)


def test_ecosystems_when_default_provider_not_exists(temp_config, caplog, networks):
bad_provider = "NOT_EXISTS"
config = {"ethereum": {"kovan": {"default_provider": bad_provider}}}
with temp_config(config):
assert networks.ecosystems

err = caplog.records[-1].message
assert err == (
f"Failed setting default provider: "
f"Provider '{bad_provider}' not found in network 'kovan'."
)