From 5af60dd722223602bdcb0aec5ea9be1f8f494e71 Mon Sep 17 00:00:00 2001 From: Gosuto Inzasheru Date: Wed, 28 Jan 2026 13:44:50 +0700 Subject: [PATCH] fix: preserve array suffix for tuple[] types in abi encoding --- .../tx_builder/tx_builder_file_decoder.py | 9 ++++++--- tests/test_tx_builder_file_decoder.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/safe_cli/tx_builder/tx_builder_file_decoder.py b/src/safe_cli/tx_builder/tx_builder_file_decoder.py index 51785ba0..ffcaaadb 100644 --- a/src/safe_cli/tx_builder/tx_builder_file_decoder.py +++ b/src/safe_cli/tx_builder/tx_builder_file_decoder.py @@ -17,13 +17,16 @@ def _parse_types_to_encoding_types(contract_fields: List[Dict[str, Any]]) -> Lis types = [] for field in contract_fields: - if is_tuple_field_type(field["type"]): + field_type = field["type"] + if is_tuple_field_type(field_type): component_types = ",".join( component["type"] for component in field["components"] ) - types.append(f"({component_types})") + # preserve array suffix (e.g., "[]" for tuple[], "[5]" for tuple[5]) + suffix = field_type[5:] # everything after "tuple" + types.append(f"({component_types}){suffix}") else: - types.append(field["type"]) + types.append(field_type) return types diff --git a/tests/test_tx_builder_file_decoder.py b/tests/test_tx_builder_file_decoder.py index 455e82e2..bd98f9b7 100644 --- a/tests/test_tx_builder_file_decoder.py +++ b/tests/test_tx_builder_file_decoder.py @@ -8,6 +8,7 @@ from safe_cli.tx_builder.tx_builder_file_decoder import ( SafeProposedTx, _get_base_field_type, + _parse_types_to_encoding_types, convert_to_proposed_transactions, encode_contract_method_to_hex_data, parse_array_of_values, @@ -78,6 +79,23 @@ def test_get_base_field_type(self): with self.assertRaises(SoliditySyntaxError): _get_base_field_type("") + def test_parse_types_to_encoding_types_tuple_array(self): + contract_fields = [ + { + "type": "tuple[]", + "name": "ops", + "components": [ + {"type": "uint8", "name": "kind"}, + {"type": "address", "name": "asset"}, + {"type": "uint256", "name": "amount"}, + {"type": "address", "name": "sender"}, + {"type": "address", "name": "recipient"}, + ], + } + ] + result = _parse_types_to_encoding_types(contract_fields) + self.assertEqual(result, ["(uint8,address,uint256,address,address)[]"]) + def test_parse_array_of_values(self): self.assertEqual(parse_array_of_values("[1,2,3]", "uint[]"), [1, 2, 3]) self.assertEqual(