This github issue on web3.py is "Document how to set up ENS for non-mainnet addresses."
This question (that I filed) is me thrashing around trying to do so.
How do you set up ENS for non-mainnet addresses? For example, Rinkeby?
Ethereum Stack Exchange is a question and answer site for users of Ethereum, the decentralized application platform and smart contract enabled blockchain. It only takes a minute to sign up.
Sign up to join this communityThis github issue on web3.py is "Document how to set up ENS for non-mainnet addresses."
This question (that I filed) is me thrashing around trying to do so.
How do you set up ENS for non-mainnet addresses? For example, Rinkeby?
Got an answer. You have to inject some middleware at exactly the right spot.
from web3 import Web3
from web3.auto.infura import (
INFURA_MAINNET_DOMAIN, build_http_headers, build_infura_url)
from web3.auto.infura.endpoints import INFURA_RINKEBY_DOMAIN
from web3.providers.auto import load_provider_from_uri
from ens import ENS
from eth_typing import ChecksumAddress
_headers = build_http_headers()
# NOTE: build_infura_url requires WEB3_INFURA_PROJECT_ID
# and WEB3_INFURA_API_SECRET environment variables set.
if False:
# Works with mainnet
_infura_url = build_infura_url(INFURA_MAINNET_DOMAIN)
else:
# Doesn't work with Rinkeby
#
# "web3.exceptions.ExtraDataLengthError: The field extraData is 97 bytes,
# but should be 32. It is quite likely that you are connected to a POA chain.
# Refer to http://web3py.readthedocs.io/en/stable/middleware.html#geth-style-proof-of-authority
# for more details."
_infura_url = build_infura_url(INFURA_RINKEBY_DOMAIN)
w3 = Web3(load_provider_from_uri(_infura_url, _headers))
ens = ENS.fromWeb3(w3)
from web3.middleware import geth_poa_middleware
# NOTE: have to inject this into ens.web3, not w3
ens.web3.middleware_onion.inject(geth_poa_middleware, layer=0)
the_ens = ens.name(
ChecksumAddress('0x5B2063246F2191f18F2675ceDB8b28102e957458'))
print(the_ens) # Returns None, presumably not mapped on Rinkeby
111