Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 89 additions & 80 deletions .gas-snapshot.runtime
Original file line number Diff line number Diff line change
@@ -1,80 +1,89 @@
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorAndProtocolFeeFill() (gas: 129374)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorFillAskFullyMatchesSingleBid() (gas: 103768)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorFillBidFullyMatchesSingleAsk() (gas: 103888)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorFillRestBidEmptyBook() (gas: 151809)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorRouteNetsRepeatedFeeToken() (gas: 122504)
RadixMatchingEngineFeeGasTest:testGas_CancelAskSkipsPathologicalBidTree() (gas: 39664)
RadixMatchingEngineFeeGasTest:testGas_CancelFilledBidClaim() (gas: 36750)
RadixMatchingEngineFeeGasTest:testGas_CancelFullDepthBidCombRightmost() (gas: 423078)
RadixMatchingEngineFeeGasTest:testGas_CancelMaxValidDepthAskCombRightmost() (gas: 424771)
RadixMatchingEngineFeeGasTest:testGas_CancelPartialBid() (gas: 48804)
RadixMatchingEngineFeeGasTest:testGas_CancelUnfilledAsk() (gas: 39881)
RadixMatchingEngineFeeGasTest:testGas_CancelUnfilledBid() (gas: 39717)
RadixMatchingEngineFeeGasTest:testGas_FillAskConsumesDirtySamePriceBidSubtree() (gas: 87846)
RadixMatchingEngineFeeGasTest:testGas_FillAskConsumesFullDepthBidComb() (gas: 352999)
RadixMatchingEngineFeeGasTest:testGas_FillAskFullyMatchesSingleBid() (gas: 78197)
RadixMatchingEngineFeeGasTest:testGas_FillAskPartiallyMatchesSingleBid() (gas: 97892)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesAskAndRestsRemainder() (gas: 130838)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesDirtySamePriceAskSubtree() (gas: 87970)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesMaxValidDepthAskComb() (gas: 324094)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesSamePriceAskSubtree() (gas: 77962)
RadixMatchingEngineFeeGasTest:testGas_FillBidFullyMatchesSingleAsk() (gas: 77862)
RadixMatchingEngineFeeGasTest:testGas_FillBidPartiallyMatchesSingleAsk() (gas: 97776)
RadixMatchingEngineFeeGasTest:testGas_FillRestAskEmptyBook() (gas: 150894)
RadixMatchingEngineFeeGasTest:testGas_FillRestBidEmptyBook() (gas: 152651)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookAskMatchesOneBid() (gas: 122101)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookBidMatchesOneAsk() (gas: 137302)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookPartialFillsAsk() (gas: 138440)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookPartialFillsBid() (gas: 123225)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookRestsAsk() (gas: 163968)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookRestsBid() (gas: 173286)
RadixMatchingEngineGasTest:testGas_CancelAskSkipsPathologicalBidTree() (gas: 39664)
RadixMatchingEngineGasTest:testGas_CancelFilledBidClaim() (gas: 36750)
RadixMatchingEngineGasTest:testGas_CancelFullDepthBidCombRightmost() (gas: 423078)
RadixMatchingEngineGasTest:testGas_CancelMaxValidDepthAskCombRightmost() (gas: 424751)
RadixMatchingEngineGasTest:testGas_CancelPartialBid() (gas: 48804)
RadixMatchingEngineGasTest:testGas_CancelUnfilledAsk() (gas: 39881)
RadixMatchingEngineGasTest:testGas_CancelUnfilledBid() (gas: 39717)
RadixMatchingEngineGasTest:testGas_FillAskConsumesDirtySamePriceBidSubtree() (gas: 87242)
RadixMatchingEngineGasTest:testGas_FillAskConsumesFullDepthBidComb() (gas: 327303)
RadixMatchingEngineGasTest:testGas_FillAskFullyMatchesSingleBid() (gas: 77593)
RadixMatchingEngineGasTest:testGas_FillAskPartiallyMatchesSingleBid() (gas: 97288)
RadixMatchingEngineGasTest:testGas_FillBidConsumesAskAndRestsRemainder() (gas: 130241)
RadixMatchingEngineGasTest:testGas_FillBidConsumesDirtySamePriceAskSubtree() (gas: 87376)
RadixMatchingEngineGasTest:testGas_FillBidConsumesMaxValidDepthAskComb() (gas: 323500)
RadixMatchingEngineGasTest:testGas_FillBidConsumesSamePriceAskSubtree() (gas: 77368)
RadixMatchingEngineGasTest:testGas_FillBidFullyMatchesSingleAsk() (gas: 77268)
RadixMatchingEngineGasTest:testGas_FillBidPartiallyMatchesSingleAsk() (gas: 97182)
RadixMatchingEngineGasTest:testGas_FillRestAskEmptyBook() (gas: 150668)
RadixMatchingEngineGasTest:testGas_FillRestBidEmptyBook() (gas: 152432)
RadixMatchingEngineGasTest:testGas_LargeRandomBookAskMatchesOneBid() (gas: 121497)
RadixMatchingEngineGasTest:testGas_LargeRandomBookBidMatchesOneAsk() (gas: 136708)
RadixMatchingEngineGasTest:testGas_LargeRandomBookPartialFillsAsk() (gas: 137846)
RadixMatchingEngineGasTest:testGas_LargeRandomBookPartialFillsBid() (gas: 122621)
RadixMatchingEngineGasTest:testGas_LargeRandomBookRestsAsk() (gas: 163742)
RadixMatchingEngineGasTest:testGas_LargeRandomBookRestsBid() (gas: 173067)
RadixMatchingEngineHookGasTest:testGas_CancelAskSkipsPathologicalBidTree() (gas: 43705)
RadixMatchingEngineHookGasTest:testGas_CancelFilledBidClaim() (gas: 37497)
RadixMatchingEngineHookGasTest:testGas_CancelFullDepthBidCombRightmost() (gas: 446433)
RadixMatchingEngineHookGasTest:testGas_CancelMaxValidDepthAskCombRightmost() (gas: 447267)
RadixMatchingEngineHookGasTest:testGas_CancelPartialBid() (gas: 53592)
RadixMatchingEngineHookGasTest:testGas_CancelUnfilledAsk() (gas: 43922)
RadixMatchingEngineHookGasTest:testGas_CancelUnfilledBid() (gas: 44505)
RadixMatchingEngineHookGasTest:testGas_FillAskConsumesDirtySamePriceBidSubtree() (gas: 95252)
RadixMatchingEngineHookGasTest:testGas_FillAskConsumesFullDepthBidComb() (gas: 414778)
RadixMatchingEngineHookGasTest:testGas_FillAskFullyMatchesSingleBid() (gas: 85769)
RadixMatchingEngineHookGasTest:testGas_FillAskPartiallyMatchesSingleBid() (gas: 105472)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesAskAndRestsRemainder() (gas: 139218)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesDirtySamePriceAskSubtree() (gas: 94243)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesMaxValidDepthAskComb() (gas: 410116)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesSamePriceAskSubtree() (gas: 93348)
RadixMatchingEngineHookGasTest:testGas_FillBidFullyMatchesSingleAsk() (gas: 84195)
RadixMatchingEngineHookGasTest:testGas_FillBidPartiallyMatchesSingleAsk() (gas: 104117)
RadixMatchingEngineHookGasTest:testGas_FillRestAskEmptyBook() (gas: 140357)
RadixMatchingEngineHookGasTest:testGas_FillRestBidEmptyBook() (gas: 142118)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookAskMatchesOneBid() (gas: 138973)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookBidMatchesOneAsk() (gas: 154786)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookPartialFillsAsk() (gas: 146871)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookPartialFillsBid() (gas: 133256)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookRestsAsk() (gas: 193723)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookRestsBid() (gas: 198650)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorAndProtocolFeeFill() (gas: 129218)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorFillAskFullyMatchesSingleBid() (gas: 103606)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorFillBidFullyMatchesSingleAsk() (gas: 103732)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorFillRestBidEmptyBook() (gas: 151866)
DeepstateV1IntegratorFeeGasTest:testGas_IntegratorRouteNetsRepeatedFeeToken() (gas: 120192)
RadixMatchingEngineFeeGasTest:testGas_CancelAskSkipsPathologicalBidTree() (gas: 39800)
RadixMatchingEngineFeeGasTest:testGas_CancelFilledBidClaim() (gas: 36860)
RadixMatchingEngineFeeGasTest:testGas_CancelFullDepthBidCombRightmost() (gas: 399374)
RadixMatchingEngineFeeGasTest:testGas_CancelMaxValidDepthAskCombRightmost() (gas: 399085)
RadixMatchingEngineFeeGasTest:testGas_CancelPartialBid() (gas: 48948)
RadixMatchingEngineFeeGasTest:testGas_CancelUnfilledAsk() (gas: 40017)
RadixMatchingEngineFeeGasTest:testGas_CancelUnfilledBid() (gas: 39861)
RadixMatchingEngineFeeGasTest:testGas_FillAskConsumesDirtySamePriceBidSubtree() (gas: 88083)
RadixMatchingEngineFeeGasTest:testGas_FillAskConsumesFullDepthBidComb() (gas: 359789)
RadixMatchingEngineFeeGasTest:testGas_FillAskFullyMatchesSingleBid() (gas: 78156)
RadixMatchingEngineFeeGasTest:testGas_FillAskPartiallyMatchesOffSpineBidBranch() (gas: 117031)
RadixMatchingEngineFeeGasTest:testGas_FillAskPartiallyMatchesSingleBid() (gas: 97851)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesAskAndRestsRemainder() (gas: 130694)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesDirtySamePriceAskSubtree() (gas: 88235)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesMaxValidDepthAskComb() (gas: 330912)
RadixMatchingEngineFeeGasTest:testGas_FillBidConsumesSamePriceAskSubtree() (gas: 77861)
RadixMatchingEngineFeeGasTest:testGas_FillBidFullyMatchesSingleAsk() (gas: 77827)
RadixMatchingEngineFeeGasTest:testGas_FillBidPartiallyMatchesOffSpineAskBranch() (gas: 116875)
RadixMatchingEngineFeeGasTest:testGas_FillBidPartiallyMatchesSingleAsk() (gas: 97741)
RadixMatchingEngineFeeGasTest:testGas_FillRestAskEmptyBook() (gas: 151073)
RadixMatchingEngineFeeGasTest:testGas_FillRestBidEmptyBook() (gas: 152822)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookAskMatchesOneBid() (gas: 122655)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookBidMatchesOneAsk() (gas: 138168)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookPartialFillsAsk() (gas: 139312)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookPartialFillsBid() (gas: 123785)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookRestsAsk() (gas: 163902)
RadixMatchingEngineFeeGasTest:testGas_LargeRandomBookRestsBid() (gas: 173271)
RadixMatchingEngineFeeGasTest:testGas_PathologicalOffSpinePartialFillBidComb() (gas: 672066)
RadixMatchingEngineGasTest:testGas_CancelAskSkipsPathologicalBidTree() (gas: 39800)
RadixMatchingEngineGasTest:testGas_CancelFilledBidClaim() (gas: 36860)
RadixMatchingEngineGasTest:testGas_CancelFullDepthBidCombRightmost() (gas: 399374)
RadixMatchingEngineGasTest:testGas_CancelMaxValidDepthAskCombRightmost() (gas: 399065)
RadixMatchingEngineGasTest:testGas_CancelPartialBid() (gas: 48948)
RadixMatchingEngineGasTest:testGas_CancelUnfilledAsk() (gas: 40017)
RadixMatchingEngineGasTest:testGas_CancelUnfilledBid() (gas: 39861)
RadixMatchingEngineGasTest:testGas_FillAskConsumesDirtySamePriceBidSubtree() (gas: 87479)
RadixMatchingEngineGasTest:testGas_FillAskConsumesFullDepthBidComb() (gas: 334093)
RadixMatchingEngineGasTest:testGas_FillAskFullyMatchesSingleBid() (gas: 77552)
RadixMatchingEngineGasTest:testGas_FillAskPartiallyMatchesOffSpineBidBranch() (gas: 116427)
RadixMatchingEngineGasTest:testGas_FillAskPartiallyMatchesSingleBid() (gas: 97247)
RadixMatchingEngineGasTest:testGas_FillBidConsumesAskAndRestsRemainder() (gas: 130097)
RadixMatchingEngineGasTest:testGas_FillBidConsumesDirtySamePriceAskSubtree() (gas: 87641)
RadixMatchingEngineGasTest:testGas_FillBidConsumesMaxValidDepthAskComb() (gas: 330318)
RadixMatchingEngineGasTest:testGas_FillBidConsumesSamePriceAskSubtree() (gas: 77267)
RadixMatchingEngineGasTest:testGas_FillBidFullyMatchesSingleAsk() (gas: 77233)
RadixMatchingEngineGasTest:testGas_FillBidPartiallyMatchesOffSpineAskBranch() (gas: 116281)
RadixMatchingEngineGasTest:testGas_FillBidPartiallyMatchesSingleAsk() (gas: 97147)
RadixMatchingEngineGasTest:testGas_FillRestAskEmptyBook() (gas: 150847)
RadixMatchingEngineGasTest:testGas_FillRestBidEmptyBook() (gas: 152603)
RadixMatchingEngineGasTest:testGas_LargeRandomBookAskMatchesOneBid() (gas: 122051)
RadixMatchingEngineGasTest:testGas_LargeRandomBookBidMatchesOneAsk() (gas: 137574)
RadixMatchingEngineGasTest:testGas_LargeRandomBookPartialFillsAsk() (gas: 138718)
RadixMatchingEngineGasTest:testGas_LargeRandomBookPartialFillsBid() (gas: 123181)
RadixMatchingEngineGasTest:testGas_LargeRandomBookRestsAsk() (gas: 163676)
RadixMatchingEngineGasTest:testGas_LargeRandomBookRestsBid() (gas: 173052)
RadixMatchingEngineGasTest:testGas_PathologicalOffSpinePartialFillBidComb() (gas: 646370)
RadixMatchingEngineHookGasTest:testGas_CancelAskSkipsPathologicalBidTree() (gas: 43805)
RadixMatchingEngineHookGasTest:testGas_CancelFilledBidClaim() (gas: 37577)
RadixMatchingEngineHookGasTest:testGas_CancelFullDepthBidCombRightmost() (gas: 423089)
RadixMatchingEngineHookGasTest:testGas_CancelMaxValidDepthAskCombRightmost() (gas: 421941)
RadixMatchingEngineHookGasTest:testGas_CancelPartialBid() (gas: 53704)
RadixMatchingEngineHookGasTest:testGas_CancelUnfilledAsk() (gas: 44022)
RadixMatchingEngineHookGasTest:testGas_CancelUnfilledBid() (gas: 44617)
RadixMatchingEngineHookGasTest:testGas_FillAskConsumesDirtySamePriceBidSubtree() (gas: 95444)
RadixMatchingEngineHookGasTest:testGas_FillAskConsumesFullDepthBidComb() (gas: 421913)
RadixMatchingEngineHookGasTest:testGas_FillAskFullyMatchesSingleBid() (gas: 85683)
RadixMatchingEngineHookGasTest:testGas_FillAskPartiallyMatchesOffSpineBidBranch() (gas: 130654)
RadixMatchingEngineHookGasTest:testGas_FillAskPartiallyMatchesSingleBid() (gas: 105386)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesAskAndRestsRemainder() (gas: 139029)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesDirtySamePriceAskSubtree() (gas: 94463)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesMaxValidDepthAskComb() (gas: 417279)
RadixMatchingEngineHookGasTest:testGas_FillBidConsumesSamePriceAskSubtree() (gas: 93232)
RadixMatchingEngineHookGasTest:testGas_FillBidFullyMatchesSingleAsk() (gas: 84115)
RadixMatchingEngineHookGasTest:testGas_FillBidPartiallyMatchesOffSpineAskBranch() (gas: 129365)
RadixMatchingEngineHookGasTest:testGas_FillBidPartiallyMatchesSingleAsk() (gas: 104037)
RadixMatchingEngineHookGasTest:testGas_FillRestAskEmptyBook() (gas: 140488)
RadixMatchingEngineHookGasTest:testGas_FillRestBidEmptyBook() (gas: 142241)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookAskMatchesOneBid() (gas: 139499)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookBidMatchesOneAsk() (gas: 155630)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookPartialFillsAsk() (gas: 147698)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookPartialFillsBid() (gas: 133771)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookRestsAsk() (gas: 193677)
RadixMatchingEngineHookGasTest:testGas_LargeRandomBookRestsBid() (gas: 198637)
RadixMatchingEngineHookGasTest:testGas_PathologicalOffSpinePartialFillBidComb() (gas: 670693)
37 changes: 23 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Radix Matching

