@zoralabs/limit-orders 0.2.4 → 0.2.6

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 (50) hide show
  1. package/.abi-stability +0 -21
  2. package/.turbo/turbo-build$colon$js.log +51 -51
  3. package/AUDIT_NOTES.md +0 -1
  4. package/CHANGELOG.md +19 -0
  5. package/README.md +6 -9
  6. package/SPEC.md +5 -5
  7. package/abis/ContractVersionBase.json +15 -0
  8. package/abis/IVersionedContract.json +15 -0
  9. package/abis/SwapWithLimitOrders.json +13 -0
  10. package/abis/ZoraLimitOrderBook.json +13 -0
  11. package/cache/solidity-files-cache.json +1 -1
  12. package/dist/index.cjs +14 -0
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.js +14 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/wagmiGenerated.d.ts +20 -0
  17. package/dist/wagmiGenerated.d.ts.map +1 -1
  18. package/out/BytesLib.sol/BytesLib.json +1 -1
  19. package/out/ContractVersionBase.sol/ContractVersionBase.json +1 -0
  20. package/out/ISwapRouter.sol/ISwapRouter.json +1 -1
  21. package/out/IUniswapV3SwapCallback.sol/IUniswapV3SwapCallback.json +1 -1
  22. package/out/IVersionedContract.sol/IVersionedContract.json +1 -0
  23. package/out/IZoraLimitOrderBook.sol/IZoraLimitOrderBook.json +1 -1
  24. package/out/LimitOrderBitmap.sol/LimitOrderBitmap.json +1 -1
  25. package/out/LimitOrderCommon.sol/LimitOrderCommon.json +1 -1
  26. package/out/LimitOrderCreate.sol/LimitOrderCreate.json +1 -1
  27. package/out/LimitOrderFill.sol/LimitOrderFill.json +1 -1
  28. package/out/LimitOrderLiquidity.sol/LimitOrderLiquidity.json +1 -1
  29. package/out/LimitOrderQueues.sol/LimitOrderQueues.json +1 -1
  30. package/out/LimitOrderStorage.sol/LimitOrderStorage.json +1 -1
  31. package/out/LimitOrderTypes.sol/LimitOrderTypes.json +1 -1
  32. package/out/LimitOrderViews.sol/LimitOrderViews.json +1 -1
  33. package/out/LimitOrderWithdraw.sol/LimitOrderWithdraw.json +1 -1
  34. package/out/Path.sol/Path.json +1 -1
  35. package/out/Permit2Payments.sol/Permit2Payments.json +1 -1
  36. package/out/PermittedCallers.sol/PermittedCallers.json +1 -1
  37. package/out/SwapLimitOrders.sol/SwapLimitOrders.json +1 -1
  38. package/out/SwapWithLimitOrders.sol/SwapWithLimitOrders.json +1 -1
  39. package/out/ZoraLimitOrderBook.sol/ZoraLimitOrderBook.json +1 -1
  40. package/out/build-info/{68b2e124c4a02a45.json → b6efea4394bdeb7d.json} +1 -1
  41. package/package/wagmiGenerated.ts +14 -0
  42. package/package.json +2 -2
  43. package/src/ZoraLimitOrderBook.sol +4 -1
  44. package/src/router/SwapWithLimitOrders.sol +2 -2
  45. package/src/version/ContractVersionBase.sol +14 -0
  46. package/test/LimitOrderAccessControl.t.sol +8 -2
  47. package/AUDIT_RFP.md +0 -408
  48. package/abis/ISetLimitOrderConfig.json +0 -27
  49. package/out/ISetLimitOrderConfig.sol/ISetLimitOrderConfig.json +0 -1
  50. package/src/router/ISetLimitOrderConfig.sol +0 -12
