Debugging#
Using Python debugger#
wake test
supports entering pdb, the Python debugger, when an error occurs.
Wake uses an enhanced version of the Python debugger, ipdb, which provides a more user-friendly interface.
It is also possible to enter the debugger manually by inserting a breakpoint()
statement in the code.
from wake.testing import *
@chain.connect()
def test_breakpoint():
breakpoint()
block = chain.blocks[0]
Info
breakpoint()
is not currently supported when running wake test
in multiprocessing mode (with the -P
option set)
Inside ipdb, any expression can be evaluated by typing it and pressing Enter
.
This can be used to get the value of a variable, to call a function, including contract functions, or even to deploy a new contract.
Useful commands:
h
orhelp
: show helpc
orcontinue
: continue executionn
ornext
: step over the next linel
orlist
: show the current line and a few lines around itq
orquit
: quit the debuggerup
ordown
: move up or down the call stack
Call traces#
Every transaction object has a call_trace
property that visualizes the call stack of the transaction.
It can be used to debug failing transactions.
External contracts in forking mode
When using forking mode (see connect
keyword arguments), already present contracts are printed as unknown contracts in call traces.
To show contract and function names, configure your API key for a given chain explorer.
from wake.testing import *
from pytypes.contracts.Counter import Counter
from pytypes.contracts.Gateway import Gateway
@chain.connect()
def test_call_trace():
gateway = Gateway.deploy()
counter = Counter.deploy()
counter.addToWhitelist(gateway)
tx = gateway.execute(
counter,
Abi.encode_call(counter.decrement, []),
confirmations=0,
)
print(tx.call_trace)
tx = gateway.execute(
counter,
Abi.encode_call(counter.increment, []),
)
print(tx.call_trace)
Info
Internal calls are not currently visualized in call traces.
Console logs#
Using the console.sol
library from Hardhat
may be the easiest way to debug a contract. Logs can be accessed through the console_logs
property of a transaction object.
Console logs are available even for failed transactions.
from wake.testing import *
from pytypes.contracts.Counter import Counter
@chain.connect()
def test_console_logs():
chain.tx_callback = lambda tx: print(tx.console_logs)
counter = Counter.deploy()
counter.increment()
counter.setCount(42)
Wake-integrated console.sol
Wake integrates the console.sol
library implementing the same functionalities as Hardhat's console.sol
.
It can serve as a drop-in replacement in case that the tested project is not using Hardhat.