Foundry prototype for a two-sided native-ETH/ERC20 matching engine backed by a single
`mapping(bytes32 => Branch)` radix tree store.
`mapping(bytes32 => Branch)` radix tree store addressed by stable node nonce.

## Order Node Layout

Expand Down Expand Up @@ -29,28 +29,37 @@ routers must choose ticks that incorporate the decimal relationship of each toke

`FillParams` contains sorted `token0` and `token1` addresses, the book epoch, a packed incoming order,
the bid/ask side, and `noRest` / `fillOrKill` controls. Incoming orders must leave nonce and correction
bits empty. Any permitted unmatched remainder receives the next decrementing nonce and rests in the
bits empty. Any permitted unmatched remainder receives the next decrementing order nonce and rests in the
appropriate active book.

## Branch Encoding

The node layout remains one `bytes32`. Branch nodes do not use nonce tags, probes, or a separate namespace.
The packed node layout remains one `bytes32`, stored in its parent pointer. The low 32-bit nonce is
the node's unique, stable identity: a branch's child pointers are stored at
`tree[bytes32(branchNonce)]`, not at a key derived from the full mutable packed word. Price,
quantity, correction, and nonce all remain in the parent pointer. A partial fill can therefore
rewrite the branch summary in its parent while its own two children stay in the same mapping slot.

