{ "info": { "author": "Benjamin Hauser", "author_email": "b.hauser@zerolaw.tech", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Build Tools" ], "description": "# eth-event\n\n[![Pypi Status](https://img.shields.io/pypi/v/eth-event.svg)](https://pypi.org/project/eth-event/) [![Build Status](https://img.shields.io/travis/com/iamdefinitelyahuman/eth-event.svg)](https://travis-ci.com/iamdefinitelyahuman/eth-event) [![Coverage Status](https://coveralls.io/repos/github/iamdefinitelyahuman/eth-event/badge.svg?branch=master)](https://coveralls.io/github/iamdefinitelyahuman/eth-event?branch=master)\n\nSimple tools for Ethereum event decoding and topic generation.\n\n## Installation\n\nYou can install the latest release via ``pip``:\n\n```bash\n$ pip install eth-brownie\n```\n\nOr clone the repository and use ``setuptools`` for the most up-to-date version:\n\n```bash\n$ python3 setup.py install\n```\n\n## Usage\n\nThe package includes the following functions:\n\n* `get_event_topic(event_abi)`: Given an event ABI, returns the 32 byte encoded topic.\n\n```python\n>>> from eth_event import get_event_topic\n>>> 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}]})\n'0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925'\n```\n\n* `get_topics(contract_abi)`: Given a contract ABI, returns a dictionary of `{'event name': \"encrypted topic\"}`.\n\n```python\n>>> from eth_event import get_topics\n\n>>> 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}]}]\n\n>>> get_topics(abi)\n{'Transfer': '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', 'Approval': '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925'}\n```\n\n* `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.\n\n```python\n>>> from eth_event import get_event_abi\n>>> get_event_abi(abi)\n{'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}]}}\n```\n\n* `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`\n\n```python\n>>> tx = token.transfer(account[1], 100, {'from': account[0]})\n\n\n>>> log = tx.logs[0]\n>>> eth_event.decode_event(log, token.abi)\n{'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}]}\n\n>>> eth_event.decode_event(log, event_abi[log['topics'][0]])\n{'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}]}\n```\n\n* `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`\n\n```python\n>>> tx = token.transfer(account[1], 100, {'from': account[0]})\n\n\n>>> eth_event.decode_logs(tx.logs, token.abi)\n[{'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}]}]\n```\n\n* `decode_trace(trace, abi)`: Given the `structLog` from a [debug_traceTransaction](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#debug_tracetransaction) RPC call, returns a list of the decoded events. Useful for obtaining events when a transaction reverts.\n\n```python\n>>> tx = token.transfer(account[1], 100, {'from': account[0]})\n\n\n>>> trace = web3.provider.make_request(\"debug_traceTransaction\", ['0x71a7146996957b8a465a4e5dd41951d614254f8271fc9140b875c4fc55dde578', {}])['result']['structLogs]\n]\n>>> eth_event.decode_trace(trace, token.abi)\n[{'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}]}]\n```\n\n## Limitations\n\n* 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`.\n\n* Anonymous events cannot be decoded.\n\n## Tests\n\nTo run the test suite:\n\n```bash\n$ tox\n```\n\n## Development\n\nThis project is still in development and should be considered an alpha. Comments, questions, criticisms and pull requests are welcomed.\n\n## License\n\nThis project is licensed under the [MIT license](LICENSE).\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/iamdefinitelyahuman/eth-event", "keywords": "ethereum", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "eth-event", "package_url": "https://pypi.org/project/eth-event/", "platform": "", "project_url": "https://pypi.org/project/eth-event/", "project_urls": { "Homepage": "https://github.com/iamdefinitelyahuman/eth-event" }, "release_url": "https://pypi.org/project/eth-event/0.2.1/", "requires_dist": [ "eth-abi (<3.0.0,>=2.0.0)", "eth-hash[pycryptodome] (<1.0.0,>=0.2.0)", "hexbytes (<1.0.0,>=0.2.0)" ], "requires_python": "", "summary": "Ethereum event decoder and topic generator", "version": "0.2.1" }, "last_serial": 5646399, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "8b60178d0f1734fa17e972dc796f2b80", "sha256": "e2a942deea5fad0a7ed1b2a0cc74cab041a1ee31b13e5e922a3766e83f28293a" }, "downloads": -1, "filename": "eth_event-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "8b60178d0f1734fa17e972dc796f2b80", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3214, "upload_time": "2019-01-06T05:20:07", "url": "https://files.pythonhosted.org/packages/9a/8b/034d55deee6f8b611d649dd042842e3c72e426cc48b3f4731e1da65e2e48/eth_event-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8dd3d44c11325e9ed80dd528fbc370ce", "sha256": "d4e93cf1da4cf62b4780ed55b707d97f8e56fe885d8387305af7db5c1f3a89f4" }, "downloads": -1, "filename": "eth_event-0.1.tar.gz", "has_sig": false, "md5_digest": "8dd3d44c11325e9ed80dd528fbc370ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2061, "upload_time": "2019-01-05T22:40:47", "url": "https://files.pythonhosted.org/packages/f7/f3/ea0f9d5046a52e25407791451998b2dca0a0ac3522d8656b988e0d892206/eth_event-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "077f48a797f662dea049e14dcaaccc2a", "sha256": "47e71f29a7cd29b81a0c44b87e5913aca949ec8c3e4024c701005302757ce299" }, "downloads": -1, "filename": "eth_event-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "077f48a797f662dea049e14dcaaccc2a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6542, "upload_time": "2019-01-14T10:55:21", "url": "https://files.pythonhosted.org/packages/a7/4f/334a925f351bcc67008d0dbc7d5e2a0ce885824f7774e6aee5c05fe3c6b4/eth_event-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1238202443a3b4deaf3bb6acf0209ec5", "sha256": "ac7b8463dcdd2e8d9c48ef659a8b7cd03b4a4203640f557443174eaec7c91971" }, "downloads": -1, "filename": "eth_event-0.1.1.tar.gz", "has_sig": false, "md5_digest": "1238202443a3b4deaf3bb6acf0209ec5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2438, "upload_time": "2019-01-06T05:20:06", "url": "https://files.pythonhosted.org/packages/f8/ac/03d76f9de1cf2bfc6a97ebf7e05992429a098667a161da986d33a854c9f2/eth_event-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "6cdff66529bc70e852d25120e5c3d124", "sha256": "caba1506654a500bfa76b8bf5907e2312f070fce6698250cbd5e9595dfe31381" }, "downloads": -1, "filename": "eth_event-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6cdff66529bc70e852d25120e5c3d124", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6543, "upload_time": "2019-01-14T10:55:23", "url": "https://files.pythonhosted.org/packages/5f/23/f498e30de0144c680e45f56e4678cb39d152a20b1b092566694b7513456f/eth_event-0.1.2-py3-none-any.whl" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "d63c250dd308360d237a44ae2dd9eacc", "sha256": "165676e949859afa83ea634b59b7f4f900bf88d6cf387b04b667daddf4828dec" }, "downloads": -1, "filename": "eth_event-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d63c250dd308360d237a44ae2dd9eacc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5645, "upload_time": "2019-01-16T13:59:48", "url": "https://files.pythonhosted.org/packages/d6/d7/5002830f2eeb48c326057421c2431ed19dcba5e7fc3d3af79b83c7abb45a/eth_event-0.1.3-py3-none-any.whl" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "14ba836d6a596f3bc65a2a1ec9f21952", "sha256": "dacca24c2db2b9835ce91c159a3dc07d7439085354f7211d7a57fc91cb24a7e7" }, "downloads": -1, "filename": "eth_event-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "14ba836d6a596f3bc65a2a1ec9f21952", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5660, "upload_time": "2019-01-16T17:20:14", "url": "https://files.pythonhosted.org/packages/2d/7e/24090a832d281020d472d157fcf494ca5ce6db9a70fef0490160699a5636/eth_event-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "33cc4a2130a1d8b2f6be232b026c310d", "sha256": "9b06f35e63b8e91a663dcdc06d43f11446ad3491a3e67c8b33c7d03d332f7301" }, "downloads": -1, "filename": "eth_event-0.1.4.tar.gz", "has_sig": false, "md5_digest": "33cc4a2130a1d8b2f6be232b026c310d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4559, "upload_time": "2019-01-16T17:20:16", "url": "https://files.pythonhosted.org/packages/64/5d/79c2fd78318be134db95f8948082f7e9e4ed994d8d8d804cb4a9cd7b1068/eth_event-0.1.4.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "712d42023cabb33803000cba77815601", "sha256": "dced89287a0b0f3cac585955fd653e075eec83218d4be1e0a39e5f89cd0f1519" }, "downloads": -1, "filename": "eth_event-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "712d42023cabb33803000cba77815601", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6219, "upload_time": "2019-08-07T05:23:11", "url": "https://files.pythonhosted.org/packages/a4/8d/726454cf4560d171883669c5fcbb5e80c7d143a9ab2857419aa27f80117f/eth_event-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8dce37a25dde08e42bdd9d7a92885e9", "sha256": "46bd31dcf8717aea7c71a47935fc56c4f7032061b1813e6306f456c34886cc15" }, "downloads": -1, "filename": "eth_event-0.2.0.tar.gz", "has_sig": false, "md5_digest": "f8dce37a25dde08e42bdd9d7a92885e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5215, "upload_time": "2019-08-07T05:23:13", "url": "https://files.pythonhosted.org/packages/ca/89/5ebe679f0b6221e4d9243eb83e480d0451e412f8217674e20842f2cde165/eth_event-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "1e0f5a0cc1dceeaed00eebd41c2de2d4", "sha256": "239cbeb94ca82830fda505d811c2c390c09d1ed4e3b001fba711bf7c8fdebb76" }, "downloads": -1, "filename": "eth_event-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1e0f5a0cc1dceeaed00eebd41c2de2d4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6234, "upload_time": "2019-08-07T18:47:31", "url": "https://files.pythonhosted.org/packages/8d/27/53ab3c875a3a50e4f504b58123246ce463cd5f7e19e4a8578a1d3ea0ef6e/eth_event-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ac4da2e275dfb86d96cb54a549bf34bb", "sha256": "00a649eb11bc4c38295a7b1c342a2fdf12a990b1d4857d9a1cd50f09be431f4e" }, "downloads": -1, "filename": "eth_event-0.2.1.tar.gz", "has_sig": false, "md5_digest": "ac4da2e275dfb86d96cb54a549bf34bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5216, "upload_time": "2019-08-07T18:47:33", "url": "https://files.pythonhosted.org/packages/cf/15/0c7b1140132c8b373fdaa1e5d0ddcad1442429238227983148e291177ef1/eth_event-0.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1e0f5a0cc1dceeaed00eebd41c2de2d4", "sha256": "239cbeb94ca82830fda505d811c2c390c09d1ed4e3b001fba711bf7c8fdebb76" }, "downloads": -1, "filename": "eth_event-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1e0f5a0cc1dceeaed00eebd41c2de2d4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6234, "upload_time": "2019-08-07T18:47:31", "url": "https://files.pythonhosted.org/packages/8d/27/53ab3c875a3a50e4f504b58123246ce463cd5f7e19e4a8578a1d3ea0ef6e/eth_event-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ac4da2e275dfb86d96cb54a549bf34bb", "sha256": "00a649eb11bc4c38295a7b1c342a2fdf12a990b1d4857d9a1cd50f09be431f4e" }, "downloads": -1, "filename": "eth_event-0.2.1.tar.gz", "has_sig": false, "md5_digest": "ac4da2e275dfb86d96cb54a549bf34bb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5216, "upload_time": "2019-08-07T18:47:33", "url": "https://files.pythonhosted.org/packages/cf/15/0c7b1140132c8b373fdaa1e5d0ddcad1442429238227983148e291177ef1/eth_event-0.2.1.tar.gz" } ] }