Quick Start
Ape plugin for ENS argument conversion and contracts
Dependencies
- Python 3 version 3.10 or greater.
Installation
via pip
You can install the latest release via pip:
pip install ape-ens
via source
You can clone the repository and install for development:
git clone https://github.com/ApeWorX/ape-ens.git
cd ape-ens
uv sync --group dev
uv run prek install
Quick Usage
Ensure you are satisfied with your Ethereum mainnet setup in Ape, as this plugin requires a connection to Ethereum to resolve ENS domains. More information on networks can be found in Ape's network guide.
If using Ape and not connected to mainnet, ape-ens will temporarily connect to Ethereum mainnet to
resolve addresses, using your default mainnet provider.
To configure a default mainnet provider, do:
ethereum:
mainnet:
default_provider: alchemy # Example, you can use any mainnet provider
Otherwise, the plugin should still work with Ape's defaults, using an RPC from the evmchains
library.
Forward resolution and text records go through web3.py's ENS client. web3.py 7.16.0 or newer is
required so those reads use the
ENS Universal Resolver (ENSv2-ready). ape.convert
and contract calls still resolve the ETH address (coin type 60).
This plugin contains two primary features:
- A conversion API implementation: this allows you to use ENS values in contract calls and transaction kwargs.
- a CLI for interacting with ENS from the command line.
Conversion API
When this plugin is installed, you can use ENS names in contract-calls, and they resolve to the addresses automatically:
from ape import accounts, Contract
ens_name = "vitalik.eth" # Going to use this later...
contract = Contract("0x123...")
me = accounts.load("me")
# Ape resolves "me" to my account's address and "vitalik.eth" to Vitalik's Ethereum address.
# It is thanks to the ape-ens plugin that "vitalik.eth" works as a transaction input.
contract.transferFrom(me, ens_name, 100, sender=me)
You can use Ape's conversion utility directly:
from ape import convert
from ape.types import AddressType
convert("vitalik.eth", AddressType)
# returns: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
Additionally, you can get the Ethereum Name Service (ENS) namehash using the namehash function:
from ape_ens.utils import namehash
namehash("foo.eth")
# HexBytes("0xde9b09fd7c5f901e23a3f19fecc54828e9c848539801e86591bd9801b019f84f")
CLI
ape-ens comes with a CLI for using ENS.
Resolve ENS domains from the command line:
ape ens resolve vitalik.eth
# outputs: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
Reverse-lookup an ENS domain:
ape ens name 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
# outputs: vitalik.eth
Get the owner of an ENS domain:
ape ens owner vitalik.eth
# outputs: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
owner is the ENS registry owner (registry.owner(node)), not the Universal Resolver path used
by resolve. Wrapped names often show the Name Wrapper.
Get the namehash of an ENS name:
ape ens namehash foo.eth
# outputs: 0xde9b09fd7c5f901e23a3f19fecc54828e9c848539801e86591bd9801b019f84f
Get a text record:
ape ens text vitalik.eth url
Resolve a non-ETH coin type (ENSIP-9/11). For EVM L2s this is 0x80000000 | chain_id:
ape ens resolve vitalik.eth --coin-type 2147492101
Or use Ape ecosystem/network names instead of a raw coin type. If you omit these, coin type follows
the connected --network (ENSIP-19): the chain record, then the default EVM record (0x80000000),
not the Ethereum (60) record. Ethereum L1 stays 60.
ape ens resolve vitalik.eth --network base:mainnet
ape ens resolve vitalik.eth --ens-ecosystem base --ens-network mainnet
ape ens resolve vitalik.eth --ens-network base
Using ape-ens as a library.
You can also use the ape_ens.ENS class directly for programmatically referring to ENS.
from ape_ens import ENS
ens = ENS()
vitalik = ens.resolve("vitalik.eth")
print(vitalik)
# Multichain (ENSIP-11): Base is 0x80000000 | 8453
base_address = ens.resolve("vitalik.eth", coin_type=2147492101)
# Same coin type via Ape names
base_address = ens.resolve("vitalik.eth", ecosystem="base", network="mainnet")
base_address = ens.resolve("vitalik.eth", network="base")
# Omit ecosystem/network to follow the connected Ape network
# Ethereum L1 testnets share coin type 60 (the ETH record), not ENSIP-11
eth_address = ens.resolve("vitalik.eth", ecosystem="ethereum", network="sepolia")
print(ens.get_text("vitalik.eth", "description"))
print(ens.get_text("vitalik.eth", "url"))
Local registry
WARNING: By default, ape-ens caches results during each Python session for faster name
resolution in scripts and testing. Be careful using ENS names in long-running scripts where it would
be bad if the name resolved differently in the future. To disable caching, configure ape-ens to
always read from Ethereum by adding to your pyproject.toml:
[tool.ape.ens]
use_cache = false
or using ape-config.yaml:
ens:
use_cache: false
To manually add entries to the cache, you can include them under the registry: key in the config:
[tool.ape.ens]
registry = { vitalik.eth = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" }
or using ape-config.yaml:
ens:
registry:
vitalik.eth: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
Configuring entries is useful for:
- Testing in the
localnetwork. - Attaining faster performance (no Ethereum call).
- Avoiding connecting to Ethereum mainnet.
Change Registry
Change the registry contract address by configuring it in your pyproject.toml:
[tool.ape.ens]
registry_address = "0x123..."
or using ape-config.yaml:
ens:
registry_address: "0x123..."
You can also switch the registry adhoc during CLI commands:
ape ens resolve vitalik.eth --registry-address 0x123...311
registry_address is the ENS registry contract. Forward resolve() and get_text() use the
Universal Resolver and do not depend on that address. owner() still queries the configured
registry.
Metadata
Release files for ape-ens 0.8.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ape_ens-0.8.3.tar.gz | 29.5 kB | With provenance | Details for ape_ens-0.8.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ape_ens-0.8.3-py3-none-any.whl | Python 3 | none | any | Details for ape_ens-0.8.3-py3-none-any.whl |
Total release size: 48.6 kB
Release files / ape_ens-0.8.3.tar.gz
| Download URL | ape_ens-0.8.3.tar.gz |
|---|---|
| Size | 29.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c5d7411e4cf243aed5df7e4e74b0f7899ff202211851f85d2ecd53cd3c09382c
|
|
BLAKE2b-256 checksum How to use checksums |
493006ee6a3000db5411952976f5df1f9e92d830d1f08405c7f14b5c79565767
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logRelease files / ape_ens-0.8.3-py3-none-any.whl
| Download URL | ape_ens-0.8.3-py3-none-any.whl |
|---|---|
| Size | 19.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d407365aa852d39c4a4b10c45b28f5eeaa5039aa79b496fc8fe7c265ce846c24
|
|
BLAKE2b-256 checksum How to use checksums |
e2db36fe22e7e996aea1bb2a680368f272b8055cbcede73b9f3345beb3effe99
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logSecurity for ape-ens 0.8.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for ape_ens-0.8.3.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.