From 48da852a163e291f8818db3ac39e3962b193a8a0 Mon Sep 17 00:00:00 2001 From: Juliya Smith Date: Fri, 26 Jul 2024 11:56:32 -0500 Subject: [PATCH] feat: evm-version local network --- README.md | 21 ++++++++++++++++++++- ape_foundry/provider.py | 13 +++++++++++++ tests/test_provider.py | 9 +++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 65db812..fca0be8 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ foundry: priority_fee: 0 ``` -# Auto-mining +## Auto-mining Anvil nodes by default auto-mine. However, you can disable auto-mining on startup by configuring the foundry plugin like so: @@ -169,3 +169,22 @@ To mine on an interval instead, set the `block_time` config: foundry: block_time: 10 # mine a new block every 10 seconds ``` + +## EVM Version (hardfork) + +To change the EVM version for local foundry networks, use the `evm_version` config: + +```yaml +foundry: + evm_version: shanghai +``` + +To change the EVM version for forked networks, set it in their forked network configs: + +```yaml +foundry: + fork: + ethereum: + mainnet: + evm_version: shanghai +``` diff --git a/ape_foundry/provider.py b/ape_foundry/provider.py index a26f80c..ccdb61d 100644 --- a/ape_foundry/provider.py +++ b/ape_foundry/provider.py @@ -2,6 +2,7 @@ import random import shutil from bisect import bisect_right +from collections.abc import Iterable from copy import copy from subprocess import PIPE, call from typing import Literal, Optional, Union, cast @@ -70,6 +71,9 @@ class FoundryNetworkConfig(PluginConfig): Defaults to ``True``. If ``host`` is remote, will not be able to start. """ + evm_version: Optional[str] = None + """The EVM hardfork to use, e.g. `shanghai`.""" + # Retry strategy configs, try increasing these if you're getting FoundrySubprocessError request_timeout: int = 30 fork_request_timeout: int = 300 @@ -419,6 +423,15 @@ def disconnect(self): super().disconnect() def build_command(self) -> list[str]: + cmd = self._build_command() + + if evm_version := self.settings.evm_version: + cmd.extend(("--hardfork", evm_version)) + + return cmd + + def _build_command(self) -> list[str]: + # All shared between forks and local. cmd = [ self.anvil_bin, "--port", diff --git a/tests/test_provider.py b/tests/test_provider.py index 63c4322..e3c3765 100644 --- a/tests/test_provider.py +++ b/tests/test_provider.py @@ -467,3 +467,12 @@ def test_initial_balance(accounts): # just showing we were able to increase it. acct = accounts[9] assert convert("10_000 ETH", int) < acct.balance <= convert("100_000 ETH", int) + + +@pytest.mark.parametrize("host", ("https://example.com", "example.com")) +def test_evm_version(project, local_network, host): + with project.temp_config(foundry={"evm_version": "shanghai"}): + provider = local_network.get_provider("foundry") + cmd = provider.build_command() + assert "--hardfork" in cmd + assert "shanghai" in cmd