From dcd243555e41ad7e2d6812bb9abc9fa52949393f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois?= Date: Mon, 18 Dec 2023 14:21:21 +0100 Subject: [PATCH] Fix Transaction serialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add address_type_id(address) Signed-off-by: Jean-François --- massa_test_framework/massa_py/operations.py | 27 ++++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/massa_test_framework/massa_py/operations.py b/massa_test_framework/massa_py/operations.py index c9481bf..a7993b4 100644 --- a/massa_test_framework/massa_py/operations.py +++ b/massa_test_framework/massa_py/operations.py @@ -30,6 +30,18 @@ def type_id(cls) -> int: return type_id +def address_type_id(address: str) -> int: + TYPE_ID = { + "U": 0, # User address + "S": 1, # Smart contract address + } + id_str = address[1] + type_id = TYPE_ID.get(id_str, -1) + if type_id == -1: + raise Exception(f"Unknown type {id_str}") + return type_id + + class InnerOp(Serializable, Typed): pass @@ -118,10 +130,9 @@ def __init__( self.amount = amount def serialize(self) -> bytes: - # varint.encode(0) forces user address - recipient_address = varint.encode(0) + base58.b58decode_check( - self.recipient_address[2:] - ) + recipient_address = varint.encode( + address_type_id(self.recipient_address) + ) + base58.b58decode_check(self.recipient_address[2:]) enc_amount = varint.encode(int(self.amount)) return bytes(recipient_address + enc_amount) @@ -162,11 +173,9 @@ def __init__( def serialize(self) -> bytes: enc_max_gas = varint.encode(int(self.max_gas)) enc_coins = varint.encode(int(self.coins)) - # TODO Add an Address class that serialize according to the type of address - # varint.encode(1) forces smart contract address - target_address = varint.encode(1) + base58.b58decode_check( - self.target_address[2:] - ) + target_address = varint.encode( + address_type_id(self.target_address) + ) + base58.b58decode_check(self.target_address[2:]) target_func = self.target_func.encode("utf-8") target_func_len_enc = varint.encode(len(target_func)) param_len_enc = varint.encode(len(self.param))