A Python library for interacting with Ethereum blockchain
Overall
score
88%
Evaluation — 88%
↑ 1.01xAgent success when using this tile
Ethereum Name Service integration for human-readable address resolution, reverse lookups, domain management, and decentralized naming system interactions.
Core ENS functionality for resolving names to addresses and vice versa.
class ENS:
def __init__(self, provider: BaseProvider = None):
"""
Initialize ENS instance.
Parameters:
- provider: Web3 provider for blockchain access
"""
def address(self, name: str) -> ChecksumAddress:
"""
Resolve ENS name to Ethereum address.
Parameters:
- name: ENS name (e.g., 'ethereum.eth')
Returns:
Ethereum address
Raises:
InvalidName: If name format is invalid
UnownedName: If name is not owned
"""
def name(self, address: AnyAddress) -> str:
"""
Reverse resolve Ethereum address to ENS name.
Parameters:
- address: Ethereum address
Returns:
ENS name if configured, empty string otherwise
"""
def resolver(self, name: str) -> ChecksumAddress:
"""
Get resolver contract address for ENS name.
Parameters:
- name: ENS name
Returns:
Resolver contract address
"""
def owner(self, name: str) -> ChecksumAddress:
"""
Get owner address for ENS name.
Parameters:
- name: ENS name
Returns:
Owner address
"""Async version of ENS operations with the same interface.
class AsyncENS:
def __init__(self, provider: AsyncBaseProvider = None):
"""
Initialize async ENS instance.
Parameters:
- provider: Async Web3 provider
"""
async def address(self, name: str) -> ChecksumAddress:
"""
Async resolve ENS name to address.
Parameters:
- name: ENS name
Returns:
Ethereum address
"""
async def name(self, address: AnyAddress) -> str:
"""
Async reverse resolve address to ENS name.
Parameters:
- address: Ethereum address
Returns:
ENS name
"""
async def resolver(self, name: str) -> ChecksumAddress:
"""
Async get resolver contract address.
Parameters:
- name: ENS name
Returns:
Resolver contract address
"""
async def owner(self, name: str) -> ChecksumAddress:
"""
Async get owner address.
Parameters:
- name: ENS name
Returns:
Owner address
"""Base class providing common ENS functionality.
class BaseENS:
def is_valid_name(self, name: str) -> bool:
"""
Check if ENS name format is valid.
Parameters:
- name: ENS name to validate
Returns:
True if valid format
"""
def namehash(self, name: str) -> HexBytes:
"""
Calculate namehash for ENS name.
Parameters:
- name: ENS name
Returns:
Namehash as bytes
"""
def label_to_hash(self, label: str) -> HexBytes:
"""
Convert label to hash for ENS operations.
Parameters:
- label: ENS label
Returns:
Label hash
"""ENS-specific exception classes for error handling.
class AddressMismatch(ValueError):
"""Address does not match expected value."""
class BidTooLow(ValueError):
"""Bid amount is too low for auction."""
class InvalidLabel(ValueError):
"""ENS label format is invalid."""
class InvalidName(ValueError):
"""ENS name format is invalid."""
class UnauthorizedError(ValueError):
"""Unauthorized operation on ENS name."""
class UnderfundedBid(ValueError):
"""Insufficient funds for bid."""
class UnownedName(ValueError):
"""ENS name is not owned/registered."""from web3 import Web3
from ens import ENS
# Initialize Web3 and ENS
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
ens = ENS.from_web3(w3)
# Resolve ENS name to address
address = ens.address('ethereum.eth')
print(f"ethereum.eth resolves to: {address}")
# Reverse resolve address to ENS name
name = ens.name('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045')
print(f"Address resolves to: {name}")
# Check if name is valid
if ens.is_valid_name('test.eth'):
print("Valid ENS name format")from web3 import Web3
# ENS middleware is included by default
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
# Use ENS names directly in Web3 operations
balance = w3.eth.get_balance('ethereum.eth')
print(f"Balance for ethereum.eth: {w3.from_wei(balance, 'ether')} ETH")
# Send transaction to ENS name
transaction = {
'from': w3.eth.accounts[0],
'to': 'recipient.eth', # ENS name resolved automatically
'value': w3.to_wei(1, 'ether'),
'gas': 21000,
'gasPrice': w3.to_wei(20, 'gwei')
}
tx_hash = w3.eth.send_transaction(transaction)from web3 import Web3
from ens import ENS
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
ens = ENS.from_web3(w3)
# Get ENS name owner
owner = ens.owner('example.eth')
print(f"Owner of example.eth: {owner}")
# Get resolver contract
resolver_address = ens.resolver('example.eth')
print(f"Resolver for example.eth: {resolver_address}")
# Calculate namehash
namehash = ens.namehash('subdomain.example.eth')
print(f"Namehash: {namehash.hex()}")
# Validate name format
names_to_check = ['valid.eth', 'invalid..eth', 'toolong.eth']
for name in names_to_check:
if ens.is_valid_name(name):
print(f"{name} is valid")
else:
print(f"{name} is invalid")from web3 import Web3
from ens import ENS
from ens.exceptions import InvalidName, UnownedName
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
ens = ENS.from_web3(w3)
try:
# Try to resolve unregistered name
address = ens.address('nonexistent-name-12345.eth')
print(f"Address: {address}")
except UnownedName:
print("ENS name is not registered")
except InvalidName:
print("Invalid ENS name format")
try:
# Try invalid name format
address = ens.address('invalid..name.eth')
except InvalidName as e:
print(f"Invalid name: {e}")import asyncio
from web3 import AsyncWeb3
from ens import AsyncENS
async def main():
w3 = AsyncWeb3(AsyncWeb3.AsyncHTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
ens = AsyncENS.from_web3(w3)
# Async ENS resolution
address = await ens.address('ethereum.eth')
print(f"ethereum.eth resolves to: {address}")
# Async reverse resolution
name = await ens.name('0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045')
print(f"Address resolves to: {name}")
# Get owner asynchronously
owner = await ens.owner('ethereum.eth')
print(f"Owner: {owner}")
asyncio.run(main())from web3 import Web3
from ens import ENS
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
# Connect to specific ENS registry
custom_ens = ENS(
provider=w3.provider,
addr='0x314159265dd8dbb310642f98f50c066173c1259b' # Custom ENS registry
)
# Use custom ENS instance
try:
address = custom_ens.address('example.eth')
print(f"Resolved via custom ENS: {address}")
except Exception as e:
print(f"Resolution failed: {e}")from web3 import Web3
from ens import ENS
from ens.exceptions import UnownedName
w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/YOUR-PROJECT-ID'))
ens = ENS.from_web3(w3)
# Batch resolve multiple names
names = ['ethereum.eth', 'ens.eth', 'example.eth']
addresses = {}
for name in names:
try:
address = ens.address(name)
addresses[name] = address
print(f"{name} -> {address}")
except UnownedName:
print(f"{name} is not registered")
except Exception as e:
print(f"Error resolving {name}: {e}")
print(f"Successfully resolved {len(addresses)} names")Install with Tessl CLI
npx tessl i tessl/pypi-web3docs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10