Calculate Solidity function selectors, event hashes, decode calldata, and sign messages.
Project description
getHashData
Calculate Solidity function selectors, event hashes, decode calldata, and sign messages.
Features
- Hash Calculation: Compute Keccak-256 hashes for Solidity function signatures and event signatures
- Function Selectors: Get 4-byte function selectors for contract calls
- Selector Lookup: Reverse lookup function signatures using 4byte.directory API
- Calldata Decoding: Decode calldata with ABI or auto-detect via 4byte.directory
- Message Signing: Sign messages and hashes with Ethereum private keys
- Address Checksum: Convert Ethereum addresses to checksummed format
Installation
pip install getHashData
Quick Start
Calculate Function Selector
getHash -f -s "transfer(address,uint256)"
# Output: 0xa9059cbb transfer(address,uint256)
Calculate Event Hash
getHash -s "Transfer(address,address,uint256)"
# Output: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef Transfer(address,address,uint256)
Lookup Function Signature
getHash --lookup 0xa9059cbb
# Output: Selector 0xa9059cbb:
# transfer(address,uint256)
# transfer(address,uint)
Decode Calldata (Auto-detect)
getHash --decode-auto 0xa9059cbb0000000000000000000000005aaeb6053ba3eedb6a475a1c689177b8d1c56f4d0000000000000000000000000000000000000000000000000de0b6b3a7640000
# Output: Signature: transfer(address,uint256)
# Function: transfer
# Parameters:
# [address] param0: 0x5aAeb6053ba3EEdb6a475A1c689177B8d1c56f4d
# [uint256] param1: 1000000000000000000
Sign Message
getHash --sign -k <private_key> -d "Hello, Ethereum!"
# Output: messageHash: 0x...
# r: ...
# s: ...
# v: ...
# signature: 0x...
Address Checksum
getHash --checksum 0x5aaeb6053ba3eedb6a475a1c689177b8d1c56f4d
# Output: 0x5aAeb6053ba3EEdb6a475A1c689177B8d1c56f4d
CLI Usage
usage: getHash [-h] [-s STRING] [-i INPUT_FILE] [-a ABI_FILE] [-o OUTPUT_FILE]
[-w] [-f] [-k PRIVATE_KEY] [-d DATA] [--hex HEX_DATA]
[--sign] [--lookup LOOKUP_SELECTOR] [--decode DECODE_CALLDATA]
[--decode-auto DECODE_CALLDATA_AUTO] [--checksum CHECKSUM_ADDR]
[--json]
Calculate Solidity function selectors, event hashes, and sign messages.
optional arguments:
-h, --help show this help message and exit
-s STRING, --string STRING
Function or event signature string.
-i INPUT_FILE, --input INPUT_FILE
Input Solidity file path.
-a ABI_FILE, --abi ABI_FILE
Input ABI JSON file path.
-o OUTPUT_FILE, --output OUTPUT_FILE
Output file path.
-w, --web3 Use Web3 library.
-f, --function Parse as function (default: event).
-k PRIVATE_KEY, --key PRIVATE_KEY
Private key for signing.
-d DATA, --data DATA Message to sign.
--hex HEX_DATA Hash to sign (hex format).
--sign Sign a message or hash.
--lookup LOOKUP_SELECTOR
Lookup function signature by selector.
--decode DECODE_CALLDATA
Decode calldata (requires ABI file).
--decode-auto DECODE_CALLDATA_AUTO
Decode calldata automatically (no ABI needed).
--checksum CHECKSUM_ADDR
Convert address to checksum format.
--json Output as JSON.
Python API
Hash Calculation
from getHashData import HashCalculator
calc = HashCalculator(use_web3=False)
selector = calc.calculate_hash("transfer(address,uint256)", is_function=True)
print(selector) # 0xa9059cbb
event_hash = calc.calculate_hash("Transfer(address,address,uint256)", is_function=False)
print(event_hash) # 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
Signature Parsing
from getHashData import SignatureParser
# Parse signature
sig = SignatureParser.parse_signature("transfer(address,uint256)")
print(sig) # transfer(address,uint256)
# Extract from ABI file
sigs = SignatureParser.extract_from_abi("abi.json", is_function=True)
print(sigs) # ['transfer(address,uint256)', 'approve(address,uint256)', ...]
Selector Lookup
from getHashData import SelectorLookup
# Lookup signatures for a selector
sigs = SelectorLookup.lookup_selector("0xa9059cbb")
print(sigs) # ['transfer(address,uint256)', 'transfer(address,uint)', ...]
Calldata Decoding
from getHashData import CalldataDecoder
# Auto-decode (no ABI needed)
result = CalldataDecoder.decode_calldata_auto(
"0xa9059cbb0000000000000000000000005aaeb6053ba3eedb6a475a1c689177b8d1c56f4d0000000000000000000000000000000000000000000000000de0b6b3a7640000"
)
print(result)
# {
# 'selector': '0xa9059cbb',
# 'signature': 'transfer(address,uint256)',
# 'function': 'transfer',
# 'param_types': ['address', 'uint256'],
# 'params': {
# 'param0': '0x5aAeb6053ba3EEdb6a475A1c689177B8d1c56f4d',
# 'param1': 1000000000000000000
# }
# }
Message Signing
from getHashData import MessageSigner
signer = MessageSigner()
result = signer.sign_message("Hello, Ethereum!", private_key)
print(result)
# {
# 'messageHash': '0x...',
# 'r': ...,
# 's': ...,
# 'v': ...,
# 'signature': '0x...'
# }
Address Checksum
from getHashData import AddressChecksum
# Checksum address
addr = AddressChecksum.checksum("0x5aaeb6053ba3eedb6a475a1c689177b8d1c56f4d")
print(addr) # 0x5aAeb6053ba3EEdb6a475A1c689177B8d1c56f4d
# Validate address
is_valid = AddressChecksum.is_valid("0x5aAeb6053ba3EEdb6a475A1c689177B8d1c56f4d")
print(is_valid) # True
Project Structure
getHashData/
├── __init__.py # Package exports
├── cli.py # CLI entry point
└── modules/
├── hasher.py # Keccak-256 hash calculation
├── parser.py # Solidity signature parsing
├── lookup.py # 4byte.directory API integration
├── decoder.py # Calldata decoding
└── crypto.py # Address checksum & message signing
tests/
├── test_parser.py # Parser tests
├── test_hasher.py # Hash calculator tests
├── test_crypto.py # Crypto utilities tests
├── test_lookup.py # Selector lookup tests
└── test_decoder.py # Calldata decoder tests
Dependencies
web3- Ethereum Web3 librarypysha3- Keccak-256 hashingrequests- HTTP client for API callseth-abi- Ethereum ABI encoding/decoding
Testing
Run the test suite:
pytest tests/ -v
All 61 tests pass with full coverage of core functionality.
License
MIT
Author
th35tr0n9
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
gethashdata-0.5.0.tar.gz
(17.0 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gethashdata-0.5.0.tar.gz.
File metadata
- Download URL: gethashdata-0.5.0.tar.gz
- Upload date:
- Size: 17.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.8.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cf0721afebe37cb272b2c1c6fd7b14e0c9e479186a84c0ab46b89eb4ead2612
|
|
| MD5 |
efe52487ab350628b69082a2262b2d40
|
|
| BLAKE2b-256 |
b4feb96f419ff9282c66eed73a4f26d8dfb89b92bf43316e346f4d09ee4a3fdf
|
File details
Details for the file gethashdata-0.5.0-py3-none-any.whl.
File metadata
- Download URL: gethashdata-0.5.0-py3-none-any.whl
- Upload date:
- Size: 13.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.8.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3e41e97101c40e25b50ad230edb970142e7d2942de4529095bd244c7a992298
|
|
| MD5 |
4325eead6df4bfaaff8117965ab12072
|
|
| BLAKE2b-256 |
29620c9a38e912f42a6f2c2ed5da983293a98fe15de25083eb2dc467b3b0a78b
|