@@ -1 +1 @@
1
- {"id":"68b2e124c4a02a45","source_id_to_path":{"0":"node_modules/@openzeppelin/contracts/access/Ownable.sol","1":"node_modules/@openzeppelin/contracts/access/Ownable2Step.sol","2":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","3":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","4":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","5":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","6":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","7":"node_modules/@openzeppelin/contracts/utils/Context.sol","8":"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol","9":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","10":"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol","11":"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol","12":"node_modules/@uniswap/permit2/src/libraries/SafeCast160.sol","13":"node_modules/@uniswap/v4-core/src/interfaces/IExtsload.sol","14":"node_modules/@uniswap/v4-core/src/interfaces/IExttload.sol","15":"node_modules/@uniswap/v4-core/src/interfaces/IHooks.sol","16":"node_modules/@uniswap/v4-core/src/interfaces/IPoolManager.sol","17":"node_modules/@uniswap/v4-core/src/interfaces/IProtocolFees.sol","18":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC20Minimal.sol","19":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC6909Claims.sol","20":"node_modules/@uniswap/v4-core/src/libraries/BitMath.sol","21":"node_modules/@uniswap/v4-core/src/libraries/CurrencyReserves.sol","22":"node_modules/@uniswap/v4-core/src/libraries/CustomRevert.sol","23":"node_modules/@uniswap/v4-core/src/libraries/FixedPoint128.sol","24":"node_modules/@uniswap/v4-core/src/libraries/FullMath.sol","25":"node_modules/@uniswap/v4-core/src/libraries/LiquidityMath.sol","26":"node_modules/@uniswap/v4-core/src/libraries/Lock.sol","27":"node_modules/@uniswap/v4-core/src/libraries/NonzeroDeltaCount.sol","28":"node_modules/@uniswap/v4-core/src/libraries/Position.sol","29":"node_modules/@uniswap/v4-core/src/libraries/SafeCast.sol","30":"node_modules/@uniswap/v4-core/src/libraries/StateLibrary.sol","31":"node_modules/@uniswap/v4-core/src/libraries/TickBitmap.sol","32":"node_modules/@uniswap/v4-core/src/libraries/TickMath.sol","33":"node_modules/@uniswap/v4-core/src/libraries/TransientStateLibrary.sol","34":"node_modules/@uniswap/v4-core/src/types/BalanceDelta.sol","35":"node_modules/@uniswap/v4-core/src/types/BeforeSwapDelta.sol","36":"node_modules/@uniswap/v4-core/src/types/Currency.sol","37":"node_modules/@uniswap/v4-core/src/types/PoolId.sol","38":"node_modules/@uniswap/v4-core/src/types/PoolKey.sol","39":"node_modules/@uniswap/v4-core/src/types/PoolOperation.sol","40":"node_modules/@uniswap/v4-periphery/src/libraries/PathKey.sol","41":"node_modules/@zoralabs/coins/src/interfaces/ICoin.sol","42":"node_modules/@zoralabs/coins/src/interfaces/IDeployedCoinVersionLookup.sol","43":"node_modules/@zoralabs/coins/src/interfaces/IDopplerErrors.sol","44":"node_modules/@zoralabs/coins/src/interfaces/IERC7572.sol","45":"node_modules/@zoralabs/coins/src/interfaces/IHasRewardsRecipients.sol","46":"node_modules/@zoralabs/coins/src/interfaces/IMsgSender.sol","47":"node_modules/@zoralabs/coins/src/interfaces/ISupportsLimitOrderFill.sol","48":"node_modules/@zoralabs/coins/src/interfaces/ISwapPathRouter.sol","49":"node_modules/@zoralabs/coins/src/interfaces/ISwapRouter.sol","50":"node_modules/@zoralabs/coins/src/interfaces/IUpgradeableV4Hook.sol","51":"node_modules/@zoralabs/coins/src/interfaces/IWETH.sol","52":"node_modules/@zoralabs/coins/src/interfaces/IZoraHookRegistry.sol","53":"node_modules/@zoralabs/coins/src/interfaces/IZoraLimitOrderBookCoinsInterface.sol","54":"node_modules/@zoralabs/coins/src/interfaces/IZoraV4CoinHook.sol","55":"node_modules/@zoralabs/coins/src/libs/CoinCommon.sol","56":"node_modules/@zoralabs/coins/src/libs/CoinConfigurationVersions.sol","57":"node_modules/@zoralabs/coins/src/libs/CoinConstants.sol","58":"node_modules/@zoralabs/coins/src/libs/DopplerMath.sol","59":"node_modules/@zoralabs/coins/src/libs/UniV4SwapToCurrency.sol","60":"node_modules/@zoralabs/coins/src/libs/V3ToV4SwapLib.sol","61":"node_modules/@zoralabs/coins/src/types/LpPosition.sol","62":"node_modules/@zoralabs/coins/src/types/PoolConfiguration.sol","63":"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol","64":"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol","65":"node_modules/@zoralabs/coins/src/utils/uniswap/FixedPoint96.sol","66":"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol","67":"node_modules/@zoralabs/coins/src/utils/uniswap/LiquidityAmounts.sol","68":"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol","69":"node_modules/@zoralabs/coins/src/utils/uniswap/SqrtPriceMath.sol","70":"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol","71":"node_modules/@zoralabs/coins/src/utils/uniswap/UnsafeMath.sol","72":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/ISwapRouter.sol","73":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/IUniswapV3SwapCallback.sol","74":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/BytesLib.sol","75":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/Path.sol","76":"src/IZoraLimitOrderBook.sol","77":"src/ZoraLimitOrderBook.sol","78":"src/access/PermittedCallers.sol","79":"src/libs/LimitOrderBitmap.sol","80":"src/libs/LimitOrderCommon.sol","81":"src/libs/LimitOrderCreate.sol","82":"src/libs/LimitOrderFill.sol","83":"src/libs/LimitOrderLiquidity.sol","84":"src/libs/LimitOrderQueues.sol","85":"src/libs/LimitOrderStorage.sol","86":"src/libs/LimitOrderTypes.sol","87":"src/libs/LimitOrderViews.sol","88":"src/libs/LimitOrderWithdraw.sol","89":"src/libs/Permit2Payments.sol","90":"src/libs/SwapLimitOrders.sol","91":"src/router/ISetLimitOrderConfig.sol","92":"src/router/SwapWithLimitOrders.sol"},"language":"Solidity"}
1
+ {"id":"b6efea4394bdeb7d","source_id_to_path":{"0":"node_modules/@openzeppelin/contracts/access/Ownable.sol","1":"node_modules/@openzeppelin/contracts/access/Ownable2Step.sol","2":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","3":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","4":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","5":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","6":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","7":"node_modules/@openzeppelin/contracts/utils/Context.sol","8":"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol","9":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","10":"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol","11":"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol","12":"node_modules/@uniswap/permit2/src/libraries/SafeCast160.sol","13":"node_modules/@uniswap/v4-core/src/interfaces/IExtsload.sol","14":"node_modules/@uniswap/v4-core/src/interfaces/IExttload.sol","15":"node_modules/@uniswap/v4-core/src/interfaces/IHooks.sol","16":"node_modules/@uniswap/v4-core/src/interfaces/IPoolManager.sol","17":"node_modules/@uniswap/v4-core/src/interfaces/IProtocolFees.sol","18":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC20Minimal.sol","19":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC6909Claims.sol","20":"node_modules/@uniswap/v4-core/src/libraries/BitMath.sol","21":"node_modules/@uniswap/v4-core/src/libraries/CurrencyReserves.sol","22":"node_modules/@uniswap/v4-core/src/libraries/CustomRevert.sol","23":"node_modules/@uniswap/v4-core/src/libraries/FixedPoint128.sol","24":"node_modules/@uniswap/v4-core/src/libraries/FullMath.sol","25":"node_modules/@uniswap/v4-core/src/libraries/LiquidityMath.sol","26":"node_modules/@uniswap/v4-core/src/libraries/Lock.sol","27":"node_modules/@uniswap/v4-core/src/libraries/NonzeroDeltaCount.sol","28":"node_modules/@uniswap/v4-core/src/libraries/Position.sol","29":"node_modules/@uniswap/v4-core/src/libraries/SafeCast.sol","30":"node_modules/@uniswap/v4-core/src/libraries/StateLibrary.sol","31":"node_modules/@uniswap/v4-core/src/libraries/TickBitmap.sol","32":"node_modules/@uniswap/v4-core/src/libraries/TickMath.sol","33":"node_modules/@uniswap/v4-core/src/libraries/TransientStateLibrary.sol","34":"node_modules/@uniswap/v4-core/src/types/BalanceDelta.sol","35":"node_modules/@uniswap/v4-core/src/types/BeforeSwapDelta.sol","36":"node_modules/@uniswap/v4-core/src/types/Currency.sol","37":"node_modules/@uniswap/v4-core/src/types/PoolId.sol","38":"node_modules/@uniswap/v4-core/src/types/PoolKey.sol","39":"node_modules/@uniswap/v4-core/src/types/PoolOperation.sol","40":"node_modules/@uniswap/v4-periphery/src/libraries/PathKey.sol","41":"node_modules/@zoralabs/coins/src/interfaces/ICoin.sol","42":"node_modules/@zoralabs/coins/src/interfaces/IDeployedCoinVersionLookup.sol","43":"node_modules/@zoralabs/coins/src/interfaces/IDopplerErrors.sol","44":"node_modules/@zoralabs/coins/src/interfaces/IERC7572.sol","45":"node_modules/@zoralabs/coins/src/interfaces/IHasRewardsRecipients.sol","46":"node_modules/@zoralabs/coins/src/interfaces/IMsgSender.sol","47":"node_modules/@zoralabs/coins/src/interfaces/ISupportsLimitOrderFill.sol","48":"node_modules/@zoralabs/coins/src/interfaces/ISwapPathRouter.sol","49":"node_modules/@zoralabs/coins/src/interfaces/ISwapRouter.sol","50":"node_modules/@zoralabs/coins/src/interfaces/IUpgradeableV4Hook.sol","51":"node_modules/@zoralabs/coins/src/interfaces/IWETH.sol","52":"node_modules/@zoralabs/coins/src/interfaces/IZoraHookRegistry.sol","53":"node_modules/@zoralabs/coins/src/interfaces/IZoraLimitOrderBookCoinsInterface.sol","54":"node_modules/@zoralabs/coins/src/interfaces/IZoraV4CoinHook.sol","55":"node_modules/@zoralabs/coins/src/libs/CoinCommon.sol","56":"node_modules/@zoralabs/coins/src/libs/CoinConfigurationVersions.sol","57":"node_modules/@zoralabs/coins/src/libs/CoinConstants.sol","58":"node_modules/@zoralabs/coins/src/libs/DopplerMath.sol","59":"node_modules/@zoralabs/coins/src/libs/UniV4SwapToCurrency.sol","60":"node_modules/@zoralabs/coins/src/libs/V3ToV4SwapLib.sol","61":"node_modules/@zoralabs/coins/src/types/LpPosition.sol","62":"node_modules/@zoralabs/coins/src/types/PoolConfiguration.sol","63":"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol","64":"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol","65":"node_modules/@zoralabs/coins/src/utils/uniswap/FixedPoint96.sol","66":"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol","67":"node_modules/@zoralabs/coins/src/utils/uniswap/LiquidityAmounts.sol","68":"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol","69":"node_modules/@zoralabs/coins/src/utils/uniswap/SqrtPriceMath.sol","70":"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol","71":"node_modules/@zoralabs/coins/src/utils/uniswap/UnsafeMath.sol","72":"node_modules/@zoralabs/shared-contracts/src/interfaces/IVersionedContract.sol","73":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/ISwapRouter.sol","74":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/IUniswapV3SwapCallback.sol","75":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/BytesLib.sol","76":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/Path.sol","77":"src/IZoraLimitOrderBook.sol","78":"src/ZoraLimitOrderBook.sol","79":"src/access/PermittedCallers.sol","80":"src/libs/LimitOrderBitmap.sol","81":"src/libs/LimitOrderCommon.sol","82":"src/libs/LimitOrderCreate.sol","83":"src/libs/LimitOrderFill.sol","84":"src/libs/LimitOrderLiquidity.sol","85":"src/libs/LimitOrderQueues.sol","86":"src/libs/LimitOrderStorage.sol","87":"src/libs/LimitOrderTypes.sol","88":"src/libs/LimitOrderViews.sol","89":"src/libs/LimitOrderWithdraw.sol","90":"src/libs/Permit2Payments.sol","91":"src/libs/SwapLimitOrders.sol","92":"src/router/SwapWithLimitOrders.sol","93":"src/version/ContractVersionBase.sol"},"language":"Solidity"}
@@ -66,6 +66,13 @@ export const swapWithLimitOrdersABI = [
66
66
  outputs: [],
67
67
  stateMutability: 'nonpayable',
68
68
  },
