Using Python debugger#
woke test and
woke fuzz support entering pdb, the Python debugger, when an error occurs.
Woke 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.
breakpoint() is not currently supported with
Inside ipdb, any expression can be evaluated by typing it and pressing
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.
help: show help
continue: continue execution
next: step over the next line
list: show the current line and a few lines around it
quit: quit the debugger
down: move up or down the call stack
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 woke.testing import * from pytypes.contracts.Counter import Counter from pytypes.contracts.Gateway import Gateway @default_chain.connect() def test_call_trace(): default_chain.set_default_accounts(default_chain.accounts) 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)
Internal calls are not currently visualized in call traces.
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 woke.testing import * from pytypes.contracts.Counter import Counter @default_chain.connect() def test_console_logs(): default_chain.tx_callback = lambda tx: print(tx.console_logs) default_chain.set_default_accounts(default_chain.accounts) counter = Counter.deploy() counter.increment() counter.setCount(42)
Woke integrates the
console.sol library implementing the same functionalities as Hardhat's
It can serve as a drop-in replacement in case that the tested project is not using Hardhat.
console_logs is not currently supported with Hardhat and Ganache.