A simple offline web3 transaction input decoder for functions and constructors
Project description
web3-input-decoder
A simple offline web3 transaction input decoder for functions and constructors.
Install
pip install web3-input-decoder
Quick start
Let's take a USDT transfer transaction and the USDT contract creator transaction as an example:
>>> import json
>>> import urllib.request
>>> from web3_input_decoder import decode_constructor, decode_function
>>> f = urllib.request.urlopen("https://api.etherscan.io/api?module=contract&action=getabi&address=0xdac17f958d2ee523a2206206994597c13d831ec7")
>>> TETHER_ABI = json.loads(json.load(f)["result"])
>>> decode_function(
TETHER_ABI, "0xa9059cbb000000000000000000000000f050227be1a7ce587aa83d5013f900dbc3be0611000000000000000000000000000000000000000000000000000000000ecdd350",
)
[('address', '_to', '0xf050227be1a7ce587aa83d5013f900dbc3be0611'),
('uint256', '_value', 248370000)]
>>> decode_constructor(
TETHER_ABI, "000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a546574686572205553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045553445400000000000000000000000000000000000000000000000000000000"
)
[('uint256', '_initialSupply', 100000000000),
('string', '_name', 'Tether USD'),
('string', '_symbol', 'USDT'),
('uint256', '_decimals', 6)]
You can also play with it here.
Performance enhancement
If you have lots of inputs in the same contract to decode, consider using InputDecoder
.
>>> from web3_input_decoder import InputDecoder
>>> decoder = InputDecoder(TETHER_ABI)
>>> for _ in range(10000):
>>> decoder.decode_function(
(
"0xa9059cbb000000000000000000000000f050227be1a7ce587aa83d5013f900dbc3be"
"0611000000000000000000000000000000000000000000000000000000000ecdd350"
),
)
API
-
def decode_constructor( abi: List[dict], tx_input: Union[str, bytes], bytecode: Union[str, bytes] = None, ) -> List[Tuple[str, str, Any]]
Parameters:
abi
: Contract ABItx_input
: Transaction input to decode, with or without deployed contract bytecodebytecode
: Optional deployed contract bytecode. If this is set,tx_input
should include bytecode
Returns:
List[Tuple[str, str, Any]]
: Decoded type-name-value tuples
-
def decode_function( abi: List[dict], tx_input: Union[str, bytes] ) -> List[Tuple[str, str, Any]]
Parameters:
abi
: Contract ABItx_input
: Transaction input to decode
Returns:
List[Tuple[str, str, Any]]
: Decoded type-name-value tuples
Rationale
Existing solutions are not satisfying to me, e.g.:
-
web3py can only decode function calls and it's necessary to be online to set up a provider first.
-
ethereum-input-decoder is not actively maintained and it contains several glitches.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for web3_input_decoder-0.1.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 05a7d0def5bed77463686ca1d9b72ed45008a79643f50c6267c1336f82f504dc |
|
MD5 | b57e2b8ac88f867612705d05d73be660 |
|
BLAKE2b-256 | 6354909959930d3702fbc72a5691b3f5fdaa0ed88361871df1f59b234943482d |