A branch node is addressed with an actual order boundary key from its children:
Order and branch identities share one collision-free 32-bit namespace with allocation fronts that
move toward one another:

```text
path = price || nonce
branch_path = max(child_a_path, child_b_path)
order_nonce = uint32.max, uint32.max - 1, ...
branch_nonce = 1, 2, ...
```

The branch path is packed back into the same tick and nonce fields, while the quantity field stores
the exact sum of the child quantities. A uniform-tick branch stores `roundingCorrection + 1` in its
Each insertion into a nonempty side allocates exactly one new branch identity. The book rotates
before the two allocation fronts meet, so branch identities cannot alias order leaves. Radix
routing derives keys from descendant order leaves rather than treating a branch identity as part of
the path. The quantity field stores the exact sum of the child quantities. A uniform-tick branch
stores `roundingCorrection + 1` in its
correction field, allowing aggregate matching to reproduce the exact sum of per-order rounded
notionals. Mixed-tick branches use correction code zero and recurse when their quote value is needed.
Because the boundary key is an actual order path, uniqueness comes from the decrementing order nonce
rather than from a synthetic branch nonce namespace.
The nonce is a unique node identity and addresses that node's stored child-pointer pair.

Resting orders start at `type(uint32).max` and decrement from there.
Resting order nonces start at `type(uint32).max` and decrement by one. Branch nonces start at one and
increment by one. A book epoch remains restable only while the next order identity is above the next
branch identity.

