hardhat-tracer 🕵️
This is a beta release. Some things might not work.
Allows you to see events, calls and storage operations when running your tests.
Installation
Step 1: Install the package
npm i hardhat-tracer
Step 2: Add to your hardhat.config.js
file
require("hardhat-tracer");
Usage
Test
npx hardhat test --trace # same as --vvv
npx hardhat test --fulltrace # same as --vvvv
npx hardhat test --v # shows logs + calls for only failed txs
npx hardhat test --vv # shows logs + calls + storage for only failed txs
npx hardhat test --vvv # shows logs + calls for all txs
npx hardhat test --vvvv # shows logs + calls + storage for all txs
# specify opcode
npx hardhat test --v --opcodes ADD,SUB # shows any opcode specified for only failed txs
npx hardhat test --vvv --opcodes ADD,SUB # shows any opcode specified for all txs
You can just enable trace some code snippet in your tests:
hre.tracer.enable = true;
await myContract.doStuff(val2);
hre.tracer.enable = false;
Trace
You can trace a mainnet transaction and ABIs/artifacts in your project will be used to decode the internal message calls.
npx hardhat trace --hash 0xTransactionHash # works if mainnet fork is on
npx hardhat trace --hash 0xTransactionHash --rpc https://url # must be archive node
Calldata decoder
If you are just looking for a quick decode of calldata or Solidity"s Custom Error:
$ npx hardhat decode --data 0x095ea7b300000000000000000000000068b3465833fb72a70ecdf485e0e4c7bd8665fc45ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ERC20.approve(spender=0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45, amount=115792089237316195423570985008687907853269984665640564039457584007913129639935)
Address name tags
You can set display names / name tags for unknown addresses by adding new entry to hre.tracer.nameTags
object in your test cases, see following example:
hre.tracer.nameTags[this.arbitrager.address] = "Arbitrager";
or can be set in hardhat config
tracer: {
nameTags: {
"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": "Hunter",
[someVariable]: "MyContract",
},
},
State overrides
These state overrides are applied when the EthereumJS/VM is created inside hardhat.
tracer: {
stateOverrides: {
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2": {
storage: {
"0": 100,
"0x1abf42a573070203916aa7bf9118741d8da5f9522f66b5368aa0a2644f487b38": 0,
},
bytecode: "0x30FF",
balance: parseEther("2"),
nonce: 2
},
},
},