mirror of https://github.com/nucypher/nucypher.git
Keep fixtures up to date with registry changes; Deprecate or relocate some test utilities.
parent
c3970ebf2b
commit
4c69809af9
|
@ -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
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue