faster-eth-abi 5.2.7__cp39-cp39-win32.whl → 5.2.9__cp39-cp39-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.
- 76f9a3652d4d2667c55c__mypyc.cp39-win32.pyd +0 -0
- faster_eth_abi/_codec.cp39-win32.pyd +0 -0
- faster_eth_abi/_codec.py +1 -2
- faster_eth_abi/_decoding.cp39-win32.pyd +0 -0
- faster_eth_abi/_decoding.py +109 -0
- faster_eth_abi/_encoding.cp39-win32.pyd +0 -0
- faster_eth_abi/abi.cp39-win32.pyd +0 -0
- faster_eth_abi/constants.cp39-win32.pyd +0 -0
- faster_eth_abi/decoding.py +91 -104
- faster_eth_abi/encoding.py +69 -41
- faster_eth_abi/from_type_str.cp39-win32.pyd +0 -0
- faster_eth_abi/packed.cp39-win32.pyd +0 -0
- faster_eth_abi/tools/__init__.cp39-win32.pyd +0 -0
- faster_eth_abi/tools/_strategies.cp39-win32.pyd +0 -0
- faster_eth_abi/utils/__init__.cp39-win32.pyd +0 -0
- faster_eth_abi/utils/numeric.cp39-win32.pyd +0 -0
- faster_eth_abi/utils/padding.cp39-win32.pyd +0 -0
- faster_eth_abi/utils/string.cp39-win32.pyd +0 -0
- faster_eth_abi/utils/validation.cp39-win32.pyd +0 -0
- {faster_eth_abi-5.2.7.dist-info → faster_eth_abi-5.2.9.dist-info}/METADATA +2 -2
- faster_eth_abi-5.2.9.dist-info/RECORD +44 -0
- faster_eth_abi-5.2.9.dist-info/top_level.txt +2 -0
- c42f5c78bc058f310136__mypyc.cp39-win32.pyd +0 -0
- faster_eth_abi-5.2.7.dist-info/RECORD +0 -42
- faster_eth_abi-5.2.7.dist-info/top_level.txt +0 -3
- {faster_eth_abi-5.2.7.dist-info → faster_eth_abi-5.2.9.dist-info}/WHEEL +0 -0
- {faster_eth_abi-5.2.7.dist-info → faster_eth_abi-5.2.9.dist-info}/licenses/LICENSE +0 -0
|
Binary file
|
|
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
|
|
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
|
faster_eth_abi/decoding.py
CHANGED
|
@@ -2,16 +2,25 @@ import abc
|
|
|
2
2
|
import decimal
|
|
3
3
|
from typing import (
|
|
4
4
|
Any,
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
176
|
+
decoder_fn = self.decoder_fn
|
|
177
|
+
if decoder_fn is None:
|
|
177
178
|
raise AssertionError("`decoder_fn` is None")
|
|
178
|
-
value =
|
|
179
|
+
value = decoder_fn(data)
|
|
179
180
|
self.validate_padding_bytes(value, padding_bytes)
|
|
180
181
|
|
|
181
182
|
return value
|
|
182
183
|
|
|
183
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
-
|
|
259
|
-
raise AssertionError("`item_decoder` is None")
|
|
259
|
+
return decode_sized_array(self, stream)
|
|
260
260
|
|
|
261
|
-
|
|
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
|
-
|
|
271
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
294
|
+
if value_bit_size % 8 != 0:
|
|
302
295
|
raise ValueError(
|
|
303
|
-
"Invalid value bit size: {
|
|
296
|
+
f"Invalid value bit size: {value_bit_size}. Must be a multiple of 8"
|
|
304
297
|
)
|
|
305
298
|
|
|
306
|
-
if
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
405
|
-
|
|
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
|
-
|
|
435
|
+
frac_places = self.frac_places
|
|
436
|
+
if frac_places is None:
|
|
451
437
|
raise ValueError("must specify `frac_places`")
|
|
452
438
|
|
|
453
|
-
if
|
|
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
|
-
|
|
477
|
-
|
|
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
|
-
|
|
558
|
-
|
|
559
|
-
|
|
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)
|
faster_eth_abi/encoding.py
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
180
|
+
if value_bit_size % 8 != 0:
|
|
171
181
|
raise ValueError(
|
|
172
|
-
f"Invalid 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
250
|
+
if not type_check_fn(value):
|
|
240
251
|
self.invalidate_value(value)
|
|
241
252
|
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
348
|
+
frac_places = self.frac_places
|
|
349
|
+
if frac_places is None:
|
|
337
350
|
raise ValueError("must specify `frac_places`")
|
|
338
351
|
|
|
339
|
-
if
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: faster_eth_abi
|
|
3
|
-
Version: 5.2.
|
|
4
|
-
Summary: A
|
|
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.cp39-win32.pyd,sha256=2qFh6wRUTfkxXGrxFdJmc1Jf_sB5xjXWFpmZaN5SRMs,132096
|
|
2
|
+
faster_eth_abi/__init__.py,sha256=JpTfPTiusUGMmX8sEsGAxvILxFbvhh3MEyfiKOd5o9g,217
|
|
3
|
+
faster_eth_abi/_codec.cp39-win32.pyd,sha256=P6_2T_eQK_6P31h7-RUHbMpoZCHCtK_oEOofS4dC86I,9216
|
|
4
|
+
faster_eth_abi/_codec.py,sha256=fLRvqvrD8F38U4m1wZztvx-7JJbZaPikwXS5u9BzY14,2509
|
|
5
|
+
faster_eth_abi/_decoding.cp39-win32.pyd,sha256=Tz1r6ArB_mlAr43gSFr4kIJE2D4_U6v7PrbOJF99G0s,9216
|
|
6
|
+
faster_eth_abi/_decoding.py,sha256=GeXe2OaAmojlnGbw3CmSzKK9k5g0QLLn_Qesz7y98X0,3208
|
|
7
|
+
faster_eth_abi/_encoding.cp39-win32.pyd,sha256=9Zl45UTt4hI2tvZ1BBO89BuUmMHaTKgO1sAMwigFhFo,9216
|
|
8
|
+
faster_eth_abi/_encoding.py,sha256=157A_MltVLCEwBmD7SB8UaKXkAOtIKC5MVupk6dk_yA,3217
|
|
9
|
+
faster_eth_abi/abi.cp39-win32.pyd,sha256=F-Uj-AWws-axrYJG7MFadBmoYIxkddu6hD31OlZ72fE,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.cp39-win32.pyd,sha256=Vs4lRUsFruqGSXaMuUQWATr8l3f8Gl0Awt9beDASUCY,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.cp39-win32.pyd,sha256=3Qsr9l9RWpgjUWdaOzgWWLgI2qcBIENpNRStw4tEImc,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.cp39-win32.pyd,sha256=PTkkhUsQLZAnhbSmNKBXmAzOSkJbulOGkiyNR6xq9ZA,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__.cp39-win32.pyd,sha256=XBtCrL6vSbWODr5FxFgXSWeVvaJOIF0eQfUa8zyR-6M,9216
|
|
27
|
+
faster_eth_abi/tools/__init__.py,sha256=jxyQnb34ldRjCTYi3Ajb5h5QlFQ6ODfKQNhOCVwR7Ao,54
|
|
28
|
+
faster_eth_abi/tools/_strategies.cp39-win32.pyd,sha256=KnwLMZFRVUYhdfpJlDkS8lENXPmnTM7IYnE4GiMsVwU,9216
|
|
29
|
+
faster_eth_abi/tools/_strategies.py,sha256=HCFdQFLa84SMf7Deui2-szTH34hxTfc0Rog_kmpTg_w,6197
|
|
30
|
+
faster_eth_abi/utils/__init__.cp39-win32.pyd,sha256=H9veWQxcZq3huX9mblBv7G_aPSjIvh5UnG9d6xhz3iM,9216
|
|
31
|
+
faster_eth_abi/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
|
+
faster_eth_abi/utils/numeric.cp39-win32.pyd,sha256=T4ooVuVr-j8iOJTscQcwD6Q8fSpTBiCXV6OM5-bESCU,9216
|
|
33
|
+
faster_eth_abi/utils/numeric.py,sha256=hNGble1NA99_5hrAOnH0ZakCuHc6PFMC1p0olmpo_vM,2232
|
|
34
|
+
faster_eth_abi/utils/padding.cp39-win32.pyd,sha256=ainMo4XJ0VTvoFCwIq_7rM8VE9Dl3UEYzJyY4tutlvw,9216
|
|
35
|
+
faster_eth_abi/utils/padding.py,sha256=k6dkOiQ3k0OhQUZ6blCiL1VOQVYGyynucafbySjcFfY,515
|
|
36
|
+
faster_eth_abi/utils/string.cp39-win32.pyd,sha256=ga0HAcL-8Y3-A5yW14v62qPJ9EkliWsyBUUJCBBW0IE,9216
|
|
37
|
+
faster_eth_abi/utils/string.py,sha256=wYcvWof4kuitrGGSe_NOduQaxE4HHYmpraCPXKcZxMs,455
|
|
38
|
+
faster_eth_abi/utils/validation.cp39-win32.pyd,sha256=IjZUyIgUj1uBqNXXrSbfRuPOD8ytx1hJhqqgTitxg_s,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=Q3uEVTFw-CqGed7ywmQZcdvBC5FiRV941NvAhTjjkOQ,95
|
|
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,,
|
|
Binary file
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
c42f5c78bc058f310136__mypyc.cp39-win32.pyd,sha256=dGkkFLmQDG-OUv0w9hLq-2gfF1AP3m1wyz3KXv4MZjM,124416
|
|
2
|
-
faster_eth_abi/__init__.py,sha256=JpTfPTiusUGMmX8sEsGAxvILxFbvhh3MEyfiKOd5o9g,217
|
|
3
|
-
faster_eth_abi/_codec.cp39-win32.pyd,sha256=zedYv-eaCQNFZn--zT5htlxTT9gkx5Al9pfFCW1-zCs,9216
|
|
4
|
-
faster_eth_abi/_codec.py,sha256=mEjPRDPbpT67gc3HlzM8xAQ7uDOLwVRqQq5-dbwXZ1g,2543
|
|
5
|
-
faster_eth_abi/_encoding.cp39-win32.pyd,sha256=nKqPkf1mieOBHfEdEYZFMNl1v6nk5ofXVSGTx7I1KjA,9216
|
|
6
|
-
faster_eth_abi/_encoding.py,sha256=157A_MltVLCEwBmD7SB8UaKXkAOtIKC5MVupk6dk_yA,3217
|
|
7
|
-
faster_eth_abi/abi.cp39-win32.pyd,sha256=XpIUJ1isVAJ-lm-GpTE3F8BDfMG6E3BeR_-4irDhGrY,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.cp39-win32.pyd,sha256=zSTgH64MURVUl1RBE6Ko2EJ37fkKrjQnSNjkDQ1OwtM,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.cp39-win32.pyd,sha256=WW8EZbrNffdR8-zBA6IAysRavzkHqOEBCIpjw-baFk4,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.cp39-win32.pyd,sha256=mrI6fUQXhDjfqJO3Mb4ErDDtHeJX55OISmlapXIU6Ow,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__.cp39-win32.pyd,sha256=oCQgksbTFDUBe539fVLM1sZtiP05V3hdmNOMCp01bhc,9216
|
|
25
|
-
faster_eth_abi/tools/__init__.py,sha256=jxyQnb34ldRjCTYi3Ajb5h5QlFQ6ODfKQNhOCVwR7Ao,54
|
|
26
|
-
faster_eth_abi/tools/_strategies.cp39-win32.pyd,sha256=riTK3y5-ig-y8M7E4k8g0teFVaKh274R2dUDI5TChGQ,9216
|
|
27
|
-
faster_eth_abi/tools/_strategies.py,sha256=HCFdQFLa84SMf7Deui2-szTH34hxTfc0Rog_kmpTg_w,6197
|
|
28
|
-
faster_eth_abi/utils/__init__.cp39-win32.pyd,sha256=m1uN1IWDplA__vV2ESf8uvxwq2OOxWVSIanea7urrNU,9216
|
|
29
|
-
faster_eth_abi/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
-
faster_eth_abi/utils/numeric.cp39-win32.pyd,sha256=IhDhPk5mfsB6Kj9-VjyqnvspjMSo7nfuf_VBRrhwbag,9216
|
|
31
|
-
faster_eth_abi/utils/numeric.py,sha256=hNGble1NA99_5hrAOnH0ZakCuHc6PFMC1p0olmpo_vM,2232
|
|
32
|
-
faster_eth_abi/utils/padding.cp39-win32.pyd,sha256=YCEkCtfV8J7uSO2LpTGgcGSOAuonADD31HAh5JHNdmY,9216
|
|
33
|
-
faster_eth_abi/utils/padding.py,sha256=k6dkOiQ3k0OhQUZ6blCiL1VOQVYGyynucafbySjcFfY,515
|
|
34
|
-
faster_eth_abi/utils/string.cp39-win32.pyd,sha256=wliyGl-YAFKOQnFHHoqYsHq8k-ZHh1MlrSsl8cBnWuU,9216
|
|
35
|
-
faster_eth_abi/utils/string.py,sha256=wYcvWof4kuitrGGSe_NOduQaxE4HHYmpraCPXKcZxMs,455
|
|
36
|
-
faster_eth_abi/utils/validation.cp39-win32.pyd,sha256=nYYuVmzODOsAtXpiyjkszTfI_jOneaqVK8ntNN4xj7c,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=Q3uEVTFw-CqGed7ywmQZcdvBC5FiRV941NvAhTjjkOQ,95
|
|
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,,
|
|
File without changes
|
|
File without changes
|