Skip to content

Commit 4647b7d

Browse files
committed
Refactor
- less web3 object passing, - move around build registry functions
1 parent 5ab3ed3 commit 4647b7d

File tree

7 files changed

+96
-104
lines changed

7 files changed

+96
-104
lines changed

tests/core/utilities/test_abi_is_encodable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
)
7676
def test_is_encodable(value, _type, expected):
7777
w3 = Web3(EthereumTesterProvider())
78-
actual = w3.is_encodable(_type, value)
78+
actual = w3.codec.is_encodable(_type, value)
7979
assert actual is expected
8080

8181

@@ -107,5 +107,5 @@ def test_is_encodable_strict(value, _type, expected):
107107
w3 = Web3(EthereumTesterProvider())
108108
w3.enable_strict_bytes_type_checking()
109109

110-
actual = w3.is_encodable(_type, value)
110+
actual = w3.codec.is_encodable(_type, value)
111111
assert actual is expected

web3/_utils/abi.py

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import warnings
1616

1717
from eth_abi import (
18+
decoding,
1819
encoding,
1920
)
2021
from eth_abi.base import (
@@ -28,6 +29,10 @@
2829
TupleType,
2930
parse,
3031
)
32+
from eth_abi.registry import (
33+
BaseEquals,
34+
registry as default_registry
35+
)
3136
from eth_typing import (
3237
TypeStr,
3338
)
@@ -287,16 +292,16 @@ def from_type_str(cls, abi_type, registry):
287292
)
288293

289294

290-
def filter_by_encodability(abi_encoder, args, kwargs, contract_abi):
295+
def filter_by_encodability(abi_codec, args, kwargs, contract_abi):
291296
return [
292297
function_abi
293298
for function_abi
294299
in contract_abi
295-
if check_if_arguments_can_be_encoded(function_abi, abi_encoder, args, kwargs)
300+
if check_if_arguments_can_be_encoded(function_abi, abi_codec, args, kwargs)
296301
]
297302

298303

299-
def check_if_arguments_can_be_encoded(function_abi, abi_encoder, args, kwargs):
304+
def check_if_arguments_can_be_encoded(function_abi, abi_codec, args, kwargs):
300305
try:
301306
arguments = merge_args_and_kwargs(function_abi, args, kwargs)
302307
except TypeError:
@@ -311,7 +316,7 @@ def check_if_arguments_can_be_encoded(function_abi, abi_encoder, args, kwargs):
311316
return False
312317

313318
return all(
314-
abi_encoder.is_encodable(_type, arg)
319+
abi_codec.is_encodable(_type, arg)
315320
for _type, arg in zip(types, aligned_args)
316321
)
317322

@@ -782,3 +787,67 @@ def strip_abi_type(elements):
782787
return elements.data
783788
else:
784789
return elements
790+
791+
792+
def build_default_registry():
793+
# We make a copy here just to make sure that eth-abi's default registry is not
794+
# affected by our custom encoder subclasses
795+
registry = default_registry.copy()
796+
797+
registry.unregister('address')
798+
registry.unregister('bytes<M>')
799+
registry.unregister('bytes')
800+
registry.unregister('string')
801+
802+
registry.register(
803+
BaseEquals('address'),
804+
AddressEncoder, decoding.AddressDecoder,
805+
label='address',
806+
)
807+
registry.register(
808+
BaseEquals('bytes', with_sub=True),
809+
BytesEncoder, decoding.BytesDecoder,
810+
label='bytes<M>',
811+
)
812+
registry.register(
813+
BaseEquals('bytes', with_sub=False),
814+
ByteStringEncoder, decoding.ByteStringDecoder,
815+
label='bytes',
816+
)
817+
registry.register(
818+
BaseEquals('string'),
819+
TextStringEncoder, decoding.StringDecoder,
820+
label='string',
821+
)
822+
return registry
823+
824+
825+
def build_strict_registry():
826+
registry = default_registry.copy()
827+
828+
registry.unregister('address')
829+
registry.unregister('bytes<M>')
830+
registry.unregister('bytes')
831+
registry.unregister('string')
832+
833+
registry.register(
834+
BaseEquals('address'),
835+
AddressEncoder, decoding.AddressDecoder,
836+
label='address',
837+
)
838+
registry.register(
839+
BaseEquals('bytes', with_sub=True),
840+
ExactLengthBytesEncoder, decoding.BytesDecoder,
841+
label='bytes<M>',
842+
)
843+
registry.register(
844+
BaseEquals('bytes', with_sub=False),
845+
StrictByteStringEncoder, decoding.ByteStringDecoder,
846+
label='bytes',
847+
)
848+
registry.register(
849+
BaseEquals('string'),
850+
TextStringEncoder, decoding.StringDecoder,
851+
label='string',
852+
)
853+
return registry

