Decoding

Decoding ABI Values

Binary values for a given ABI type can be decoded into python values as follows:

>>> from eth_abi import decode

>>> # decode a single ABI type
>>> decode(['uint256'], b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0009')
(12345,)

>>> # decode multiple ABI types
>>> decode(['bytes1', 'bytes1'], b'a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
(b'a', b'b')

>>> # decode a single tuple type with two `bytes1` types
>>> decode(['(bytes1,bytes1)'], b'a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
((b'a', b'b'),)

The eth_abi.decoding.BaseDecoder.decode() function provides an API for decoding binary values for ABI types into python values. It accepts a sequence of ABI type strings as the first argument and the binary data to be decoded, as a python bytes or bytearray value, as the second argument.

Strict Mode

By default, the decoder will raise an exception if the binary data to be decoded is not padded to the next 32-byte boundary. This behavior can be disabled for the ByteStringDecoder (the default decoder for bytes and string types) by passing strict=False to the eth_abi.abi.decode() method. Turning off strict mode will also ignore any trailing bytes beyond the data size specified. This means that if there is any padding, the validation for only empty bytes in the padding area is also ignored.

>>> from eth_abi import abi

>>> # decode a bytes value without strict mode
>>> hex_val = (
...     # offset to data is 32 bytes:
...     "0000000000000000000000000000000000000000000000000000000000000020"
...     # length of data is 1 byte:
...     "0000000000000000000000000000000000000000000000000000000000000001"
...     # b"\x01" with less than 32 bytes of padding
...     # and not strictly padded with only zero bytes:
...     "0100000000000001020300"
... )
>>> (decoded,) = abi.decode(['bytes'], bytes.fromhex(hex_val), strict=False)
>>> decoded
b'\x01'