Skip to content

Commit 29e328d

Browse files
authored
fix: issue connecting to some random nodes from evmchains (#127)
1 parent cab4658 commit 29e328d

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

ape_foundry/provider.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -778,11 +778,10 @@ def fork_url(self) -> str:
778778
def connect(self):
779779
super().connect()
780780

781-
# If using the provider config for upstream_provider,
782-
# set the network one in this session, so other features work in core.
783781
with self.forked_network.use_upstream_provider() as upstream_provider:
782+
upstream_genesis_block = None
784783
try:
785-
upstream_genesis_block_hash = upstream_provider.get_block(0).hash
784+
upstream_genesis_block = upstream_provider.get_block(0)
786785
except ExtraDataLengthError as err:
787786
if isinstance(upstream_provider, Web3Provider):
788787
logger.error(
@@ -791,15 +790,20 @@ def connect(self):
791790
upstream_provider.web3.middleware_onion.inject(
792791
ExtraDataToPOAMiddleware, layer=0
793792
)
794-
upstream_genesis_block_hash = upstream_provider.get_block(0).hash
793+
upstream_genesis_block = upstream_provider.get_block(0)
795794
else:
796795
raise FoundryProviderError(f"Unable to get genesis block: {err}.") from err
797796

798-
if self.get_block(0).hash != upstream_genesis_block_hash:
799-
logger.warning(
800-
"Upstream network has mismatching genesis block. "
801-
"This could be an issue with foundry."
802-
)
797+
except Exception:
798+
logger.error("Unable to get genesis block for upstream provider.")
799+
800+
if upstream_genesis_block is not None:
801+
genesis_block = self.get_block(0)
802+
if genesis_block.hash != upstream_genesis_block.hash:
803+
logger.warning(
804+
"Upstream network has mismatching genesis block. "
805+
"This could be an issue with foundry."
806+
)
803807

804808
def build_command(self) -> list[str]:
805809
if not self.fork_url:

tests/test_fork_provider.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from ape_ethereum.ecosystem import NETWORKS
88

99
from ape_foundry import FoundryNetworkConfig
10+
from ape_foundry.provider import FoundryForkProvider
1011

1112
TESTS_DIRECTORY = Path(__file__).parent
1213
TEST_ADDRESS = "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"
@@ -183,6 +184,29 @@ def test_connect_to_polygon(networks, owner, contract_container):
183184
assert isinstance(contract, ContractInstance) # Didn't fail
184185

185186

187+
@pytest.mark.fork
188+
def test_connect_light_client(mocker, networks, owner, contract_container):
189+
"""
190+
Ensures if we can't detect mismatch, it is OK.
191+
"""
192+
mock_network = mocker.MagicMock()
193+
provider = FoundryForkProvider(name="foundry", network=networks.ethereum.local)
194+
provider.network = mock_network
195+
mock_web3 = mocker.MagicMock()
196+
provider._web3 = mock_web3
197+
198+
# Set up a mock connection context for the upstream provider.
199+
mock_ctx = mocker.MagicMock()
200+
mock_upstream_provider = mocker.MagicMock()
201+
mock_ctx.__enter__.return_value = mock_upstream_provider
202+
mock_network.use_upstream_provider.return_value = mock_ctx
203+
204+
# Make it fail like a light client might.
205+
mock_upstream_provider.get_block.side_effect = Exception
206+
207+
provider.connect() # No error.
208+
209+
186210
@pytest.mark.fork
187211
@pytest.mark.parametrize("network,port", [("amoy", 9878), ("mainnet", 9879)])
188212
def test_provider_settings(networks, network, port):

0 commit comments

Comments
 (0)