Metadata-Version: 2.1
Name: evm-trace
Version: 0.1.2
Summary: evm-trace: Ethereum Virtual Machine transaction tracing tool
Home-page: https://github.com/ApeWorX/evm-trace
Author: ApeWorX Ltd.
Author-email: admin@apeworx.io
License: Apache-2.0
Keywords: ethereum
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Natural Language :: English
Classifier: Operating System :: MacOS
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Requires-Python: >=3.8,<4
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pydantic <3,>=2.5.2
Requires-Dist: py-evm <0.9,>=0.7.0a4
Requires-Dist: eth-utils <3,>=2.3.1
Requires-Dist: msgspec >=0.8
Requires-Dist: eth-pydantic-types >=0.1.0a5
Provides-Extra: dev
Requires-Dist: pytest >=6.0 ; extra == 'dev'
Requires-Dist: pytest-xdist ; extra == 'dev'
Requires-Dist: pytest-cov ; extra == 'dev'
Requires-Dist: hypothesis <7.0,>=6.2.0 ; extra == 'dev'
Requires-Dist: eth-hash[pysha3] ; extra == 'dev'
Requires-Dist: black <24,>=23.11.0 ; extra == 'dev'
Requires-Dist: mypy <2,>=1.7.1 ; extra == 'dev'
Requires-Dist: types-setuptools ; extra == 'dev'
Requires-Dist: flake8 <7,>=6.1.0 ; extra == 'dev'
Requires-Dist: flake8-breakpoint <2,>=1.1.0 ; extra == 'dev'
Requires-Dist: flake8-print <6,>=5.0.0 ; extra == 'dev'
Requires-Dist: isort <6,>=5.10.1 ; extra == 'dev'
Requires-Dist: mdformat >=0.7.17 ; extra == 'dev'
Requires-Dist: mdformat-gfm >=0.3.5 ; extra == 'dev'
Requires-Dist: mdformat-frontmatter >=0.4.1 ; extra == 'dev'
Requires-Dist: mdformat-pyproject >=0.0.1 ; extra == 'dev'
Requires-Dist: setuptools ; extra == 'dev'
Requires-Dist: wheel ; extra == 'dev'
Requires-Dist: twine ; extra == 'dev'
Requires-Dist: commitizen ; extra == 'dev'
Requires-Dist: pre-commit ; extra == 'dev'
Requires-Dist: pytest-watch ; extra == 'dev'
Requires-Dist: IPython ; extra == 'dev'
Requires-Dist: ipdb ; extra == 'dev'
Provides-Extra: lint
Requires-Dist: black <24,>=23.11.0 ; extra == 'lint'
Requires-Dist: mypy <2,>=1.7.1 ; extra == 'lint'
Requires-Dist: types-setuptools ; extra == 'lint'
Requires-Dist: flake8 <7,>=6.1.0 ; extra == 'lint'
Requires-Dist: flake8-breakpoint <2,>=1.1.0 ; extra == 'lint'
Requires-Dist: flake8-print <6,>=5.0.0 ; extra == 'lint'
Requires-Dist: isort <6,>=5.10.1 ; extra == 'lint'
Requires-Dist: mdformat >=0.7.17 ; extra == 'lint'
Requires-Dist: mdformat-gfm >=0.3.5 ; extra == 'lint'
Requires-Dist: mdformat-frontmatter >=0.4.1 ; extra == 'lint'
Requires-Dist: mdformat-pyproject >=0.0.1 ; extra == 'lint'
Provides-Extra: release
Requires-Dist: setuptools ; extra == 'release'
Requires-Dist: wheel ; extra == 'release'
Requires-Dist: twine ; extra == 'release'
Provides-Extra: test
Requires-Dist: pytest >=6.0 ; extra == 'test'
Requires-Dist: pytest-xdist ; extra == 'test'
Requires-Dist: pytest-cov ; extra == 'test'
Requires-Dist: hypothesis <7.0,>=6.2.0 ; extra == 'test'
Requires-Dist: eth-hash[pysha3] ; extra == 'test'

# Quick Start

Ethereum Virtual Machine transaction tracing tool

## Dependencies

- [python3](https://www.python.org/downloads) version 3.8 to 3.11.

## Installation

### via `pip`

You can install the latest release via [`pip`](https://pypi.org/project/pip/):

```bash
pip install evm-trace
```

### via `setuptools`

You can clone the repository and use [`setuptools`](https://github.com/pypa/setuptools) for the most up-to-date version:

```bash
git clone https://github.com/ApeWorX/evm-trace.git
cd evm-trace
python3 setup.py install
```

## Quick Usage

### Geth Style Traces

If you are using a node that supports the `debug_traceTransaction` RPC, you can use `web3.py` to get trace frames:

```python
from web3 import HTTPProvider, Web3
from evm_trace import TraceFrame

web3 = Web3(HTTPProvider("https://path.to.my.node"))
txn_hash = "0x..."
struct_logs = web3.manager.request_blocking("debug_traceTransaction", [txn_hash]).structLogs
for item in struct_logs:
    frame = TraceFrame.model_validate(item)
```

If you want to get the call-tree node, you can do:

```python
from evm_trace import CallType, get_calltree_from_geth_trace

root_node_kwargs = {
    "gas_cost": 10000000,
    "gas_limit": 10000000000,
    "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
    "calldata": "0x00",
    "value": 1000,
    "call_type": CallType.CALL,
}

# Where `trace` is a `TraceFrame` (see example above)
calltree = get_calltree_from_geth_trace(trace, **root_node_kwargs)
```

### Parity Style Traces

If you are using a node that supports the `trace_transaction` RPC, you can use `web3.py` to get trace objects:

```python
from evm_trace import CallType, ParityTraceList

raw_trace_list = web3.manager.request_blocking("trace_transaction", [txn_hash])
trace_list = ParityTraceList.model_validate(raw_trace_list)
```

And to make call-tree nodes, you can do:

```python
from evm_trace import get_calltree_from_parity_trace

tree = get_calltree_from_parity_trace(trace_list)
```

### Gas Reports

If you are using a node that supports creating traces, you can get a gas report.

```python
from evm_trace.gas import get_gas_report

# see examples above for creating a calltree
calltree = get_calltree_from_geth_trace(trace, **root_node_kwargs)

gas_report = get_gas_report(calltree)
```

For a more custom report, use the `merge_reports` method to combine a list of reports into a single report.
Pass two or more `Dict[Any, Dict[Any, List[int]]]` to combine reports where `List[int]` is the gas used.

Customize the values of `Any` accordingly:

1. The first `Any` represents the bytes from the address.
2. The second `Any` represents the method selector.

For example, you may replace addresses with token names or selector bytes with signature call strings.

Import the method like so:

```python
from evm_trace.gas import merge_reports
```

## Development

This project is in development and should be considered a beta.
Things might not be in their final state and breaking changes may occur.
Comments, questions, criticisms and pull requests are welcomed.

## License

This project is licensed under the [Apache 2.0](LICENSE).
