diff --git a/.github/workflows/check-btcli-tests.yml b/.github/workflows/check-btcli-tests.yml index f49102f..f8f2176 100644 --- a/.github/workflows/check-btcli-tests.yml +++ b/.github/workflows/check-btcli-tests.yml @@ -13,6 +13,7 @@ on: branches: - main - staging + - master types: [opened, synchronize, reopened, labeled, unlabeled] env: diff --git a/.github/workflows/check-sdk-tests.yml b/.github/workflows/check-sdk-tests.yml index cd1832d..cc8c839 100644 --- a/.github/workflows/check-sdk-tests.yml +++ b/.github/workflows/check-sdk-tests.yml @@ -13,6 +13,7 @@ on: branches: - main - staging + - master types: [opened, synchronize, reopened, labeled, unlabeled] workflow_dispatch: diff --git a/CHANGELOG.md b/CHANGELOG.md index 57433b2..a157b62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ # Changelog + +## 1.5.14 /2025-12-04 +* Update: Adds support for custom extrinsic `DecryptionFailed` by @ibraheem-abe in https://github.com/opentensor/async-substrate-interface/pull/247 + +**Full Changelog**: https://github.com/opentensor/async-substrate-interface/compare/v1.5.13...v1.5.14 + ## 1.5.13 /2025-12-01 * Update `Checkout PR branch in async-substrate-interface` step by @basfroman in https://github.com/opentensor/async-substrate-interface/pull/240 * No continual reconnection without cause by @thewhaleking in https://github.com/opentensor/async-substrate-interface/pull/241 diff --git a/async_substrate_interface/async_substrate.py b/async_substrate_interface/async_substrate.py index a654c1b..dae91e5 100644 --- a/async_substrate_interface/async_substrate.py +++ b/async_substrate_interface/async_substrate.py @@ -297,7 +297,8 @@ async def process_events(self): and event["event"]["event_id"] == "ExtrinsicFailed" ) or ( event["event"]["module_id"] == "MevShield" - and event["event"]["event_id"] == "DecryptedRejected" + and event["event"]["event_id"] + in ("DecryptedRejected", "DecryptionFailed") ): possible_success = False self.__is_success = False @@ -308,13 +309,23 @@ async def process_events(self): 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 event["event"]["event_id"] == "DecryptedRejected": + 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"] + else: + self.__error_message = { + "type": "MevShield", + "name": "DecryptionFailed", + "docs": event["event"]["attributes"]["reason"], + } + continue if "Module" in dispatch_error: if isinstance(dispatch_error["Module"], tuple): diff --git a/async_substrate_interface/sync_substrate.py b/async_substrate_interface/sync_substrate.py index e6a2e3b..8ddd90b 100644 --- a/async_substrate_interface/sync_substrate.py +++ b/async_substrate_interface/sync_substrate.py @@ -258,7 +258,8 @@ def process_events(self): and event["event"]["event_id"] == "ExtrinsicFailed" ) or ( event["event"]["module_id"] == "MevShield" - and event["event"]["event_id"] == "DecryptedRejected" + and event["event"]["event_id"] + in ("DecryptedRejected", "DecryptionFailed") ): possible_success = False self.__is_success = False @@ -269,13 +270,23 @@ def process_events(self): 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 event["event"]["event_id"] == "DecryptedRejected": + 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"] + else: + self.__error_message = { + "type": "MevShield", + "name": "DecryptionFailed", + "docs": event["event"]["attributes"]["reason"], + } + continue if "Module" in dispatch_error: if isinstance(dispatch_error["Module"], tuple): diff --git a/async_substrate_interface/types.py b/async_substrate_interface/types.py index a627132..b9fbfae 100644 --- a/async_substrate_interface/types.py +++ b/async_substrate_interface/types.py @@ -1127,7 +1127,7 @@ def _get_metadata_storage_functions(self, runtime: Runtime) -> list[dict[str, An self.serialize_storage_item( storage_item=storage, module=module, - spec_version_id=self.runtime.runtime_version, + spec_version_id=runtime.runtime_version, runtime=runtime, ) ) diff --git a/pyproject.toml b/pyproject.toml index a060d67..d260931 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "async-substrate-interface" -version = "1.5.13" +version = "1.5.14" description = "Asyncio library for interacting with substrate. Mostly API-compatible with py-substrate-interface" readme = "README.md" license = { file = "LICENSE" }