From 11bfdf51c2e949ed51e56e042a75ec098b2ea8b9 Mon Sep 17 00:00:00 2001 From: ibraheem-latent Date: Thu, 27 Nov 2025 20:16:14 -0800 Subject: [PATCH 1/3] adds mev shield handling --- async_substrate_interface/async_substrate.py | 21 ++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/async_substrate_interface/async_substrate.py b/async_substrate_interface/async_substrate.py index af37530..5706660 100644 --- a/async_substrate_interface/async_substrate.py +++ b/async_substrate_interface/async_substrate.py @@ -280,8 +280,9 @@ async def process_events(self): event["event"]["module_id"] == "System" and event["event"]["event_id"] == "ExtrinsicSuccess" ): - self.__is_success = True - self.__error_message = None + if self.__error_message is None: + self.__is_success = True + self.__error_message = None if "dispatch_info" in event["event"]["attributes"]: self.__weight = event["event"]["attributes"]["dispatch_info"][ @@ -294,13 +295,21 @@ async def process_events(self): elif ( event["event"]["module_id"] == "System" and event["event"]["event_id"] == "ExtrinsicFailed" + ) or ( + event["event"]["module_id"] == "MevShield" + and event["event"]["event_id"] == "DecryptedRejected" ): self.__is_success = False - dispatch_info = event["event"]["attributes"]["dispatch_info"] - dispatch_error = event["event"]["attributes"]["dispatch_error"] - - self.__weight = dispatch_info["weight"] + if event["event"]["module_id"] == "System": + dispatch_info = event["event"]["attributes"]["dispatch_info"] + dispatch_error = event["event"]["attributes"]["dispatch_error"] + self.__weight = dispatch_info["weight"] + else: + # MEV shield extrinsics + dispatch_info = event["event"]["attributes"]["reason"]["post_info"] + dispatch_error = event["event"]["attributes"]["reason"]["error"] + self.__weight = event["event"]["attributes"]["reason"]["post_info"]["actual_weight"] if "Module" in dispatch_error: if isinstance(dispatch_error["Module"], tuple): From 8d816138808e443f7f620d5416aa9d95d59d3c5d Mon Sep 17 00:00:00 2001 From: bdhimes Date: Fri, 28 Nov 2025 12:32:00 +0200 Subject: [PATCH 2/3] Apply to sync, better handle possible success --- async_substrate_interface/async_substrate.py | 16 ++++++++---- async_substrate_interface/sync_substrate.py | 27 +++++++++++++++----- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/async_substrate_interface/async_substrate.py b/async_substrate_interface/async_substrate.py index 5706660..c9cdef2 100644 --- a/async_substrate_interface/async_substrate.py +++ b/async_substrate_interface/async_substrate.py @@ -274,15 +274,14 @@ async def process_events(self): has_transaction_fee_paid_event = True # Process other events + possible_success = False for event in await self.triggered_events: # Check events if ( event["event"]["module_id"] == "System" and event["event"]["event_id"] == "ExtrinsicSuccess" ): - if self.__error_message is None: - self.__is_success = True - self.__error_message = None + possible_success = True if "dispatch_info" in event["event"]["attributes"]: self.__weight = event["event"]["attributes"]["dispatch_info"][ @@ -299,6 +298,7 @@ async def process_events(self): event["event"]["module_id"] == "MevShield" and event["event"]["event_id"] == "DecryptedRejected" ): + possible_success = False self.__is_success = False if event["event"]["module_id"] == "System": @@ -307,9 +307,13 @@ async def process_events(self): self.__weight = dispatch_info["weight"] else: # MEV shield extrinsics - dispatch_info = event["event"]["attributes"]["reason"]["post_info"] + dispatch_info = event["event"]["attributes"]["reason"][ + "post_info" + ] dispatch_error = event["event"]["attributes"]["reason"]["error"] - self.__weight = event["event"]["attributes"]["reason"]["post_info"]["actual_weight"] + self.__weight = event["event"]["attributes"]["reason"][ + "post_info" + ]["actual_weight"] if "Module" in dispatch_error: if isinstance(dispatch_error["Module"], tuple): @@ -375,6 +379,8 @@ async def process_events(self): and event["event"]["event_id"] == "Deposit" ): self.__total_fee_amount += event.value["attributes"]["amount"] + if possible_success is True and self.__error_message is None: + self.__is_success = True @property async def is_success(self) -> bool: diff --git a/async_substrate_interface/sync_substrate.py b/async_substrate_interface/sync_substrate.py index c175c1f..ef1ec3b 100644 --- a/async_substrate_interface/sync_substrate.py +++ b/async_substrate_interface/sync_substrate.py @@ -235,14 +235,14 @@ def process_events(self): has_transaction_fee_paid_event = True # Process other events + possible_success = False for event in self.triggered_events: # Check events if ( event["event"]["module_id"] == "System" and event["event"]["event_id"] == "ExtrinsicSuccess" ): - self.__is_success = True - self.__error_message = None + possible_success = True if "dispatch_info" in event["event"]["attributes"]: self.__weight = event["event"]["attributes"]["dispatch_info"][ @@ -255,13 +255,26 @@ def process_events(self): elif ( event["event"]["module_id"] == "System" and event["event"]["event_id"] == "ExtrinsicFailed" + ) or ( + event["event"]["module_id"] == "MevShield" + and event["event"]["event_id"] == "DecryptedRejected" ): + possible_success = False self.__is_success = False - dispatch_info = event["event"]["attributes"]["dispatch_info"] - dispatch_error = event["event"]["attributes"]["dispatch_error"] - - self.__weight = dispatch_info["weight"] + if event["event"]["module_id"] == "System": + dispatch_info = event["event"]["attributes"]["dispatch_info"] + dispatch_error = event["event"]["attributes"]["dispatch_error"] + self.__weight = dispatch_info["weight"] + else: + # MEV shield extrinsics + dispatch_info = event["event"]["attributes"]["reason"][ + "post_info" + ] + dispatch_error = event["event"]["attributes"]["reason"]["error"] + self.__weight = event["event"]["attributes"]["reason"][ + "post_info" + ]["actual_weight"] if "Module" in dispatch_error: if isinstance(dispatch_error["Module"], tuple): @@ -319,6 +332,8 @@ def process_events(self): and event["event"]["event_id"] == "Deposit" ): self.__total_fee_amount += event.value["attributes"]["amount"] + if possible_success is True and self.__error_message is None: + self.__is_success = True @property def is_success(self) -> bool: From 199e26c518a0410d7dc54fe8f4cb756a28c32616 Mon Sep 17 00:00:00 2001 From: bdhimes Date: Fri, 28 Nov 2025 12:49:28 +0200 Subject: [PATCH 3/3] Added comment --- async_substrate_interface/async_substrate.py | 2 ++ async_substrate_interface/sync_substrate.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/async_substrate_interface/async_substrate.py b/async_substrate_interface/async_substrate.py index c9cdef2..cad2fae 100644 --- a/async_substrate_interface/async_substrate.py +++ b/async_substrate_interface/async_substrate.py @@ -380,6 +380,8 @@ async def process_events(self): ): self.__total_fee_amount += event.value["attributes"]["amount"] if possible_success is True and self.__error_message is None: + # we delay the positive setting of the __is_success flag until we have finished iteration of the + # events and have ensured nothing has set an error message self.__is_success = True @property diff --git a/async_substrate_interface/sync_substrate.py b/async_substrate_interface/sync_substrate.py index ef1ec3b..bd80d36 100644 --- a/async_substrate_interface/sync_substrate.py +++ b/async_substrate_interface/sync_substrate.py @@ -333,6 +333,8 @@ def process_events(self): ): self.__total_fee_amount += event.value["attributes"]["amount"] if possible_success is True and self.__error_message is None: + # we delay the positive setting of the __is_success flag until we have finished iteration of the + # events and have ensured nothing has set an error message self.__is_success = True @property