diff --git a/src/dipdup/codegen/substrate.py b/src/dipdup/codegen/substrate.py index dbf28a6ab..3509c0dd7 100644 --- a/src/dipdup/codegen/substrate.py +++ b/src/dipdup/codegen/substrate.py @@ -246,7 +246,7 @@ async def _generate_types(self, force: bool = False) -> None: name = event_name break else: - raise Exception(f'Event not found for {typeclass_dir.stem}') + continue # NOTE: Don't extract from typeclass path! XYK.Sell -> xyk_sell -> XykSellPayload; should be XYKSellPayload. typeclass_name = f'{snake_to_pascal(name)}Payload' diff --git a/src/dipdup/runtimes.py b/src/dipdup/runtimes.py index b77c1fcbc..deb2a7106 100644 --- a/src/dipdup/runtimes.py +++ b/src/dipdup/runtimes.py @@ -292,3 +292,17 @@ def extract_subsquid_payload(data: Any) -> Any: return kind return data + + +def extract_multilocation_payload(data: Any) -> Any: + if isinstance(data, list | tuple): + return tuple(extract_multilocation_payload(item) for item in data) + + if isinstance(data, dict): + + if len(data) == 1 and (key := next(iter(data.keys()))).startswith('X'): + return data[key] + + return {key: extract_multilocation_payload(value) for key, value in data.items()} + + return data diff --git a/tests/test_datasources/test_substrate.py b/tests/test_datasources/test_substrate.py index 1d6438540..d329972da 100644 --- a/tests/test_datasources/test_substrate.py +++ b/tests/test_datasources/test_substrate.py @@ -1,3 +1,4 @@ +from dipdup.runtimes import extract_multilocation_payload from dipdup.runtimes import extract_subsquid_payload path_1 = [ @@ -106,9 +107,33 @@ }, ) +extracted_path_1 = ( + ( + { + 'parents': 0, + 'interior': ( + {'PalletInstance': 50}, + {'GeneralIndex': '1337'}, + ), + }, + 84640, + ), + ( + { + 'parents': 1, + 'interior': 'Here', + }, + 122612710, + ), +) + def test_extract_subsquid_payload() -> None: assert extract_subsquid_payload(path_1) == processed_path_1 assert extract_subsquid_payload(path_2) == processed_path_2 assert extract_subsquid_payload(path_3) == processed_path_3 + + +def test_extract_multilocation_payload() -> None: + assert extract_multilocation_payload(processed_path_1) == extracted_path_1