1
1
import pytest
2
2
3
+ from web3 ._utils .contract_sources .contract_data ._custom_contract_data import (
4
+ EMITTER_ENUM ,
5
+ )
6
+
3
7
4
8
def test_contract_get_available_events (
5
9
emitter ,
6
10
):
7
11
"""We can iterate over available contract events"""
8
12
contract = emitter
9
13
events = list (contract .events )
10
- assert len (events ) == 19
14
+ assert len (events ) == len ( EMITTER_ENUM )
11
15
12
16
13
17
def test_contract_get_logs_all (
@@ -87,6 +91,81 @@ def test_contract_get_logs_argument_filter(
87
91
assert len (partial_logs ) == 4
88
92
89
93
94
+ def test_get_logs_argument_filters_indexed_and_non_indexed_args (emitter ):
95
+ emitter .functions .logIndexedAndNotIndexedArgs (
96
+ f"0xdead{ '00' * 17 } 01" , # indexed address
97
+ 101 , # indexed uint256
98
+ f"0xBEEf{ '00' * 17 } 01" , # non-indexed address
99
+ 201 , # non-indexed uint256
100
+ "This is the FIRST string arg." , # non-indexed string
101
+ ).transact ()
102
+ emitter .functions .logIndexedAndNotIndexedArgs (
103
+ f"0xdEaD{ '00' * 17 } 02" ,
104
+ 102 ,
105
+ f"0xbeeF{ '00' * 17 } 02" ,
106
+ 202 ,
107
+ "This is the SECOND string arg." ,
108
+ ).transact ()
109
+
110
+ # get all logs
111
+ logs_no_filter = emitter .events .LogIndexedAndNotIndexed .get_logs (fromBlock = 1 )
112
+ assert len (logs_no_filter ) == 2
113
+
114
+ # filter for the second log by each of the indexed args and compare
115
+ logs_filter_indexed_address = emitter .events .LogIndexedAndNotIndexed .get_logs (
116
+ fromBlock = 1 ,
117
+ argument_filters = {"indexedAddress" : f"0xdEaD{ '00' * 17 } 02" },
118
+ )
119
+ logs_filter_indexed_uint256 = emitter .events .LogIndexedAndNotIndexed .get_logs (
120
+ fromBlock = 1 ,
121
+ argument_filters = {"indexedUint256" : 102 },
122
+ )
123
+ assert len (logs_filter_indexed_address ) == len (logs_filter_indexed_uint256 ) == 1
124
+ assert (
125
+ logs_filter_indexed_address [0 ]
126
+ == logs_filter_indexed_uint256 [0 ]
127
+ == logs_no_filter [1 ]
128
+ )
129
+
130
+ # filter for the first log by non-indexed address
131
+ logs_filter_non_indexed_address = emitter .events .LogIndexedAndNotIndexed .get_logs (
132
+ fromBlock = 1 ,
133
+ argument_filters = {"nonIndexedAddress" : f"0xBEEf{ '00' * 17 } 01" },
134
+ )
135
+ assert len (logs_filter_non_indexed_address ) == 1
136
+ assert logs_filter_non_indexed_address [0 ] == logs_no_filter [0 ]
137
+
138
+ # filter for the second log by non-indexed uint256 and string separately
139
+ logs_filter_non_indexed_uint256 = emitter .events .LogIndexedAndNotIndexed .get_logs (
140
+ fromBlock = 1 ,
141
+ argument_filters = {"nonIndexedUint256" : 202 },
142
+ )
143
+ logs_filter_non_indexed_string = emitter .events .LogIndexedAndNotIndexed .get_logs (
144
+ fromBlock = 1 ,
145
+ argument_filters = {"nonIndexedString" : "SECOND" },
146
+ )
147
+ assert len (logs_filter_non_indexed_uint256 ) == 1
148
+ assert len (logs_filter_non_indexed_string ) == 1
149
+ assert (
150
+ logs_filter_non_indexed_uint256 [0 ]
151
+ == logs_filter_non_indexed_string [0 ]
152
+ == logs_no_filter [1 ]
153
+ )
154
+
155
+ # filter by both string and uint256, non-indexed
156
+ logs_filter_non_indexed_uint256_and_string = (
157
+ emitter .events .LogIndexedAndNotIndexed .get_logs (
158
+ fromBlock = 1 ,
159
+ argument_filters = {
160
+ "nonIndexedUint256" : 201 ,
161
+ "nonIndexedString" : "FIRST" ,
162
+ },
163
+ )
164
+ )
165
+ assert len (logs_filter_non_indexed_uint256_and_string ) == 1
166
+ assert logs_filter_non_indexed_uint256_and_string [0 ] == logs_no_filter [0 ]
167
+
168
+
90
169
# --- async --- #
91
170
92
171
@@ -96,7 +175,7 @@ def test_async_contract_get_available_events(
96
175
"""We can iterate over available contract events"""
97
176
contract = async_emitter
98
177
events = list (contract .events )
99
- assert len (events ) == 19
178
+ assert len (events ) == len ( EMITTER_ENUM )
100
179
101
180
102
181
@pytest .mark .asyncio
@@ -195,3 +274,93 @@ async def test_async_contract_get_logs_argument_filter(
195
274
argument_filters = {"arg0" : 1 },
196
275
)
197
276
assert len (partial_logs ) == 4
277
+
278
+
279
+ @pytest .mark .asyncio
280
+ async def test_async_get_logs_argument_filters_indexed_and_non_indexed_args (
281
+ async_emitter ,
282
+ ):
283
+ await async_emitter .functions .logIndexedAndNotIndexedArgs (
284
+ f"0xdead{ '00' * 17 } 01" , # indexed address
285
+ 101 , # indexed uint256
286
+ f"0xBEEf{ '00' * 17 } 01" , # non-indexed address
287
+ 201 , # non-indexed uint256
288
+ "This is the FIRST string arg." , # non-indexed string
289
+ ).transact ()
290
+ await async_emitter .functions .logIndexedAndNotIndexedArgs (
291
+ f"0xdEaD{ '00' * 17 } 02" ,
292
+ 102 ,
293
+ f"0xbeeF{ '00' * 17 } 02" ,
294
+ 202 ,
295
+ "This is the SECOND string arg." ,
296
+ ).transact ()
297
+
298
+ # get all logs
299
+ logs_no_filter = await async_emitter .events .LogIndexedAndNotIndexed .get_logs (
300
+ fromBlock = 1
301
+ )
302
+ assert len (logs_no_filter ) == 2
303
+
304
+ # filter for the second log by each of the indexed args and compare
305
+ logs_filter_indexed_address = (
306
+ await async_emitter .events .LogIndexedAndNotIndexed .get_logs (
307
+ fromBlock = 1 ,
308
+ argument_filters = {"indexedAddress" : f"0xdEaD{ '00' * 17 } 02" },
309
+ )
310
+ )
311
+ logs_filter_indexed_uint256 = (
312
+ await async_emitter .events .LogIndexedAndNotIndexed .get_logs (
313
+ fromBlock = 1 ,
314
+ argument_filters = {"indexedUint256" : 102 },
315
+ )
316
+ )
317
+ assert len (logs_filter_indexed_address ) == len (logs_filter_indexed_uint256 ) == 1
318
+ assert (
319
+ logs_filter_indexed_address [0 ]
320
+ == logs_filter_indexed_uint256 [0 ]
321
+ == logs_no_filter [1 ]
322
+ )
323
+
324
+ # filter for the first log by non-indexed address
325
+ logs_filter_non_indexed_address = (
326
+ await async_emitter .events .LogIndexedAndNotIndexed .get_logs (
327
+ fromBlock = 1 ,
328
+ argument_filters = {"nonIndexedAddress" : f"0xBEEf{ '00' * 17 } 01" },
329
+ )
330
+ )
331
+ assert len (logs_filter_non_indexed_address ) == 1
332
+ assert logs_filter_non_indexed_address [0 ] == logs_no_filter [0 ]
333
+
334
+ # filter for the second log by non-indexed uint256 and string separately
335
+ logs_filter_non_indexed_uint256 = (
336
+ await async_emitter .events .LogIndexedAndNotIndexed .get_logs (
337
+ fromBlock = 1 ,
338
+ argument_filters = {"nonIndexedUint256" : 202 },
339
+ )
340
+ )
341
+ logs_filter_non_indexed_string = (
342
+ await async_emitter .events .LogIndexedAndNotIndexed .get_logs (
343
+ fromBlock = 1 ,
344
+ argument_filters = {"nonIndexedString" : "SECOND" },
345
+ )
346
+ )
347
+ assert len (logs_filter_non_indexed_uint256 ) == 1
348
+ assert len (logs_filter_non_indexed_string ) == 1
349
+ assert (
350
+ logs_filter_non_indexed_uint256 [0 ]
351
+ == logs_filter_non_indexed_string [0 ]
352
+ == logs_no_filter [1 ]
353
+ )
354
+
355
+ # filter by both string and uint256, non-indexed
356
+ logs_filter_non_indexed_uint256_and_string = (
357
+ await async_emitter .events .LogIndexedAndNotIndexed .get_logs (
358
+ fromBlock = 1 ,
359
+ argument_filters = {
360
+ "nonIndexedUint256" : 201 ,
361
+ "nonIndexedString" : "FIRST" ,
362
+ },
363
+ )
364
+ )
365
+ assert len (logs_filter_non_indexed_uint256_and_string ) == 1
366
+ assert logs_filter_non_indexed_uint256_and_string [0 ] == logs_no_filter [0 ]
0 commit comments