web3/_utils/contracts.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def find_matching_event_abi(abi, event_name=None, argument_names=None):
6969
raise ValueError("Multiple events found")
7070

7171

72-
def find_matching_fn_abi(abi, abi_encoder, fn_identifier=None, args=None, kwargs=None):
72+
def find_matching_fn_abi(abi, abi_codec, fn_identifier=None, args=None, kwargs=None):
7373
args = args or tuple()
7474
kwargs = kwargs or dict()
7575
num_arguments = len(args) + len(kwargs)
@@ -82,7 +82,7 @@ def find_matching_fn_abi(abi, abi_encoder, fn_identifier=None, args=None, kwargs
8282

8383
name_filter = functools.partial(filter_by_name, fn_identifier)
8484
arg_count_filter = functools.partial(filter_by_argument_count, num_arguments)
85-
encoding_filter = functools.partial(filter_by_encodability, abi_encoder, args, kwargs)
85+
encoding_filter = functools.partial(filter_by_encodability, abi_codec, args, kwargs)
8686

8787
function_candidates = pipe(abi, name_filter, arg_count_filter, encoding_filter)
8888

@@ -172,7 +172,7 @@ def prepare_transaction(
172172
TODO: add new prepare_deploy_transaction API
173173
"""
174174
if fn_abi is None:
175-
fn_abi = find_matching_fn_abi(contract_abi, web3, fn_identifier, fn_args, fn_kwargs)
175+
fn_abi = find_matching_fn_abi(contract_abi, web3.codec, fn_identifier, fn_args, fn_kwargs)
176176

177177
validate_payable(transaction, fn_abi)
178178

@@ -225,14 +225,14 @@ def get_fallback_function_info(contract_abi=None, fn_abi=None):
225225
return fn_abi, fn_selector, fn_arguments
226226

227227

228-
def get_function_info(fn_name, abi_encoder, contract_abi=None, fn_abi=None, args=None, kwargs=None):
228+
def get_function_info(fn_name, abi_codec, contract_abi=None, fn_abi=None, args=None, kwargs=None):
229229
if args is None:
230230
args = tuple()
231231
if kwargs is None:
232232
kwargs = {}
233233

234234
if fn_abi is None:
235-
fn_abi = find_matching_fn_abi(contract_abi, abi_encoder, fn_name, args, kwargs)
235+
fn_abi = find_matching_fn_abi(contract_abi, abi_codec, fn_name, args, kwargs)
236236

237237
fn_selector = encode_hex(function_abi_to_4byte_selector(fn_abi))
238238

web3/_utils/events.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
)
6262

6363

64-
def construct_event_topic_set(event_abi, abi_encoder, arguments=None):
64+
def construct_event_topic_set(event_abi, abi_codec, arguments=None):
6565
if arguments is None:
6666
arguments = {}
6767
if isinstance(arguments, (list, tuple)):
@@ -89,7 +89,7 @@ def construct_event_topic_set(event_abi, abi_encoder, arguments=None):
8989
]
9090
encoded_args = [
9191
[
92-
None if option is None else encode_hex(abi_encoder.encode_single(arg['type'], option))
92+
None if option is None else encode_hex(abi_codec.encode_single(arg['type'], option))
9393
for option in arg_options]
9494
for arg, arg_options in zipped_abi_and_args
9595
]
@@ -98,7 +98,7 @@ def construct_event_topic_set(event_abi, abi_encoder, arguments=None):
9898
return topics
9999

100100

101-
def construct_event_data_set(event_abi, abi_encoder, arguments=None):
101+
def construct_event_data_set(event_abi, abi_codec, arguments=None):
102102
if arguments is None:
103103
arguments = {}
104104
if isinstance(arguments, (list, tuple)):
@@ -125,7 +125,7 @@ def construct_event_data_set(event_abi, abi_encoder, arguments=None):
125125
]
126126
encoded_args = [
127127
[
128-
None if option is None else encode_hex(abi_encoder.encode_single(arg['type'], option))
128+
None if option is None else encode_hex(abi_codec.encode_single(arg['type'], option))
129129
for option in arg_options]
130130
for arg, arg_options in zipped_abi_and_args
131131
]

web3/_utils/filters.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@
3131

3232

3333
def construct_event_filter_params(event_abi,
34-
abi_encoder,
34+
abi_codec,
3535
contract_address=None,
3636
argument_filters=None,
3737
topics=None,
3838
fromBlock=None,
3939
toBlock=None,
4040
address=None):
4141
filter_params = {}
42-
topic_set = construct_event_topic_set(event_abi, abi_encoder, argument_filters)
42+
topic_set = construct_event_topic_set(event_abi, abi_codec, argument_filters)
4343

4444
if topics is not None:
4545
if len(topic_set) > 1:
@@ -81,7 +81,7 @@ def construct_event_filter_params(event_abi,
8181
if toBlock is not None:
8282
filter_params['toBlock'] = toBlock
8383

84-
data_filters_set = construct_event_data_set(event_abi, abi_encoder, argument_filters)
84+
data_filters_set = construct_event_data_set(event_abi, abi_codec, argument_filters)
8585

8686
return data_filters_set, filter_params
8787

web3/contract.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ def decode_function_input(self, data):
418418
@combomethod
419419
def find_functions_by_args(self, *args):
420420
def callable_check(fn_abi):
421-
return check_if_arguments_can_be_encoded(fn_abi, self.web3, args=args, kwargs={})
421+
return check_if_arguments_can_be_encoded(fn_abi, self.web3.codec, args=args, kwargs={})
422422

423423
return find_functions_by_identifier(
424424
self.abi, self.web3, self.address, callable_check
@@ -454,7 +454,7 @@ def _prepare_transaction(cls,
454454
@classmethod
455455
def _find_matching_fn_abi(cls, fn_identifier=None, args=None, kwargs=None):
456456
return find_matching_fn_abi(cls.abi,
457-
cls.web3,
457+
cls.web3.codec,
458458
fn_identifier=fn_identifier,
459459
args=args,
460460
kwargs=kwargs)
@@ -686,7 +686,7 @@ def _none_addr(datatype, data):
686686
class ImplicitMethod(ConciseMethod):
687687
def __call_by_default(self, args):
688688
function_abi = find_matching_fn_abi(self._function.contract_abi,
689-
self._function.web3,
689+
self._function.web3.codec,
690690
fn_identifier=self._function.function_identifier,
691691
args=args)
692692

@@ -766,7 +766,7 @@ def _set_function_info(self):
766766
if not self.abi:
767767
self.abi = find_matching_fn_abi(
768768
self.contract_abi,
769-
self.web3,
769+
self.web3.codec,
770770
self.function_identifier,
771771
self.args,
772772
self.kwargs
@@ -1350,7 +1350,7 @@ def call_contract_function(
13501350
return_data = web3.eth.call(call_transaction, block_identifier=block_id)
13511351

13521352
if fn_abi is None:
1353-
fn_abi = find_matching_fn_abi(contract_abi, web3, function_identifier, args, kwargs)
1353+
fn_abi = find_matching_fn_abi(contract_abi, web3.codec, function_identifier, args, kwargs)
13541354

13551355
output_types = get_abi_output_types(fn_abi)
13561356

web3/main.py

Lines changed: 4 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
from eth_abi import (
2-
decoding,
3-
)
41
from eth_abi.codec import (
52
ABICodec,
63
)
7-
from eth_abi.registry import (
8-
BaseEquals,
9-
registry as default_registry,
10-
)
114
from eth_utils import (
125
add_0x_prefix,
136
apply_to_return_value,
@@ -25,13 +18,9 @@
2518

2619
from ens import ENS
2720
from web3._utils.abi import (
21+
build_default_registry,
22+
build_strict_registry,
2823
map_abi_data,
29-
AddressEncoder,
30-
BytesEncoder,
31-
ByteStringEncoder,
32-
ExactLengthBytesEncoder,
33-
StrictByteStringEncoder,
34-
TextStringEncoder,
3524
)
3625
from web3._utils.decorators import (
3726
combomethod,
@@ -156,46 +145,10 @@ def __init__(self, provider=None, middlewares=None, modules=None, ens=empty):
156145

157146
attach_modules(self, modules)
158147

159-
self.codec = ABICodec(self.build_default_registry())
148+
self.codec = ABICodec(build_default_registry())
160149

161150
self.ens = ens
162151

163-
def is_encodable(self, _type, value):
164-
# TODO - there is probably a better place to put this
165-
return self.codec.is_encodable(_type, value)
166-
167-
def build_default_registry(self):
168-
# We make a copy here just to make sure that eth-abi's default registry is not
169-
# affected by our custom encoder subclasses
170-
registry = default_registry.copy()
171-
172-
registry.unregister('address')
173-
registry.unregister('bytes<M>')
174-
registry.unregister('bytes')
175-
registry.unregister('string')
176-
177-
registry.register(
178-
BaseEquals('address'),
179-
AddressEncoder, decoding.AddressDecoder,
180-
label='address',
181-
)
182-
registry.register(
183-
BaseEquals('bytes', with_sub=True),
184-
BytesEncoder, decoding.BytesDecoder,
185-
label='bytes<M>',
186-
)
187-
registry.register(
188-
BaseEquals('bytes', with_sub=False),
189-
ByteStringEncoder, decoding.ByteStringDecoder,
190-
label='bytes',
191-
)
192-
registry.register(
193-
BaseEquals('string'),
194-
TextStringEncoder, decoding.StringDecoder,
195-
label='string',
196-
)
197-
return registry
198-
199152
@property
200153
def middleware_onion(self):
201154
return self.manager.middleware_onion
@@ -300,35 +253,5 @@ def enable_unstable_package_management_api(self):
300253
if not hasattr(self, '_pm'):
301254
PM.attach(self, '_pm')
302255

303-
def build_strict_registry(self):
304-
registry = default_registry.copy()
305-
306-
registry.unregister('address')
307-
registry.unregister('bytes<M>')
308-
registry.unregister('bytes')
309-
registry.unregister('string')
310-
311-
registry.register(
312-
BaseEquals('address'),
313-
AddressEncoder, decoding.AddressDecoder,
314-
label='address',
315-
)
316-
registry.register(
317-
BaseEquals('bytes', with_sub=True),
318-
ExactLengthBytesEncoder, decoding.BytesDecoder,
319-
label='bytes<M>',
320-
)
321-
registry.register(
322-
BaseEquals('bytes', with_sub=False),
323-
StrictByteStringEncoder, decoding.ByteStringDecoder,
324-
label='bytes',
325-
)
326-
registry.register(
327-
BaseEquals('string'),
328-
TextStringEncoder, decoding.StringDecoder,
329-
label='string',
330-
)
331-
return registry
332-
333256
def enable_strict_bytes_type_checking(self):
334-
return setattr(self, 'codec', ABICodec(self.build_strict_registry()))
257+
return setattr(self, 'codec', ABICodec(build_strict_registry()))

0 commit comments

Comments
 (0)