Skip to content

Create ChunkedTransaction class#73

Open
MonaaEid wants to merge 19 commits into
mainfrom
chore/2300-create-ChunkedTransaction
Open

Create ChunkedTransaction class#73
MonaaEid wants to merge 19 commits into
mainfrom
chore/2300-create-ChunkedTransaction

Conversation

@MonaaEid

Copy link
Copy Markdown
Owner

No description provided.

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

ChunkedTransaction is added as a shared base class for chunked transactions, and TopicMessageSubmitTransaction and FileAppendTransaction are updated to inherit from it. Unit and integration tests were added or adjusted for chunk validation, freezing, execution, and chunk-limit failures.

Changes

ChunkedTransaction base class and subclass migration

Layer / File(s) Summary
ChunkedTransaction contract and state
src/hiero_sdk_python/transaction/chunked_transaction.py
Defines ChunkedTransaction(Transaction, ABC) with chunking defaults, abstract hooks, fluent setters, validation, freeze and execution APIs, signing, and per-chunk body sizing.
TopicMessageSubmitTransaction migration
src/hiero_sdk_python/consensus/topic_message_submit_transaction.py
Switches to ChunkedTransaction, widens message handling to `bytes
FileAppendTransaction migration
src/hiero_sdk_python/file/file_append_transaction.py
Switches to ChunkedTransaction, simplifies constructor setup for file contents and chunk parameters, and removes local multi-chunk orchestration overrides.
ChunkedTransaction tests and integration updates
tests/unit/chunked_transaction_test.py, tests/integration/topic_message_submit_transaction_e2e_test.py
Adds unit coverage for ChunkedTransaction behavior and updates TopicMessageSubmitTransaction integration tests so chunk-limit failures are asserted during freeze_with.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 59.18% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive No description was provided, so the intent cannot be verified beyond the title and code summary. Add a brief description of the main change and any notable API or behavior changes.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main change: introducing a ChunkedTransaction class.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/2300-create-ChunkedTransaction

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/hiero_sdk_python/consensus/topic_message_submit_transaction.py (1)

179-182: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

BLOCKER: Guard _initial_transaction_id before writing chunkInfo.

File and line: src/hiero_sdk_python/consensus/topic_message_submit_transaction.py, Line 182
Proto field: ConsensusSubmitMessageTransactionBody.chunkInfo = 3, ConsensusMessageChunkInfo.initialTransactionID = 1
Issue type: Missing guard
Description: build_transaction_body() can reach _build_proto_body() for a multi-chunk message before freeze_with() initializes _initial_transaction_id, causing an AttributeError instead of a deterministic serialization error.
Suggested fix: raise a descriptive ValueError before dereferencing.

Proposed fix
         # Multi-chunk metadata
         if self._total_chunks > 1:
+            if self._initial_transaction_id is None:
+                raise ValueError(
+                    "Cannot build chunkInfo before freeze_with() initializes "
+                    "the initial transaction ID for a multi-chunk message."
+                )
             body.chunkInfo.CopyFrom(
                 consensus_submit_message_pb2.ConsensusMessageChunkInfo(
                     initialTransactionID=self._initial_transaction_id._to_proto(),

As per path instructions, _build_proto_body() must explicitly guard _initial_transaction_id is None before calling _to_proto() for multi-chunk topic messages.

Source: Path instructions


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7ada005e-13ec-4a18-b13a-49b9ad17b7d3

📥 Commits

Reviewing files that changed from the base of the PR and between ce16902 and 2e65854.

📒 Files selected for processing (3)
  • src/hiero_sdk_python/consensus/topic_message_submit_transaction.py
  • src/hiero_sdk_python/file/file_append_transaction.py
  • src/hiero_sdk_python/transaction/chunked_transaction.py

Comment thread src/hiero_sdk_python/consensus/topic_message_submit_transaction.py Outdated
Comment thread src/hiero_sdk_python/consensus/topic_message_submit_transaction.py Outdated
Comment on lines 28 to +33
self.contents: bytes | None = self._encode_contents(contents)
self.max_chunks: int = max_chunks if max_chunks is not None else 20
self.chunk_size: int = chunk_size if chunk_size is not None else 4096
self._default_transaction_fee = Hbar(5).to_tinybars()

# Internal tracking for chunking
self._current_chunk_index: int = 0
self._total_chunks: int = self._calculate_total_chunks()
self._transaction_ids: list[TransactionId] = []
self._signing_keys: list[PrivateKey] = [] # Use string annotation to avoid import issues
self._total_chunks = self._calculate_total_chunks()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cd src/hiero_sdk_python/file && find . -name "file_append_transaction.py" -type f

Repository: MonaaEid/hiero-sdk-python

Length of output: 192


🏁 Script executed:

cd src/hiero_sdk_python && head -250 file/file_append_transaction.py | cat -n

Repository: MonaaEid/hiero-sdk-python

Length of output: 9522


🏁 Script executed:

cd src/hiero_sdk_python && wc -l file/file_append_transaction.py

Repository: MonaaEid/hiero-sdk-python

Length of output: 199


🏁 Script executed:

cd src/hiero_sdk_python && sed -n '1,80p' file/file_append_transaction.py | cat -n

Repository: MonaaEid/hiero-sdk-python

Length of output: 3414


🏁 Script executed:

cd src/hiero_sdk_python && sed -n '130,160p' file/file_append_transaction.py | cat -n

Repository: MonaaEid/hiero-sdk-python

Length of output: 1511


🏁 Script executed:

cd src/hiero_sdk_python && sed -n '200,220p' file/file_append_transaction.py | cat -n

Repository: MonaaEid/hiero-sdk-python

Length of output: 1130


🏁 Script executed:

cd src/hiero_sdk_python && grep -n "_from_proto\|_to_proto\|_calculate_total_chunks" file/file_append_transaction.py

Repository: MonaaEid/hiero-sdk-python

Length of output: 806


Validate and enforce non-empty file append contents to prevent zero-chunk transactions.

Proto field: contents — field 4 in FileAppendTransactionBody. Issue type: Bytes not normalized / Chunking contract violation. The protobuf schema requires non-empty contents. However, empty bytes (b"") are not normalized to None, causing _calculate_total_chunks() to return 0 when contents is b"" instead of the expected minimum of 1. This can occur when:

  • Calling _from_proto() with proto.contents = b"" (protobuf default for bytes)
  • Passing empty string or bytes to constructor or set_contents()

The _build_proto_body() method then silently serializes an empty body instead of rejecting it, violating the chunking contract. Per coding guidelines, required proto fields must be validated client-side, and bytes fields modeled as bytes | None must normalize empty bytes to None.

Proposed fixes
  1. Line 207 (_from_proto()): Normalize empty bytes to None:
self.contents = proto.contents or None
  1. Lines 51-60 (_calculate_total_chunks()): Treat both None and empty bytes as requiring 1 chunk:
if not self.contents:
    return 1
return math.ceil(len(self.contents) / self.chunk_size)
  1. Lines 144-149 (_build_proto_body()): Reject empty contents instead of silent fallback:
if not self.contents:
    raise ValueError("Missing required non-empty contents")

start_index = self._current_chunk_index * self.chunk_size
end_index = min(start_index + self.chunk_size, len(self.contents))
chunk_contents = self.contents[start_index:end_index]

Also applies to: 51-60, 140-149, 206-208

🧰 Tools
🪛 GitHub Actions: Secondary PR Check - Hiero Solo Integration & Unit Tests / Unit Tests (Python 3.14)

[error] 31-31: NameError: name 'Hbar' is not defined. In FileAppendTransaction.init, _default_transaction_fee is set with Hbar(5).to_tinybars() causing all related tests to fail.

Source: Path instructions

Comment thread src/hiero_sdk_python/file/file_append_transaction.py Outdated
Comment thread src/hiero_sdk_python/transaction/chunked_transaction.py Outdated
Comment thread src/hiero_sdk_python/transaction/chunked_transaction.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/hiero_sdk_python/file/file_append_transaction.py (1)

216-227: 🎯 Functional Correctness | 🟡 Minor

_validate_chunking() override breaks the base-class return contract.

The base ChunkedTransaction._validate_chunking() is declared to return int and is assigned to required_chunks in freeze_with() (line 153). The FileAppendTransaction override is annotated -> None and returns nothing, causing a type contract violation. Although the current code path doesn't use the assigned variable (it calls self.get_required_chunks() directly in the loop), this is a latent bug that breaks the override contract. Add return self.get_required_chunks() to the override.

♻️ Add return statement to align with base contract
     def _validate_chunking(self) -> None:
+    def _validate_chunking(self) -> int:
         """
         Validates that the transaction doesn't exceed the maximum number of chunks.
 
         Raises:
             ValueError: If the transaction exceeds the maximum number of chunks.
         """
         if self.max_chunks and self.get_required_chunks() > self.max_chunks:
             raise ValueError(
                 f"Cannot execute FileAppendTransaction with more than {self.max_chunks} chunks. "
                 f"Required: {self.get_required_chunks()}"
             )
+        return self.get_required_chunks()

Source: Path instructions

src/hiero_sdk_python/consensus/topic_message_submit_transaction.py (1)

174-195: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

BLOCKER: Guard _initial_transaction_id before serializing a multi-chunk body.

When _total_chunks > 1, line 189 dereferences self._initial_transaction_id._to_proto(). ChunkedTransaction.freeze_with() is what populates _initial_transaction_id; if a caller invokes build_transaction_body() (or build_scheduled_body()) directly without freezing, _initial_transaction_id is None and this raises AttributeError at serialization time. Add an explicit None check with a descriptive ValueError.

🛡️ Proposed guard
         # Multi-chunk metadata
         if self._total_chunks > 1:
+            if self._initial_transaction_id is None:
+                raise ValueError(
+                    "initial_transaction_id is not set; call freeze_with() "
+                    "before building a multi-chunk transaction body."
+                )
             body.chunkInfo.CopyFrom(
                 consensus_submit_message_pb2.ConsensusMessageChunkInfo(
                     initialTransactionID=self._initial_transaction_id._to_proto(),
                     total=self._total_chunks,
                     number=self._current_chunk_index + 1,
                 )
             )

As per path instructions: "An explicit if self._initial_transaction_id is None guard with a descriptive ValueError MUST be present. Flag as BLOCKER."

Source: Path instructions

♻️ Duplicate comments (2)
src/hiero_sdk_python/file/file_append_transaction.py (2)

34-38: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Validate positive max_chunks / chunk_size in the constructor.

chunk_size=0 reaches _calculate_total_chunks() (Line 38) and raises ZeroDivisionError, while max_chunks=0 later disables the _validate_chunking() guard (if self.max_chunks). This was flagged on a prior commit and is still unaddressed.

Source: Path instructions


149-154: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Empty contents still serializes a zero-chunk body.

When self.contents is None/b"", _build_proto_body() silently emits empty contents and _calculate_total_chunks() returns 0, violating the chunking contract. Previously flagged and still unaddressed; normalize empty bytes to None and reject empty contents.

Source: Path instructions


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 63467aa1-bf58-4800-bf64-1da24e98af51

📥 Commits

Reviewing files that changed from the base of the PR and between 2e65854 and 818506b.

📒 Files selected for processing (3)
  • src/hiero_sdk_python/consensus/topic_message_submit_transaction.py
  • src/hiero_sdk_python/file/file_append_transaction.py
  • src/hiero_sdk_python/transaction/chunked_transaction.py

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/hiero_sdk_python/consensus/topic_message_submit_transaction.py (1)

197-200: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

BLOCKER: Guard _initial_transaction_id before serializing chunk metadata.

File and line: Line 200
Proto field: ConsensusSubmitMessageTransactionBody.chunkInfo = 3, ConsensusMessageChunkInfo.initialTransactionID = 1
Issue type: Missing field
Description: For multi-chunk submissions, the schema requires chunk metadata, including the initial transaction ID. If build_transaction_body() is called before freeze_with(), _initial_transaction_id can still be None, causing serialization to fail with AttributeError instead of an actionable error. (raw.githubusercontent.com)
Suggested fix:

Proposed fix
         # Multi-chunk metadata
         if self._total_chunks > 1:
+            if self._initial_transaction_id is None:
+                raise ValueError(
+                    "Cannot build a chunked topic message body before freeze_with() "
+                    "initializes the initial transaction ID."
+                )
             body.chunkInfo.CopyFrom(
                 consensus_submit_message_pb2.ConsensusMessageChunkInfo(
                     initialTransactionID=self._initial_transaction_id._to_proto(),

As per path instructions, _build_proto_body() must explicitly guard _initial_transaction_id is None for multi-chunk messages.

Source: Path instructions

♻️ Duplicate comments (1)
src/hiero_sdk_python/consensus/topic_message_submit_transaction.py (1)

48-48: 🗄️ Data Integrity & Integration | 🔴 Critical | ⚡ Quick win

BLOCKER: Normalize the stored HCS message to bytes.

File and line: Line 48
Proto field: ConsensusSubmitMessageTransactionBody.message = 2
Issue type: Wrong type
Description: The schema defines message as bytes, but the SDK attribute still allows storing str. Accepting str at the API boundary is fine, but the model field should be bytes | None to align with the proto field. (raw.githubusercontent.com)
Suggested fix:

Proposed fix
-        self.message: bytes | str | None = message
+        self.message: bytes | None = (
+            message.encode("utf-8") if isinstance(message, str) else message
+        )
@@
-        self.message = message
+        self.message = message.encode("utf-8") if isinstance(message, str) else message

As per path instructions, proto bytes fields must map to bytes | None or bytes, and consensus protobuf correctness is must-not-break.

Also applies to: 100-112

Source: Path instructions


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: cea53e29-97ab-40ca-8f30-b284a7378be9

📥 Commits

Reviewing files that changed from the base of the PR and between 818506b and d3d5626.

📒 Files selected for processing (1)
  • src/hiero_sdk_python/consensus/topic_message_submit_transaction.py

@MonaaEid
MonaaEid force-pushed the chore/2300-create-ChunkedTransaction branch from 9f06310 to dd22252 Compare June 25, 2026 17:46

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/hiero_sdk_python/file/file_append_transaction.py (1)

218-229: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Remove this override so shared chunk validation runs.

File and line: Line 218. Proto field: contents — field 4. Issue type: Bytes not normalized / chunking contract violation. FileAppendTransaction now inherits ChunkedTransaction, but this override shadows the base guard that rejects < 1 chunks and maintains _total_chunks; freeze_with() and execute_all() dispatch here, so empty append payloads can still bypass the centralized validation even though the schema requires non-empty contents. (raw.githubusercontent.com)

Proposed fix
-    def _validate_chunking(self) -> None:
-        """
-        Validates that the transaction doesn't exceed the maximum number of chunks.
-
-        Raises:
-            ValueError: If the transaction exceeds the maximum number of chunks.
-        """
-        if self.max_chunks and self.get_required_chunks() > self.max_chunks:
-            raise ValueError(
-                f"Cannot execute FileAppendTransaction with more than {self.max_chunks} chunks. "
-                f"Required: {self.get_required_chunks()}"
-            )

As per path instructions, “Validation bounds for max_chunks and chunk_size are strictly enforced” and serialization must map directly to Hedera protobufs.

Source: Path instructions


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 2d29f3ff-fffc-4531-acae-b4bdf23dea03

📥 Commits

Reviewing files that changed from the base of the PR and between d3d5626 and dd22252.

📒 Files selected for processing (1)
  • src/hiero_sdk_python/file/file_append_transaction.py

@MonaaEid
MonaaEid force-pushed the chore/2300-create-ChunkedTransaction branch from dd22252 to 26e5372 Compare June 25, 2026 21:38

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/hiero_sdk_python/consensus/topic_message_submit_transaction.py (1)

197-201: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

BLOCKER: Guard initialTransactionID before serializing chunk metadata.

File and line: src/hiero_sdk_python/consensus/topic_message_submit_transaction.py, Lines 197-201
Proto field: ConsensusMessageChunkInfo.initialTransactionID = 1
Issue type: Missing field
Description: Calling build_transaction_body() directly for a multi-chunk message can dereference None before freeze_with() initializes _initial_transaction_id, producing an AttributeError instead of a deterministic validation error. (raw.githubusercontent.com)
Suggested fix:

Proposed fix
         # Multi-chunk metadata
         if self._total_chunks > 1:
+            if self._initial_transaction_id is None:
+                raise ValueError(
+                    "Cannot build a multi-chunk TopicMessageSubmitTransaction before freeze_with(); "
+                    "initial transaction ID is missing."
+                )
             body.chunkInfo.CopyFrom(
                 consensus_submit_message_pb2.ConsensusMessageChunkInfo(
                     initialTransactionID=self._initial_transaction_id._to_proto(),

As per path instructions, _initial_transaction_id null-safety requires an explicit guard with a descriptive ValueError.

Source: Path instructions


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3c769826-af58-4220-ba1a-8cafb11c6703

📥 Commits

Reviewing files that changed from the base of the PR and between dd22252 and 26e5372.

📒 Files selected for processing (5)
  • src/hiero_sdk_python/consensus/topic_message_submit_transaction.py
  • src/hiero_sdk_python/file/file_append_transaction.py
  • src/hiero_sdk_python/transaction/chunked_transaction.py
  • tests/integration/topic_message_submit_transaction_e2e_test.py
  • tests/unit/chunked_transaction_test.py

Comment thread tests/integration/topic_message_submit_transaction_e2e_test.py Outdated
Comment on lines +77 to +91
def test_freeze_with_builds_chunk_transaction_ids(mock_client):
tx = DummyChunkedTransaction(required_chunks=3)
base_timestamp = timestamp_pb2.Timestamp(seconds=123, nanos=456)
tx.transaction_id = TransactionId(account_id=AccountId(0, 0, 1234), valid_start=base_timestamp)

tx.freeze_with(mock_client)

assert tx._total_chunks == 3
assert len(tx._transaction_ids) == 3
assert tx._initial_transaction_id == tx.transaction_id
assert tx._transaction_ids[0] == tx.transaction_id
assert tx._transaction_ids[1].valid_start.seconds == 123
assert tx._transaction_ids[1].valid_start.nanos == 457
assert tx._transaction_ids[2].valid_start.seconds == 123
assert tx._transaction_ids[2].valid_start.nanos == 458

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Add a rollover case for valid_start.nanos.

This only exercises the easy path (456 -> 457/458). The new chunking base also has a carry path when nanos crosses 1_000_000_000, and that boundary is exactly what can break chunk ordering on the wire. Please add a case starting near 999_999_999 and assert the later chunk increments seconds and wraps nanos. As per path instructions, unit tests should cover boundary conditions, and chunked message submission must carry seconds when nanos + num_chunks > 999_999_999.

Source: Path instructions

Comment thread tests/unit/chunked_transaction_test.py Outdated
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
@MonaaEid
MonaaEid force-pushed the chore/2300-create-ChunkedTransaction branch from 4d30b9c to 16e3540 Compare June 25, 2026 22:27
MonaaEid and others added 6 commits June 26, 2026 01:37
Signed-off-by: MontyPokemon <59332150+MonaaEid@users.noreply.github.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
@MonaaEid
MonaaEid force-pushed the chore/2300-create-ChunkedTransaction branch from 02d3111 to f8bd8cf Compare July 4, 2026 16:17
MonaaEid and others added 4 commits July 4, 2026 19:27
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
@MonaaEid
MonaaEid force-pushed the chore/2300-create-ChunkedTransaction branch from f0b39c6 to 34149b5 Compare July 6, 2026 20:41
MonaaEid and others added 6 commits July 6, 2026 23:44
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
Signed-off-by: MonaaEid <monaa_eid@hotmail.com>
@MonaaEid
MonaaEid force-pushed the chore/2300-create-ChunkedTransaction branch from cac35b2 to c6d2eba Compare July 14, 2026 16:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant