Skip to content

Commit d9ed7bf

Browse files
committed
feat: added method to get signable_node tx_body_bytes
Signed-off-by: Manish Dait <daitmanish88@gmail.com>
1 parent 9dd5458 commit d9ed7bf

2 files changed

Lines changed: 77 additions & 1 deletion

File tree

src/hiero_sdk_python/transaction/transaction.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import hashlib
4+
from dataclasses import dataclass
45
from typing import TYPE_CHECKING, Literal, overload
56

67
from hiero_sdk_python.account.account_id import AccountId
@@ -1142,3 +1143,34 @@ def high_volume(self) -> bool:
11421143
bool: True if high-volume throttles are enabled.
11431144
"""
11441145
return self._high_volume
1146+
1147+
def get_signable_node_body_bytes_list(self) -> list[SignableNodeTransactionBodyBytes]:
1148+
"""Returns a list of SignableNodeTransactionBodyBytes objects."""
1149+
self._require_frozen()
1150+
1151+
signable_node_transaction_body_bytes: list[SignableNodeTransactionBodyBytes] = []
1152+
1153+
for node_transaction_bodies in self._transaction_body_bytes.values():
1154+
for transaction_bytes in node_transaction_bodies.values():
1155+
try:
1156+
transaction_body = transaction_pb2.TransactionBody()
1157+
transaction_body.ParseFromString(transaction_bytes)
1158+
except Exception as e:
1159+
raise ValueError(f"Failed to parse transaction bytes: {e}") from e
1160+
1161+
signable_node_transaction_body_bytes.append(
1162+
SignableNodeTransactionBodyBytes(
1163+
node_id=AccountId._from_proto(transaction_body.nodeAccountID),
1164+
transaction_id=TransactionId._from_proto(transaction_body.transactionID),
1165+
transaction_bytes=transaction_body.SerializeToString(),
1166+
)
1167+
)
1168+
1169+
return signable_node_transaction_body_bytes
1170+
1171+
1172+
@dataclass
1173+
class SignableNodeTransactionBodyBytes:
1174+
node_id: AccountId | None = None
1175+
transaction_id: TransactionId | None = None
1176+
transaction_bytes: bytes | None = None

tests/unit/transaction_test.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from hiero_sdk_python.response_code import ResponseCode
2626
from hiero_sdk_python.tokens.token_id import TokenId
2727
from hiero_sdk_python.tokens.token_mint_transaction import TokenMintTransaction
28-
from hiero_sdk_python.transaction.transaction import Transaction
28+
from hiero_sdk_python.transaction.transaction import SignableNodeTransactionBodyBytes, Transaction
2929
from hiero_sdk_python.transaction.transaction_id import TransactionId
3030
from hiero_sdk_python.transaction.transaction_receipt import TransactionReceipt
3131
from hiero_sdk_python.transaction.transaction_response import TransactionResponse
@@ -730,3 +730,47 @@ def test_serialization_of_single_transaction():
730730
assert tx1.initial_balance == tx2.initial_balance
731731
assert tx2.node_account_id == node_account_id
732732
assert tx2.transaction_id == transaction_id
733+
734+
735+
def test_get_signable_node_bytes():
736+
"""Test that get signable node body bytes return the transaction body bytes lists."""
737+
key = PrivateKey.generate_ecdsa()
738+
transaction_id = TransactionId.generate(AccountId(0, 0, 5))
739+
node_account_ids = [AccountId(0, 0, 4), AccountId(0, 0, 3)]
740+
741+
tx = (
742+
AccountCreateTransaction()
743+
.set_key_without_alias(key)
744+
.set_initial_balance(1)
745+
.set_account_memo("test account")
746+
.set_node_account_ids(node_account_ids)
747+
.set_transaction_id(transaction_id)
748+
.freeze()
749+
)
750+
751+
signable_bytes = tx.get_signable_node_body_bytes_list()
752+
753+
assert signable_bytes is not None
754+
assert isinstance(signable_bytes, list)
755+
assert len(signable_bytes) == 2 # single tx_id for 2 node_ids
756+
for tx_bytes in signable_bytes:
757+
assert isinstance(tx_bytes, SignableNodeTransactionBodyBytes)
758+
759+
760+
def test_get_signable_node_bytes_raise_error_if_not_frozen():
761+
"""Test that get signable node body bytes rraise exception if the transaction not frozen."""
762+
key = PrivateKey.generate_ecdsa()
763+
transaction_id = TransactionId.generate(AccountId(0, 0, 5))
764+
node_account_ids = [AccountId(0, 0, 4), AccountId(0, 0, 3)]
765+
766+
tx = (
767+
AccountCreateTransaction()
768+
.set_key_without_alias(key)
769+
.set_initial_balance(1)
770+
.set_account_memo("test account")
771+
.set_node_account_ids(node_account_ids)
772+
.set_transaction_id(transaction_id)
773+
)
774+
775+
with pytest.raises(Exception, match="Transaction is not frozen"):
776+
tx.get_signable_node_body_bytes_list()

0 commit comments

Comments
 (0)