Chains and blocks#
For single chain tests, Wake provides the global chain
variable. This
variable is a Chain
object that can be used to change the chain parameters
or access the chain data. Other Chain
instances can be created, which is
useful in Cross-chain testing.
Chain properties#
The Chain
object has the following properties:
Property | Description |
---|---|
accounts |
list of Account objects owned by the client (private keys are known to the client) |
automine |
whether to automatically mine blocks |
blocks |
property to access the chain blocks |
block_gas_limit |
gas limit of the pending block |
chain_id |
chain ID |
chain_interface |
low-level chain interface useful for debugging and power users |
client_version |
client version as reported by the web3_clientVersion JSON-RPC method |
coinbase |
coinbase Account , i.e. account of the miner who mined the block |
connected |
whether the chain is connected |
default_access_list_account |
default Account used for access list creation requests |
default_call_account |
default Account used for calls |
default_estimate_account |
default Account used for gas estimations |
default_tx_account |
default Account used for transactions |
default_tx_confirmations |
default number of confirmations (mined blocks) needed before a transaction object is returned |
default_tx_type |
default transaction type (0, 1, or 2) used when sending transactions |
gas_price |
gas price used for all type 0 and type 1 transactions sent to the chain |
max_priority_fee_per_gas |
max priority fee per gas used for all type 2 transactions sent to the chain |
require_signed_transactions |
whether to send signed transactions or unsigned transactions |
txs |
dictionary of transaction objects indexed by transaction hash (a string starting with 0x ) |
tx_callback |
callback function to be called when a transaction is mined; applies only to return_tx=False transactions |
automine
, block_gas_limit
, coinbase
, default_call_account
, default_tx_account
, gas_price
, and tx_callback
can be assigned to.
Chain methods#
The Chain
object has the following methods:
Method | Description |
---|---|
change_automine |
context manager to temporarily change the automine property |
connect |
context manager to launch a chain and connect to it or connect to an already running chain |
mine |
mine a block with an optional callback function to set the next block timestamp |
mine_many |
mine multiple blocks with an optional timestamp delta between blocks |
reset |
reset the chain to its initial state |
revert |
revert the chain to a previous state given by a snapshot ID |
set_default_accounts |
set the default accounts for tx , call , estimate , and access_list requests at once |
set_min_gas_price |
set the minimum gas price accepted by the chain |
set_next_block_base_fee_per_gas |
set the base fee per gas for the next block |
set_next_block_timestamp |
set the timestamp of the next block |
snapshot |
take a snapshot of the chain state; return a snapshot ID |
snapshot_and_revert |
context manager to take a snapshot and revert to it after the context ends |
update_accounts |
update the accounts list |
deploy |
low-level method for deploying contracts from creation code |
It is recommended to use the context managers change_automine
and snapshot_and_revert
instead of setting the automine
property directly or calling snapshot
and revert
manually.
The following example presents the use of Chain
methods:
from wake.testing import chain
def test_chain():
# launch a chain and connect to it
with chain.connect(), chain.snapshot_and_revert():
# mine a block with the timestamp 1 greater than the previous block
chain.mine(lambda x: x + 1)
All Chain
context managers can be used as decorators:
from wake.testing import chain
@chain.connect()
@chain.snapshot_and_revert()
@chain.change_automine(False)
def test_chain():
# mine a block with the timestamp 1 greater than the previous block
chain.mine(lambda x: x + 1)
connect
keyword arguments#
The connect
context manager accepts keyword arguments that can override the command line arguments set in configuration files:
Keyword argument | Description | Default value |
---|---|---|
accounts |
number of accounts to generate | None (do not override) |
chain_id |
chain ID assigned to the chain | None (do not override) |
fork |
URL of the chain to fork from | None (do not override) |
hardfork |
hardfork to use | None (do not override) |
min_gas_price |
minimum gas price accepted by the chain | 0 |
block_base_fee_per_gas |
base fee per gas for the next block | 0 |
Warning
connect
keyword arguments can only be used when launching a new development chain.
Also, it is not possible to set these keyword arguments when working with Hardhat.
from wake.testing import chain
@chain.connect(
accounts=15,
chain_id=1020,
)
def test_chain():
assert len(chain.accounts) == 15
assert chain.chain_id == 1020
Accessing chain blocks#
The chain.blocks
property can be used to access up-to-date chain blocks data.
It can be indexed by an integer or string literals latest
, pending
, earliest
, safe
, and finalized
:
from wake.testing import chain
from pytypes.contracts.Counter import Counter
@chain.connect()
def test_chain_blocks():
chain.set_default_accounts(chain.accounts[0])
# get the block 0
block0 = chain.blocks[0]
# block 0 and earliest are the same
assert block0 == chain.blocks["earliest"]
counter = Counter.deploy()
# find the first block with non-zero transactions count
block = next(block for block in chain.blocks if len(block.txs) > 0)
assert block.txs[0].return_value == counter
with chain.change_automine(False):
# block -1 and latest are the same
assert chain.blocks[-1] == chain.blocks["latest"]
tx = counter.increment(confirmations=0)
# pending block contains the transaction
assert tx in chain.blocks["pending"].txs
Block properties#
The following table lists the most important block properties:
Property | Description |
---|---|
chain |
chain the block belongs to |
hash |
block hash |
number |
block number |
parent_hash |
parent block hash |
miner |
miner Account of the block |
gas_used |
amount of gas used in the block |
gas_limit |
block gas limit |
timestamp |
block timestamp |
txs |
list of transaction objects in the block sorted by transaction index |