Skip to content

Support out-of-order (future-nonce) transaction submission - #227

Open
Storm1289 wants to merge 27 commits into
hyperledger:mainfrom
Storm1289:feat/out-of-order-nonce-parking
Open

Support out-of-order (future-nonce) transaction submission#227
Storm1289 wants to merge 27 commits into
hyperledger:mainfrom
Storm1289:feat/out-of-order-nonce-parking

Conversation

@Storm1289

@Storm1289 Storm1289 commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #52.

Adds support for out-of-order (future-nonce) transaction submission by introducing a per-sender nonce parking layer.

Ethereum clients commonly submit multiple transactions back-to-back with sequential nonces, expecting the network to process them in order. Previously, the gateway immediately enqueued any transaction that passed validation, causing future-nonce transactions to fail downstream. This PR parks future-nonce transactions until earlier nonces commit, then releases them in nonce order.

Changes

gateway/core/nonce_parking.go (new)

Introduces a per-sender nonceGate responsible for ordering transaction admission.

  • Admit

    • Reads the sender's committed nonce.
    • Immediately admits in-order transactions to the worker queue.
    • Parks future-nonce transactions by nonce.
  • Released

    • Invoked after block commit.
    • Re-reads the sender's committed nonce.
    • Releases the next eligible parked transaction.

Guardrails included:

  • Per-sender parked transaction limit.
  • TTL-based eviction for orphaned nonce gaps to prevent memory leaks.

gateway/core/api.go

  • SendTransaction now admits transactions through the nonce gate.
  • Handle releases parked transactions after block commit.
  • TransactionByHash reports parked transactions as pending.

gateway/core/nonce_parking_test.go (new)

Adds dedicated unit tests covering the nonce parking layer.

Scope

This PR intentionally supports one in-flight transaction per sender, releasing the next transaction only after the previous one commits.

This matches the scope of #52.

Higher-throughput same-sender pipelining and dependency-aware scheduling remain out of scope and are expected to build on top of this work in #59. This parking layer sits in front of that scheduling rather than replacing it.

Tests

gateway/core/nonce_parking_test.go adds 10 unit tests covering:

  • In-order admission
  • Future-nonce parking
  • Release on commit
  • One-per-commit chaining
  • Multiple independent senders
  • Per-sender parked transaction limit
  • Duplicate nonce handling
  • TTL eviction
  • Stale transaction removal during release
  • State lookup error propagation

All tests pass with -race, and the full gateway/core test suite remains green.

Test plan

  • go test -race ./gateway/core/...
  • CI Quick Tests
  • CI Integration Tests

Storm1289 and others added 2 commits July 9, 2026 21:24
- add per-sender nonceGate: admit in-order txs, park future nonces
- release parked txs in nonce order on commit (one per sender in flight)
- guard with per-sender cap and TTL gap-eviction
- report parked txs as pending in eth_getTransactionByHash

Signed-off-by: Storm1289 <divakarsharm2934@gmail.com>
@Storm1289 Storm1289 changed the title feat(gateway): park future-nonce txs until earlier nonces commit ## Support out-of-order (future-nonce) transaction submission Jul 10, 2026
@Storm1289 Storm1289 changed the title ## Support out-of-order (future-nonce) transaction submission Support out-of-order (future-nonce) transaction submission Jul 10, 2026
@Storm1289
Storm1289 marked this pull request as ready for review July 10, 2026 09:05
@Storm1289

Copy link
Copy Markdown
Contributor Author

Hi @ale-linux, whenever you have some time after reviewing #219, could you please take a look at this one as well?

Signed-off-by: Storm <divakarsharma2934@gmail.com>
@arner

arner commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Hi @Storm1289 , make checks is failing, can you take a look please?

- drop unreachable code after Admit that failed go vet (make checks)
- reject duplicates (queued or parked) before admitting through the gate
- initialize nonceGate in the SendTransaction duplicate test

Signed-off-by: Storm1289 <divakarsharm2934@gmail.com>
@Storm1289

Copy link
Copy Markdown
Contributor Author

Hi @Storm1289 , make checks is failing, can you take a look please?

fixed, please check again.

@codecov

codecov Bot commented Jul 21, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 31.24%. Comparing base (97e5b3f) to head (f76114b).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #227      +/-   ##
==========================================
+ Coverage   30.45%   31.24%   +0.79%     
==========================================
  Files          80       81       +1     
  Lines       11287    11363      +76     
