diff --git a/nucypher/blockchain/eth/utilities.py b/nucypher/blockchain/eth/utilities.py new file mode 100644 index 000000000..33c025669 --- /dev/null +++ b/nucypher/blockchain/eth/utilities.py @@ -0,0 +1,68 @@ +import os +import tempfile + +import pkg_resources +from eth_tester import PyEVMBackend +from eth_tester.backends import is_pyevm_available +from eth_tester.backends.pyevm.main import get_default_genesis_params, get_default_account_keys, generate_genesis_state + +from nucypher.blockchain.eth.interfaces import EthereumContractRegistry + + +class TemporaryEthereumContractRegistry(EthereumContractRegistry): + + def __init__(self): + _, self.temp_filepath = tempfile.mkstemp() + super().__init__(registry_filepath=self.temp_filepath) + + def clear(self): + with open(self.registry_filepath, 'w') as registry_file: + registry_file.write('') + + def reset(self): + os.remove(self.temp_filepath) # remove registrar tempfile + + +class OverridablePyEVMBackend(PyEVMBackend): + + def __init__(self, genesis_overrides=None): + """ + Example overrides + --------------------------------- + coinbase: address_bytes + difficulty: int(default: 131072) + extra_data: bytes + gas_limit: int(default: 3141592) + gas_used: int(default: 0) + nonce: bytes + block_number: int + timestamp: int(epoch) + """ + + self.fork_config = dict() + + if not is_pyevm_available(): + raise pkg_resources.DistributionNotFound( + "The `py-evm` package is not available. The " + "`PyEVMBackend` requires py-evm to be installed and importable. " + "Please install the `py-evm` library." + ) + + self.reset_to_genesis(overrides=genesis_overrides) + + def reset_to_genesis(self, overrides=None): + from evm.chains.tester import MainnetTesterChain + from evm.db import get_db_backend + + base_db = get_db_backend() + genesis_params = get_default_genesis_params() + + # Genesis params overrides + if overrides is not None: + genesis_params.update(overrides) + + account_keys = get_default_account_keys() + genesis_state = generate_genesis_state(account_keys) + chain = MainnetTesterChain.from_genesis(base_db, genesis_params, genesis_state) + + self.account_keys, self.chain = account_keys, chain \ No newline at end of file diff --git a/tests/blockchain/eth/entities/test_deployers.py b/tests/blockchain/eth/entities/test_deployers.py index beee69158..01d0205da 100644 --- a/tests/blockchain/eth/entities/test_deployers.py +++ b/tests/blockchain/eth/entities/test_deployers.py @@ -36,6 +36,8 @@ def test_token_deployer_and_agent(testerchain): assert token_agent.contract_address == same_token_agent.contract_address assert token_agent == same_token_agent # __eq__ + testerchain.interface._registry.clear() + @pytest.mark.slow() def test_deploy_ethereum_contracts(testerchain): diff --git a/tests/blockchain/eth/utilities.py b/tests/blockchain/eth/utilities.py index b79aa2739..07b3797b8 100644 --- a/tests/blockchain/eth/utilities.py +++ b/tests/blockchain/eth/utilities.py @@ -1,15 +1,11 @@ import random from typing import List -import pkg_resources from constant_sorrow import constants -from eth_tester import PyEVMBackend -from eth_tester.backends import is_pyevm_available -from eth_tester.backends.pyevm.main import get_default_genesis_params, get_default_account_keys, generate_genesis_state from umbral import keys from web3 import Web3 -from nucypher.blockchain.eth.agents import MinerAgent, NucypherTokenAgent +from nucypher.blockchain.eth.agents import MinerAgent from nucypher.blockchain.eth.deployers import MinerEscrowDeployer, NucypherTokenDeployer @@ -73,64 +69,3 @@ def generate_accounts(w3: Web3, quantity: int) -> List[str]: w3.personal.unlockAccount(address, passphrase=insecure_passphrase) addresses.append(addresses) return addresses - - -class TesterPyEVMBackend(PyEVMBackend): - - def __init__(self, genesis_overrides=None): - """ - Example overrides - --------------------------------- - coinbase: address_bytes - difficulty: int(default: 131072) - extra_data: bytes - gas_limit: int(default: 3141592) - gas_used: int(default: 0) - nonce: bytes - block_number: int - timestamp: int(epoch) - """ - - self.fork_config = dict() - - if not is_pyevm_available(): - raise pkg_resources.DistributionNotFound( - "The `py-evm` package is not available. The " - "`PyEVMBackend` requires py-evm to be installed and importable. " - "Please install the `py-evm` library." - ) - - self.reset_to_genesis(overrides=genesis_overrides) - - def reset_to_genesis(self, overrides=None): - from evm.chains.tester import MainnetTesterChain - from evm.db import get_db_backend - - base_db = get_db_backend() - genesis_params = get_default_genesis_params() - - # Genesis params overrides - if overrides is not None: - genesis_params.update(overrides) - - account_keys = get_default_account_keys() - genesis_state = generate_genesis_state(account_keys) - chain = MainnetTesterChain.from_genesis(base_db, genesis_params, genesis_state) - - self.account_keys, self.chain = account_keys, chain - - -def token_airdrop(token_agent, amount: int, origin: str, addresses: List[str]): - """Airdrops tokens from creator address to all other addresses!""" - - def txs(): - for address in addresses: - txhash = token_agent.contract.functions.transfer(address, amount).transact({'from': origin, - 'gas': 2000000}) - yield txhash - - receipts = list() - for tx in txs(): # One at a time - receipt = token_agent.blockchain.wait_for_receipt(tx) - receipts.append(receipt) - return receipts diff --git a/tests/eth_fixtures.py b/tests/eth_fixtures.py index 96f85fceb..f88627319 100644 --- a/tests/eth_fixtures.py +++ b/tests/eth_fixtures.py @@ -118,22 +118,18 @@ def testerchain(solidity_compiler): https: // github.com / ethereum / eth - tester # available-backends """ - # create a temporary registrar for the tester blockchain - _, filepath = tempfile.mkstemp() - test_registrar = EthereumContractRegistry(registry_filepath=filepath) + temp_registrar = TemporaryEthereumContractRegistry() # Configure a custom provider overrides = {'gas_limit': 4626271} - pyevm_backend = TesterPyEVMBackend(genesis_overrides=overrides) - - # pyevm_backend = PyEVMBackend() # TODO: Remove custom overrides? + pyevm_backend = OverridablePyEVMBackend(genesis_overrides=overrides) eth_tester = EthereumTester(backend=pyevm_backend, auto_mine_transactions=True) pyevm_provider = EthereumTesterProvider(ethereum_tester=eth_tester) # Use the the custom provider and registrar to init an interface circumflex = DeployerCircumflex(compiler=solidity_compiler, # freshly recompile - registry=test_registrar, # use temporary registrar + registry=temp_registrar, # use temporary registrar providers=(pyevm_provider, )) # use custom test provider # Create the blockchain @@ -143,8 +139,7 @@ def testerchain(solidity_compiler): yield testerchain - testerchain.sever_connection() # Destroy the blockchin singelton cache - os.remove(filepath) # remove registrar tempfile + testerchain.sever_connection() #