@zoralabs/limit-orders 0.2.2 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/.abi-stability +70 -0
  2. package/.turbo/turbo-build$colon$js.log +44 -45
  3. package/AUDIT_NOTES.md +0 -1
  4. package/CHANGELOG.md +29 -0
  5. package/README.md +6 -9
  6. package/SPEC.md +5 -5
  7. package/cache/solidity-files-cache.json +1 -1
  8. package/out/CoinConfigurationVersions.sol/CoinConfigurationVersions.json +1 -1
  9. package/out/CoinConstants.sol/CoinConstants.json +1 -1
  10. package/out/DopplerMath.sol/DopplerMath.json +1 -1
  11. package/out/LimitOrderBitmap.sol/LimitOrderBitmap.json +1 -1
  12. package/out/LimitOrderCommon.sol/LimitOrderCommon.json +1 -1
  13. package/out/LimitOrderCreate.sol/LimitOrderCreate.json +1 -1
  14. package/out/LimitOrderFill.sol/LimitOrderFill.json +1 -1
  15. package/out/LimitOrderLiquidity.sol/LimitOrderLiquidity.json +1 -1
  16. package/out/LimitOrderWithdraw.sol/LimitOrderWithdraw.json +1 -1
  17. package/out/PermittedCallers.sol/PermittedCallers.json +1 -1
  18. package/out/SwapLimitOrders.sol/SwapLimitOrders.json +1 -1
  19. package/out/SwapWithLimitOrders.sol/SwapWithLimitOrders.json +1 -1
  20. package/out/UniV4SwapToCurrency.sol/UniV4SwapToCurrency.json +1 -1
  21. package/out/V3ToV4SwapLib.sol/V3ToV4SwapLib.json +1 -1
  22. package/out/ZoraLimitOrderBook.sol/ZoraLimitOrderBook.json +1 -1
  23. package/out/build-info/{37e0124d88d60569.json → c9f7ee5726bfbd48.json} +1 -1
  24. package/package.json +4 -2
  25. package/src/access/PermittedCallers.sol +5 -1
  26. package/src/libs/LimitOrderBitmap.sol +0 -1
  27. package/src/libs/LimitOrderCommon.sol +14 -0
  28. package/src/libs/LimitOrderCreate.sol +6 -0
  29. package/src/libs/LimitOrderFill.sol +3 -20
  30. package/src/libs/LimitOrderLiquidity.sol +61 -38
  31. package/src/libs/LimitOrderWithdraw.sol +2 -6
  32. package/src/libs/SwapLimitOrders.sol +13 -7
  33. package/src/router/SwapWithLimitOrders.sol +2 -2
  34. package/test/LimitOrderLiquidityPayouts.t.sol +14 -14
  35. package/test/SwapWithLimitOrdersRouter.t.sol +4 -0
  36. package/test/unit/LimitOrderCreateUnit.t.sol +17 -17
  37. package/test/unit/SwapLimitOrdersUnit.t.sol +47 -86
  38. package/test/unit/SwapLimitOrdersValidation.t.sol +3 -11
  39. package/test/utils/BaseTest.sol +1 -1
  40. package/AUDIT_RFP.md +0 -408
  41. package/abis/ISetLimitOrderConfig.json +0 -27
  42. package/out/ISetLimitOrderConfig.sol/ISetLimitOrderConfig.json +0 -1
  43. package/src/router/ISetLimitOrderConfig.sol +0 -12
