Skip to main content

Ethereum event decoder and topic generator

Project description

eth-event

Pypi Status Build Status Coverage Status

Simple tools for Ethereum event decoding and topic generation.

Installation

You can install the latest release via pip:

$ pip install eth-brownie

Or clone the repository and use setuptools for the most up-to-date version:

$ python3 setup.py install

Usage

The package includes the following functions:

  • get_event_topic(event_abi): Given an event ABI, returns the 32 byte encoded topic.
>>> from eth_event import get_event_topic
>>> get_event_topic({'name': 'Approval', 'anonymous': False, 'type': 'event', 'inputs': [{'name': 'owner', 'type': 'address', 'indexed': True}, {'name': 'spender', 'type': 'address', 'indexed': True}, {'name': 'value', 'type': 'uint256', 'indexed': False}]})
'0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925'
  • get_topics(contract_abi): Given a contract ABI, returns a dictionary of {'event name': "encrypted topic"}.
>>> from eth_event import get_topics

>>> abi = [{'name': 'Approval', 'anonymous': False, 'type': 'event', 'inputs': [{'name': 'owner', 'type': 'address', 'indexed': True}, {'name': 'spender', 'type': 'address', 'indexed': True}, {'name': 'value', 'type': 'uint256', 'indexed': False}]}, {'name': 'Transfer', 'anonymous': False, 'type': 'event', 'inputs': [{'name': 'from', 'type': 'address', 'indexed': True}, {'name': 'to', 'type': 'address', 'indexed': True}, {'name': 'value', 'type': 'uint256', 'indexed': False}]}]

>>> get_topics(abi)
{'Transfer': '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', 'Approval': '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925'}
  • get_event_abi(contract_abi): Given a contract ABI, returns a dictionary of {'encrypted topic': "ABI"}. Useful for stripping an ABI so that only event related data remains.
>>> from eth_event import get_event_abi
>>> get_event_abi(abi)
{'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef': {'name': 'Transfer', 'inputs': [{'name': 'from', 'type': 'address', 'indexed': True}, {'name': 'to', 'type': 'address', 'indexed': True}, {'name': 'value', 'type': 'uint256', 'indexed': False}]}, '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925': {'name': 'Approval', 'inputs': [{'name': 'owner', 'type': 'address', 'indexed': True}, {'name': 'spender', 'type': 'address', 'indexed': True}, {'name': 'value', 'type': 'uint256', 'indexed': False}]}}
  • decode_event(event, abi): Given a single event from a transaction log and an ABI, returns the decoded event. The ABI may supplied in the normal contract format, or as a dictionary value generated by get_event_abi
>>> tx = token.transfer(account[1], 100, {'from': account[0]})
<Transaction object '0xd0b9f575747eafdce3ba6ee8d6c16146bfff35cb86bec0a1909ab04fa94fc024'>

>>> log = tx.logs[0]
>>> eth_event.decode_event(log, token.abi)
{'name': 'Transfer', 'data': [{'name': 'from', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a'}, {'name': 'to', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a', 'decoded': True}, {'name': 'tokens', 'type': 'uint256', 'value': 100, 'decoded': True}]}

>>> eth_event.decode_event(log, event_abi[log['topics'][0]])
{'name': 'Transfer', 'data': [{'name': 'from', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a'}, {'name': 'to', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a', 'decoded': True}, {'name': 'tokens', 'type': 'uint256', 'value': 100, 'decoded': True}]}
  • decode_logs(logs, abi): Given an entire transaction log and an ABI, returns the decoded events. The ABI may supplied in the normal contract format, or as a dictionary value generated by get_event_abi
>>> tx = token.transfer(account[1], 100, {'from': account[0]})
<Transaction object '0x615a157e84715d5f960a38fe2a3ddb566c8393cfc71f15b06170a0eff74dfdde'>

>>> eth_event.decode_logs(tx.logs, token.abi)
[{'name': 'Transfer', 'data': [{'name': 'from', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a'}, {'name': 'to', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a', 'decoded': True}, {'name': 'tokens', 'type': 'uint256', 'value': 100, 'decoded': True}]}]
  • decode_trace(trace, abi): Given the structLog from a debug_traceTransaction RPC call, returns a list of the decoded events. Useful for obtaining events when a transaction reverts.
>>> tx = token.transfer(account[1], 100, {'from': account[0]})
<Transaction object '0x71a7146996957b8a465a4e5dd41951d614254f8271fc9140b875c4fc55dde578'>

>>> trace = web3.provider.make_request("debug_traceTransaction", ['0x71a7146996957b8a465a4e5dd41951d614254f8271fc9140b875c4fc55dde578', {}])['result']['structLogs]
]
>>> eth_event.decode_trace(trace, token.abi)
[{'name': 'Transfer', 'data': [{'name': 'from', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a'}, {'name': 'to', 'type': 'address', 'value': '0xbd4940951bfa463f8fb6db762e55686f6cfdb73a', 'decoded': True}, {'name': 'tokens', 'type': 'uint256', 'value': 100, 'decoded': True}]}]

Limitations

  • If an array is indexed in an event, the topic is generated as a sha3 hash and so cannot be decrypted. In this case, the unencrypted topcic is returned and decoded is set to False.

  • Anonymous events cannot be decoded.

Tests

To run the test suite:

$ tox

Development

This project is still in development and should be considered an alpha. Comments, questions, criticisms and pull requests are welcomed.

License

This project is licensed under the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

eth_event-0.2.1.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

eth_event-0.2.1-py3-none-any.whl (6.2 kB view details)

Uploaded Python 3

File details

Details for the file eth_event-0.2.1.tar.gz.

File metadata

  • Download URL: eth_event-0.2.1.tar.gz
  • Upload date:
  • Size: 5.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.8

File hashes

Hashes for eth_event-0.2.1.tar.gz
Algorithm Hash digest
SHA256 00a649eb11bc4c38295a7b1c342a2fdf12a990b1d4857d9a1cd50f09be431f4e
MD5 ac4da2e275dfb86d96cb54a549bf34bb
BLAKE2b-256 cf150c7b1140132c8b373fdaa1e5d0ddcad1442429238227983148e291177ef1

See more details on using hashes here.

File details

Details for the file eth_event-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: eth_event-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 6.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.8

File hashes

Hashes for eth_event-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 239cbeb94ca82830fda505d811c2c390c09d1ed4e3b001fba711bf7c8fdebb76
MD5 1e0f5a0cc1dceeaed00eebd41c2de2d4
BLAKE2b-256 8d2753ab3c875a3a50e4f504b58123246ce463cd5f7e19e4a8578a1d3ea0ef6e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page