==========================================
+ Hits         3437     3550     +113     
+ Misses       7548     7509      -39     
- Partials      302      304       +2     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Storm1289 and others added 9 commits July 22, 2026 12:53
- cover Admit sender-recover error, Released nonce-lookup error, and
  releaseSender no-op (nonce_parking.go now 100%)
- add gateway-level tests: New wires the gate, future-nonce parking via
  SendTransaction/TransactionByHash, Handle release path

Signed-off-by: Storm1289 <divakarsharm2934@gmail.com>
- add a queue stub whose Handle fails, covering Handle's error branch
- exercise New's workerCount and queue defaults

Signed-off-by: Storm1289 <divakarsharm2934@gmail.com>
@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown

✅ OZ Hardhat Compatibility — 84.4% passing (5144/6094)

No regressions, no stale entries.

Full breakdown — 5144 passed, 949 failed, 1 skipped (6094 total, 84.4% passing)

By suite

  • access: 355/578 passing (61%)
  • crosschain: 12/15 passing (80%)
  • finance: 8/16 passing (50%)
  • governance: 214/522 passing (41%)
  • metatx: 13/23 passing (57%)
  • proxy: 257/280 passing (92%)
  • token: 1732/1852 passing (94%)
  • utils: 2553/2807 passing (91%)