package/.abi-stability ADDED
@@ -0,0 +1,70 @@
1
+ =======================
2
+ 👁👁 ABI STABILITY snapshot 👁👁
3
+ =======================
4
+
5
+ ===============================
6
+ DEPRECATED FUNCTIONS
7
+ ===============================
8
+
9
+ (none)
10
+
11
+ ===============================
12
+ ➡ IZoraLimitOrderBook
13
+ ===============================
14
+
15
+ --- EVENTS ---
16
+
17
+ ╭-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╮
18
+ | Event | Topic |
19
+ +======================================================================================================================================================================+
20
+ | LimitOrderCreated(address,address,bytes32,bool,int24,int24,uint128,bytes32) | 0x36c14a3cb6751895ef6ab64f123dcca47c492ec447d69f86bb560eb5ad0e47a3 |
21
+ |-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------|
22
+ | LimitOrderFilled(address,address,address,uint128,uint128,address,uint128,bytes32,int24,bytes32) | 0x59d8d839dc2a16f78d0e321652546b26bd10065beade9541895b54e0ec058a37 |
23
+ |-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------|
24
+ | LimitOrderUpdated(address,address,bytes32,bool,int24,uint128,bytes32,bool) | 0x73544fee6e45e543d5464c5d945a19046ad773dabfc95c7d1c119b135d947dde |
25
+ |-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------|
26
+ | MakerBalanceUpdated(address,address,uint256) | 0xa942ad2d47c64ce0859147575881ee76ce335036216e9378b100614f683006cb |
27
+ ╰-------------------------------------------------------------------------------------------------+--------------------------------------------------------------------╯
28
+
29
+
30
+ --- FUNCTIONS ---
31
+
32
+ ╭-------------------------------------------------------------------------------+------------╮
33
+ | Method | Identifier |
34
+ +============================================================================================+
35
+ | balanceOf(address,address) | f7888aec |
36
+ |-------------------------------------------------------------------------------+------------|
37
+ | create((address,address,uint24,int24,address),bool,uint256[],int24[],address) | eb07ed24 |
38
+ |-------------------------------------------------------------------------------+------------|
39
+ | fill(((address,address,uint24,int24,address),bool,bytes32[])[],address) | 7a9cf273 |
40
+ |-------------------------------------------------------------------------------+------------|
41
+ | fill((address,address,uint24,int24,address),bool,int24,int24,uint256,address) | 5f8fbad6 |
42
+ |-------------------------------------------------------------------------------+------------|
43
+ | getMaxFillCount() | d8c31772 |
44
+ |-------------------------------------------------------------------------------+------------|
45
+ | setMaxFillCount(uint256) | c96d060b |
46
+ |-------------------------------------------------------------------------------+------------|
47
+ | withdraw(bytes32[],address,uint256,address) | c2ec68ea |
48
+ ╰-------------------------------------------------------------------------------+------------╯
49
+
50
+
51
+ ===============================
52
+ ➡ ISetLimitOrderConfig
53
+ ===============================
54
+
55
+ --- EVENTS ---
56
+
57
+ ╭-------+-------╮
58
+ | Event | Topic |
59
+ +===============+
60
+ ╰-------+-------╯
61
+
62
+
63
+ --- FUNCTIONS ---
64
+
65
+ ╭--------------------------------------------+------------╮
66
+ | Method | Identifier |
67
+ +=========================================================+
68
+ | setLimitOrderConfig((uint256[],uint256[])) | 18ed2974 |
69
+ ╰--------------------------------------------+------------╯
70
+
@@ -1,17 +1,17 @@
1
1
 
2
- > @zoralabs/limit-orders@0.2.2 build:js /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
2
+ > @zoralabs/limit-orders@0.2.5 build:js /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
3
3
  > pnpm run wagmi:generate && pnpm run copy-abis && pnpm run prettier:write && tsup
4
4
 
5
5
 
6
- > @zoralabs/limit-orders@0.2.2 wagmi:generate /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
6
+ > @zoralabs/limit-orders@0.2.5 wagmi:generate /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
7
7
  > pnpm run build:contracts:minimal && wagmi generate && pnpm exec rename-generated-abi-casing ./package/wagmiGenerated.ts
8
8
 
9
9
 
10
- > @zoralabs/limit-orders@0.2.2 build:contracts:minimal /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
10
+ > @zoralabs/limit-orders@0.2.5 build:contracts:minimal /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
11
11
  > forge build src/ --no-metadata
12
12
 
13
- Compiling 93 files with Solc 0.8.28
14
- Solc 0.8.28 finished in 7.13s
13
+ Compiling 92 files with Solc 0.8.28
14
+ Solc 0.8.28 finished in 7.62s
15
15
  Compiler run successful!
16
16
  - Validating plugins
17
17
  ✔ Validating plugins
@@ -26,50 +26,49 @@ Compiler run successful!
26
26
  ✅ Updated ./package/wagmiGenerated.ts (3 replacements)
27
27
  ✨ All files processed successfully!
28
28
 
29
- > @zoralabs/limit-orders@0.2.2 copy-abis /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
29
+ > @zoralabs/limit-orders@0.2.5 copy-abis /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
30
30
  > pnpm exec bundle-abis
31
31
 
32
32
 
33
- > @zoralabs/limit-orders@0.2.2 prettier:write /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
33
+ > @zoralabs/limit-orders@0.2.5 prettier:write /home/runner/work/zora-protocol-private/zora-protocol-private/packages/limit-orders
34
34
  > prettier --write 'src/**/*.sol' 'test/**/*.sol'
35
35
 
36
- src/access/PermittedCallers.sol 449ms (unchanged)
37
- src/IZoraLimitOrderBook.sol 54ms (unchanged)
38
- src/libs/LimitOrderBitmap.sol 57ms (unchanged)
39
- src/libs/LimitOrderCommon.sol 210ms (unchanged)
40
- src/libs/LimitOrderCreate.sol 374ms (unchanged)
41
- src/libs/LimitOrderFill.sol 244ms (unchanged)
42
- src/libs/LimitOrderLiquidity.sol 250ms (unchanged)
43
- src/libs/LimitOrderQueues.sol 43ms (unchanged)
44
- src/libs/LimitOrderStorage.sol 13ms (unchanged)
45
- src/libs/LimitOrderTypes.sol 3ms (unchanged)
46
- src/libs/LimitOrderViews.sol 114ms (unchanged)
47
- src/libs/LimitOrderWithdraw.sol 109ms (unchanged)
36
+ src/access/PermittedCallers.sol 502ms (unchanged)
37
+ src/IZoraLimitOrderBook.sol 61ms (unchanged)
38
+ src/libs/LimitOrderBitmap.sol 59ms (unchanged)
39
+ src/libs/LimitOrderCommon.sol 217ms (unchanged)
40
+ src/libs/LimitOrderCreate.sol 387ms (unchanged)
41
+ src/libs/LimitOrderFill.sol 238ms (unchanged)
42
+ src/libs/LimitOrderLiquidity.sol 231ms (unchanged)
43
+ src/libs/LimitOrderQueues.sol 62ms (unchanged)
44
+ src/libs/LimitOrderStorage.sol 14ms (unchanged)
45
+ src/libs/LimitOrderTypes.sol 2ms (unchanged)
46
+ src/libs/LimitOrderViews.sol 106ms (unchanged)
47
+ src/libs/LimitOrderWithdraw.sol 106ms (unchanged)
48
48
  src/libs/Permit2Payments.sol 17ms (unchanged)
49
- src/libs/SwapLimitOrders.sol 173ms (unchanged)
50
- src/router/ISetLimitOrderConfig.sol 1ms (unchanged)
51
- src/router/SwapWithLimitOrders.sol 301ms (unchanged)
52
- src/ZoraLimitOrderBook.sol 111ms (unchanged)
53
- test/gas/LimitOrderFillGas.t.sol 792ms (unchanged)
54
- test/gas/LimitOrderSwapGas.t.sol 283ms (unchanged)
55
- test/LimitOrderAccessControl.t.sol 396ms (unchanged)
56
- test/LimitOrderBitmap.t.sol 212ms (unchanged)
57
- test/LimitOrderCreate.t.sol 364ms (unchanged)
58
- test/LimitOrderFill.t.sol 999ms (unchanged)
59
- test/LimitOrderLibraries.t.sol 371ms (unchanged)
60
- test/LimitOrderLiquidityPayouts.t.sol 420ms (unchanged)
61
- test/LimitOrderV4Pools.t.sol 141ms (unchanged)
62
- test/LimitOrderWithdraw.t.sol 665ms (unchanged)
63
- test/SwapWithLimitOrders.t.sol 88ms (unchanged)
64
- test/SwapWithLimitOrdersRouter.t.sol 626ms (unchanged)
65
- test/unit/LimitOrderBitmapUnit.t.sol 80ms (unchanged)
66
- test/unit/LimitOrderCreateUnit.t.sol 193ms (unchanged)
67
- test/unit/SwapLimitOrdersUnit.t.sol 601ms (unchanged)
68
- test/unit/SwapLimitOrdersValidation.t.sol 228ms (unchanged)
69
- test/unit/SwapWithLimitOrdersUnit.t.sol 63ms (unchanged)
70
- test/utils/BaseTest.sol 593ms (unchanged)
71
- test/utils/MockWETH.sol 34ms (unchanged)
72
- test/utils/TestableZoraLimitOrderBook.sol 41ms (unchanged)
49
+ src/libs/SwapLimitOrders.sol 149ms (unchanged)
50
+ src/router/SwapWithLimitOrders.sol 256ms (unchanged)
51
+ src/ZoraLimitOrderBook.sol 141ms (unchanged)
52
+ test/gas/LimitOrderFillGas.t.sol 812ms (unchanged)
53
+ test/gas/LimitOrderSwapGas.t.sol 305ms (unchanged)
54
+ test/LimitOrderAccessControl.t.sol 392ms (unchanged)
55
+ test/LimitOrderBitmap.t.sol 208ms (unchanged)
56
+ test/LimitOrderCreate.t.sol 462ms (unchanged)
57
+ test/LimitOrderFill.t.sol 1033ms (unchanged)
58
+ test/LimitOrderLibraries.t.sol 402ms (unchanged)
59
+ test/LimitOrderLiquidityPayouts.t.sol 418ms (unchanged)
60
+ test/LimitOrderV4Pools.t.sol 148ms (unchanged)
61
+ test/LimitOrderWithdraw.t.sol 641ms (unchanged)
62
+ test/SwapWithLimitOrders.t.sol 98ms (unchanged)
63
+ test/SwapWithLimitOrdersRouter.t.sol 628ms (unchanged)
64
+ test/unit/LimitOrderBitmapUnit.t.sol 83ms (unchanged)
65
+ test/unit/LimitOrderCreateUnit.t.sol 165ms (unchanged)
66
+ test/unit/SwapLimitOrdersUnit.t.sol 616ms (unchanged)
67
+ test/unit/SwapLimitOrdersValidation.t.sol 250ms (unchanged)
68
+ test/unit/SwapWithLimitOrdersUnit.t.sol 69ms (unchanged)
69
+ test/utils/BaseTest.sol 638ms (unchanged)
70
+ test/utils/MockWETH.sol 22ms (unchanged)
71
+ test/utils/TestableZoraLimitOrderBook.sol 19ms (unchanged)
73
72
  CLI Building entry: package/index.ts
