Metadata-Version: 2.1
Name: getHashData
Version: 0.5.0
Summary: Calculate Solidity function selectors, event hashes, decode calldata, and sign messages.
Author-email: th35tr0n9 <th35tr0n9@gmail.com>
License: MIT
Project-URL: Homepage, https://hxzy.me
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: License :: OSI Approved :: MIT License
Requires-Python: >=3.7
Description-Content-Type: text/markdown
Requires-Dist: web3
Requires-Dist: pysha3
Requires-Dist: requests
Requires-Dist: eth-abi

# 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

```bash
pip install getHashData
```

## Quick Start

### Calculate Function Selector

```bash
getHash -f -s "transfer(address,uint256)"
# Output: 0xa9059cbb transfer(address,uint256)
```

### Calculate Event Hash

```bash
getHash -s "Transfer(address,address,uint256)"
# Output: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef Transfer(address,address,uint256)
```

### Lookup Function Signature

```bash
getHash --lookup 0xa9059cbb
# Output: Selector 0xa9059cbb:
#   transfer(address,uint256)
#   transfer(address,uint)
```

### Decode Calldata (Auto-detect)

```bash
getHash --decode-auto 0xa9059cbb0000000000000000000000005aaeb6053ba3eedb6a475a1c689177b8d1c56f4d0000000000000000000000000000000000000000000000000de0b6b3a7640000
# Output: Signature: transfer(address,uint256)
#         Function:  transfer
#         Parameters:
#           [address] param0: 0x5aAeb6053ba3EEdb6a475A1c689177B8d1c56f4d
#           [uint256] param1: 1000000000000000000
```

### Sign Message

```bash
getHash --sign -k <private_key> -d "Hello, Ethereum!"
# Output: messageHash: 0x...
#         r: ...
#         s: ...
#         v: ...
#         signature: 0x...
```

### Address Checksum

```bash
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

```python
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

```python
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

```python
from getHashData import SelectorLookup

# Lookup signatures for a selector
sigs = SelectorLookup.lookup_selector("0xa9059cbb")
print(sigs)  # ['transfer(address,uint256)', 'transfer(address,uint)', ...]
```

### Calldata Decoding

```python
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

```python
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

```python
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 library
- `pysha3` - Keccak-256 hashing
- `requests` - HTTP client for API calls
- `eth-abi` - Ethereum ABI encoding/decoding

## Testing

Run the test suite:

```bash
pytest tests/ -v
```

All 61 tests pass with full coverage of core functionality.

## License

MIT

## Author

th35tr0n9