69
+ {
70
+ type: 'function',
71
+ inputs: [],
72
+ name: 'contractVersion',
73
+ outputs: [{ name: '', internalType: 'string', type: 'string' }],
74
+ stateMutability: 'pure',
75
+ },
69
76
  {
70
77
  type: 'function',
71
78
  inputs: [],
@@ -431,6 +438,13 @@ export const zoraLimitOrderBookABI = [
431
438
  outputs: [{ name: '', internalType: 'uint256', type: 'uint256' }],
432
439
  stateMutability: 'view',
433
440
  },
441
+ {
442
+ type: 'function',
443
+ inputs: [],
444
+ name: 'contractVersion',
445
+ outputs: [{ name: '', internalType: 'string', type: 'string' }],
446
+ stateMutability: 'pure',
447
+ },
434
448
  {
435
449
  type: 'function',
436
450
  inputs: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zoralabs/limit-orders",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -34,7 +34,7 @@
34
34
  "tsup": "^7.2.0",
35
35
  "tsx": "^3.13.0",
36
36
  "typescript": "^5.2.2",
37
- "viem": "^2.21.18",
37
+ "viem": "2.22.12",
38
38
  "@zoralabs/shared-contracts": "^0.0.5",
39
39
  "@zoralabs/shared-scripts": "^0.0.0",
40
40
  "@zoralabs/coins": "^2.5.0",
@@ -21,8 +21,9 @@ import {LimitOrderWithdraw} from "./libs/LimitOrderWithdraw.sol";
21
21
  import {LimitOrderViews} from "./libs/LimitOrderViews.sol";
22
22
  import {LimitOrderTypes} from "./libs/LimitOrderTypes.sol";
23
23
  import {PermittedCallers} from "./access/PermittedCallers.sol";
24
+ import {ContractVersionBase} from "./version/ContractVersionBase.sol";
24
25
 
25
- contract ZoraLimitOrderBook is IZoraLimitOrderBook, PermittedCallers {
26
+ contract ZoraLimitOrderBook is IZoraLimitOrderBook, ContractVersionBase, PermittedCallers {
26
27
  IPoolManager public immutable poolManager;
27
28
  IDeployedCoinVersionLookup public immutable zoraCoinVersionLookup;
28
29
  IZoraHookRegistry public immutable zoraHookRegistry;
@@ -38,6 +39,8 @@ contract ZoraLimitOrderBook is IZoraLimitOrderBook, PermittedCallers {
38
39
  zoraCoinVersionLookup = IDeployedCoinVersionLookup(zoraCoinVersionLookup_);
39
40
  zoraHookRegistry = IZoraHookRegistry(zoraHookRegistry_);
40
41
  weth = weth_;
42
+
43
+ LimitOrderStorage.layout().maxFillCount = 50;
41
44
  }
42
45
 
43
46
  /// @inheritdoc IZoraLimitOrderBook
@@ -18,7 +18,6 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
18
18
 
19
19
  import {IZoraLimitOrderBook} from "../IZoraLimitOrderBook.sol";
20
20
  import {SwapLimitOrders, LimitOrderConfig, Orders} from "../libs/SwapLimitOrders.sol";
21
- import {ISetLimitOrderConfig} from "./ISetLimitOrderConfig.sol";
22
21
  import {ISwapRouter} from "@zoralabs/shared-contracts/interfaces/uniswap/ISwapRouter.sol";
23
22
  import {ISupportsLimitOrderFill} from "@zoralabs/coins/src/interfaces/ISupportsLimitOrderFill.sol";
24
23
  import {IMsgSender} from "@zoralabs/coins/src/interfaces/IMsgSender.sol";
@@ -29,6 +28,7 @@ import {V3ToV4SwapLib} from "@zoralabs/coins/src/libs/V3ToV4SwapLib.sol";
29
28
  import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
30
29
  import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
31
30
  import {IAllowanceTransfer} from "permit2/src/interfaces/IAllowanceTransfer.sol";
31
+ import {ContractVersionBase} from "../version/ContractVersionBase.sol";
32
32
 
33
33
  /// @title SwapWithLimitOrders
34
34
  /// @notice Standalone router contract that executes swaps with automatic limit order placement and filling.
@@ -37,7 +37,7 @@ import {IAllowanceTransfer} from "permit2/src/interfaces/IAllowanceTransfer.sol"
37
37
  /// Users call swapWithLimitOrders() directly, which triggers the unlock callback flow.
38
38
  /// Uses Permit2 for token approvals, matching the universal-router pattern.
39
39
  /// @author oveddan
40
- contract SwapWithLimitOrders is ISetLimitOrderConfig, Ownable2Step, IMsgSender {
40
+ contract SwapWithLimitOrders is ContractVersionBase, Ownable2Step, IMsgSender {
41
41
  using SafeERC20 for IERC20;
42
42
  using BalanceDeltaLibrary for BalanceDelta;
43
43
  using CurrencyLibrary for Currency;
@@ -0,0 +1,14 @@
1
+ // This file is automatically generated by code; do not manually update
2
+ // SPDX-License-Identifier: MIT
3
+ pragma solidity ^0.8.23;
4
+
5
+ import {IVersionedContract} from "@zoralabs/shared-contracts/interfaces/IVersionedContract.sol";
6
+
7
+ /// @title ContractVersionBase
8
+ /// @notice Base contract for versioning contracts
9
+ contract ContractVersionBase is IVersionedContract {
10
+ /// @notice The version of the contract
11
+ function contractVersion() external pure override returns (string memory) {
12
+ return "0.2.6";
13
+ }
14
+ }
@@ -332,9 +332,15 @@ contract LimitOrderAccessControlTest is BaseTest {
332
332
  payable(address(limitOrderBook)).transfer(1 wei);
333
333
  }
334
334
 
335
+ // Test: maxFillCount defaults to 50 after construction
336
+ function test_maxFillCount_defaultsTo50() public {
337
+ // Max fill count should be initialized to 50 in constructor
338
+ assertEq(limitOrderBook.getMaxFillCount(), 50);
339
+ }
340
+
335
341
  // Test: setMaxFillCount - owner can set
336
342
  function test_setMaxFillCount_ownerCanSet() public {
337
- // Initially max fill count should be 50 (set in BaseTest)
343
+ // Initially max fill count should be 50 (set in constructor)
338
344
  assertEq(limitOrderBook.getMaxFillCount(), 50);
339
345
 
340
346
  // Owner (this contract) should be able to set it
@@ -350,7 +356,7 @@ contract LimitOrderAccessControlTest is BaseTest {
350
356
  vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableUnauthorizedAccount.selector, unauthorizedUser));
351
357
  limitOrderBook.setMaxFillCount(20);
352
358
 
353
- // Verify value hasn't changed (still 50 from BaseTest)
359
+ // Verify value hasn't changed (still 50 from constructor)
354
360
  assertEq(limitOrderBook.getMaxFillCount(), 50);
355
361
  }
356
362
 
package/AUDIT_RFP.md DELETED
@@ -1,408 +0,0 @@
1
- # Zora Protocol Limit Orders (aka "Autosell") - Audit Scope Document
2
-
3
- **Version**: 1.2
4
- **Date**: 2025-12-12
5
- **Branch**: `autosell`
6
- **Purpose**: Audit scope and technical reference for engaged auditors
7
-
8
- ---
9
-
10
- ## Executive Summary
11
-
12
- Zora has implemented a limit orders system that enables users to create onchain
13
- orders that automatically execute when Uniswap V4 pool prices reach
14
- predetermined ticks. This document provides complete scope, technical analysis,
15
- and security considerations for the audit engagement.
16
-
17
- **Scope**: ~2,758 lines of Solidity across 16 new files
18
- **Focus Areas**: Linked list integrity, epoch-based execution isolation, bitmap optimization, access control
19
- **Ideal Auditor Profile**: Strong familiarity with DeFi protocols and Uniswap V4 architecture (liquidity positions, hook patterns, unlock callbacks, transient storage)
20
-
21
- ---
22
-
23
- ## Technical Architecture Reference
24
-
25
- **Supporting docs**
26
-
27
- - [`README.md`](./README.md) — architecture, diagrams, execution paths
28
- - [`SPEC.md`](./SPEC.md) — normative behavior and invariants (“what must be true”)
29
- - [`AUDIT_NOTES.md`](./AUDIT_NOTES.md) — threat model + audit checklist
30
-
31
- This RFP focuses on audit scope, security considerations, and deliverables.
32
-
33
- ---
34
-
35
- ## Quick Navigation
36
-
37
- ### Part 1: Audit Scope & Process
38
-
39
- - [Audit Scope](#part-1-audit-scope) - What's in/out of scope
40
- - [Areas of Technical Complexity](#areas-of-technical-complexity) - Implementation details
41
- - [Audit Deliverables](#audit-deliverables)
42
- - [Timeline & Process](#timeline-and-process)
43
- - [Clarifications Needed](#clarifications-needed)
44
-
45
- ### Part 2: Technical Implementation
46
-
47
- - [File Structure](#file-structure) - All 15 files documented
48
- - [Data Structures](#data-structures) - LimitOrder, Queue, Order IDs
49
- - [Storage Organization](#storage-organization) - Storage layout
50
- - [External Functions](#external-functions) - create, fill, withdraw
51
-
52
- ### Part 3: Additional Information
53
-
54
- - [Known Limitations](#known-limitations)
55
-
56
- ---
57
-
58
- # PART 1: AUDIT SCOPE
59
-
60
- ## Overview
61
-
62
- _For detailed architecture, see [README: Overview](./README.md#1-overview) and [Limit Orders Architecture](./README.md#3-limit-orders-architecture-overview)_
63
-
64
- The limit orders system allows users to:
65
-
66
- 1. **Create orders** by adding Uniswap V4 liquidity positions across a one-tick-spacing range
67
- 2. **Fill orders** automatically when pool price crosses into the order's range
68
- 3. **Withdraw orders** by cancelling specific orders by ID and withdrawing the resulting funds to a recipient.
69
- - The call cancels orders in the order provided until `minAmountOut` is reached (or cancels all provided orders if `minAmountOut == 0`).
70
- - Cancellation is whole-order only (no proportional/partial cancellation).
71
-
72
- **Key Innovation**: Implements limit orders as single-sided Uniswap V4 liquidity positions, providing a completely native onchain approach that keeps liquidity in the pools for improved trading. Uses linked list queues, bitmap optimization, and epoch-based execution isolation for efficient order matching.
73
-
74
- ## In-Scope Contracts
75
-
76
- ### Primary Package: `packages/limit-orders/src/`
77
-
78
- #### Core Contracts (2 files, ~418 LOC)
79
-
80
- **ZoraLimitOrderBook.sol** (229 lines)
81
-
82
- - Main contract implementing the order book
83
- - Manages pool manager unlock/callback patterns
84
- - Delegates to library contracts for execution
85
- - Access control via SimpleAccessManaged
86
-
87
- **IZoraLimitOrderBook.sol** (189 lines)
88
-
89
- - Public API interface and event definitions
90
- - 3 callback types: CREATE, FILL, WITHDRAW_ORDERS
91
- - 21 error types for validation
92
- - Data structure definitions for callbacks
93
-
94
- #### Access Control (2 files, ~345 LOC)
95
-
96
- **access/SimpleAccessManaged.sol** (76 lines)
97
-
98
- - Lightweight fork of OpenZeppelin's [AccessManaged](https://docs.openzeppelin.com/contracts/5.x/api/access#AccessManaged) contract, reduced in complexity to minimize code size
99
- - Uses the same security architecture (authority-based permissions via `IAuthority.canCall()`)
100
- - Removes time-based permissions methodology (no delays, no scheduled operations)
101
- - Controls `create()` and `setMaxFillCount()` functions
102
-
103
- **access/SimpleAccessManager.sol** (268 lines)
104
-
105
- - Full role-based access manager implementation
106
- - Provides complete `IAuthority` interface implementation
107
- - Supports role-based permissions with admin delegation
108
- - `PUBLIC_ROLE` support for unrestricted functions
109
- - Function selector mapping to specific roles
110
-
111
- #### Type Definitions & Storage (2 files, ~79 LOC)
112
-
113
- **LimitOrderTypes.sol** (44 lines)
114
-
115
- - OrderStatus enum: INACTIVE, OPEN, FILLED
116
- - LimitOrder struct (224 bytes / 7 storage slots with linked list pointers)
117
- - Queue struct (96 bytes / 3 storage slots with head/tail/length/balance)
118
-
119
- **LimitOrderStorage.sol** (35 lines)
120
-
121
- - Storage slot derived from `keccak256("zora.limit.order.book.storage")`
122
- - Storage slot: `0x98b43bb10ca7bc310641b07883d9e14c04b3983640df6b07dd1c99d10a3c6cec`
123
- - Layout with 6 mappings for orders, queues, epochs, bitmaps, nonces, and maker balances
124
-
125
- #### Order Lifecycle Libraries (3 files, ~722 LOC)
126
-
127
- **LimitOrderCreate.sol** (277 lines)
128
-
129
- - Order creation with validation
130
- - Calls `poolManager.modifyLiquidity()` with positive `liquidityDelta` to add liquidity
131
- - Manages callback data and execution
132
- - Handles residual amount refunds
133
- - Implementation details: Input validation, liquidity calculations, nonce management
134
-
135
- **LimitOrderFill.sol** (345 lines)
136
-
137
- - Core fill execution logic
138
- - Epoch-based execution isolation mechanism
139
- - Two fill modes: tick range-based and order ID-based
140
- - Bitmap-based tick iteration optimization
141
- - Assembly optimizations in tight loops
142
- - Implementation details: Epoch checks, bitmap manipulation, linked list traversal
143
-
144
- **LimitOrderWithdraw.sol** (100 lines)
145
-
146
- - Cancellation and withdrawal logic
147
- - Order-specific withdrawal (cancels provided order ids sequentially until `minAmountOut` is reached)
148
- - Burns liquidity and issues refunds
149
- - Implementation details: Owner validation, balance accounting, liquidity burning
150
-
151
- #### Support Libraries (6 files, ~648 LOC)
152
-
153
- **LimitOrderCommon.sol** (91 lines)
154
-
155
- - Order metadata extraction helpers
156
- - Records orders in queues and bitmaps
157
- - Removes orders from queues and bitmaps
158
- - Tick determination logic
159
-
160
- **LimitOrderQueues.sol** (101 lines)
161
-
162
- - Linked list implementation
163
- - Single tick queue system
164
- - Operations: enqueue, unlink, clearLinks
165
- - Direct storage slot manipulation for gas optimization
166
- - Implementation details: Linked list integrity, concurrent modifications
167
-
168
- **LimitOrderBitmap.sol** (84 lines)
169
-
170
- - Bitmap management for tick activation tracking
171
- - Sets/clears bits when ticks become active/inactive
172
- - `getExecutableTicks()` for efficient range queries
173
- - Implementation details: Bit manipulation correctness, boundary conditions
174
-
175
- **LimitOrderLiquidity.sol** (222 lines)
176
-
177
- - Uniswap V4 liquidity management
178
- - Helper functions for adding liquidity during order creation (`_mintLiquidity()`)
179
- - Removes liquidity during fills/cancels (`burnAndPayout()`, `burnAndRefund()`)
180
- - Handles fee distribution and swap paths
181
- - Supports alternative payout currencies
182
- - Implementation details: Liquidity calculations, fee distribution, swap execution
183
-
184
- **SwapLimitOrders.sol** (209 lines)
185
-
186
- - Configuration for automatic order creation post-swap
187
- - Validates multiples and percentages
188
- - Computes order ladders from price multiples
189
- - Square root math for price alignment
190
-
191
- **Permit2Payments.sol** (41 lines)
192
-
193
- - Abstract contract for Permit2 token transfers
194
- - Based on Uniswap's universal-router module
195
- - Enables gasless token approvals
196
-
197
- #### Router Contract (1 file, ~454 LOC)
198
-
199
- _See [README: SwapWithLimitOrders Router](./README.md#2-swapwithlimitorders-router) for detailed architecture_
200
-
201
- **router/SwapWithLimitOrders.sol** (454 lines)
202
-
203
- - Standalone router for combined operations
204
- - Executes V3→V4 swaps + order creation + fills
205
- - Implements pool manager callback pattern
206
- - Attempts to fill orders if price crosses
207
-
208
- ### Integration Points: `packages/coins/src/`
209
-
210
- _For Zora Coins platform architecture, see [README: Coins Platform Architecture](./README.md#2-coins-platform-architecture)_
211
-
212
- #### Modified Hook Contract
213
-
214
- **hooks/ZoraV4CoinHook.sol** (modifications only)
215
-
216
- - Integration point for automatic limit order fills during swaps
217
- - Calls `limitOrderBook.fill()` in `afterSwap` hook
218
- - Passes fill referral information
219
-
220
- **Related Support Libraries**:
221
-
222
- - `libs/V3ToV4SwapLib.sol` - V3 migration support
223
- - `libs/CoinRewardsV4.sol` - Reward distribution
224
-
225
- ## Out-of-Scope
226
-
227
- ### Explicitly Excluded
228
-
229
- **Deployment Scripts**:
230
-
231
- - `packages/coins/src/deployment/CoinsDeployerBase.sol`
232
- - All files in `script/` directories across all packages
233
- - All deployment infrastructure and tooling
234
-
235
- **Test Files**:
236
-
237
- - All files in `test/` directories (except as behavioral reference)
238
- - Test utilities and mocks
239
-
240
- **Legacy Code**:
241
-
242
- - `legacy/` directory contents
243
- - Deprecated contracts from previous versions
244
-
245
- **Documentation & Tooling**:
246
-
247
- - `docs/` and `nft-docs/` directories
248
- - Build scripts and configuration files
249
- - SDK packages (`coins-sdk`, `protocol-deployments`)
250
-
251
- **External Dependencies** (auditing the dependencies themselves is out of scope, but integration risks are a key focus):
252
-
253
- - Uniswap V4 core contracts (`@uniswap/v4-core`) - **Integration analysis is critical**: how we interact with pool manager, liquidity operations, unlock callbacks, and balance settlements
254
- - OpenZeppelin contracts (`@openzeppelin/contracts`) - Used for IAuthority, IERC20, SafeERC20, TransientSlot
255
-
256
- **Critical Integration Patterns to Audit**:
257
-
258
- We are particularly interested in identifying risks in how our code interacts with Uniswap V4:
259
-
260
- - **Unlock callback patterns**: nested unlock handling when orders are created during fills (see `LimitOrderCreate.sol:44`), potential reentrancy through callbacks, unlock state verification
261
- - **Liquidity position management**: salt-based position isolation using orderIds as salts (see `LimitOrderCreate.sol:200`, `LimitOrderLiquidity.sol:64`), tick range calculations, liquidity delta correctness
262
- - **Balance accounting**: settle/take/sync patterns (see `LimitOrderLiquidity.sol`), currency delta tracking via `TransientStateLibrary.currencyDelta`, ETH vs ERC20 handling
263
- - **Transient storage usage**: `isUnlocked` checks for access control (see `ZoraLimitOrderBook.sol:90`), currency delta reading for settlement verification
264
- - **Position lifecycle**: `modifyLiquidity` calls with positive delta (mint) and negative delta (burn), fee accumulation via `feesDelta` and distribution to makers/referrals
265
-
266
- ## Areas of Technical Complexity
267
-
268
- **Linked List Implementation** ([`LimitOrderQueues.sol`](src/libs/LimitOrderQueues.sol), [`LimitOrderCommon.sol`](src/libs/LimitOrderCommon.sol)) - See [README: Tick Queue System](./README.md#tick-queue-system): Tick-based linked lists enable O(1) insertion/removal when order ID is known. Orders are indexed by `(poolKeyHash, coin, tick)` for efficient fill operations.
269
-
270
- **Epoch-Based Execution Isolation** ([`LimitOrderFill.sol`](src/libs/LimitOrderFill.sol), [`LimitOrderStorage.sol`](src/libs/LimitOrderStorage.sol)) - See [README: Epoch-Based Protection](./README.md#epoch-based-protection): Orders cannot be filled in the same epoch they were created. Each pool maintains an independent epoch counter (uint256) that increments at the start of each fill. Orders store uint32 createdEpoch and are skipped if `createdEpoch >= currentEpoch`. This ensures orders created during fill execution wait for the next fill operation.
271
-
272
- **Bitmap Optimization** ([`LimitOrderBitmap.sol`](src/libs/LimitOrderBitmap.sol), [`LimitOrderCommon.sol`](src/libs/LimitOrderCommon.sol)) - See [README: Tick Discovery](./README.md#tick-discovery-bitmap-implementation): Active ticks tracked via bitmap structure for gas-efficient iteration. One bitmap per (poolKeyHash, coin) combination with word-based storage (256 ticks per uint256). Uses Uniswap's TickBitmap library for word-boundary traversal.
273
-
274
- **Access Control** ([`SimpleAccessManaged.sol`](src/access/SimpleAccessManaged.sol)) - See [README: Access Control](./README.md#access-control-via-simpleaccessmanaged): Lightweight fork of OpenZeppelin's [AccessManaged](https://docs.openzeppelin.com/contracts/5.x/api/access#AccessManaged) that removes time-based permissions. Protects `create()` and `setMaxFillCount()` via authority contract's `canCall()` interface. Fill operations have additional restrictions during pool unlock (only registered hooks).
275
-
276
- **Liquidity Management** ([`LimitOrderLiquidity.sol`](src/libs/LimitOrderLiquidity.sol), [`LimitOrderCreate.sol`](src/libs/LimitOrderCreate.sol), [`LimitOrderWithdraw.sol`](src/libs/LimitOrderWithdraw.sol)) - See [README: Single-Sided Liquidity](./README.md#single-sided-liquidity): Orders implemented as Uniswap V4 liquidity positions across one-tick-spacing ranges using orderID as salt. Supports ERC20 and ETH, alternative payout currencies via swap paths, residual refunds, and fee distribution to makers/referrals.
277
-
278
- **Unlock Callback Pattern** ([`ZoraLimitOrderBook.sol`](src/ZoraLimitOrderBook.sol)) - See [README: Component Interaction Flows](./README.md#component-interaction-flows): All state-changing operations occur within Uniswap V4's unlock callback mechanism. Three callback types: CREATE, FILL, WITHDRAW_ORDERS. All balance changes must be settled atomically before unlock completes.
279
-
280
- **Token Accounting** ([`LimitOrderLiquidity.sol`](src/libs/LimitOrderLiquidity.sol)) - See [README: Component Interaction Flows](./README.md#component-interaction-flows): Handles ERC20 and native ETH transfers through pool manager's sync/settle/take pattern with balance verification before and after transfers.
281
-
282
- **Gas Optimization** ([`LimitOrderFill.sol`](src/libs/LimitOrderFill.sol)): `maxFillCount` parameter limits orders processed per call. Bitmap optimization skips empty ticks. Assembly optimizations in hot loops. Multiple fill calls may be needed for large queues (100+ orders).
283
-
284
- **Security Model** - See [README: Security Model & Guarantees](./README.md#5-security-model--guarantees): Documents protocol security guarantees, actor analysis, admin capabilities/limitations, and why `create()` is access controlled.
285
-
286
- **DOS Prevention** - See [README: Gas Limits & DOS Prevention](./README.md#6-gas-limits--dos-prevention): Details on `maxFillCount` parameter, gas analysis from testing, and Fusaka/future hard fork considerations.
287
-
288
- **Fill Execution Paths** - See [README: Fill Execution Paths](./README.md#4-fill-execution-paths): Documents the three distinct fill paths (auto-fill from hook, router fill, third-party fill), hook migration requirements, and universal Uniswap V4 compatibility.
289
-
290
- ## Code Statistics
291
-
292
- **Solidity Code**:
293
-
294
- - Core implementation: ~2,758 lines
295
- - Primary contract: 220 lines
296
- - Libraries: ~1,689 lines
297
- - Interface: 195 lines
298
- - Access control: 344 lines (SimpleAccessManaged + SimpleAccessManager)
299
- - Router: 454 lines
300
-
301
- **Test Files**: 6 test contracts in `packages/limit-orders/test/`
302
-
303
- **Modified Existing Code**:
304
-
305
- - ZoraV4CoinHook.sol: ~50-100 lines modified for integration
306
- - Supporting libraries: TBD based on actual changes
307
-
308
- **Note for Auditors**: Understanding the integration points will require familiarity with the existing Zora Coins protocol architecture (hooks, reward distribution, coin versioning). Auditors should account for time to review relevant portions of `packages/coins/` in their proposals.
309
-
310
- ## Audit Deliverables
311
-
312
- We are looking for a comprehensive security assessment that includes:
313
-
314
- - **Security findings** with severity classifications, impact analysis, and remediation recommendations
315
- - **Integration risk assessment** focusing on Uniswap V4 interactions and Zora Coins protocol integration
316
- - **Code quality analysis** including gas optimization opportunities and best practices
317
- - **Testing artifacts** such as custom test cases, fuzzing results, or static analysis outputs developed during the audit
318
-
319
- ---
320
-
321
- # PART 2: TECHNICAL IMPLEMENTATION
322
-
323
- ## File Structure
324
-
325
- ### Complete Package Organization
326
-
327
- ```
328
- packages/limit-orders/src/
329
- ├── ZoraLimitOrderBook.sol (220 lines) - Main contract
330
- ├── IZoraLimitOrderBook.sol (195 lines) - Interface
331
- ├── access/
332
- │ ├── SimpleAccessManaged.sol (76 lines) - Access control base
333
- │ └── SimpleAccessManager.sol (268 lines) - Role-based access manager
334
- ├── libs/
335
- │ ├── LimitOrderCreate.sol (277 lines) - Creation logic
336
- │ ├── LimitOrderFill.sol (345 lines) - Fill logic (MOST COMPLEX)
337
- │ ├── LimitOrderWithdraw.sol (100 lines) - Withdrawal logic
338
- │ ├── LimitOrderStorage.sol (34 lines) - Storage layout
339
- │ ├── LimitOrderTypes.sol (41 lines) - Type definitions
340
- │ ├── LimitOrderCommon.sol (91 lines) - Common utilities
341
- │ ├── LimitOrderQueues.sol (101 lines) - Linked list ops
342
- │ ├── LimitOrderBitmap.sol (84 lines) - Bitmap tracking
343
- │ ├── LimitOrderLiquidity.sol (222 lines) - Liquidity management
344
- │ ├── SwapLimitOrders.sol (209 lines) - Config helper
345
- │ └── Permit2Payments.sol (41 lines) - Permit2 support
346
- └── router/
347
- └── SwapWithLimitOrders.sol (454 lines) - Router contract
348
- ```
349
-
350
- ## Data Structures
351
-
352
- For detailed documentation of data structures (LimitOrder struct, Queue struct, OrderStatus enum) and the tick queue system, see the [README.md](./README.md#tick-queue-system).
353
-
354
- **Order ID Generation**: Deterministic hash of `keccak256(abi.encode(poolKeyHash, coin, tick, maker, nonce))` where nonce increments per maker.
355
- (_Implementation detail_: `LimitOrderCreate.sol` hashes 5x 32-byte words, equivalent to `abi.encode(...)` rather than `abi.encodePacked(...)`.)
356
-
357
- **Callback Data Structures** ([`IZoraLimitOrderBook.sol`](src/IZoraLimitOrderBook.sol)): OrderBatch, CreateCallbackData, FillCallbackData, WithdrawOrdersCallbackData
358
-
359
- ## Storage Organization
360
-
361
- Uses diamond storage pattern at slot `0x98b43bb10ca7bc310641b07883d9e14c04b3983640df6b07dd1c99d10a3c6cec`. For details on storage layout and the diamond pattern implementation, see [`LimitOrderStorage.sol`](src/libs/LimitOrderStorage.sol) and [README.md](./README.md#diamond-storage-pattern).
362
-
363
- ## External Functions
364
-
365
- _See [README: Order Creation Flow](./README.md#order-creation-flow) and [Withdrawal Flow](./README.md#withdrawal-flow) for detailed interaction diagrams_
366
-
367
- See [`IZoraLimitOrderBook.sol`](src/IZoraLimitOrderBook.sol) for full signatures and documentation.
368
-
369
- **`create()`** ([ZoraLimitOrderBook.sol:73-82](src/ZoraLimitOrderBook.sol#L73-L82)): Creates new limit order(s) by adding liquidity via `poolManager.modifyLiquidity()`. Requires authorization via SimpleAccessManaged. Generates order IDs, records in queues, sets bitmap bits, handles residual refunds.
370
-
371
- **`fill()` - Range-based** ([ZoraLimitOrderBook.sol:85-127](src/ZoraLimitOrderBook.sol#L85-L127)): Fills orders within a tick range. Anyone can call; restricted to registered hooks during pool unlock. Bumps epoch, traverses bitmap for active ticks, processes orders, burns liquidity, distributes payouts.
372
-
373
- **`fill()` - Order-specific** ([ZoraLimitOrderBook.sol:129-142](src/ZoraLimitOrderBook.sol#L129-L142)): Fills specific orders by ID. Operates on explicit order ID batches.
374
-
375
- **`withdraw()`** ([ZoraLimitOrderBook.sol:141-147](src/ZoraLimitOrderBook.sol#L141-L147)): Cancel specific orders by ID. Takes `orderIds`, `coin`, `minAmountOut`, and `recipient` parameters. Validates ownership and status, burns liquidity, issues refunds.
376
-
377
- ---
378
-
379
- # PART 3: ADDITIONAL INFORMATION
380
-
381
- ## Known Limitations
382
-
383
- 1. **Multi-block scenarios**: Epochs only prevent same-transaction, not cross-block
384
- 2. **Gas Limits**: Large queues (100s/1000s of orders) may need multiple fills
385
- 3. **No Partial Fills**: Orders fill completely or not at all
386
- 4. **Tick Spacing**: Limited by pool's tick spacing
387
-
388
- ---
389
-
390
- # CONCLUSION
391
-
392
- The Zora Limit Orders implementation uses sophisticated data structures (linked lists, bitmaps) to provide an onchain order book integrated with Uniswap V4.
393
-
394
- ## Next Steps for Auditors
395
-
396
- 1. Review this document and supporting docs ([README.md](./README.md), [SPEC.md](./SPEC.md), [AUDIT_NOTES.md](./AUDIT_NOTES.md))
397
- 2. Familiarize yourself with Uniswap V4 architecture if needed
398
- 3. Begin review with code hotspots identified in [AUDIT_NOTES.md](./AUDIT_NOTES.md#1-code-hotspots-fast-path)
399
- 4. Submit questions or clarifications as needed
400
-
401
- ---
402
-
403
- **Document Version**: 1.2
404
- **Last Updated**: 2025-12-12
405
- **Based On**: Actual implementation in `packages/limit-orders/`
406
- **Branch**: `autosell`
407
-
408
- For questions or clarifications, please contact [Will Binns](mailto:will.binns@ourzora.com).
@@ -1,27 +0,0 @@
1
- [
2
- {
3
- "type": "function",
4
- "name": "setLimitOrderConfig",
5
- "inputs": [
6
- {
7
- "name": "config",
8
- "type": "tuple",
9
- "internalType": "struct LimitOrderConfig",
10
- "components": [
11
- {
12
- "name": "multiples",
13
- "type": "uint256[]",
14
- "internalType": "uint256[]"
15
- },
16
- {
17
- "name": "percentages",
18
- "type": "uint256[]",
19
- "internalType": "uint256[]"
20
- }
21
- ]
22
- }
23
- ],
24
- "outputs": [],
25
- "stateMutability": "nonpayable"
26
- }
27
- ]