Skip to content

Commit 1ce4000

Browse files
committed
Refactoring for resolve() and resolver() ENS methods
- Make ``ENS.resolve()`` an internal method to provide a better user experience / less confusion. ``ENS.address()`` and ``ENS.name()`` should better abstract forward and backward resolution without the need to expose the ``resolve()`` method as part of the API. - Normalize the name being passed into ``ENS.resolver()`` since this is an exposed method for user input. This is done on other methods for the class but was not yet done for ``ENS.resolver()``.
1 parent 344bf44 commit 1ce4000

File tree

2 files changed

+40
-44
lines changed

2 files changed

+40
-44
lines changed

ens/main.py

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def address(self, name: str) -> Optional[ChecksumAddress]:
152152
:param str name: an ENS name to look up
153153
:raises InvalidName: if `name` has invalid syntax
154154
"""
155-
return cast(ChecksumAddress, self.resolve(name, 'addr'))
155+
return cast(ChecksumAddress, self._resolve(name, 'addr'))
156156

157157
def name(self, address: ChecksumAddress) -> Optional[str]:
158158
"""
@@ -163,7 +163,7 @@ def name(self, address: ChecksumAddress) -> Optional[str]:
163163
:type address: hex-string
164164
"""
165165
reversed_domain = address_to_reverse_domain(address)
166-
name = self.resolve(reversed_domain, fn_name='name')
166+
name = self._resolve(reversed_domain, fn_name='name')
167167

168168
# To be absolutely certain of the name, via reverse resolution, the address must match in
169169
# the forward resolution
@@ -285,38 +285,14 @@ def setup_name(
285285
self.setup_address(name, address, transact=transact)
286286
return self._setup_reverse(name, address, transact=transact)
287287

288-
def resolver(self, normal_name: str) -> Optional['Contract']:
289-
return self._get_resolver(normal_name)[0]
288+
def resolver(self, name: str) -> Optional['Contract']:
289+
"""
290+
Get the resolver for an ENS name.
290291
291-
def resolve(self, name: str, fn_name: str = 'addr') -> Optional[Union[ChecksumAddress, str]]:
292+
:param str name: The ENS name
293+
"""
292294
normal_name = normalize_name(name)
293-
294-
resolver, current_name = self._get_resolver(normal_name, fn_name)
295-
if not resolver:
296-
return None
297-
298-
node = self.namehash(normal_name)
299-
300-
if _resolver_supports_interface(resolver, EXTENDED_RESOLVER_INTERFACE_ID):
301-
# update the resolver abi to the extended resolver abi
302-
extended_resolver = self.w3.eth.contract(abi=abis.EXTENDED_RESOLVER)(resolver.address)
303-
contract_func_with_args = (fn_name, [node])
304-
305-
calldata = extended_resolver.encodeABI(*contract_func_with_args)
306-
contract_call_result = extended_resolver.caller.resolve(
307-
ens_encode_name(normal_name), calldata
308-
)
309-
result = self._decode_ensip10_resolve_data(
310-
contract_call_result, extended_resolver, fn_name
311-
)
312-
return to_checksum_address(result) if is_address(result) else result
313-
elif normal_name == current_name:
314-
lookup_function = getattr(resolver.functions, fn_name)
315-
result = lookup_function(node).call()
316-
if is_none_or_zero_address(result):
317-
return None
318-
return to_checksum_address(result) if is_address(result) else result
319-
return None
295+
return self._get_resolver(normal_name)[0]
320296

321297
def reverser(self, target_address: ChecksumAddress) -> Optional['Contract']:
322298
reversed_domain = address_to_reverse_domain(target_address)
@@ -456,6 +432,36 @@ def setup_owner(
456432
self._claim_ownership(new_owner, unowned, owned, super_owner, transact=transact)
457433
return new_owner
458434

435+
def _resolve(self, name: str, fn_name: str = 'addr') -> Optional[Union[ChecksumAddress, str]]:
436+
normal_name = normalize_name(name)
437+
438+
resolver, current_name = self._get_resolver(normal_name, fn_name)
439+
if not resolver:
440+
return None
441+
442+
node = self.namehash(normal_name)
443+
444+
if _resolver_supports_interface(resolver, EXTENDED_RESOLVER_INTERFACE_ID):
445+
# update the resolver abi to the extended resolver abi
446+
extended_resolver = self.w3.eth.contract(abi=abis.EXTENDED_RESOLVER)(resolver.address)
447+
contract_func_with_args = (fn_name, [node])
448+
449+
calldata = extended_resolver.encodeABI(*contract_func_with_args)
450+
contract_call_result = extended_resolver.caller.resolve(
451+
ens_encode_name(normal_name), calldata
452+
)
453+
result = self._decode_ensip10_resolve_data(
454+
contract_call_result, extended_resolver, fn_name
455+
)
456+
return to_checksum_address(result) if is_address(result) else result
457+
elif normal_name == current_name:
458+
lookup_function = getattr(resolver.functions, fn_name)
459+
result = lookup_function(node).call()
460+
if is_none_or_zero_address(result):
461+
return None
462+
return to_checksum_address(result) if is_address(result) else result
463+
return None
464+
459465
def _assert_control(self, account: ChecksumAddress, name: str,
460466
parent_owned: Optional[str] = None) -> None:
461467
if not address_in(account, self.w3.eth.accounts):
Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,18 @@
11
import pytest
22

33

4-
def test_resolve(ens):
5-
acct = ens.w3.eth.accounts[2]
6-
ens.setup_address('tester.eth', acct)
7-
8-
assert ens.resolve('tester.eth') == acct
9-
10-
# clean up
11-
ens.setup_address('tester.eth', None)
12-
13-
144
@pytest.mark.parametrize('subdomain', ('sub1', 'sub2', 'rändöm', '🌈rainbow', 'faß'))
155
def test_wildcard_resolution_with_extended_resolver_for_subdomains(ens, subdomain):
166
# validate subdomains of `extended-resolver.eth` by asserting it returns the specified
177
# hard-coded address from `tests/test_contracts/ExtendedResolver.sol` which requires
188
# certain conditions to be met that are specific to subdomains only
19-
resolved_child_address = ens.resolve(f'{subdomain}.extended-resolver.eth')
9+
resolved_child_address = ens.address(f'{subdomain}.extended-resolver.eth')
2010
assert resolved_child_address == '0x000000000000000000000000000000000000dEaD'
2111

2212

2313
def test_wildcard_resolution_with_extended_resolver_for_parent_ens_domain(ens):
2414
# validate `extended-resolver.eth` by asserting it returns the specified hard-coded address from
2515
# `tests/test_contracts/ExtendedResolver.sol` which requires a specific condition to be
2616
# met for the parent domain `extended-resolver.eth`
27-
resolved_parent_address = ens.resolve('extended-resolver.eth')
17+
resolved_parent_address = ens.address('extended-resolver.eth')
2818
assert resolved_parent_address == '0x000000000000000000000000000000000000bEEF'

0 commit comments

Comments
 (0)