|
29 | 29 | # Use TYPE_CHECKING to avoid circular import errors |
30 | 30 | if TYPE_CHECKING: |
31 | 31 | from hiero_sdk_python.channels import _Channel |
32 | | - from hiero_sdk_python.client import Client |
| 32 | + from hiero_sdk_python.client.client import Client |
33 | 33 | from hiero_sdk_python.crypto.private_key import PrivateKey |
34 | 34 | from hiero_sdk_python.executable import _Method |
35 | 35 | from hiero_sdk_python.transaction.transaction import TransactionReceipt |
@@ -286,40 +286,31 @@ def freeze_with(self, client: Client) -> FileAppendTransaction: |
286 | 286 | if self._transaction_body_bytes: |
287 | 287 | return self |
288 | 288 |
|
289 | | - if self.transaction_id is None: |
290 | | - self.transaction_id = client.generate_transaction_id() |
| 289 | + self._resolve_transaction_id(client) |
291 | 290 |
|
292 | 291 | # Generate transaction IDs for all chunks |
293 | | - self._transaction_ids = [] |
294 | | - base_timestamp = self.transaction_id.valid_start |
295 | | - |
296 | | - for i in range(self.get_required_chunks()): |
297 | | - if i == 0: |
298 | | - # First chunk uses the original transaction ID |
299 | | - chunk_transaction_id = self.transaction_id |
300 | | - else: |
301 | | - # Subsequent chunks get incremented timestamps |
302 | | - # Add i nanoseconds to space out chunks |
303 | | - chunk_valid_start = timestamp_pb2.Timestamp( |
304 | | - seconds=base_timestamp.seconds, nanos=base_timestamp.nanos + i |
305 | | - ) |
306 | | - chunk_transaction_id = TransactionId( |
307 | | - account_id=self.transaction_id.account_id, valid_start=chunk_valid_start |
308 | | - ) |
309 | | - self._transaction_ids.append(chunk_transaction_id) |
310 | | - |
311 | | - # We iterate through every node in the client's network |
312 | | - # For each node, set the node_account_id and build the transaction body |
313 | | - # This allows the transaction to be submitted to any node in the network |
314 | | - for node in client.network.nodes: |
315 | | - self.node_account_id = node._account_id |
316 | | - transaction_body = self.build_transaction_body() |
317 | | - self._transaction_body_bytes[node._account_id] = transaction_body.SerializeToString() |
318 | | - |
319 | | - # Set the node account id to the current node in the network |
320 | | - self.node_account_id = client.network.current_node._account_id |
| 292 | + if not self._transaction_ids: |
| 293 | + base_timestamp = self.transaction_id.valid_start |
321 | 294 |
|
322 | | - return self |
| 295 | + for i in range(self.get_required_chunks()): |
| 296 | + if i == 0: |
| 297 | + # First chunk uses the original transaction ID |
| 298 | + chunk_transaction_id = self.transaction_id |
| 299 | + else: |
| 300 | + # Subsequent chunks get incremented timestamps |
| 301 | + # Add i nanoseconds to space out chunks |
| 302 | + next_nanos = base_timestamp.nanos + i |
| 303 | + |
| 304 | + chunk_valid_start = timestamp_pb2.Timestamp( |
| 305 | + seconds=base_timestamp.seconds + next_nanos // 1_000_000_000, nanos=next_nanos % 1_000_000_000 |
| 306 | + ) |
| 307 | + chunk_transaction_id = TransactionId( |
| 308 | + account_id=self.transaction_id.account_id, valid_start=chunk_valid_start |
| 309 | + ) |
| 310 | + |
| 311 | + self._transaction_ids.append(chunk_transaction_id) |
| 312 | + |
| 313 | + return super().freeze_with(client) |
323 | 314 |
|
324 | 315 | @overload |
325 | 316 | def execute( |
@@ -458,3 +449,24 @@ def sign(self, private_key: PrivateKey) -> FileAppendTransaction: |
458 | 449 | # Call the parent sign method for the current transaction |
459 | 450 | super().sign(private_key) |
460 | 451 | return self |
| 452 | + |
| 453 | + @property |
| 454 | + def body_size_all_chunks(self) -> list[int]: |
| 455 | + """Returns an array of body sizes for transactions with multiple chunks.""" |
| 456 | + self._require_frozen() |
| 457 | + sizes = [] |
| 458 | + |
| 459 | + original_index = self._current_chunk_index |
| 460 | + original_transaction_id = self.transaction_id |
| 461 | + |
| 462 | + try: |
| 463 | + for i, transaction_id in enumerate(self._transaction_ids): |
| 464 | + self._current_chunk_index = i |
| 465 | + self.transaction_id = transaction_id |
| 466 | + |
| 467 | + sizes.append(self.body_size) |
| 468 | + finally: |
| 469 | + self._current_chunk_index = original_index |
| 470 | + self.transaction_id = original_transaction_id |
| 471 | + |
| 472 | + return sizes |
0 commit comments