74
73
  CLI Using tsconfig: tsconfig.json
75
74
  CLI tsup v8.4.0
@@ -80,7 +79,7 @@ test/utils/TestableZoraLimitOrderBook.sol 41ms (unchanged)
80
79
  ESM Build start
81
80
  CJS dist/index.cjs 25.65 KB
82
81
  CJS dist/index.cjs.map 44.14 KB
83
- CJS ⚡️ Build success in 35ms
82
+ CJS ⚡️ Build success in 45ms
84
83
  ESM dist/index.js 24.48 KB
85
84
  ESM dist/index.js.map 44.03 KB
86
- ESM ⚡️ Build success in 35ms
85
+ ESM ⚡️ Build success in 47ms
package/AUDIT_NOTES.md CHANGED
@@ -6,7 +6,6 @@ Related docs:
6
6
 
7
7
  - [`README.md`](./README.md) — architecture & diagrams
8
8
  - [`SPEC.md`](./SPEC.md) — normative behavior + invariants
9
- - [`AUDIT_RFP.md`](./AUDIT_RFP.md) — audit scope
10
9
 
11
10
  ---
12
11
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # @zoralabs/limit-orders
2
2
 
3
+ ## 0.2.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 9a46fe15: Remove unused ISetLimitOrderConfig interface from SwapWithLimitOrders router
8
+
9
+ ## 0.2.4
10
+
11
+ ### Patch Changes
12
+
13
+ - 3a8a5a05: Fixed infinite loop bug in batch fill when order hasn't crossed tick range
14
+ - 53957bf7: Skip order creation when swaps hit hard price boundaries using sqrt price sentinel checks.
15
+
16
+ ## 0.2.3
17
+
18
+ ### Patch Changes
19
+
20
+ - 98e02520: Fix dual positive deltas consolidation in burnAndRefund
21
+
22
+ - Consolidate payouts to single currency when burning limit orders with dual positive deltas
23
+ - Extract path-building logic into reusable `_buildSingleHopPath` helper function
24
+ - Ensure users receive proceeds in their original deposit currency by swapping counter-assets
25
+ - Align burnAndRefund behavior with burnAndPayout for consistent payout consolidation
26
+
27
+ - 91a82b2f: Fix withdraw crossed order check to use consistent logic with fills. The `hasCrossed` check for currency1 orders now uses strict `<` comparison instead of `<=`, preventing false positives at the tick boundary. Consolidated `hasCrossed` and `currentPoolTick` helpers into `LimitOrderCommon` for shared use across fill and withdraw paths.
28
+ - e9ffd038: Fix premature limit order fills due to Uniswap v4 tick boundary handling
29
+
30
+ Previously, limit orders for non-currency0 tokens could be filled prematurely when the current tick was exactly equal to the order's lower tick boundary. This fix ensures orders are only filled when the pool tick has fully crossed the order's range, preventing users from receiving fewer output tokens than intended.
31
+
3
32
  ## 0.2.2
