A Python library for managing Anvil Ethereum test containers with security and ease of use in mind. This library provides a clean interface for running and interacting with Anvil instances in Docker containers, making it perfect for testing Ethereum smart contracts and DApps.
This library offers several key features for Ethereum development and testing:
- Automated container lifecycle management
- Ethereum chain forking and manipulation
- Secure command execution
- Transaction handling
- Block time control
- Chain state snapshots and restoration
- Health monitoring and diagnostics
- Container log access
- Resource cleanup and management
- Environment variable handling
- Input validation for Ethereum addresses
- Command injection protection
- Secure transaction handling
- Safe environment variable management
- Resource isolation
You can install the library using pip:
pip install anvil-testcontainer
Or with Poetry (recommended):
poetry add anvil-testcontainer
- Python 3.8 or higher
- Docker installed and running
- Access to an Ethereum node for forking (e.g., Infura, Alchemy)
Here's a simple example to get you started:
from anvil_testcontainer import AnvilContainer
with AnvilContainer("<rpc provider url eg https://eth-mainnet.alchemyapi.io/v2..>") as anvil:
web3 = anvil.get_web3()
print(f"Current block: {web3.eth.block_number}")
anvil.move_time(86400)
Use the ContainerConfig
class for more control:
from anvil_testcontainer import AnvilContainer, ContainerConfig
config = ContainerConfig(
fork_url="<provider URL>",
fork_block_number=14000000,
image="ghcr.io/foundry-rs/foundry:nightly",
port=8545,
timeout=60,
env_vars={"ETHERSCAN_API_KEY": "your-key"}
)
with AnvilContainer(config) as anvil:
snapshot_id = anvil.create_snapshot()
tx_hash = anvil.send_transaction(
from_address="0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
to_address="0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
value=100000000000000000 # 0.1 ETH
)
receipt = anvil.get_web3().eth.wait_for_transaction_receipt(tx_hash)
anvil.revert_snapshot(snapshot_id)
Monitor container health and access logs:
with AnvilContainer(config) as anvil:
# Check container health
if anvil.verify_health():
print("Container is healthy")
# Access container logs
logs = anvil.get_logs()
print(logs)
The main class for container management.
start()
: Start the containerstop()
: Stop the containerget_web3()
: Get Web3 instancemove_time(seconds: int)
: Advance blockchain timereset_fork(block_number: int)
: Reset to specific block
create_snapshot()
: Create chain state snapshotrevert_snapshot(snapshot_id: str)
: Restore chain statesend_transaction(...)
: Execute transactionverify_health()
: Check container healthget_logs()
: Retrieve container logs
Configuration class for container initialization.
ContainerConfig(
fork_url: str,
fork_block_number: Optional[int] = None,
image: str = "ghcr.io/foundry-rs/foundry:nightly",
port: int = 8545,
timeout: int = 60,
env_vars: Optional[Dict[str, str]] = None
)
The library provides custom exceptions for better error handling:
from anvil_testcontainer import ValidationError
try:
with AnvilContainer(config) as anvil:
anvil.send_transaction(
from_address="invalid_address",
to_address="0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
value=1000000000000000000
)
except ValidationError as e:
print(f"Validation failed: {e}")
We welcome contributions! Please follow these steps:
- Fork the repository
- Create a feature branch
- Make your changes
- Add or update tests
- Submit a pull request
git clone https://github.com/epappas/anvil-testcontainer.git
cd anvil-testcontainer
poetry install
poetry run pytest
Run the test suite:
poetry run pytest
With coverage:
poetry run pytest --cov=anvil_testcontainer
This project is licensed under the MIT License - see the LICENSE file for details.
For support, please:
- Check the documentation
- Search existing issues
- Create a new issue if needed
- Foundry team for Anvil
- OpenZeppelin for security best practices
- Web3.py team for Ethereum interaction capabilities