Deployment#
Differences from testing#
Most information about testing is applicable to deployment as well. However, there are a few key differences.
The behavior depends on whether wake.testing
or wake.deployment
is imported.
wake.deployment
should be used when interacting with a live chain (testnet or mainnet). wake.testing
should be used when interacting with a local development chain (like Anvil, Ganache, or Hardhat).
# use wake.deployment when interacting with a live chain
from wake.deployment import *
# use wake.testing when interacting with a local development chain
from wake.testing import *
chain.connect
keyword arguments#
The context manager chain.connect
takes min_gas_price
and block_base_fee_per_gas
keyword arguments.
In testing, these are set to 0
by default. In deployment, these are set to None
by default.
Required signed transactions#
In testing, transactions are not required to be signed for performance reasons. In deployment, transactions are required to be signed by default.
That is, chain.require_signed_transactions
is True
by default.
chain.block_gas_limit
#
In testing, the value of chain.block_gas_limit
is cached for performance reasons. In deployment, the value is always fetched from the chain for the current pending
block.
chain.gas_price
#
chain.gas_price
is a constant value in testing and can be modified by the user. In deployment, chain.gas_price
is a value returned by the eth_gasPrice
JSON-RPC method.
chain.max_priority_fee_per_gas
#
chain.max_priority_fee_per_gas
is a constant value in testing and can be modified by the user. In deployment, chain.max_priority_fee_per_gas
is a value returned by the eth_maxPriorityFeePerGas
JSON-RPC method.
Managing accounts with private keys#
While it is possible to import accounts from a private key or mnemonic phrase at runtime, it is not recommended.
To protect your private keys, it should be encrypted and stored in a file. To do this, use wake accounts
CLI commands.
$ wake accounts --help
Usage: wake accounts [OPTIONS] COMMAND [ARGS]...
Run Wake accounts manager.
╭─ Options ───────────────────────────────────────────────────────────────╮
│ --help Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ Commands ──────────────────────────────────────────────────────────────╮
│ export Export an account's private key. │
│ import Import an account from a private key or mnemonic. │
│ list List all accounts. │
│ new Create a new account. │
│ remove Remove an account. │
╰─────────────────────────────────────────────────────────────────────────╯
Accounts are referenced by their alias, which is a unique identifier, string, defined by the user. Accounts can be imported by their alias in scripts:
Writing deployment scripts#
wake.deployment
module can be imported in test files. This can be useful when both interacting with a live chain and pytest features like fixtures are needed.
This way, integration tests can be written using the same conventions as unit tests.
To distinguish between tests and deployment scripts, it is possible to execute Python scripts using the wake run
CLI command.
The Python scripts must define a main
function, which will be executed when the script is run.
When no arguments are passed to wake run
, the scripts
directory is searched for Python scripts.
from wake.deployment import *
from pytypes.contracts.Counter import Counter
ALCHEMY_API_KEY = "YOUR_ALCHEMY_API_KEY"
@chain.connect(f"wss://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_API_KEY}")
def main():
acc = Account.from_alias("deployment")
chain.set_default_accounts(acc)
counter = Counter.deploy()
print(counter)
counter.increment()
assert counter.count() == 1
And then run the script:
Supported chains#
The following chains are supported (mainnets and testnets):
- Ethereum
- Binance Smart Chain
- Polygon
- Avalanche
- Arbitrum
- Polygon zkEVM
- Optimism
- Base