Expected failures by cause (943)

  • execution reverted: 231
  • max-code-size: 212
  • fixed-timestamp: 68
  • gas-stub: 36
  • hardhat_setBalance: 29
  • Expected transaction to be reverted with custom error 'AccessManagerNotScheduled', but it reverted with custom error 'AccessManagerUnauthorizedAccount': 27
  • eth_signTypedData_v4: 23
  • execution reverted: arithmetic underflow or overflow: 22
  • fixed-block-number: 17
  • insufficient-funds: 14
  • Expected transaction to be reverted without a reason, but it didn't revert: 9
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 1000004 to equal 1786613939.: 8
  • Expected transaction to be reverted: 6
  • eth_getProof: 6
  • expected 10000000 to be at most 30000.: 6
  • Expected transaction to be reverted with custom error 'ERC3009InvalidAuthorizationTime', but it didn't revert: 4
  • Expected transaction to be reverted with custom error 'FailedCall', but it reverted with custom error 'TimelockUnexpectedOperationState': 4
  • Expected transaction to be reverted with custom error 'InvalidAccountNonce', but it reverted with custom error 'ERC3009InvalidAuthorizationTime': 4
  • expected 0 to equal 864000.: 4
  • expected 1000180 to equal 1786614087.: 4
  • Error in "RoleGranted" event: Error in the 4th argument assertion: expected 1000000 to equal 1786613916.: 3
  • expected false to be true: 3
  • hardhat_setStorageAt: 3
  • transaction already pending: 3
  • Error in "RoleGranted" event: Error in the 4th argument assertion: expected 1000000 to equal 1787823516.: 2
  • Error in "RoleGranted" event: Error in the 4th argument assertion: expected 1345600 to equal 1786959516.: 2
  • Expected transaction to be reverted with custom error 'AccessManagerNotScheduled', but it reverted with a different custom error: 2
  • Expected transaction to be reverted with custom error 'FailedCall', but it didn't revert: 2
  • Expected transaction to be reverted with custom error 'GovernorInsufficientProposerVotes', but it reverted with panic code 0x11 (Arithmetic operation overflowed outside of an unchecked block): 2
  • Expected transaction to be reverted with custom error 'GovernorInvalidVoteParams', but it reverted with custom error 'GovernorUnexpectedProposalState': 2
  • Expected transaction to be reverted with custom error 'GovernorInvalidVoteType', but it reverted with custom error 'GovernorUnexpectedProposalState': 2
  • Expected transaction to be reverted with panic code 0x31 (.pop() was called on an empty array), but it reverted with a custom error: 2
  • expected 0 to equal 1.: 2
  • expected 0 to equal 10.: 2
  • expected 0 to equal 1666666666666666666.: 2
  • expected 0 to equal 25000000000000000000.: 2
  • expected 1000000 to equal 1786613907.: 2
  • expected 1086400 to equal 1786700339.: 2
  • expected 1345600 to equal 1786959516.: 2
  • expected 1787477908 to equal 1787477907.: 2
  • expected 518400 to equal 172800.: 2
  • expected Result(2) [ 10000n, 0n ] to deeply equal [ 0n, 10000n ]: 2
  • expected Result(2) [ 17n, 9983n ] to deeply equal [ 15n, 9985n ]: 2
  • expected Result(2) [ 42n, 9958n ] to deeply equal [ 40n, 9960n ]: 2
  • expected Result(2) [ 5000n, 5000n ] to deeply equal [ 0n, 10000n ]: 2
  • Clock mismatch in blockNumber mode: expected 0 to equal 1535.: 1
  • Clock mismatch in blockNumber mode: expected 0 to equal 1674.: 1
  • Clock mismatch in timestamp mode: expected 1000000 to equal 1786613933.: 1
  • Error in "GovernorInsufficientProposerVotes" custom error: Error in the 2nd argument assertion: expected 0 to equal 10000000000000000000.: 1
  • Error in "GovernorUnexpectedProposalState" custom error: Error in the 2nd argument assertion: expected 0 to equal 3.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 1000004 to equal 1786613937.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1540.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1575.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1576.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1577.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1578.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1579.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1580.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1581.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1582.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1679.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1714.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1715.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1716.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1717.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1718.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1719.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1720.: 1
  • Error in "ProposalCreated" event: Error in the 7th argument assertion: expected 4 to equal 1721.: 1
  • Error in "Transfer" event: Error in the 3rd argument assertion: expected 0 to equal 1666666666666666666.: 1
  • Error in "Transfer" event: Error in the 3rd argument assertion: expected 0 to equal 25000000000000000000.: 1
  • Expected the ether balance of 0x0E801D84Fa97b50751Dbf25036d067dCf18858bF (the 1st address in the list) to change by -1666666666666666666 wei, but it changed by 0 wei
    Expected the ether balance of 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (the 2nd address in the list) to change by 1666666666666666666 wei, but it changed by 0 wei: 1
  • Expected the ether balance of 0x4c5859f0F772848b2D91F1D83E2Fe57935348029 (the 1st address in the list) to change by -25000000000000000000 wei, but it changed by 0 wei
    Expected the ether balance of 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (the 2nd address in the list) to change by 25000000000000000000 wei, but it changed by 0 wei: 1
  • Expected transaction NOT to be reverted: 1
  • Expected transaction to be reverted with custom error 'AccessManagerUnauthorizedCall', but it didn't revert: 1
  • Expected transaction to be reverted with custom error 'ERC2771ForwarderExpiredRequest', but it didn't revert: 1
  • Expected transaction to be reverted with custom error 'GovernorExceedRemainingWeight', but it reverted with custom error 'GovernorUnexpectedProposalState': 1
  • Expected transaction to be reverted with custom error 'GovernorUnableToCancel', but it didn't revert: 1
  • Expected transaction to be reverted with custom error 'TimelockUnexecutedPredecessor', but it reverted with custom error 'TimelockUnexpectedOperationState': 1
  • Expected transaction to be reverted with panic code 0x01 (Assertion error), but it reverted with a custom error: 1
  • Invalid block number 20 is not larger than current block number 1544: 1
  • Invalid block number 20 is not larger than current block number 1556: 1
  • Invalid block number 20 is not larger than current block number 1683: 1
  • Invalid block number 20 is not larger than current block number 1695: 1
  • Invalid block number 4 is not larger than current block number 1537: 1
  • Invalid block number 4 is not larger than current block number 1542: 1
  • Invalid block number 4 is not larger than current block number 1543: 1
  • Invalid block number 4 is not larger than current block number 1545: 1
  • Invalid block number 4 is not larger than current block number 1548: 1
  • Invalid block number 4 is not larger than current block number 1549: 1
  • Invalid block number 4 is not larger than current block number 1550: 1
  • Invalid block number 4 is not larger than current block number 1551: 1
  • Invalid block number 4 is not larger than current block number 1552: 1
  • Invalid block number 4 is not larger than current block number 1553: 1
  • Invalid block number 4 is not larger than current block number 1554: 1
  • Invalid block number 4 is not larger than current block number 1555: 1
  • Invalid block number 4 is not larger than current block number 1557: 1
  • Invalid block number 4 is not larger than current block number 1558: 1
  • Invalid block number 4 is not larger than current block number 1560: 1
  • Invalid block number 4 is not larger than current block number 1561: 1
  • Invalid block number 4 is not larger than current block number 1562: 1
  • Invalid block number 4 is not larger than current block number 1563: 1
  • Invalid block number 4 is not larger than current block number 1568: 1
  • Invalid block number 4 is not larger than current block number 1569: 1
  • Invalid block number 4 is not larger than current block number 1570: 1
  • Invalid block number 4 is not larger than current block number 1579: 1
  • Invalid block number 4 is not larger than current block number 1580: 1
  • Invalid block number 4 is not larger than current block number 1581: 1
  • Invalid block number 4 is not larger than current block number 1582: 1
  • Invalid block number 4 is not larger than current block number 1676: 1
  • Invalid block number 4 is not larger than current block number 1681: 1
  • Invalid block number 4 is not larger than current block number 1682: 1
  • Invalid block number 4 is not larger than current block number 1684: 1
  • Invalid block number 4 is not larger than current block number 1687: 1
  • Invalid block number 4 is not larger than current block number 1688: 1
  • Invalid block number 4 is not larger than current block number 1689: 1
  • Invalid block number 4 is not larger than current block number 1690: 1
  • Invalid block number 4 is not larger than current block number 1691: 1
  • Invalid block number 4 is not larger than current block number 1692: 1
  • Invalid block number 4 is not larger than current block number 1693: 1
  • Invalid block number 4 is not larger than current block number 1694: 1
  • Invalid block number 4 is not larger than current block number 1696: 1
  • Invalid block number 4 is not larger than current block number 1697: 1
  • Invalid block number 4 is not larger than current block number 1699: 1
  • Invalid block number 4 is not larger than current block number 1700: 1
  • Invalid block number 4 is not larger than current block number 1701: 1
  • Invalid block number 4 is not larger than current block number 1702: 1
  • Invalid block number 4 is not larger than current block number 1707: 1
  • Invalid block number 4 is not larger than current block number 1708: 1
  • Invalid block number 4 is not larger than current block number 1709: 1
  • Invalid block number 4 is not larger than current block number 1718: 1
  • Invalid block number 4 is not larger than current block number 1719: 1
  • Invalid block number 4 is not larger than current block number 1720: 1
  • Invalid block number 4 is not larger than current block number 1721: 1
  • Invalid block number 4 is not larger than current block number 1805: 1
  • Invalid block number 4 is not larger than current block number 1806: 1
  • Invalid block number 4 is not larger than current block number 1807: 1
  • Invalid block number 4 is not larger than current block number 1808: 1
  • Invalid block number 4 is not larger than current block number 1809: 1
  • Invalid block number 4 is not larger than current block number 1810: 1
  • Invalid block number 4 is not larger than current block number 1811: 1
  • Invalid block number 4 is not larger than current block number 1812: 1
  • Invalid block number 4 is not larger than current block number 1847: 1
  • Invalid block number 4 is not larger than current block number 1877: 1
  • Invalid block number 4 is not larger than current block number 1879: 1
  • Invalid block number 4 is not larger than current block number 1944: 1
  • Invalid block number 4 is not larger than current block number 1946: 1
  • Invalid block number 4 is not larger than current block number 2003: 1
  • Invalid block number 4 is not larger than current block number 2067: 1
  • Invalid block number 4 is not larger than current block number 2068: 1
  • Invalid block number 4 is not larger than current block number 2069: 1
  • Invalid block number 4 is not larger than current block number 2070: 1
  • Invalid block number 4 is not larger than current block number 2129: 1
  • Invalid block number 4 is not larger than current block number 2130: 1
  • Invalid block number 4 is not larger than current block number 2131: 1
  • Invalid block number 4 is not larger than current block number 2132: 1
  • Invalid block number 4 is not larger than current block number 2133: 1
  • Invalid block number 4 is not larger than current block number 2134: 1
  • Invalid block number 4 is not larger than current block number 2135: 1
  • Invalid block number 4 is not larger than current block number 2136: 1
  • Invalid block number 4 is not larger than current block number 2137: 1
  • Invalid block number 4 is not larger than current block number 2138: 1
  • Invalid block number 4 is not larger than current block number 2141: 1
  • Invalid block number 4 is not larger than current block number 2143: 1
  • Invalid block number 4 is not larger than current block number 2148: 1
  • Invalid block number 4 is not larger than current block number 2214: 1
  • Invalid block number 4 is not larger than current block number 2215: 1
  • Invalid block number 4 is not larger than current block number 2216: 1
  • Invalid block number 4 is not larger than current block number 2217: 1
  • Invalid block number 4 is not larger than current block number 2248: 1
  • Invalid block number 4 is not larger than current block number 2249: 1
  • Invalid block number 4 is not larger than current block number 2278: 1
  • Invalid block number 4 is not larger than current block number 2279: 1
  • Invalid block number 5 is not larger than current block number 1567: 1
  • Invalid block number 5 is not larger than current block number 1706: 1
  • execution reverted: ERC20Votes: block not yet mined: 1
  • expected '0xfde817c5e42bd3eaefa7f3450a22d7efcc5…' to equal '0xa52b7419d8cdc4e1f4fa7df7a0f38d779f8…': 1
  • expected 0 to equal 36000.: 1
  • expected 0 to equal 950400.: 1
  • expected 1000004 to equal 1786613948.: 1
  • expected 1259200 to equal 1786873119.: 1
  • expected 1787477908 to equal 0.: 1
  • expected 36000 to equal 4919.: 1
  • expected 4 to equal 1949.: 1
  • expected 4919 to equal 0.: 1
  • expected 9941 to equal 9958.: 1
  • expected 9998000000000000000000 to equal 9998000000000000000010.: 1
  • expected Result(2) [ 10000n, 0n ] to deeply equal [ 9953n, 47n ]: 1
  • expected Result(2) [ 10000n, 10000n ] to deeply equal [ 9962n, 10038n ]: 1
  • expected Result(2) [ 10n, 9990n ] to deeply equal [ 0n, 10000n ]: 1
  • expected Result(2) [ 42n, 9958n ] to deeply equal [ 0n, 10000n ]: 1
  • expected [ 10716, 10715 ] to have a length of 1 but got 2: 1
  • expected [ EventLog{ …(13) }, …(2) ] to have a length of 2 but got 3: 1
  • expected [ false, '0' ] to deeply equal [ true, '0' ]: 1
  • failed to revert Store to block 10465: snapshot for block 10465 not found: 1
  • nonce too low: next nonce 843, tx nonce 842: 1
  • out of gas: 1
  • transaction 0x997e9cf0296d4a99841433813dc064c14eda6246f23230257a0a9099e7c4ed11 was dropped before it committed: 1
  • transaction execution reverted (action="sendTransaction", data=null, reason=null, invocation=null, revert=null, transaction={ "data": "", "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "to": "0x2B8F5e69C35c1Aff4CCc71458CA26c2F313c3ed3" }, receipt={ "_type": "TransactionReceipt", "blobGasPrice": null, "blobGasUsed": null, "blockHash": "0x4048824aa745d3badaf583edf7f86939bfeec675dd434d24da75dd7de4760d7c", "blockNumber": 10706, "contractAddress": "0x0000000000000000000000000000000000000000", "cumulativeGasUsed": "0", "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "gasPrice": "0", "gasUsed": "0", "hash": "0xe8b1907e5a37242800ce4167c482e356b710c71eb2cf291e714a544433f2a786", "index": 0, "logs": [ ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "root": "0x", "status": 0, "to": "0x2B8F5e69C35c1Aff4CCc71458CA26c2F313c3ed3" }, code=CALL_EXCEPTION, version=6.16.0): 1
  • transaction execution reverted (action="sendTransaction", data=null, reason=null, invocation=null, revert=null, transaction={ "data": "", "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "to": "0x2B8F5e69C35c1Aff4CCc71458CA26c2F313c3ed3" }, receipt={ "_type": "TransactionReceipt", "blobGasPrice": null, "blobGasUsed": null, "blockHash": "0xe7c8cc0d41cc47fd1542a380c158f5969977fb87025a725399302ce9f6eba286", "blockNumber": 10751, "contractAddress": "0x0000000000000000000000000000000000000000", "cumulativeGasUsed": "0", "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "gasPrice": "0", "gasUsed": "0", "hash": "0x2364ddde2d7c37eb63ef234f6c542df96aa3cdd2c7db9d5ee38b809f4666cb0a", "index": 0, "logs": [ ], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "root": "0x", "status": 0, "to": "0x2B8F5e69C35c1Aff4CCc71458CA26c2F313c3ed3" }, code=CALL_EXCEPTION, version=6.16.0): 1

@Storm1289

Copy link
Copy Markdown
Contributor Author

Hi @ale-linux, please review this pr whenever you have sometime.

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.

Support Out-of-Order Transaction Submission

2 participants