From b394964b8bff0e9fbd523fffd5b5e57a04f0539d Mon Sep 17 00:00:00 2001 From: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> Date: Thu, 12 Jun 2025 13:59:43 +0100 Subject: [PATCH 1/3] refactor: add validator registration value --- .../transactions/builder/validator_registration_builder.py | 5 +++++ crypto/transactions/deserializer.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/crypto/transactions/builder/validator_registration_builder.py b/crypto/transactions/builder/validator_registration_builder.py index 30a409b..ee80f1c 100644 --- a/crypto/transactions/builder/validator_registration_builder.py +++ b/crypto/transactions/builder/validator_registration_builder.py @@ -13,5 +13,10 @@ def validator_public_key(self, validator_public_key: str): self.transaction.refresh_payload_data() return self + def value(self, value: int): + self.transaction.data['value'] = int(value) + self.transaction.refresh_payload_data() + return self + def get_transaction_instance(self, data: dict): return ValidatorRegistration(data) diff --git a/crypto/transactions/deserializer.py b/crypto/transactions/deserializer.py index 5675930..17f34e8 100644 --- a/crypto/transactions/deserializer.py +++ b/crypto/transactions/deserializer.py @@ -81,7 +81,7 @@ def __guess_transaction_from_data(self, data: dict) -> AbstractTransaction: if function_name == AbiFunction.MULTIPAYMENT.value: return Multipayment(data) - if data['value'] != '0': + if data['data'] == '': return Transfer(data) consensus_payload_data = self.decode_payload(data) From fe23ca00efa2637e485b3e95fe25c6cdd9af72b2 Mon Sep 17 00:00:00 2001 From: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> Date: Thu, 12 Jun 2025 13:59:50 +0100 Subject: [PATCH 2/3] test --- .../fixtures/transactions/validator-registration.json | 10 +++++----- .../builder/test_validator_registration_builder.py | 2 ++ tests/transactions/test_deserializer.py | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/fixtures/transactions/validator-registration.json b/tests/fixtures/transactions/validator-registration.json index 0b36a41..77f6155 100644 --- a/tests/fixtures/transactions/validator-registration.json +++ b/tests/fixtures/transactions/validator-registration.json @@ -5,14 +5,14 @@ "gasPrice": 5000000000, "gas": 200000, "to": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1", - "value": "0", + "value": "250000000000000000000", "data": "602a9eee0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003030954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c062400000000000000000000000000000000", "v": 28, - "r": "57216346b5252f6db63a2c78b5bc0a3697d2247377e9d9ef1b67849a87eb2413", - "s": "66ea02477fc19671b3b626e3c4d33939a8ba43004f0a56e900efc1e580739d11", + "r": "94cc05fc2abfdf0d84b5aa8a0d7ecfc7e07076e137d97781725daa568cda3b72", + "s": "6fde8095be44340cc34f12d192cec63289c0eba759e3df25b6e89c05786588cd", "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d", "from": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd", - "hash": "5064b50091b8e5d50ec1d1eb7c5b71cdcf9c7355bba18ee0efeaeacb0b1c95d5" + "hash": "a3a35d0fe9429b43833b4f4b8ec90cc56f431d68e24d10602967d9eab68caf6b" }, - "serialized": "02f8ef822710018085012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b884602a9eee0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003030954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c062400000000000000000000000000000000c001a057216346b5252f6db63a2c78b5bc0a3697d2247377e9d9ef1b67849a87eb2413a066ea02477fc19671b3b626e3c4d33939a8ba43004f0a56e900efc1e580739d11" + "serialized": "02f8f8822710018085012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e1890d8d726b7177a80000b884602a9eee0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003030954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c062400000000000000000000000000000000c001a094cc05fc2abfdf0d84b5aa8a0d7ecfc7e07076e137d97781725daa568cda3b72a06fde8095be44340cc34f12d192cec63289c0eba759e3df25b6e89c05786588cd" } diff --git a/tests/transactions/builder/test_validator_registration_builder.py b/tests/transactions/builder/test_validator_registration_builder.py index 7784b77..b7d545b 100644 --- a/tests/transactions/builder/test_validator_registration_builder.py +++ b/tests/transactions/builder/test_validator_registration_builder.py @@ -10,6 +10,7 @@ def test_validator_registration_transaction(passphrase, validator_public_key, lo .nonce(fixture['data']['nonce']) .network(fixture['data']['network']) .gas(fixture['data']['gas']) + .value(fixture['data']['value']) .validator_public_key(validator_public_key) .to(fixture['data']['to']) .sign(passphrase) @@ -40,6 +41,7 @@ def test_validator_registration_transaction_with_default_to(passphrase, validato .nonce(fixture['data']['nonce']) .network(fixture['data']['network']) .gas(fixture['data']['gas']) + .value(fixture['data']['value']) .validator_public_key(validator_public_key) .sign(passphrase) ) diff --git a/tests/transactions/test_deserializer.py b/tests/transactions/test_deserializer.py index 20b56e2..cd72c2a 100644 --- a/tests/transactions/test_deserializer.py +++ b/tests/transactions/test_deserializer.py @@ -40,9 +40,10 @@ def test_deserialize_unvote(load_transaction_fixture): def test_deserialize_validator_registration(load_transaction_fixture): fixture = load_transaction_fixture('transactions/validator-registration') - transaction = assert_deserialized(fixture, ['hash', 'nonce', 'gasPrice', 'gas', 'v', 'r', 's']) + transaction = assert_deserialized(fixture, ['hash', 'nonce', 'gasPrice', 'gas', 'value', 'v', 'r', 's']) assert isinstance(transaction, ValidatorRegistration) + assert transaction.data['value'] == '250000000000000000000' def test_deserialize_validator_resignation(load_transaction_fixture): fixture = load_transaction_fixture('transactions/validator-resignation') From 8c2334dcf604ca31e110975161ce24d67cfecf5e Mon Sep 17 00:00:00 2001 From: Alex Barnsley <8069294+alexbarnsley@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:53:30 +0100 Subject: [PATCH 3/3] move check for transfer in deserializer guess type --- crypto/transactions/deserializer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto/transactions/deserializer.py b/crypto/transactions/deserializer.py index 17f34e8..f5bfa57 100644 --- a/crypto/transactions/deserializer.py +++ b/crypto/transactions/deserializer.py @@ -81,9 +81,6 @@ def __guess_transaction_from_data(self, data: dict) -> AbstractTransaction: if function_name == AbiFunction.MULTIPAYMENT.value: return Multipayment(data) - if data['data'] == '': - return Transfer(data) - consensus_payload_data = self.decode_payload(data) if consensus_payload_data is not None: function_name = consensus_payload_data.get('functionName') @@ -108,6 +105,9 @@ def __guess_transaction_from_data(self, data: dict) -> AbstractTransaction: if function_name == AbiFunction.USERNAME_RESIGNATION.value: return UsernameResignation(data) + if data['value'] != '0': + return Transfer(data) + return EvmCall(data) @staticmethod