4
33
 
5
34
  ### Patch Changes
package/README.md CHANGED
@@ -5,9 +5,6 @@
5
5
  - **Architecture + diagrams (this doc)**: [`README.md`](./README.md)
6
6
  - **Normative behavior + invariants**: [`SPEC.md`](./SPEC.md)
7
7
  - **Threat model + audit checklist**: [`AUDIT_NOTES.md`](./AUDIT_NOTES.md)
8
- - **Audit scope / process**: [`AUDIT_RFP.md`](./AUDIT_RFP.md)
9
-
10
- If you’re auditing: read **README → SPEC → AUDIT_NOTES → code**.
11
8
 
12
9
  ### Table of Contents
13
10
 
@@ -155,8 +152,7 @@ Components
155
152
 
156
153
  4. Access Control
157
154
 
158
- - [`SimpleAccessManaged.sol`](./src/access/SimpleAccessManaged.sol) - Base contract for access-controlled functions
159
- - [`SimpleAccessManager.sol`](./src/access/SimpleAccessManager.sol) - Role-based access manager implementation
155
+ - [`PermittedCallers.sol`](./src/access/PermittedCallers.sol) - Ownable2Step-based access control with permitted callers mapping
160
156
 
161
157
  #### Tick Queue System
162
158
 
@@ -456,13 +452,14 @@ This enables.
456
452
  - Potential future upgradeability
457
453
  - Gas-efficient storage access
458
454
 
459
- Access Control via SimpleAccessManaged
455
+ Access Control via PermittedCallers
460
456
 
461
- Uses OpenZeppelin's access control pattern with a separate `AccessManager` contract.
457
+ Uses OpenZeppelin's `Ownable2Step` pattern with a simple permitted callers mapping.
462
458
 
463
- - Flexible role-based permissions
459
+ - By default, `PUBLIC_ACCESS` (address(0)) is permitted, meaning anyone can call
460
+ - Owner can restrict access by setting `PUBLIC_ACCESS` to false and whitelisting specific addresses
464
461
  - Can restrict `create()` to specific routers/hooks if needed
465
- - Authority can be transferred or upgraded
462
+ - Two-step ownership transfer for safe admin transitions
466
463
 
467
464
  ### 4. Fill Execution Paths
468
465
 
package/SPEC.md CHANGED
@@ -4,9 +4,8 @@ This document is the **behavioral specification** for the Limit Orders system in
4
4
 
5
5
  Related docs:
6
6
 
7
- - [`README.md`](./README.md) — architecture & diagrams (canonical where to start)
7
+ - [`README.md`](./README.md) — architecture & diagrams (canonical "where to start")
8
8
  - [`AUDIT_NOTES.md`](./AUDIT_NOTES.md) — threat model & audit checklist
9
- - [`AUDIT_RFP.md`](./AUDIT_RFP.md) — audit scope & deliverables
10
9
 
11
10
  ---
12
11
 
@@ -65,7 +64,7 @@ This section defines **intended behavior** for the public entrypoints. For exact
65
64
 
66
65
  **Authorization**
67
66
 
68
- - `create()` is access-controlled via `SimpleAccessManaged` authority checks.
67
+ - `create()` is access-controlled via `PermittedCallers` which uses an `onlyPermitted` modifier.
69
68
 
70
69
  **Effects**
71
70
 
@@ -163,9 +162,10 @@ This section defines **intended behavior** for the public entrypoints. For exact
163
162
  - Updates the stored default max fills per call.
164
163
  - Must not allow admin to withdraw user funds or block withdrawals.
165
164
 
166
- **Authority management**
165
+ **Permitted callers management**
167
166
 
168
- - Authority contract can be updated as per `SimpleAccessManaged` design.
167
+ - Owner can update permitted callers via `setPermittedCallers()`.
168
+ - Ownership can be transferred via two-step process (`Ownable2Step`).
169
169
 
170
170
  ---
171
171