# decoding ethereum smart contract data

By [DeCode](https://paragraph.com/@decode) · 2022-06-16

---

from web3.\_utils.events import get\_event\_data @lru\_cache(maxsize=None)def _get\_topic2abi(abi): if isinstance(abi, (str)): abi = json.loads(abi) event\_abi = \[a for a in abi if a\['type'\] == 'event'\] topic2abi = {event\_abi\_to\_log\_topic(_): \_ for \_ in event\_abi} return topic2abi @lru\_cache(maxsize=None)def \_get\_hex\_topic(t): hex\_t = HexBytes(t) return hex\_t def decode\_log(data, topics, abi): if abi is not None: try: topic2abi = \_get\_topic2abi(abi) log = { 'address': None, #Web3.toChecksumAddress(address), 'blockHash': None, #HexBytes(blockHash), 'blockNumber': None, 'data': data, 'logIndex': None, 'topics': \[_get\_hex\_topic(_) for \_ in topics\], 'transactionHash': None, #HexBytes(transactionHash), 'transactionIndex': None } event\_abi = topic2abi\[log\['topics'\]\[0\]\] evt\_name = event\_abi\['name'\] data = get\_event\_data(w3.codec, event\_abi, log)\['args'\] target\_schema = event\_abi\['inputs'\] decoded\_data = convert\_to\_hex(data, target\_schema) return (evt\_name, json.dumps(decoded\_data), json.dumps(target\_schema)) except Exception: return ('decode error', traceback.format\_exc(), None) else: return ('no matching abi', None, None) pair\_abi = '\[{"inputs":\[\],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":\[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}\],"name":"Approval","type":"event"},{"anonymous":false,"inputs":\[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}\],"name":"Burn","type":"event"},{"anonymous":false,"inputs":\[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}\],"name":"Mint","type":"event"},{"anonymous":false,"inputs":\[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}\],"name":"Swap","type":"event"},{"anonymous":false,"inputs":\[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}\],"name":"Sync","type":"event"},{"anonymous":false,"inputs":\[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}\],"name":"Transfer","type":"event"},{"constant":true,"inputs":\[\],"name":"DOMAIN\_SEPARATOR","outputs":\[{"internalType":"bytes32","name":"","type":"bytes32"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[\],"name":"MINIMUM\_LIQUIDITY","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[\],"name":"PERMIT\_TYPEHASH","outputs":\[{"internalType":"bytes32","name":"","type":"bytes32"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}\],"name":"allowance","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}\],"name":"approve","outputs":\[{"internalType":"bool","name":"","type":"bool"}\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":\[{"internalType":"address","name":"","type":"address"}\],"name":"balanceOf","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"to","type":"address"}\],"name":"burn","outputs":\[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":\[\],"name":"decimals","outputs":\[{"internalType":"uint8","name":"","type":"uint8"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[\],"name":"factory","outputs":\[{"internalType":"address","name":"","type":"address"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[\],"name":"getReserves","outputs":\[{"internalType":"uint112","name":"\_reserve0","type":"uint112"},{"internalType":"uint112","name":"\_reserve1","type":"uint112"},{"internalType":"uint32","name":"\_blockTimestampLast","type":"uint32"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"\_token0","type":"address"},{"internalType":"address","name":"\_token1","type":"address"}\],"name":"initialize","outputs":\[\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":\[\],"name":"kLast","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"to","type":"address"}\],"name":"mint","outputs":\[{"internalType":"uint256","name":"liquidity","type":"uint256"}\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":\[\],"name":"name","outputs":\[{"internalType":"string","name":"","type":"string"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[{"internalType":"address","name":"","type":"address"}\],"name":"nonces","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}\],"name":"permit","outputs":\[\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":\[\],"name":"price0CumulativeLast","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[\],"name":"price1CumulativeLast","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"to","type":"address"}\],"name":"skim","outputs":\[\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":\[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}\],"name":"swap","outputs":\[\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":\[\],"name":"symbol","outputs":\[{"internalType":"string","name":"","type":"string"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[\],"name":"sync","outputs":\[\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":\[\],"name":"token0","outputs":\[{"internalType":"address","name":"","type":"address"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[\],"name":"token1","outputs":\[{"internalType":"address","name":"","type":"address"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":\[\],"name":"totalSupply","outputs":\[{"internalType":"uint256","name":"","type":"uint256"}\],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}\],"name":"transfer","outputs":\[{"internalType":"bool","name":"","type":"bool"}\],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":\[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}\],"name":"transferFrom","outputs":\[{"internalType":"bool","name":"","type":"bool"}\],"payable":false,"stateMutability":"nonpayable","type":"function"}\]'output = decode\_log( '0x000000000000000000000000000000000000000000000000000000009502f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000093f8f932b016b1c', \[ '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822', '0x0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d', '0x000000000000000000000000242301fa62f0de9e3842a5fb4c0cdca67e3a2fab'\], pair\_abi) print('event emitted: ', output\[0\])print('arguments: ', json.dumps(json.loads(output\[1\]), indent=2))

---

*Originally published on [DeCode](https://paragraph.com/@decode/decoding-ethereum-smart-contract-data)*
