Skip to content

Commit 502939b

Browse files
committed
ens_encode_name -> dns_encode_name
- For consistency with implementations across other languages, and with the ENS docs, rename ``ens_encode_name`` to ``dns_encode_name`` and deprecate the old name for removal in ``v8``. - Closes #3700
1 parent 51b76f1 commit 502939b

File tree

7 files changed

+54
-27
lines changed

7 files changed

+54
-27
lines changed

ens/async_ens.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
address_in,
5858
address_to_reverse_domain,
5959
default,
60-
ens_encode_name,
60+
dns_encode_name,
6161
init_async_web3,
6262
is_empty_name,
6363
is_none_or_zero_address,
@@ -500,7 +500,7 @@ async def _resolve(
500500

501501
calldata = resolver.encode_abi(*contract_func_with_args)
502502
contract_call_result = await resolver.caller.resolve(
503-
ens_encode_name(normal_name),
503+
dns_encode_name(normal_name),
504504
calldata,
505505
)
506506
result = self._decode_ensip10_resolve_data(

ens/ens.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
address_in,
5757
address_to_reverse_domain,
5858
default,
59-
ens_encode_name,
59+
dns_encode_name,
6060
init_web3,
6161
is_empty_name,
6262
is_none_or_zero_address,
@@ -482,7 +482,7 @@ def _resolve(
482482

483483
calldata = resolver.encode_abi(*contract_func_with_args)
484484
contract_call_result = resolver.caller.resolve(
485-
ens_encode_name(normal_name),
485+
dns_encode_name(normal_name),
486486
calldata,
487487
)
488488
result = self._decode_ensip10_resolve_data(

ens/utils.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
Union,
1414
cast,
1515
)
16+
import warnings
1617

1718
from eth_typing import (
1819
Address,
@@ -132,7 +133,7 @@ def normalize_name(name: str) -> str:
132133
return normalize_name_ensip15(name).as_text
133134

134135

135-
def ens_encode_name(name: str) -> bytes:
136+
def dns_encode_name(name: str) -> HexBytes:
136137
r"""
137138
Encode a name according to DNS standards specified in section 3.1
138139
of RFC1035 with the following validations:
@@ -145,7 +146,7 @@ def ens_encode_name(name: str) -> bytes:
145146
:param str name: the dot-separated ENS name
146147
"""
147148
if is_empty_name(name):
148-
return b"\x00"
149+
return HexBytes(b"\x00")
149150

150151
normalized_name = normalize_name(name)
151152

@@ -163,7 +164,17 @@ def ens_encode_name(name: str) -> bytes:
163164
dns_prepped_labels = [to_bytes(len(label)) + label for label in labels_as_bytes]
164165

165166
# return the joined prepped labels in order and append the zero byte at the end:
166-
return b"".join(dns_prepped_labels) + b"\x00"
167+
return HexBytes(b"".join(dns_prepped_labels) + b"\x00")
168+
169+
170+
def ens_encode_name(name: str) -> bytes:
171+
warnings.warn(
172+
"``ens_encode_name`` is deprecated and will be removed in the next "
173+
"major version. Use ``dns_encode_name`` instead.",
174+
DeprecationWarning,
175+
stacklevel=2,
176+
)
177+
return bytes(dns_encode_name(name))
167178

168179

169180
def is_valid_name(name: str) -> bool:

newsfragments/3700.deprecation.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Deprecate ``ens_encode_name`` in favor of ``dns_encode_name``.

newsfragments/3700.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Introduce ``ens.utils.dns_encode_name`` as a rename of the current ``ens_encode_name``, for consistency across other language implementations and with the ENS docs. Returns ``HexBytes`` instead of ``bytes``.

tests/ens/test_offchain_resolution.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import requests
77

88
from ens.utils import (
9-
ens_encode_name,
9+
dns_encode_name,
1010
)
1111
from web3.exceptions import (
1212
OffchainLookup,
@@ -172,14 +172,14 @@ def test_offchain_resolver_function_call_raises_with_ccip_read_disabled(
172172
# should fail here with `ccip_read_enabled` flag set to False
173173
with pytest.raises(OffchainLookup):
174174
offchain_resolver.functions.resolve(
175-
ens_encode_name("offchainexample.eth"),
175+
dns_encode_name("offchainexample.eth"),
176176
ENCODED_ADDR_CALLDATA,
177177
).call(ccip_read_enabled=False)
178178

179179
# pass flag on specific call via ContractCaller is also an option
180180
with pytest.raises(OffchainLookup):
181181
offchain_resolver.caller(ccip_read_enabled=False).resolve(
182-
ens_encode_name("offchainexample.eth"),
182+
dns_encode_name("offchainexample.eth"),
183183
ENCODED_ADDR_CALLDATA,
184184
)
185185

tests/ens/test_utils.py

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import pytest
2+
from unittest import (
3+
mock,
4+
)
25
from unittest.mock import (
36
patch,
47
)
@@ -20,6 +23,7 @@
2023
ENSValidationError,
2124
)
2225
from ens.utils import (
26+
dns_encode_name,
2327
ens_encode_name,
2428
init_async_web3,
2529
init_web3,
@@ -70,8 +74,8 @@ def test_init_web3_adds_expected_middleware():
7074
(f"abc-123.{'b' * 255}", b"\x07abc-123" + b"\xff" + b"b" * 255 + b"\x00"),
7175
),
7276
)
73-
def test_ens_encode_name(name, expected):
74-
assert ens_encode_name(name) == expected
77+
def test_dns_encode_name(name, expected):
78+
assert dns_encode_name(name) == expected
7579

7680

7781
@pytest.mark.parametrize(
@@ -101,19 +105,19 @@ def test_ens_encode_name(name, expected):
101105
),
102106
),
103107
)
104-
def test_ens_encode_name_validating_total_encoded_name_size(name, expected):
108+
def test_dns_encode_name_validating_total_encoded_name_size(name, expected):
105109
# This test is important because dns validation technically limits the
106110
# total encoded domain name size to 255. ENSIP-10 expects the name to be
107111
# DNS encoded with one of the validation exceptions being that the
108112
# total encoded size can be any length.
109-
ens_encoded = ens_encode_name(name)
110-
assert len(ens_encoded) > 255
111-
assert ens_encoded == expected
113+
dns_encoded = dns_encode_name(name)
114+
assert len(dns_encoded) > 255
115+
assert dns_encoded == expected
112116

113117

114118
@pytest.mark.parametrize("empty_name", ("", ".", None, " ", " "))
115-
def test_ens_encode_name_returns_single_zero_byte_for_empty_name(empty_name):
116-
assert ens_encode_name(empty_name) == b"\00"
119+
def test_dns_encode_name_returns_single_zero_byte_for_empty_name(empty_name):
120+
assert dns_encode_name(empty_name) == b"\00"
117121

118122

119123
@pytest.mark.parametrize(
@@ -127,21 +131,21 @@ def test_ens_encode_name_returns_single_zero_byte_for_empty_name(empty_name):
127131
(f"{'a' * 255}.{'1' * 255}.{'b' * 256}", 2),
128132
),
129133
)
130-
def test_ens_encode_name_raises_ValidationError_on_label_lengths_over_63(
134+
def test_dns_encode_name_raises_validation_error_on_label_lengths_over_63(
131135
name, invalid_label_index
132136
):
133137
with pytest.raises(
134138
ENSValidationError, match=f"Label at position {invalid_label_index} too long"
135139
):
136-
ens_encode_name(name)
140+
dns_encode_name(name)
137141

138142

139-
def test_ens_encode_name_normalizes_name_before_encoding():
140-
assert ens_encode_name("Öbb.at") == ens_encode_name("öbb.at")
141-
assert ens_encode_name("nhÉéÉéÉé.eth") == ens_encode_name("nhéééééé.eth")
142-
assert ens_encode_name("TESTER.eth") == ens_encode_name("tester.eth")
143-
assert ens_encode_name("test\u200btest.com") == ens_encode_name("testtest.com")
144-
assert ens_encode_name("O\u0308bb.at") == ens_encode_name("öbb.at")
143+
def test_dns_encode_name_normalizes_name_before_encoding():
144+
assert dns_encode_name("Öbb.at") == dns_encode_name("öbb.at")
145+
assert dns_encode_name("nhÉéÉéÉé.eth") == dns_encode_name("nhéééééé.eth")
146+
assert dns_encode_name("TESTER.eth") == dns_encode_name("tester.eth")
147+
assert dns_encode_name("test\u200btest.com") == dns_encode_name("testtest.com")
148+
assert dns_encode_name("O\u0308bb.at") == dns_encode_name("öbb.at")
145149

146150

147151
@pytest.mark.parametrize(
@@ -167,7 +171,7 @@ def test_normal_name_to_hash(name, hashed):
167171
is_valid_name,
168172
BaseENS.namehash,
169173
BaseENS.nameprep,
170-
ens_encode_name,
174+
dns_encode_name,
171175
raw_name_to_hash,
172176
),
173177
)
@@ -205,6 +209,16 @@ def test_label_to_hash_normalizes_name_using_ensip15():
205209
)
206210

207211

212+
@mock.patch("ens.utils.dns_encode_name")
213+
def test_ens_encode_name_issues_deprecation_warning_and_calls_dns_encode_name(
214+
mock_dns_encode_name,
215+
):
216+
with pytest.warns(DeprecationWarning, match=r"``ens_encode_name`` is deprecated"):
217+
ens_encode_name("foo")
218+
219+
mock_dns_encode_name.assert_called_once_with("foo")
220+
221+
208222
# -- async -- #
209223

210224

0 commit comments

Comments
 (0)