@@ -76,6 +76,7 @@ def __init__(
76
76
self .revert_reason_available : bool = self ._check_revert_reason_available ()
77
77
if not self .revert_reason_available :
78
78
print (f"RPC { self .node_url } does not return revert reasons" )
79
+ self .overwrites_available : bool = self ._check_overwrites_available ()
79
80
80
81
self .middleware_onion .inject (BatchRetryMiddleware , layer = 0 , name = "batch_retry" ) # split and retry batch requests
81
82
@@ -142,3 +143,26 @@ def _check_revert_reason_available(self):
142
143
if not isinstance (e , ContractLogicError ):
143
144
return False
144
145
return e .message == "execution reverted: abc"
146
+
147
+ def _check_overwrites_available (self ) -> bool :
148
+ with files ("IceCreamSwapWeb3" ).joinpath ("./abi/OverwriteTester.abi" ).open ('r' ) as f :
149
+ overwrite_tester_abi = f .read ()
150
+ with files ("IceCreamSwapWeb3" ).joinpath ("./bytecode/OverwriteTesterRuntime.bytecode" ).open ('r' ) as f :
151
+ overwrite_tester_bytecode = f .read ()
152
+
153
+ test_address = to_checksum_address ("0x1234567800000000000000000000000000000001" )
154
+ test_value = 1234
155
+ overwrite_tester_contract = self .eth .contract (abi = overwrite_tester_abi , address = test_address )
156
+ try :
157
+ response = overwrite_tester_contract .functions .getSlot0 ().call (state_override = {
158
+ test_address : {
159
+ "code" : overwrite_tester_bytecode ,
160
+ "stateDiff" : {
161
+ "0x" + "00" * 32 : "0x" + hex (test_value )[2 :].rjust (64 , "0" )
162
+ }
163
+ }
164
+ })
165
+ except Exception as e :
166
+ print (f"RPC does not support state overwrites, got: { repr (e )} " )
167
+ return False
168
+ return response == test_value
0 commit comments