faster-eth-abi 5.2.7__cp314-cp314-win32.whl → 5.2.9__cp314-cp314-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of faster-eth-abi might be problematic. Click here for more details.

Binary file
faster_eth_abi/_codec.py CHANGED
@@ -3,7 +3,6 @@ from typing import (
3
3
  Any,
4
4
  Iterable,
5
5
  Tuple,
6
- cast,
7
6
  )
8
7
 
9
8
  from eth_typing import (
@@ -79,4 +78,4 @@ def decode_c(
79
78
  decoder = self._registry.get_tuple_decoder(*types, strict=strict)
80
79
  stream = self.stream_class(data)
81
80
 
82
- return cast(Tuple[Any, ...], decoder(stream))
81
+ return decoder(stream)
Binary file
@@ -0,0 +1,109 @@
1
+ from typing import (
2
+ TYPE_CHECKING,
3
+ Any,
4
+ Tuple,
5
+ )
6
+
7
+ from faster_eth_utils import (
8
+ big_endian_to_int,
9
+ )
10
+
11
+ from faster_eth_abi.exceptions import (
12
+ InsufficientDataBytes,
13
+ )
14
+ from faster_eth_abi.io import (
15
+ BytesIO,
16
+ ContextFramesBytesIO,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from .decoding import (
21
+ DynamicArrayDecoder,
22
+ FixedByteSizeDecoder,
23
+ HeadTailDecoder,
24
+ SizedArrayDecoder,
25
+ TupleDecoder,
26
+ )
27
+
28
+
29
+ def decode_uint_256(stream: ContextFramesBytesIO) -> int:
30
+ """
31
+ This function is a faster version of decode_uint_256 in decoding.py.
32
+
33
+ It recreates the logic from the UnsignedIntegerDecoder, but we can
34
+ skip a lot because we know the value of many vars.
35
+ """
36
+ # read data from stream
37
+ if len(data := stream.read(32)) == 32:
38
+ return big_endian_to_int(data) # type: ignore [no-any-return]
39
+ raise InsufficientDataBytes(f"Tried to read 32 bytes, only got {len(data)} bytes.")
40
+
41
+
42
+ # HeadTailDecoder
43
+ def decode_head_tail(self: "HeadTailDecoder", stream: ContextFramesBytesIO) -> Any:
44
+ # Decode the offset and move the stream cursor forward 32 bytes
45
+ start_pos = decode_uint_256(stream)
46
+ # Jump ahead to the start of the value
47
+ stream.push_frame(start_pos)
48
+
49
+ # assertion check for mypy
50
+ tail_decoder = self.tail_decoder
51
+ if tail_decoder is None:
52
+ raise AssertionError("`tail_decoder` is None")
53
+ # Decode the value
54
+ value = tail_decoder(stream)
55
+ # Return the cursor
56
+ stream.pop_frame()
57
+
58
+ return value
59
+
60
+
61
+ # TupleDecoder
62
+ def decode_tuple(self: "TupleDecoder", stream: ContextFramesBytesIO) -> Tuple[Any, ...]:
63
+ self.validate_pointers(stream)
64
+ return tuple(decoder(stream) for decoder in self.decoders)
65
+
66
+
67
+ # SizedArrayDecoder
68
+ def decode_sized_array(
69
+ self: "SizedArrayDecoder", stream: ContextFramesBytesIO
70
+ ) -> Tuple[Any, ...]:
71
+ item_decoder = self.item_decoder
72
+ if item_decoder is None:
73
+ raise AssertionError("`item_decoder` is None")
74
+
75
+ array_size = self.array_size
76
+ self.validate_pointers(stream, array_size)
77
+ return tuple(item_decoder(stream) for _ in range(array_size))
78
+
79
+
80
+ # DynamicArrayDecoder
81
+ def decode_dynamic_array(
82
+ self: "DynamicArrayDecoder", stream: ContextFramesBytesIO
83
+ ) -> Tuple[Any, ...]:
84
+ array_size = decode_uint_256(stream)
85
+ stream.push_frame(32)
86
+ if self.item_decoder is None:
87
+ raise AssertionError("`item_decoder` is None")
88
+
89
+ self.validate_pointers(stream, array_size)
90
+ item_decoder = self.item_decoder
91
+ try:
92
+ return tuple(item_decoder(stream) for _ in range(array_size))
93
+ finally:
94
+ stream.pop_frame()
95
+
96
+
97
+ # FixedByteSizeDecoder
98
+ def read_fixed_byte_size_data_from_stream(
99
+ self: "FixedByteSizeDecoder",
100
+ # NOTE: use BytesIO here so mypyc doesn't type-check
101
+ # `stream` once we compile ContextFramesBytesIO.
102
+ stream: BytesIO,
103
+ ) -> bytes:
104
+ data_byte_size = self.data_byte_size
105
+ if len(data := stream.read(data_byte_size)) == data_byte_size:
106
+ return data
107
+ raise InsufficientDataBytes(
108
+ f"Tried to read {data_byte_size} bytes, only got {len(data)} bytes."
109
+ )
Binary file
Binary file
Binary file
@@ -2,16 +2,25 @@ import abc
2
2
  import decimal
3
3
  from typing import (
4
4
  Any,
5
- Generator,
5
+ Callable,
6
+ Final,
7
+ Optional,
6
8
  Tuple,
9
+ Union,
7
10
  )
8
11
 
9
12
  from faster_eth_utils import (
10
13
  big_endian_to_int,
11
14
  to_normalized_address,
12
- to_tuple,
13
15
  )
14
16
 
17
+ from faster_eth_abi._decoding import (
18
+ decode_dynamic_array,
19
+ decode_head_tail,
20
+ decode_sized_array,
21
+ decode_tuple,
22
+ read_fixed_byte_size_data_from_stream,
23
+ )
15
24
  from faster_eth_abi.base import (
16
25
  BaseCoder,
17
26
  )
@@ -33,6 +42,10 @@ from faster_eth_abi.utils.numeric import (
33
42
  ceil32,
34
43
  )
35
44
 
45
+ DynamicDecoder = Union[
46
+ "HeadTailDecoder", "SizedArrayDecoder", "DynamicArrayDecoder", "ByteStringDecoder"
47
+ ]
48
+
36
49
 
37
50
  class BaseDecoder(BaseCoder, metaclass=abc.ABCMeta):
38
51
  """
@@ -65,29 +78,18 @@ class HeadTailDecoder(BaseDecoder):
65
78
 
66
79
  is_dynamic = True
67
80
 
68
- tail_decoder = None
81
+ tail_decoder: Optional[DynamicDecoder] = None
69
82
 
70
- def validate(self):
83
+ def validate(self) -> None:
71
84
  super().validate()
72
85
 
73
86
  if self.tail_decoder is None:
74
87
  raise ValueError("No `tail_decoder` set")
75
88
 
76
89
  def decode(self, stream: ContextFramesBytesIO) -> Any:
77
- # Decode the offset and move the stream cursor forward 32 bytes
78
- start_pos = decode_uint_256(stream)
79
- # Jump ahead to the start of the value
80
- stream.push_frame(start_pos)
81
-
82
- # assertion check for mypy
83
- if self.tail_decoder is None:
84
- raise AssertionError("`tail_decoder` is None")
85
- # Decode the value
86
- value = self.tail_decoder(stream)
87
- # Return the cursor
88
- stream.pop_frame()
90
+ return decode_head_tail(self, stream)
89
91
 
90
- return value
92
+ __call__ = decode
91
93
 
92
94
 
93
95
  class TupleDecoder(BaseDecoder):
@@ -96,14 +98,17 @@ class TupleDecoder(BaseDecoder):
96
98
  def __init__(self, decoders: Tuple[BaseDecoder, ...], **kwargs: Any) -> None:
97
99
  super().__init__(**kwargs)
98
100
 
99
- self.decoders = tuple(
101
+ self.decoders = decoders = tuple(
100
102
  HeadTailDecoder(tail_decoder=d) if getattr(d, "is_dynamic", False) else d
101
103
  for d in decoders
102
104
  )
103
105
 
104
- self.is_dynamic = any(getattr(d, "is_dynamic", False) for d in self.decoders)
106
+ self.is_dynamic = any(getattr(d, "is_dynamic", False) for d in decoders)
107
+ self.len_of_head = sum(
108
+ getattr(decoder, "array_size", 1) for decoder in decoders
109
+ )
105
110
 
106
- def validate(self):
111
+ def validate(self) -> None:
107
112
  super().validate()
108
113
 
109
114
  if self.decoders is None:
@@ -114,11 +119,7 @@ class TupleDecoder(BaseDecoder):
114
119
  Verify that all pointers point to a valid location in the stream.
115
120
  """
116
121
  current_location = stream.tell()
117
- len_of_head = sum(
118
- decoder.array_size if hasattr(decoder, "array_size") else 1
119
- for decoder in self.decoders
120
- )
121
- end_of_offsets = current_location + 32 * len_of_head
122
+ end_of_offsets = current_location + 32 * self.len_of_head
122
123
  total_stream_length = len(stream.getbuffer())
123
124
  for decoder in self.decoders:
124
125
  if isinstance(decoder, HeadTailDecoder):
@@ -143,11 +144,10 @@ class TupleDecoder(BaseDecoder):
143
144
  # return the stream to its original location for actual decoding
144
145
  stream.seek(current_location)
145
146
 
146
- @to_tuple # type: ignore [misc]
147
- def decode(self, stream: ContextFramesBytesIO) -> Generator[Any, None, None]:
148
- self.validate_pointers(stream)
149
- for decoder in self.decoders:
150
- yield decoder(stream)
147
+ def decode(self, stream: ContextFramesBytesIO) -> Tuple[Any, ...]:
148
+ return decode_tuple(self, stream)
149
+
150
+ __call__ = decode
151
151
 
152
152
  @parse_tuple_type_str
153
153
  def from_type_str(cls, abi_type, registry):
@@ -161,7 +161,7 @@ class TupleDecoder(BaseDecoder):
161
161
  class SingleDecoder(BaseDecoder):
162
162
  decoder_fn = None
163
163
 
164
- def validate(self):
164
+ def validate(self) -> None:
165
165
  super().validate()
166
166
 
167
167
  if self.decoder_fn is None:
@@ -173,33 +173,35 @@ class SingleDecoder(BaseDecoder):
173
173
  def decode(self, stream):
174
174
  raw_data = self.read_data_from_stream(stream)
175
175
  data, padding_bytes = self.split_data_and_padding(raw_data)
176
- if self.decoder_fn is None:
176
+ decoder_fn = self.decoder_fn
177
+ if decoder_fn is None:
177
178
  raise AssertionError("`decoder_fn` is None")
178
- value = self.decoder_fn(data)
179
+ value = decoder_fn(data)
179
180
  self.validate_padding_bytes(value, padding_bytes)
180
181
 
181
182
  return value
182
183
 
183
- def read_data_from_stream(self, stream):
184
+ __call__ = decode
185
+
186
+ def read_data_from_stream(self, stream: ContextFramesBytesIO) -> bytes:
184
187
  raise NotImplementedError("Must be implemented by subclasses")
185
188
 
186
- def split_data_and_padding(self, raw_data):
189
+ def split_data_and_padding(self, raw_data: bytes) -> Tuple[bytes, bytes]:
187
190
  return raw_data, b""
188
191
 
189
192
 
190
193
  class BaseArrayDecoder(BaseDecoder):
191
- item_decoder = None
194
+ item_decoder: BaseDecoder = None
192
195
 
193
- def __init__(self, **kwargs):
196
+ def __init__(self, **kwargs: Any) -> None:
194
197
  super().__init__(**kwargs)
195
198
 
196
199
  # Use a head-tail decoder to decode dynamic elements
197
- if self.item_decoder.is_dynamic:
198
- self.item_decoder = HeadTailDecoder(
199
- tail_decoder=self.item_decoder,
200
- )
200
+ item_decoder = self.item_decoder
201
+ if item_decoder.is_dynamic:
202
+ self.item_decoder = HeadTailDecoder(tail_decoder=item_decoder)
201
203
 
202
- def validate(self):
204
+ def validate(self) -> None:
203
205
  super().validate()
204
206
 
205
207
  if self.item_decoder is None:
@@ -246,78 +248,61 @@ class BaseArrayDecoder(BaseDecoder):
246
248
 
247
249
 
248
250
  class SizedArrayDecoder(BaseArrayDecoder):
249
- array_size = None
251
+ array_size: int = None
250
252
 
251
253
  def __init__(self, **kwargs):
252
254
  super().__init__(**kwargs)
253
255
 
254
256
  self.is_dynamic = self.item_decoder.is_dynamic
255
257
 
256
- @to_tuple
257
258
  def decode(self, stream):
258
- if self.item_decoder is None:
259
- raise AssertionError("`item_decoder` is None")
259
+ return decode_sized_array(self, stream)
260
260
 
261
- self.validate_pointers(stream, self.array_size)
262
- for _ in range(self.array_size):
263
- yield self.item_decoder(stream)
261
+ __call__ = decode
264
262
 
265
263
 
266
264
  class DynamicArrayDecoder(BaseArrayDecoder):
267
265
  # Dynamic arrays are always dynamic, regardless of their elements
268
266
  is_dynamic = True
269
267
 
270
- @to_tuple
271
- def decode(self, stream):
272
- array_size = decode_uint_256(stream)
273
- stream.push_frame(32)
274
- if self.item_decoder is None:
275
- raise AssertionError("`item_decoder` is None")
268
+ def decode(self, stream: ContextFramesBytesIO) -> Tuple[Any, ...]:
269
+ return decode_dynamic_array(self, stream)
276
270
 
277
- self.validate_pointers(stream, array_size)
278
- for _ in range(array_size):
279
- yield self.item_decoder(stream)
280
- stream.pop_frame()
271
+ __call__ = decode
281
272
 
282
273
 
283
274
  class FixedByteSizeDecoder(SingleDecoder):
284
- decoder_fn = None
285
- value_bit_size = None
286
- data_byte_size = None
287
- is_big_endian = None
275
+ decoder_fn: Callable[[bytes], Any] = None
276
+ value_bit_size: int = None
277
+ data_byte_size: int = None
278
+ is_big_endian: bool = None
288
279
 
289
- def validate(self):
280
+ def validate(self) -> None:
290
281
  super().validate()
291
282
 
292
- if self.value_bit_size is None:
283
+ value_bit_size = self.value_bit_size
284
+ if value_bit_size is None:
293
285
  raise ValueError("`value_bit_size` may not be None")
294
- if self.data_byte_size is None:
286
+ data_byte_size = self.data_byte_size
287
+ if data_byte_size is None:
295
288
  raise ValueError("`data_byte_size` may not be None")
296
289
  if self.decoder_fn is None:
297
290
  raise ValueError("`decoder_fn` may not be None")
298
291
  if self.is_big_endian is None:
299
292
  raise ValueError("`is_big_endian` may not be None")
300
293
 
301
- if self.value_bit_size % 8 != 0:
294
+ if value_bit_size % 8 != 0:
302
295
  raise ValueError(
303
- "Invalid value bit size: {self.value_bit_size}. Must be a multiple of 8"
296
+ f"Invalid value bit size: {value_bit_size}. Must be a multiple of 8"
304
297
  )
305
298
 
306
- if self.value_bit_size > self.data_byte_size * 8:
299
+ if value_bit_size > data_byte_size * 8:
307
300
  raise ValueError("Value byte size exceeds data size")
308
301
 
309
- def read_data_from_stream(self, stream):
310
- data = stream.read(self.data_byte_size)
311
-
312
- if len(data) != self.data_byte_size:
313
- raise InsufficientDataBytes(
314
- f"Tried to read {self.data_byte_size} bytes, "
315
- f"only got {len(data)} bytes."
316
- )
317
-
318
- return data
302
+ def read_data_from_stream(self, stream: ContextFramesBytesIO) -> bytes:
303
+ return read_fixed_byte_size_data_from_stream(self, stream)
319
304
 
320
- def split_data_and_padding(self, raw_data):
305
+ def split_data_and_padding(self, raw_data: bytes) -> Tuple[bytes, bytes]:
321
306
  value_byte_size = self._get_value_byte_size()
322
307
  padding_size = self.data_byte_size - value_byte_size
323
308
 
@@ -330,7 +315,7 @@ class FixedByteSizeDecoder(SingleDecoder):
330
315
 
331
316
  return data, padding_bytes
332
317
 
333
- def validate_padding_bytes(self, value, padding_bytes):
318
+ def validate_padding_bytes(self, value: Any, padding_bytes: bytes) -> None:
334
319
  value_byte_size = self._get_value_byte_size()
335
320
  padding_size = self.data_byte_size - value_byte_size
336
321
 
@@ -339,9 +324,8 @@ class FixedByteSizeDecoder(SingleDecoder):
339
324
  f"Padding bytes were not empty: {padding_bytes!r}"
340
325
  )
341
326
 
342
- def _get_value_byte_size(self):
343
- value_byte_size = self.value_bit_size // 8
344
- return value_byte_size
327
+ def _get_value_byte_size(self) -> int:
328
+ return self.value_bit_size // 8
345
329
 
346
330
 
347
331
  class Fixed32ByteSizeDecoder(FixedByteSizeDecoder):
@@ -353,7 +337,7 @@ class BooleanDecoder(Fixed32ByteSizeDecoder):
353
337
  is_big_endian = True
354
338
 
355
339
  @staticmethod
356
- def decoder_fn(data):
340
+ def decoder_fn(data: bytes) -> bool:
357
341
  if data == b"\x00":
358
342
  return False
359
343
  elif data == b"\x01":
@@ -401,12 +385,13 @@ class SignedIntegerDecoder(Fixed32ByteSizeDecoder):
401
385
 
402
386
  def decoder_fn(self, data):
403
387
  value = big_endian_to_int(data)
404
- if value >= 2 ** (self.value_bit_size - 1):
405
- return value - 2**self.value_bit_size
388
+ value_bit_size = self.value_bit_size
389
+ if value >= 2 ** (value_bit_size - 1):
390
+ return value - 2**value_bit_size
406
391
  else:
407
392
  return value
408
393
 
409
- def validate_padding_bytes(self, value, padding_bytes):
394
+ def validate_padding_bytes(self, value: Any, padding_bytes: bytes) -> None:
410
395
  value_byte_size = self._get_value_byte_size()
411
396
  padding_size = self.data_byte_size - value_byte_size
412
397
 
@@ -441,16 +426,17 @@ class BytesDecoder(Fixed32ByteSizeDecoder):
441
426
 
442
427
 
443
428
  class BaseFixedDecoder(Fixed32ByteSizeDecoder):
444
- frac_places = None
429
+ frac_places: int = None
445
430
  is_big_endian = True
446
431
 
447
- def validate(self):
432
+ def validate(self) -> None:
448
433
  super().validate()
449
434
 
450
- if self.frac_places is None:
435
+ frac_places = self.frac_places
436
+ if frac_places is None:
451
437
  raise ValueError("must specify `frac_places`")
452
438
 
453
- if self.frac_places <= 0 or self.frac_places > 80:
439
+ if frac_places <= 0 or frac_places > 80:
454
440
  raise ValueError("`frac_places` must be in range (0, 80]")
455
441
 
456
442
 
@@ -473,8 +459,9 @@ class UnsignedFixedDecoder(BaseFixedDecoder):
473
459
  class SignedFixedDecoder(BaseFixedDecoder):
474
460
  def decoder_fn(self, data):
475
461
  value = big_endian_to_int(data)
476
- if value >= 2 ** (self.value_bit_size - 1):
477
- signed_value = value - 2**self.value_bit_size
462
+ value_bit_size = self.value_bit_size
463
+ if value >= 2 ** (value_bit_size - 1):
464
+ signed_value = value - 2**value_bit_size
478
465
  else:
479
466
  signed_value = value
480
467
 
@@ -483,7 +470,7 @@ class SignedFixedDecoder(BaseFixedDecoder):
483
470
 
484
471
  return decimal_value
485
472
 
486
- def validate_padding_bytes(self, value, padding_bytes):
473
+ def validate_padding_bytes(self, value: Any, padding_bytes: bytes) -> None:
487
474
  value_byte_size = self._get_value_byte_size()
488
475
  padding_size = self.data_byte_size - value_byte_size
489
476
 
@@ -514,7 +501,7 @@ class ByteStringDecoder(SingleDecoder):
514
501
  def decoder_fn(data):
515
502
  return data
516
503
 
517
- def read_data_from_stream(self, stream):
504
+ def read_data_from_stream(self, stream: ContextFramesBytesIO) -> bytes:
518
505
  data_length = decode_uint_256(stream)
519
506
  padded_length = ceil32(data_length)
520
507
 
@@ -534,7 +521,7 @@ class ByteStringDecoder(SingleDecoder):
534
521
 
535
522
  return data[:data_length]
536
523
 
537
- def validate_padding_bytes(self, value, padding_bytes):
524
+ def validate_padding_bytes(self, value: Any, padding_bytes: bytes) -> None:
538
525
  pass
539
526
 
540
527
  @parse_type_str("bytes")
@@ -543,21 +530,21 @@ class ByteStringDecoder(SingleDecoder):
543
530
 
544
531
 
545
532
  class StringDecoder(ByteStringDecoder):
546
- def __init__(self, handle_string_errors="strict"):
547
- self.bytes_errors = handle_string_errors
533
+ def __init__(self, handle_string_errors: str = "strict") -> None:
534
+ self.bytes_errors: Final = handle_string_errors
548
535
  super().__init__()
549
536
 
550
537
  @parse_type_str("string")
551
538
  def from_type_str(cls, abi_type, registry):
552
539
  return cls()
553
540
 
554
- def decode(self, stream):
541
+ def decode(self, stream: ContextFramesBytesIO) -> str:
555
542
  raw_data = self.read_data_from_stream(stream)
556
543
  data, padding_bytes = self.split_data_and_padding(raw_data)
557
- value = self.decoder_fn(data, self.bytes_errors)
558
- self.validate_padding_bytes(value, padding_bytes)
559
- return value
544
+ return self.decoder_fn(data, self.bytes_errors)
545
+
546
+ __call__ = decode
560
547
 
561
548
  @staticmethod
562
- def decoder_fn(data, handle_string_errors="strict"):
549
+ def decoder_fn(data: bytes, handle_string_errors: str = "strict") -> str:
563
550
  return data.decode("utf-8", errors=handle_string_errors)
@@ -3,6 +3,8 @@ import codecs
3
3
  import decimal
4
4
  from typing import (
5
5
  Any,
6
+ Callable,
7
+ ClassVar,
6
8
  NoReturn,
7
9
  Optional,
8
10
  Sequence,
@@ -20,6 +22,9 @@ from faster_eth_utils import (
20
22
  is_text,
21
23
  to_canonical_address,
22
24
  )
25
+ from typing_extensions import (
26
+ Self,
27
+ )
23
28
 
24
29
  from faster_eth_abi._encoding import (
25
30
  encode_elements,
@@ -108,37 +113,40 @@ class TupleEncoder(BaseEncoder):
108
113
 
109
114
  self.is_dynamic = any(getattr(e, "is_dynamic", False) for e in self.encoders)
110
115
 
111
- def validate(self):
116
+ def validate(self) -> None:
112
117
  super().validate()
113
118
 
114
119
  if self.encoders is None:
115
120
  raise ValueError("`encoders` may not be none")
116
121
 
117
- def validate_value(self, value):
122
+ def validate_value(self, value: Sequence[Any]) -> None:
118
123
  if not is_list_like(value):
119
124
  self.invalidate_value(
120
125
  value,
121
126
  msg="must be list-like object such as array or tuple",
122
127
  )
123
128
 
124
- if len(value) != len(self.encoders):
129
+ encoders = self.encoders
130
+ if len(value) != len(encoders):
125
131
  self.invalidate_value(
126
132
  value,
127
133
  exc=ValueOutOfBounds,
128
- msg=f"value has {len(value)} items when {len(self.encoders)} "
134
+ msg=f"value has {len(value)} items when {len(encoders)} "
129
135
  "were expected",
130
136
  )
131
137
 
132
- for item, encoder in zip(value, self.encoders):
138
+ for item, encoder in zip(value, encoders):
133
139
  try:
134
140
  encoder.validate_value(item)
135
141
  except AttributeError:
136
142
  encoder(item)
137
143
 
138
- def encode(self, values):
144
+ def encode(self, values: Sequence[Any]) -> bytes:
139
145
  self.validate_value(values)
140
146
  return encode_tuple(values, self.encoders)
141
147
 
148
+ __call__: Callable[[Self, Sequence[Any]], bytes] = encode
149
+
142
150
  @parse_tuple_type_str
143
151
  def from_type_str(cls, abi_type, registry):
144
152
  encoders = tuple(
@@ -155,25 +163,26 @@ class FixedSizeEncoder(BaseEncoder):
155
163
  type_check_fn = None
156
164
  is_big_endian = None
157
165
 
158
- def validate(self):
166
+ def validate(self) -> None:
159
167
  super().validate()
160
168
 
161
- if self.value_bit_size is None:
169
+ value_bit_size = self.value_bit_size
170
+ if value_bit_size is None:
162
171
  raise ValueError("`value_bit_size` may not be none")
163
- if self.data_byte_size is None:
172
+ data_byte_size = self.data_byte_size
173
+ if data_byte_size is None:
164
174
  raise ValueError("`data_byte_size` may not be none")
165
175
  if self.encode_fn is None:
166
176
  raise ValueError("`encode_fn` may not be none")
167
177
  if self.is_big_endian is None:
168
178
  raise ValueError("`is_big_endian` may not be none")
169
179
 
170
- if self.value_bit_size % 8 != 0:
180
+ if value_bit_size % 8 != 0:
171
181
  raise ValueError(
172
- f"Invalid value bit size: {self.value_bit_size}. "
173
- "Must be a multiple of 8"
182
+ f"Invalid value bit size: {value_bit_size}. Must be a multiple of 8"
174
183
  )
175
184
 
176
- if self.value_bit_size > self.data_byte_size * 8:
185
+ if value_bit_size > data_byte_size * 8:
177
186
  raise ValueError("Value byte size exceeds data size")
178
187
 
179
188
  def validate_value(self, value):
@@ -181,11 +190,12 @@ class FixedSizeEncoder(BaseEncoder):
181
190
 
182
191
  def encode(self, value: Any) -> bytes:
183
192
  self.validate_value(value)
184
- if self.encode_fn is None:
193
+ encode_fn = self.encode_fn
194
+ if encode_fn is None:
185
195
  raise AssertionError("`encode_fn` is None")
186
- return encode_fixed(
187
- value, self.encode_fn, self.is_big_endian, self.data_byte_size
188
- )
196
+ return encode_fixed(value, encode_fn, self.is_big_endian, self.data_byte_size)
197
+
198
+ __call__ = encode
189
199
 
190
200
 
191
201
  class Fixed32ByteSizeEncoder(FixedSizeEncoder):
@@ -202,7 +212,7 @@ class BooleanEncoder(Fixed32ByteSizeEncoder):
202
212
  cls.invalidate_value(value)
203
213
 
204
214
  @classmethod
205
- def encode_fn(cls, value):
215
+ def encode_fn(cls, value: bool) -> bytes:
206
216
  if value is True:
207
217
  return b"\x01"
208
218
  elif value is False:
@@ -225,7 +235,7 @@ class NumberEncoder(Fixed32ByteSizeEncoder):
225
235
  illegal_value_fn = None
226
236
  type_check_fn = None
227
237
 
228
- def validate(self):
238
+ def validate(self) -> None:
229
239
  super().validate()
230
240
 
231
241
  if self.bounds_fn is None:
@@ -234,14 +244,14 @@ class NumberEncoder(Fixed32ByteSizeEncoder):
234
244
  raise ValueError("`type_check_fn` cannot be null")
235
245
 
236
246
  def validate_value(self, value):
237
- if self.type_check_fn is None:
247
+ type_check_fn = self.type_check_fn
248
+ if type_check_fn is None:
238
249
  raise AssertionError("`type_check_fn` is None")
239
- if not self.type_check_fn(value):
250
+ if not type_check_fn(value):
240
251
  self.invalidate_value(value)
241
252
 
242
- illegal_value = self.illegal_value_fn is not None and self.illegal_value_fn(
243
- value
244
- )
253
+ illegal_value_fn = self.illegal_value_fn
254
+ illegal_value = illegal_value_fn is not None and illegal_value_fn(value)
245
255
  if illegal_value:
246
256
  self.invalidate_value(value, exc=IllegalValue)
247
257
 
@@ -284,10 +294,12 @@ class SignedIntegerEncoder(NumberEncoder):
284
294
  def encode_fn(self, value: int) -> bytes:
285
295
  return int_to_big_endian(value % (2**self.value_bit_size))
286
296
 
287
- def encode(self, value):
297
+ def encode(self, value: int) -> bytes:
288
298
  self.validate_value(value)
289
299
  return encode_signed(value, self.encode_fn, self.data_byte_size)
290
300
 
301
+ __call__ = encode
302
+
291
303
  @parse_type_str("int")
292
304
  def from_type_str(cls, abi_type, registry):
293
305
  return cls(value_bit_size=abi_type.sub)
@@ -330,13 +342,14 @@ class BaseFixedEncoder(NumberEncoder):
330
342
  f"{self.frac_places}",
331
343
  )
332
344
 
333
- def validate(self):
345
+ def validate(self) -> None:
334
346
  super().validate()
335
347
 
336
- if self.frac_places is None:
348
+ frac_places = self.frac_places
349
+ if frac_places is None:
337
350
  raise ValueError("must specify `frac_places`")
338
351
 
339
- if self.frac_places <= 0 or self.frac_places > 80:
352
+ if frac_places <= 0 or frac_places > 80:
340
353
  raise ValueError("`frac_places` must be in range (0, 80]")
341
354
 
342
355
 
@@ -390,6 +403,8 @@ class SignedFixedEncoder(BaseFixedEncoder):
390
403
  self.validate_value(value)
391
404
  return encode_signed(value, self.encode_fn, self.data_byte_size)
392
405
 
406
+ __call__ = encode
407
+
393
408
  @parse_type_str("fixed")
394
409
  def from_type_str(cls, abi_type, registry):
395
410
  value_bit_size, frac_places = abi_type.sub
@@ -422,7 +437,7 @@ class AddressEncoder(Fixed32ByteSizeEncoder):
422
437
  if not is_address(value):
423
438
  cls.invalidate_value(value)
424
439
 
425
- def validate(self):
440
+ def validate(self) -> None:
426
441
  super().validate()
427
442
 
428
443
  if self.value_bit_size != 20 * 8:
@@ -479,7 +494,7 @@ class ByteStringEncoder(BaseEncoder):
479
494
  cls.invalidate_value(value)
480
495
 
481
496
  @classmethod
482
- def encode(cls, value):
497
+ def encode(cls, value: bytes) -> bytes:
483
498
  cls.validate_value(value)
484
499
  value_length = len(value)
485
500
 
@@ -488,9 +503,11 @@ class ByteStringEncoder(BaseEncoder):
488
503
 
489
504
  return encoded_size + padded_value
490
505
 
506
+ __call__: ClassVar[Callable[[Type[Self], bytes], bytes]] = encode
507
+
491
508
  @parse_type_str("bytes")
492
509
  def from_type_str(cls, abi_type, registry):
493
- return cls()
510
+ return cls() # type: ignore [misc]
494
511
 
495
512
 
496
513
  class PackedByteStringEncoder(ByteStringEncoder):
@@ -501,6 +518,8 @@ class PackedByteStringEncoder(ByteStringEncoder):
501
518
  cls.validate_value(value)
502
519
  return value
503
520
 
521
+ __call__ = encode
522
+
504
523
 
505
524
  class TextStringEncoder(BaseEncoder):
506
525
  is_dynamic = True
@@ -511,7 +530,7 @@ class TextStringEncoder(BaseEncoder):
511
530
  cls.invalidate_value(value)
512
531
 
513
532
  @classmethod
514
- def encode(cls, value):
533
+ def encode(cls, value: str) -> bytes:
515
534
  cls.validate_value(value)
516
535
 
517
536
  value_as_bytes = codecs.encode(value, "utf8")
@@ -522,24 +541,28 @@ class TextStringEncoder(BaseEncoder):
522
541
 
523
542
  return encoded_size + padded_value
524
543
 
544
+ __call__: ClassVar[Callable[[Type[Self], str], bytes]] = encode
545
+
525
546
  @parse_type_str("string")
526
547
  def from_type_str(cls, abi_type, registry):
527
- return cls()
548
+ return cls() # type: ignore [misc]
528
549
 
529
550
 
530
551
  class PackedTextStringEncoder(TextStringEncoder):
531
552
  is_dynamic = False
532
553
 
533
554
  @classmethod
534
- def encode(cls, value):
555
+ def encode(cls, value: str) -> bytes:
535
556
  cls.validate_value(value)
536
557
  return codecs.encode(value, "utf8")
537
558
 
559
+ __call__ = encode
560
+
538
561
 
539
562
  class BaseArrayEncoder(BaseEncoder):
540
- item_encoder = None
563
+ item_encoder: BaseEncoder = None
541
564
 
542
- def validate(self):
565
+ def validate(self) -> None:
543
566
  super().validate()
544
567
 
545
568
  if self.item_encoder is None:
@@ -552,8 +575,9 @@ class BaseArrayEncoder(BaseEncoder):
552
575
  msg="must be list-like such as array or tuple",
553
576
  )
554
577
 
578
+ item_encoder = self.item_encoder
555
579
  for item in value:
556
- self.item_encoder.validate_value(item)
580
+ item_encoder.validate_value(item)
557
581
 
558
582
  def encode_elements(self, value: Sequence[Any]) -> bytes:
559
583
  self.validate_value(value)
@@ -581,17 +605,19 @@ class PackedArrayEncoder(BaseArrayEncoder):
581
605
  def validate_value(self, value: Any) -> None:
582
606
  super().validate_value(value)
583
607
 
584
- if self.array_size is not None and len(value) != self.array_size:
608
+ array_size = self.array_size
609
+ if array_size is not None and len(value) != array_size:
585
610
  self.invalidate_value(
586
611
  value,
587
612
  exc=ValueOutOfBounds,
588
- msg=f"value has {len(value)} items when {self.array_size} were "
589
- "expected",
613
+ msg=f"value has {len(value)} items when {array_size} were expected",
590
614
  )
591
615
 
592
616
  def encode(self, value: Sequence[Any]) -> bytes:
593
617
  return encode_elements(self.item_encoder, value)
594
618
 
619
+ __call__ = encode
620
+
595
621
  @parse_type_str(with_arrlist=True)
596
622
  def from_type_str(cls, abi_type, registry):
597
623
  item_encoder = registry.get_encoder(abi_type.item_type.to_type_str())
@@ -614,7 +640,7 @@ class SizedArrayEncoder(BaseArrayEncoder):
614
640
 
615
641
  self.is_dynamic = self.item_encoder.is_dynamic
616
642
 
617
- def validate(self):
643
+ def validate(self) -> None:
618
644
  super().validate()
619
645
 
620
646
  if self.array_size is None:
@@ -634,6 +660,8 @@ class SizedArrayEncoder(BaseArrayEncoder):
634
660
  def encode(self, value: Sequence[Any]) -> bytes:
635
661
  return encode_elements(self.item_encoder, value)
636
662
 
663
+ __call__ = encode
664
+
637
665
 
638
666
  class DynamicArrayEncoder(BaseArrayEncoder):
639
667
  is_dynamic = True
Binary file
Binary file
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: faster_eth_abi
3
- Version: 5.2.7
4
- Summary: A aster fork of eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding. Implemented in C.
3
+ Version: 5.2.9
4
+ Summary: A faster fork of eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding. Implemented in C.
5
5
  Home-page: https://github.com/BobTheBuidler/faster-eth-abi
6
6
  Author: The Ethereum Foundation
7
7
  Author-email: snakecharmers@ethereum.org
@@ -0,0 +1,44 @@
1
+ 76f9a3652d4d2667c55c__mypyc.cp314-win32.pyd,sha256=0qPsleQujc4Prlr6YdwPjSkYCS_TmzvZEweGoJuPJ8k,138240
2
+ faster_eth_abi/__init__.py,sha256=JpTfPTiusUGMmX8sEsGAxvILxFbvhh3MEyfiKOd5o9g,217
3
+ faster_eth_abi/_codec.cp314-win32.pyd,sha256=TzqeT156gb9NOUYMTbPJIpOgWHH87OZBoh4uf55mqUI,9216
4
+ faster_eth_abi/_codec.py,sha256=fLRvqvrD8F38U4m1wZztvx-7JJbZaPikwXS5u9BzY14,2509
5
+ faster_eth_abi/_decoding.cp314-win32.pyd,sha256=i3fBU4w-BTcjUlV8-S3VOuD8J_v4jaOh1__rbTZIKYM,9216
6
+ faster_eth_abi/_decoding.py,sha256=GeXe2OaAmojlnGbw3CmSzKK9k5g0QLLn_Qesz7y98X0,3208
7
+ faster_eth_abi/_encoding.cp314-win32.pyd,sha256=IPiX1s0Yt6-C6_thN0bc5_41_uR2LHsGSTJmeSCB4nw,9216
8
+ faster_eth_abi/_encoding.py,sha256=157A_MltVLCEwBmD7SB8UaKXkAOtIKC5MVupk6dk_yA,3217
9
+ faster_eth_abi/abi.cp314-win32.pyd,sha256=lsPT4CgXlcYmBdfpK4HVRXnev2nUUVfQSjdqr6n55fg,9216
10
+ faster_eth_abi/abi.py,sha256=-t9OVBSCxy6SuWpCu3cxHrCqkx8_svPIRb0MSFXEl5Q,383
11
+ faster_eth_abi/base.py,sha256=y4IXpQJWGfUISl3xjCO420Grxido3tE2ebPV2rK-DvM,1229
12
+ faster_eth_abi/codec.py,sha256=e1uO8BJrXRn0Ih70eUa5qipD2wcg2aZSR4fyVuGpFoY,4580
13
+ faster_eth_abi/constants.cp314-win32.pyd,sha256=dTIbg1TxLzK1KYEaKs5hEhHDbaqWu-fpVLbxsQ9Q5bk,9216
14
+ faster_eth_abi/constants.py,sha256=q3FGynS-Eb78cnrL6mBoAvTDz16PF3tW2OylTMd6ajs,114
15
+ faster_eth_abi/decoding.py,sha256=LUyG3EO6K4O6u1020FVMNEB80TwW2aHy6gInHoW5qy8,17632
16
+ faster_eth_abi/encoding.py,sha256=P1svhYylcZa55cQ9LPj6jV8iJVLSL_c5SIZT1Umol58,19679
17
+ faster_eth_abi/exceptions.py,sha256=KzNYRc9t0CvlkveozWvLeo1WC_GarcBkwzV67aY_5yI,3067
18
+ faster_eth_abi/from_type_str.cp314-win32.pyd,sha256=aoyT4srt-ZDUYSXXil8bo7RetY_nOMuPLYrucElURow,9216
19
+ faster_eth_abi/from_type_str.py,sha256=WLRP3OIyrJORgloX-7V0x2KdrZj0kLay-J9I8f-H36s,4446
20
+ faster_eth_abi/grammar.py,sha256=lhEmp3ZwMTzm1-jJiMUVD4zrBgU4MEZCRiND4WxfOes,13839
21
+ faster_eth_abi/io.py,sha256=E_QX7aYAjGYnkNAZmJMmSmx1lqvl_FDNmMFruTi9UX4,3831
22
+ faster_eth_abi/packed.cp314-win32.pyd,sha256=xes76a-pSPSIqaoib6a-PtC0VEfrghXh1dWBmO-VAII,9216
23
+ faster_eth_abi/packed.py,sha256=RZ2chvsx9_AL9OxY1ixHTsaUJHaR_tmrNdViOIp-xSg,316
24
+ faster_eth_abi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ faster_eth_abi/registry.py,sha256=gU5-k_1eYUjs7-NAKoH9nncCJ36tZZHM5ZXvwmXt0cw,21192
26
+ faster_eth_abi/tools/__init__.cp314-win32.pyd,sha256=roRJOos6LPFV0oklRO5lnLcL7toUnB7jiVIg7QpjhfQ,9216
27
+ faster_eth_abi/tools/__init__.py,sha256=jxyQnb34ldRjCTYi3Ajb5h5QlFQ6ODfKQNhOCVwR7Ao,54
28
+ faster_eth_abi/tools/_strategies.cp314-win32.pyd,sha256=rM5mLhIE7wsL72OYHdYm7HdNRJlr7l8P88otbWrNSGw,9216
29
+ faster_eth_abi/tools/_strategies.py,sha256=HCFdQFLa84SMf7Deui2-szTH34hxTfc0Rog_kmpTg_w,6197
30
+ faster_eth_abi/utils/__init__.cp314-win32.pyd,sha256=qBWDKpqUuHUGmDzDgvMnFJI61BKyJK9Z5PFyo4iWoF4,9216
31
+ faster_eth_abi/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ faster_eth_abi/utils/numeric.cp314-win32.pyd,sha256=vI7AyNmpSnvVRtwcvy0KXQ4ZY91koRdNfw4vOrzNnDY,9216
33
+ faster_eth_abi/utils/numeric.py,sha256=hNGble1NA99_5hrAOnH0ZakCuHc6PFMC1p0olmpo_vM,2232
34
+ faster_eth_abi/utils/padding.cp314-win32.pyd,sha256=0iTTXC8bGaY4JLEzMAxMc8NLr6Jv1EdY3e3st9xKnx4,9216
35
+ faster_eth_abi/utils/padding.py,sha256=k6dkOiQ3k0OhQUZ6blCiL1VOQVYGyynucafbySjcFfY,515
36
+ faster_eth_abi/utils/string.cp314-win32.pyd,sha256=d6My9x_k0SL7VJMt0YqGR3WOJVqozKPc6sdkN_P6DNs,9216
37
+ faster_eth_abi/utils/string.py,sha256=wYcvWof4kuitrGGSe_NOduQaxE4HHYmpraCPXKcZxMs,455
38
+ faster_eth_abi/utils/validation.cp314-win32.pyd,sha256=bXUcqPgX8XgecFII3Wo9iOBRjJr_vN-oYdnwshVmqVg,9216
39
+ faster_eth_abi/utils/validation.py,sha256=9veO7wyQsmcFgeaGrsKdSifjV1gaXfTDDKAt1EbKHYY,539
40
+ faster_eth_abi-5.2.9.dist-info/licenses/LICENSE,sha256=Q1lDDWXR057JL2Y7HTAwclCF32_LCloN4sGUkXO1YeI,1127
41
+ faster_eth_abi-5.2.9.dist-info/METADATA,sha256=KDOT00QI4vuhhmIEyht-d1iYsmyvKLtq9xwMBQqxhzg,5498
42
+ faster_eth_abi-5.2.9.dist-info/WHEEL,sha256=avp3B09fSRXVHn4cshTNKc58MtFVN-cVe0NyrqeYT2s,97
43
+ faster_eth_abi-5.2.9.dist-info/top_level.txt,sha256=CO2FQwf61aFzjYze7Wywa5KQdJ6bbLkzDoGEjDF2g9o,43
44
+ faster_eth_abi-5.2.9.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ 76f9a3652d4d2667c55c__mypyc
2
+ faster_eth_abi
Binary file
@@ -1,42 +0,0 @@
1
- c42f5c78bc058f310136__mypyc.cp314-win32.pyd,sha256=6XMnpBuqLdwGUcJTwyR7nq9DE1dNzn2tgeODugcdr2g,129024
2
- faster_eth_abi/__init__.py,sha256=JpTfPTiusUGMmX8sEsGAxvILxFbvhh3MEyfiKOd5o9g,217
3
- faster_eth_abi/_codec.cp314-win32.pyd,sha256=0oOFwWEYGz4W3Dmijtrdsz2w6hR4oJNh4OYr3uxrkUw,9216
4
- faster_eth_abi/_codec.py,sha256=mEjPRDPbpT67gc3HlzM8xAQ7uDOLwVRqQq5-dbwXZ1g,2543
5
- faster_eth_abi/_encoding.cp314-win32.pyd,sha256=MPrCH0-WWk8z2Z3SIsHliyXPkJiYs9ggH2cy5frEfz4,9216
6
- faster_eth_abi/_encoding.py,sha256=157A_MltVLCEwBmD7SB8UaKXkAOtIKC5MVupk6dk_yA,3217
7
- faster_eth_abi/abi.cp314-win32.pyd,sha256=U51VC1Tj48TN1DBQPHkocBE7klQEE8P1YluSAaUKeVg,9216
8
- faster_eth_abi/abi.py,sha256=-t9OVBSCxy6SuWpCu3cxHrCqkx8_svPIRb0MSFXEl5Q,383
9
- faster_eth_abi/base.py,sha256=y4IXpQJWGfUISl3xjCO420Grxido3tE2ebPV2rK-DvM,1229
10
- faster_eth_abi/codec.py,sha256=e1uO8BJrXRn0Ih70eUa5qipD2wcg2aZSR4fyVuGpFoY,4580
11
- faster_eth_abi/constants.cp314-win32.pyd,sha256=OnMdrlBu-AOWwtwhaoQRyDGxuhiNWvuwDJxoNo6bx94,9216
12
- faster_eth_abi/constants.py,sha256=q3FGynS-Eb78cnrL6mBoAvTDz16PF3tW2OylTMd6ajs,114
13
- faster_eth_abi/decoding.py,sha256=w98AsF5cq5DXE9OVflfkVLpMeCRbxzZuIj0hFPJcJNc,17910
14
- faster_eth_abi/encoding.py,sha256=vlFlvohYCUCGtvxhIih3apDuCA5FPu-D_qH7UiaiFTQ,18805
15
- faster_eth_abi/exceptions.py,sha256=KzNYRc9t0CvlkveozWvLeo1WC_GarcBkwzV67aY_5yI,3067
16
- faster_eth_abi/from_type_str.cp314-win32.pyd,sha256=bL48hPOjgqciIiJpguacZ7etLsCxWXwG_rW76BollpI,9216
17
- faster_eth_abi/from_type_str.py,sha256=WLRP3OIyrJORgloX-7V0x2KdrZj0kLay-J9I8f-H36s,4446
18
- faster_eth_abi/grammar.py,sha256=lhEmp3ZwMTzm1-jJiMUVD4zrBgU4MEZCRiND4WxfOes,13839
19
- faster_eth_abi/io.py,sha256=E_QX7aYAjGYnkNAZmJMmSmx1lqvl_FDNmMFruTi9UX4,3831
20
- faster_eth_abi/packed.cp314-win32.pyd,sha256=DoOaBWlHeqsK9mi9kSJW6bFT835IG-i5s0uKUICR0uE,9216
21
- faster_eth_abi/packed.py,sha256=RZ2chvsx9_AL9OxY1ixHTsaUJHaR_tmrNdViOIp-xSg,316
22
- faster_eth_abi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- faster_eth_abi/registry.py,sha256=gU5-k_1eYUjs7-NAKoH9nncCJ36tZZHM5ZXvwmXt0cw,21192
24
- faster_eth_abi/tools/__init__.cp314-win32.pyd,sha256=g-igD5c0HjaRHHnxM5dm7jpVOeayOr6a7fT9gBBzJ9o,9216
25
- faster_eth_abi/tools/__init__.py,sha256=jxyQnb34ldRjCTYi3Ajb5h5QlFQ6ODfKQNhOCVwR7Ao,54
26
- faster_eth_abi/tools/_strategies.cp314-win32.pyd,sha256=8-VTqEpmG4EtFQtfvqFqJz5MmzatxK4IvEuZFs-jCrQ,9216
27
- faster_eth_abi/tools/_strategies.py,sha256=HCFdQFLa84SMf7Deui2-szTH34hxTfc0Rog_kmpTg_w,6197
28
- faster_eth_abi/utils/__init__.cp314-win32.pyd,sha256=tZMVMD0WPC46fBI0oD6gsMPqcBDy19-r-_zjAYYVlwA,9216
29
- faster_eth_abi/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- faster_eth_abi/utils/numeric.cp314-win32.pyd,sha256=VJLEaZgmb7hA9r-lC0dXmlzuZaBc9ns5clV9zRNCxos,9216
31
- faster_eth_abi/utils/numeric.py,sha256=hNGble1NA99_5hrAOnH0ZakCuHc6PFMC1p0olmpo_vM,2232
32
- faster_eth_abi/utils/padding.cp314-win32.pyd,sha256=Uw6Nl8H3xYfPj4hdFlB6l4f6yKg7zin5bTFMQNA8rlU,9216
33
- faster_eth_abi/utils/padding.py,sha256=k6dkOiQ3k0OhQUZ6blCiL1VOQVYGyynucafbySjcFfY,515
34
- faster_eth_abi/utils/string.cp314-win32.pyd,sha256=UEYZq9DbyTdYlYFf_HoUJCOEMCScOV6-bJ6fijw5dIk,9216
35
- faster_eth_abi/utils/string.py,sha256=wYcvWof4kuitrGGSe_NOduQaxE4HHYmpraCPXKcZxMs,455
36
- faster_eth_abi/utils/validation.cp314-win32.pyd,sha256=uZhfJKrlt2khHBltXxgIBOxU_XHw5oBi0qLfNmrc8fQ,9216
37
- faster_eth_abi/utils/validation.py,sha256=9veO7wyQsmcFgeaGrsKdSifjV1gaXfTDDKAt1EbKHYY,539
38
- faster_eth_abi-5.2.7.dist-info/licenses/LICENSE,sha256=Q1lDDWXR057JL2Y7HTAwclCF32_LCloN4sGUkXO1YeI,1127
39
- faster_eth_abi-5.2.7.dist-info/METADATA,sha256=96YSgdtfqL_8HbaSyInDgKBRk6QC18eraaRYG-u-v6g,5497
40
- faster_eth_abi-5.2.7.dist-info/WHEEL,sha256=avp3B09fSRXVHn4cshTNKc58MtFVN-cVe0NyrqeYT2s,97
41
- faster_eth_abi-5.2.7.dist-info/top_level.txt,sha256=5cP87jVHTOdG5bgQZ3ws5MGsnIwm_yX-WalM08iynHc,51
42
- faster_eth_abi-5.2.7.dist-info/RECORD,,
@@ -1,3 +0,0 @@
1
- c42f5c78bc058f310136__mypyc
2
- eth_abi
3
- faster_eth_abi