Higher order nonce still means earlier time priority at the same price.

Expand Down Expand Up @@ -106,9 +115,9 @@ forge test --force --match-contract '.*RadixMatchingEngineInvariantTest.*' --mat
FOUNDRY_INVARIANT_RUNS=2048 FOUNDRY_INVARIANT_DEPTH=64 forge test --force --match-contract '.*RadixMatchingEngineInvariantTest.*' --match-test 'invariant_.*'
INVARIANT_RUNS=2048 INVARIANT_DEPTH=64 INVARIANT_SHARDS=8 INVARIANT_SHARD=1 make invariant-deep-shard
INVARIANT_RUNS=2048 INVARIANT_DEPTH=64 INVARIANT_SHARDS=8 make invariant-deep-shards
forge test --isolate --force --match-contract 'RadixMatchingEngine(Gas|HookGas|FeeGas)Test' --gas-report
forge snapshot --isolate --force --match-contract 'RadixMatchingEngine(Gas|HookGas|FeeGas)Test' --snap .gas-snapshot.runtime
forge snapshot --isolate --force --match-contract 'RadixMatchingEngine(Gas|HookGas|FeeGas)Test' --check .gas-snapshot.runtime
forge test --isolate --force --match-contract '(RadixMatchingEngine(Gas|HookGas|FeeGas)Test|DeepstateV1IntegratorFeeGasTest)' --gas-report
forge snapshot --isolate --force --match-contract '(RadixMatchingEngine(Gas|HookGas|FeeGas)Test|DeepstateV1IntegratorFeeGasTest)' --snap .gas-snapshot.runtime
forge snapshot --isolate --force --match-contract '(RadixMatchingEngine(Gas|HookGas|FeeGas)Test|DeepstateV1IntegratorFeeGasTest)' --check .gas-snapshot.runtime
forge build --sizes
python3 script/check_tick_math.py --check test/TickMath32.t.sol
uv run --locked --only-group static slither src/DeepstateV1.sol --config-file slither.config.json --exclude-informational
Expand Down
Loading