@zoralabs/limit-orders 0.2.0 → 0.2.1

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 (84) hide show
  1. package/.turbo/turbo-build$colon$js.log +47 -45
  2. package/CHANGELOG.md +61 -0
  3. package/abis/IWETH.json +118 -0
  4. package/abis/IZoraLimitOrderBook.json +5 -0
  5. package/abis/LimitOrderLiquidity.json +7 -0
  6. package/abis/LimitOrderViews.json +62 -0
  7. package/abis/SwapWithLimitOrders.json +18 -11
  8. package/abis/ZoraLimitOrderBook.json +28 -0
  9. package/cache/solidity-files-cache.json +1 -1
  10. package/dist/index.cjs +29 -8
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +29 -8
  13. package/dist/index.js.map +1 -1
  14. package/dist/wagmiGenerated.d.ts +37 -9
  15. package/dist/wagmiGenerated.d.ts.map +1 -1
  16. package/out/BytesLib.sol/BytesLib.json +1 -1
  17. package/out/CoinCommon.sol/CoinCommon.json +1 -1
  18. package/out/CoinConfigurationVersions.sol/CoinConfigurationVersions.json +1 -1
  19. package/out/CoinConstants.sol/CoinConstants.json +1 -1
  20. package/out/DopplerMath.sol/DopplerMath.json +1 -1
  21. package/out/FixedPoint96.sol/FixedPoint96.json +1 -1
  22. package/out/ISwapRouter.sol/ISwapRouter.json +1 -1
  23. package/out/IUniswapV3SwapCallback.sol/IUniswapV3SwapCallback.json +1 -1
  24. package/out/IWETH.sol/IWETH.json +1 -0
  25. package/out/IZoraHookRegistry.sol/IZoraHookRegistry.json +1 -1
  26. package/out/IZoraLimitOrderBook.sol/IZoraLimitOrderBook.json +1 -1
  27. package/out/IZoraLimitOrderBookCoinsInterface.sol/IZoraLimitOrderBookCoinsInterface.json +1 -1
  28. package/out/IZoraV4CoinHook.sol/IZoraV4CoinHook.json +1 -1
  29. package/out/LimitOrderBitmap.sol/LimitOrderBitmap.json +1 -1
  30. package/out/LimitOrderCommon.sol/LimitOrderCommon.json +1 -1
  31. package/out/LimitOrderCreate.sol/LimitOrderCreate.json +1 -1
  32. package/out/LimitOrderFill.sol/LimitOrderFill.json +1 -1
  33. package/out/LimitOrderLiquidity.sol/LimitOrderLiquidity.json +1 -1
  34. package/out/LimitOrderQueues.sol/LimitOrderQueues.json +1 -1
  35. package/out/LimitOrderStorage.sol/LimitOrderStorage.json +1 -1
  36. package/out/LimitOrderTypes.sol/LimitOrderTypes.json +1 -1
  37. package/out/LimitOrderViews.sol/LimitOrderViews.json +1 -0
  38. package/out/LimitOrderWithdraw.sol/LimitOrderWithdraw.json +1 -1
  39. package/out/LiquidityAmounts.sol/LiquidityAmounts.json +1 -1
  40. package/out/Path.sol/Path.json +1 -1
  41. package/out/Permit2Payments.sol/Permit2Payments.json +1 -1
  42. package/out/SimpleAccessManaged.sol/SimpleAccessManaged.json +1 -1
  43. package/out/SimpleAccessManager.sol/SimpleAccessManager.json +1 -1
  44. package/out/SqrtPriceMath.sol/SqrtPriceMath.json +1 -1
  45. package/out/SwapLimitOrders.sol/SwapLimitOrders.json +1 -1
  46. package/out/SwapWithLimitOrders.sol/SwapWithLimitOrders.json +1 -1
  47. package/out/UniV4SwapToCurrency.sol/UniV4SwapToCurrency.json +1 -1
  48. package/out/UnsafeMath.sol/UnsafeMath.json +1 -1
  49. package/out/V3ToV4SwapLib.sol/V3ToV4SwapLib.json +1 -1
  50. package/out/ZoraLimitOrderBook.sol/ZoraLimitOrderBook.json +1 -1
  51. package/out/build-info/{69718f10d1dc37f0.json → 876cc09bc44cc8a7.json} +1 -1
  52. package/out/uniswap/BitMath.sol/BitMath.json +1 -1
  53. package/out/uniswap/CustomRevert.sol/CustomRevert.json +1 -1
  54. package/out/uniswap/FullMath.sol/FullMath.json +1 -1
  55. package/out/uniswap/SafeCast.sol/SafeCast.json +1 -1
  56. package/out/uniswap/TickMath.sol/TickMath.json +1 -1
  57. package/package/wagmiGenerated.ts +28 -7
  58. package/package.json +1 -1
  59. package/src/IZoraLimitOrderBook.sol +2 -0
  60. package/src/ZoraLimitOrderBook.sol +22 -8
  61. package/src/libs/LimitOrderBitmap.sol +0 -51
  62. package/src/libs/LimitOrderCommon.sol +48 -30
  63. package/src/libs/LimitOrderCreate.sol +5 -18
  64. package/src/libs/LimitOrderFill.sol +32 -161
  65. package/src/libs/LimitOrderLiquidity.sol +92 -71
  66. package/src/libs/LimitOrderViews.sol +168 -0
  67. package/src/libs/LimitOrderWithdraw.sol +13 -4
  68. package/src/libs/SwapLimitOrders.sol +14 -7
  69. package/src/router/SwapWithLimitOrders.sol +40 -26
  70. package/test/LimitOrderBitmap.t.sol +13 -7
  71. package/test/LimitOrderFill.t.sol +43 -0
  72. package/test/LimitOrderLibraries.t.sol +18 -10
  73. package/test/LimitOrderLiquidityPayouts.t.sol +280 -3
  74. package/test/LimitOrderWithdraw.t.sol +28 -1
  75. package/test/SwapWithLimitOrders.t.sol +3 -3
  76. package/test/SwapWithLimitOrdersRouter.t.sol +108 -11
  77. package/test/unit/LimitOrderBitmapUnit.t.sol +0 -134
  78. package/test/unit/LimitOrderCreateUnit.t.sol +32 -0
  79. package/test/unit/SwapLimitOrdersUnit.t.sol +231 -33
  80. package/test/unit/SwapLimitOrdersValidation.t.sol +20 -34
  81. package/test/unit/SwapWithLimitOrdersUnit.t.sol +21 -88
  82. package/test/utils/BaseTest.sol +29 -8
  83. package/test/utils/MockWETH.sol +39 -0
  84. package/test/utils/TestableZoraLimitOrderBook.sol +5 -7
@@ -1 +1 @@
1
- {"id":"69718f10d1dc37f0","source_id_to_path":{"0":"node_modules/@openzeppelin/contracts/access/manager/IAuthority.sol","1":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","2":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","3":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","4":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","5":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","6":"node_modules/@openzeppelin/contracts/utils/Context.sol","7":"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol","8":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","9":"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol","10":"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol","11":"node_modules/@uniswap/permit2/src/libraries/SafeCast160.sol","12":"node_modules/@uniswap/v4-core/src/interfaces/IExtsload.sol","13":"node_modules/@uniswap/v4-core/src/interfaces/IExttload.sol","14":"node_modules/@uniswap/v4-core/src/interfaces/IHooks.sol","15":"node_modules/@uniswap/v4-core/src/interfaces/IPoolManager.sol","16":"node_modules/@uniswap/v4-core/src/interfaces/IProtocolFees.sol","17":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC20Minimal.sol","18":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC6909Claims.sol","19":"node_modules/@uniswap/v4-core/src/libraries/BitMath.sol","20":"node_modules/@uniswap/v4-core/src/libraries/CurrencyReserves.sol","21":"node_modules/@uniswap/v4-core/src/libraries/CustomRevert.sol","22":"node_modules/@uniswap/v4-core/src/libraries/FixedPoint128.sol","23":"node_modules/@uniswap/v4-core/src/libraries/FullMath.sol","24":"node_modules/@uniswap/v4-core/src/libraries/LiquidityMath.sol","25":"node_modules/@uniswap/v4-core/src/libraries/Lock.sol","26":"node_modules/@uniswap/v4-core/src/libraries/NonzeroDeltaCount.sol","27":"node_modules/@uniswap/v4-core/src/libraries/Position.sol","28":"node_modules/@uniswap/v4-core/src/libraries/SafeCast.sol","29":"node_modules/@uniswap/v4-core/src/libraries/StateLibrary.sol","30":"node_modules/@uniswap/v4-core/src/libraries/TickBitmap.sol","31":"node_modules/@uniswap/v4-core/src/libraries/TickMath.sol","32":"node_modules/@uniswap/v4-core/src/libraries/TransientStateLibrary.sol","33":"node_modules/@uniswap/v4-core/src/types/BalanceDelta.sol","34":"node_modules/@uniswap/v4-core/src/types/BeforeSwapDelta.sol","35":"node_modules/@uniswap/v4-core/src/types/Currency.sol","36":"node_modules/@uniswap/v4-core/src/types/PoolId.sol","37":"node_modules/@uniswap/v4-core/src/types/PoolKey.sol","38":"node_modules/@uniswap/v4-core/src/types/PoolOperation.sol","39":"node_modules/@uniswap/v4-periphery/src/libraries/PathKey.sol","40":"node_modules/@zoralabs/coins/src/interfaces/ICoin.sol","41":"node_modules/@zoralabs/coins/src/interfaces/IDeployedCoinVersionLookup.sol","42":"node_modules/@zoralabs/coins/src/interfaces/IDopplerErrors.sol","43":"node_modules/@zoralabs/coins/src/interfaces/IERC7572.sol","44":"node_modules/@zoralabs/coins/src/interfaces/IHasRewardsRecipients.sol","45":"node_modules/@zoralabs/coins/src/interfaces/IMsgSender.sol","46":"node_modules/@zoralabs/coins/src/interfaces/ISupportsLimitOrderFill.sol","47":"node_modules/@zoralabs/coins/src/interfaces/ISwapPathRouter.sol","48":"node_modules/@zoralabs/coins/src/interfaces/ISwapRouter.sol","49":"node_modules/@zoralabs/coins/src/interfaces/IUpgradeableV4Hook.sol","50":"node_modules/@zoralabs/coins/src/interfaces/IZoraHookRegistry.sol","51":"node_modules/@zoralabs/coins/src/interfaces/IZoraLimitOrderBookCoinsInterface.sol","52":"node_modules/@zoralabs/coins/src/interfaces/IZoraV4CoinHook.sol","53":"node_modules/@zoralabs/coins/src/libs/CoinCommon.sol","54":"node_modules/@zoralabs/coins/src/libs/CoinConfigurationVersions.sol","55":"node_modules/@zoralabs/coins/src/libs/CoinConstants.sol","56":"node_modules/@zoralabs/coins/src/libs/DopplerMath.sol","57":"node_modules/@zoralabs/coins/src/libs/UniV4SwapToCurrency.sol","58":"node_modules/@zoralabs/coins/src/libs/V3ToV4SwapLib.sol","59":"node_modules/@zoralabs/coins/src/types/LpPosition.sol","60":"node_modules/@zoralabs/coins/src/types/PoolConfiguration.sol","61":"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol","62":"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol","63":"node_modules/@zoralabs/coins/src/utils/uniswap/FixedPoint96.sol","64":"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol","65":"node_modules/@zoralabs/coins/src/utils/uniswap/LiquidityAmounts.sol","66":"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol","67":"node_modules/@zoralabs/coins/src/utils/uniswap/SqrtPriceMath.sol","68":"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol","69":"node_modules/@zoralabs/coins/src/utils/uniswap/UnsafeMath.sol","70":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/ISwapRouter.sol","71":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/IUniswapV3SwapCallback.sol","72":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/BytesLib.sol","73":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/Path.sol","74":"src/IZoraLimitOrderBook.sol","75":"src/ZoraLimitOrderBook.sol","76":"src/access/SimpleAccessManaged.sol","77":"src/access/SimpleAccessManager.sol","78":"src/libs/LimitOrderBitmap.sol","79":"src/libs/LimitOrderCommon.sol","80":"src/libs/LimitOrderCreate.sol","81":"src/libs/LimitOrderFill.sol","82":"src/libs/LimitOrderLiquidity.sol","83":"src/libs/LimitOrderQueues.sol","84":"src/libs/LimitOrderStorage.sol","85":"src/libs/LimitOrderTypes.sol","86":"src/libs/LimitOrderWithdraw.sol","87":"src/libs/Permit2Payments.sol","88":"src/libs/SwapLimitOrders.sol","89":"src/router/SwapWithLimitOrders.sol"},"language":"Solidity"}
1
+ {"id":"876cc09bc44cc8a7","source_id_to_path":{"0":"node_modules/@openzeppelin/contracts/access/manager/IAuthority.sol","1":"node_modules/@openzeppelin/contracts/interfaces/IERC1363.sol","2":"node_modules/@openzeppelin/contracts/interfaces/IERC165.sol","3":"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol","4":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","5":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","6":"node_modules/@openzeppelin/contracts/utils/Context.sol","7":"node_modules/@openzeppelin/contracts/utils/TransientSlot.sol","8":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","9":"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol","10":"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol","11":"node_modules/@uniswap/permit2/src/libraries/SafeCast160.sol","12":"node_modules/@uniswap/v4-core/src/interfaces/IExtsload.sol","13":"node_modules/@uniswap/v4-core/src/interfaces/IExttload.sol","14":"node_modules/@uniswap/v4-core/src/interfaces/IHooks.sol","15":"node_modules/@uniswap/v4-core/src/interfaces/IPoolManager.sol","16":"node_modules/@uniswap/v4-core/src/interfaces/IProtocolFees.sol","17":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC20Minimal.sol","18":"node_modules/@uniswap/v4-core/src/interfaces/external/IERC6909Claims.sol","19":"node_modules/@uniswap/v4-core/src/libraries/BitMath.sol","20":"node_modules/@uniswap/v4-core/src/libraries/CurrencyReserves.sol","21":"node_modules/@uniswap/v4-core/src/libraries/CustomRevert.sol","22":"node_modules/@uniswap/v4-core/src/libraries/FixedPoint128.sol","23":"node_modules/@uniswap/v4-core/src/libraries/FullMath.sol","24":"node_modules/@uniswap/v4-core/src/libraries/LiquidityMath.sol","25":"node_modules/@uniswap/v4-core/src/libraries/Lock.sol","26":"node_modules/@uniswap/v4-core/src/libraries/NonzeroDeltaCount.sol","27":"node_modules/@uniswap/v4-core/src/libraries/Position.sol","28":"node_modules/@uniswap/v4-core/src/libraries/SafeCast.sol","29":"node_modules/@uniswap/v4-core/src/libraries/StateLibrary.sol","30":"node_modules/@uniswap/v4-core/src/libraries/TickBitmap.sol","31":"node_modules/@uniswap/v4-core/src/libraries/TickMath.sol","32":"node_modules/@uniswap/v4-core/src/libraries/TransientStateLibrary.sol","33":"node_modules/@uniswap/v4-core/src/types/BalanceDelta.sol","34":"node_modules/@uniswap/v4-core/src/types/BeforeSwapDelta.sol","35":"node_modules/@uniswap/v4-core/src/types/Currency.sol","36":"node_modules/@uniswap/v4-core/src/types/PoolId.sol","37":"node_modules/@uniswap/v4-core/src/types/PoolKey.sol","38":"node_modules/@uniswap/v4-core/src/types/PoolOperation.sol","39":"node_modules/@uniswap/v4-periphery/src/libraries/PathKey.sol","40":"node_modules/@zoralabs/coins/src/interfaces/ICoin.sol","41":"node_modules/@zoralabs/coins/src/interfaces/IDeployedCoinVersionLookup.sol","42":"node_modules/@zoralabs/coins/src/interfaces/IDopplerErrors.sol","43":"node_modules/@zoralabs/coins/src/interfaces/IERC7572.sol","44":"node_modules/@zoralabs/coins/src/interfaces/IHasRewardsRecipients.sol","45":"node_modules/@zoralabs/coins/src/interfaces/IMsgSender.sol","46":"node_modules/@zoralabs/coins/src/interfaces/ISupportsLimitOrderFill.sol","47":"node_modules/@zoralabs/coins/src/interfaces/ISwapPathRouter.sol","48":"node_modules/@zoralabs/coins/src/interfaces/ISwapRouter.sol","49":"node_modules/@zoralabs/coins/src/interfaces/IUpgradeableV4Hook.sol","50":"node_modules/@zoralabs/coins/src/interfaces/IWETH.sol","51":"node_modules/@zoralabs/coins/src/interfaces/IZoraHookRegistry.sol","52":"node_modules/@zoralabs/coins/src/interfaces/IZoraLimitOrderBookCoinsInterface.sol","53":"node_modules/@zoralabs/coins/src/interfaces/IZoraV4CoinHook.sol","54":"node_modules/@zoralabs/coins/src/libs/CoinCommon.sol","55":"node_modules/@zoralabs/coins/src/libs/CoinConfigurationVersions.sol","56":"node_modules/@zoralabs/coins/src/libs/CoinConstants.sol","57":"node_modules/@zoralabs/coins/src/libs/DopplerMath.sol","58":"node_modules/@zoralabs/coins/src/libs/UniV4SwapToCurrency.sol","59":"node_modules/@zoralabs/coins/src/libs/V3ToV4SwapLib.sol","60":"node_modules/@zoralabs/coins/src/types/LpPosition.sol","61":"node_modules/@zoralabs/coins/src/types/PoolConfiguration.sol","62":"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol","63":"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol","64":"node_modules/@zoralabs/coins/src/utils/uniswap/FixedPoint96.sol","65":"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol","66":"node_modules/@zoralabs/coins/src/utils/uniswap/LiquidityAmounts.sol","67":"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol","68":"node_modules/@zoralabs/coins/src/utils/uniswap/SqrtPriceMath.sol","69":"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol","70":"node_modules/@zoralabs/coins/src/utils/uniswap/UnsafeMath.sol","71":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/ISwapRouter.sol","72":"node_modules/@zoralabs/shared-contracts/src/interfaces/uniswap/IUniswapV3SwapCallback.sol","73":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/BytesLib.sol","74":"node_modules/@zoralabs/shared-contracts/src/libs/UniswapV3/Path.sol","75":"src/IZoraLimitOrderBook.sol","76":"src/ZoraLimitOrderBook.sol","77":"src/access/SimpleAccessManaged.sol","78":"src/access/SimpleAccessManager.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/SwapWithLimitOrders.sol"},"language":"Solidity"}
@@ -1 +1 @@
1
- {"abi":[],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"414:2420:61:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"414:2420:61:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Solady (https://github.com/Vectorized/solady/blob/8200a70e8dc2a77ecb074fc2e99a2a0d36547522/src/utils/LibBit.sol)\",\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/BitMath.solThis library provides functionality for computing bit properties of an unsigned integer\",\"kind\":\"dev\",\"methods\":{},\"title\":\"BitMath\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol\":\"BitMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol\":{\"keccak256\":\"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070\",\"dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol":"BitMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol":{"keccak256":"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d","urls":["bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070","dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN"],"license":"MIT"}},"version":1},"id":61}
1
+ {"abi":[],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"414:2420:62:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"414:2420:62:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Solady (https://github.com/Vectorized/solady/blob/8200a70e8dc2a77ecb074fc2e99a2a0d36547522/src/utils/LibBit.sol)\",\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/BitMath.solThis library provides functionality for computing bit properties of an unsigned integer\",\"kind\":\"dev\",\"methods\":{},\"title\":\"BitMath\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol\":\"BitMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol\":{\"keccak256\":\"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070\",\"dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol":"BitMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol":{"keccak256":"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d","urls":["bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070","dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN"],"license":"MIT"}},"version":1},"id":62}
@@ -1 +1 @@
1
- {"abi":[{"type":"error","name":"WrappedError","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"},{"name":"reason","type":"bytes","internalType":"bytes"},{"name":"details","type":"bytes","internalType":"bytes"}]}],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"622:4550:62:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"622:4550:62:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"details\",\"type\":\"bytes\"}],\"name\":\"WrappedError\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/CustomRevert.solTo use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with `CustomError.selector.revertWith()`The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately\",\"errors\":{\"WrappedError(address,bytes4,bytes,bytes)\":[{\"details\":\"ERC-7751 error for wrapping bubbled up reverts\"}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"Library for reverting with custom errors efficiently\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Contains functions for reverting with custom errors with different argument types efficiently\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":\"CustomRevert\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":{\"keccak256\":\"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a\",\"dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bytes","name":"reason","type":"bytes"},{"internalType":"bytes","name":"details","type":"bytes"}],"type":"error","name":"WrappedError"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":"CustomRevert"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":{"keccak256":"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4","urls":["bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a","dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU"],"license":"MIT"}},"version":1},"id":62}
1
+ {"abi":[{"type":"error","name":"WrappedError","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"selector","type":"bytes4","internalType":"bytes4"},{"name":"reason","type":"bytes","internalType":"bytes"},{"name":"details","type":"bytes","internalType":"bytes"}]}],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"622:4550:63:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"622:4550:63:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"details\",\"type\":\"bytes\"}],\"name\":\"WrappedError\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/CustomRevert.solTo use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with `CustomError.selector.revertWith()`The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately\",\"errors\":{\"WrappedError(address,bytes4,bytes,bytes)\":[{\"details\":\"ERC-7751 error for wrapping bubbled up reverts\"}]},\"kind\":\"dev\",\"methods\":{},\"title\":\"Library for reverting with custom errors efficiently\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Contains functions for reverting with custom errors with different argument types efficiently\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":\"CustomRevert\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":{\"keccak256\":\"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a\",\"dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"bytes","name":"reason","type":"bytes"},{"internalType":"bytes","name":"details","type":"bytes"}],"type":"error","name":"WrappedError"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":"CustomRevert"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":{"keccak256":"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4","urls":["bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a","dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU"],"license":"MIT"}},"version":1},"id":63}
@@ -1 +1 @@
1
- {"abi":[],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"471:5108:64:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"471:5108:64:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/FullMath.solHandles \\\"phantom overflow\\\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Contains 512-bit math functions\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol\":\"FullMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol\":{\"keccak256\":\"0xc6b0d61b8d60acb295d196a72f81e577007e822f63c737ae0fa87d63e228f074\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://643ddf8897f3d2610ce5ac45c0571e86cd2a97542c2599121fa39a06daa95509\",\"dweb:/ipfs/QmZ74RCf31apWy8UukKUrFi98kgSK6sRH68MFMGudPVpqx\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol":"FullMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol":{"keccak256":"0xc6b0d61b8d60acb295d196a72f81e577007e822f63c737ae0fa87d63e228f074","urls":["bzz-raw://643ddf8897f3d2610ce5ac45c0571e86cd2a97542c2599121fa39a06daa95509","dweb:/ipfs/QmZ74RCf31apWy8UukKUrFi98kgSK6sRH68MFMGudPVpqx"],"license":"MIT"}},"version":1},"id":64}
1
+ {"abi":[],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"471:5108:65:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"471:5108:65:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/FullMath.solHandles \\\"phantom overflow\\\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Contains 512-bit math functions\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol\":\"FullMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol\":{\"keccak256\":\"0xc6b0d61b8d60acb295d196a72f81e577007e822f63c737ae0fa87d63e228f074\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://643ddf8897f3d2610ce5ac45c0571e86cd2a97542c2599121fa39a06daa95509\",\"dweb:/ipfs/QmZ74RCf31apWy8UukKUrFi98kgSK6sRH68MFMGudPVpqx\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol":"FullMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/FullMath.sol":{"keccak256":"0xc6b0d61b8d60acb295d196a72f81e577007e822f63c737ae0fa87d63e228f074","urls":["bzz-raw://643ddf8897f3d2610ce5ac45c0571e86cd2a97542c2599121fa39a06daa95509","dweb:/ipfs/QmZ74RCf31apWy8UukKUrFi98kgSK6sRH68MFMGudPVpqx"],"license":"MIT"}},"version":1},"id":65}
@@ -1 +1 @@
1
- {"abi":[{"type":"error","name":"SafeCastOverflow","inputs":[]}],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"318:2067:66:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"318:2067:66:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"SafeCastOverflow\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/SafeCast.sol\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Safe casting methods\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Contains methods for safely casting between types\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol\":\"SafeCast\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":{\"keccak256\":\"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a\",\"dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU\"]},\"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol\":{\"keccak256\":\"0x5ec831c0fbdcb16091d35eee2e49d54eaadf7ce72d971aec9ea30f379cba258a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9440106f4a5ff5d829ed68c82de4f92e171c4e9306e89d28fe75b4ca30b5f298\",\"dweb:/ipfs/QmdLJitnGXNMZxG6XZxhvCMjoNEKzpZVJ2dnzGVXtWUSFf\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"SafeCastOverflow"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol":"SafeCast"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":{"keccak256":"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4","urls":["bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a","dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU"],"license":"MIT"},"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol":{"keccak256":"0x5ec831c0fbdcb16091d35eee2e49d54eaadf7ce72d971aec9ea30f379cba258a","urls":["bzz-raw://9440106f4a5ff5d829ed68c82de4f92e171c4e9306e89d28fe75b4ca30b5f298","dweb:/ipfs/QmdLJitnGXNMZxG6XZxhvCMjoNEKzpZVJ2dnzGVXtWUSFf"],"license":"MIT"}},"version":1},"id":66}
1
+ {"abi":[{"type":"error","name":"SafeCastOverflow","inputs":[]}],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"318:2067:67:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"318:2067:67:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"SafeCastOverflow\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/SafeCast.sol\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Safe casting methods\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Contains methods for safely casting between types\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol\":\"SafeCast\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":{\"keccak256\":\"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a\",\"dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU\"]},\"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol\":{\"keccak256\":\"0x5ec831c0fbdcb16091d35eee2e49d54eaadf7ce72d971aec9ea30f379cba258a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9440106f4a5ff5d829ed68c82de4f92e171c4e9306e89d28fe75b4ca30b5f298\",\"dweb:/ipfs/QmdLJitnGXNMZxG6XZxhvCMjoNEKzpZVJ2dnzGVXtWUSFf\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"SafeCastOverflow"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol":"SafeCast"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":{"keccak256":"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4","urls":["bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a","dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU"],"license":"MIT"},"node_modules/@zoralabs/coins/src/utils/uniswap/SafeCast.sol":{"keccak256":"0x5ec831c0fbdcb16091d35eee2e49d54eaadf7ce72d971aec9ea30f379cba258a","urls":["bzz-raw://9440106f4a5ff5d829ed68c82de4f92e171c4e9306e89d28fe75b4ca30b5f298","dweb:/ipfs/QmdLJitnGXNMZxG6XZxhvCMjoNEKzpZVJ2dnzGVXtWUSFf"],"license":"MIT"}},"version":1},"id":67}
@@ -1 +1 @@
1
- {"abi":[{"type":"error","name":"InvalidSqrtPrice","inputs":[{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"}]},{"type":"error","name":"InvalidTick","inputs":[{"name":"tick","type":"int24","internalType":"int24"}]}],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"498:12100:68:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"498:12100:68:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"}],\"name\":\"InvalidSqrtPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"tick\",\"type\":\"int24\"}],\"name\":\"InvalidTick\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/TickMath.sol\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"MAX_SQRT_PRICE\":{\"details\":\"The maximum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MAX_TICK)\"},\"MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE\":{\"details\":\"A threshold used for optimized bounds check, equals `MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1`\"},\"MAX_TICK\":{\"details\":\"The maximum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**128If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\"},\"MAX_TICK_SPACING\":{\"details\":\"The maximum tick spacing value drawn from the range of type int16, i.e. max from the range [1, 32767]\"},\"MIN_SQRT_PRICE\":{\"details\":\"The minimum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MIN_TICK)\"},\"MIN_TICK\":{\"details\":\"The minimum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**-128If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\"},\"MIN_TICK_SPACING\":{\"details\":\"The minimum tick spacing value drawn from the range of type int16 that is greater than 0, i.e. min from the range [1, 32767]\"}},\"title\":\"Math library for computing sqrt prices from ticks and vice versa\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidSqrtPrice(uint160)\":[{\"notice\":\"Thrown when the price passed to #getTickAtSqrtPrice does not correspond to a price between MIN_TICK and MAX_TICK\"}],\"InvalidTick(int24)\":[{\"notice\":\"Thrown when the tick passed to #getSqrtPriceAtTick is not between MIN_TICK and MAX_TICK\"}]},\"kind\":\"user\",\"methods\":{},\"notice\":\"Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports prices between 2**-128 and 2**128\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol\":\"TickMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol\":{\"keccak256\":\"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070\",\"dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN\"]},\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":{\"keccak256\":\"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a\",\"dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU\"]},\"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol\":{\"keccak256\":\"0xb8d86efe55d877582bdd2d2580d5c57c0fd955fdfb08116dba033f2e8f429e2e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://997e7fc24b30ff5464a5d3db14ac17eb07bed862bbce553a060f38affd8cb6f7\",\"dweb:/ipfs/QmfQ8bo8zEGT6NEDVRdWJaCWaAXMoH7eH8xz14XA1p4Ex3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"}],"type":"error","name":"InvalidSqrtPrice"},{"inputs":[{"internalType":"int24","name":"tick","type":"int24"}],"type":"error","name":"InvalidTick"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol":"TickMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol":{"keccak256":"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d","urls":["bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070","dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN"],"license":"MIT"},"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":{"keccak256":"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4","urls":["bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a","dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU"],"license":"MIT"},"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol":{"keccak256":"0xb8d86efe55d877582bdd2d2580d5c57c0fd955fdfb08116dba033f2e8f429e2e","urls":["bzz-raw://997e7fc24b30ff5464a5d3db14ac17eb07bed862bbce553a060f38affd8cb6f7","dweb:/ipfs/QmfQ8bo8zEGT6NEDVRdWJaCWaAXMoH7eH8xz14XA1p4Ex3"],"license":"MIT"}},"version":1},"id":68}
1
+ {"abi":[{"type":"error","name":"InvalidSqrtPrice","inputs":[{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"}]},{"type":"error","name":"InvalidTick","inputs":[{"name":"tick","type":"int24","internalType":"int24"}]}],"bytecode":{"object":"0x6080806040523460175760039081601c823930815050f35b5f80fdfe5f80fd","sourceMap":"498:12100:69:-:0;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x5f80fd","sourceMap":"498:12100:69:-:0;;","linkReferences":{}},"methodIdentifiers":{},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"}],\"name\":\"InvalidSqrtPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"tick\",\"type\":\"int24\"}],\"name\":\"InvalidTick\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"https://github.com/Uniswap/v4-core/blob/80311e34080fee64b6fc6c916e9a51a437d0e482/src/libraries/TickMath.sol\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"MAX_SQRT_PRICE\":{\"details\":\"The maximum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MAX_TICK)\"},\"MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE\":{\"details\":\"A threshold used for optimized bounds check, equals `MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1`\"},\"MAX_TICK\":{\"details\":\"The maximum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**128If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\"},\"MAX_TICK_SPACING\":{\"details\":\"The maximum tick spacing value drawn from the range of type int16, i.e. max from the range [1, 32767]\"},\"MIN_SQRT_PRICE\":{\"details\":\"The minimum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MIN_TICK)\"},\"MIN_TICK\":{\"details\":\"The minimum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**-128If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\"},\"MIN_TICK_SPACING\":{\"details\":\"The minimum tick spacing value drawn from the range of type int16 that is greater than 0, i.e. min from the range [1, 32767]\"}},\"title\":\"Math library for computing sqrt prices from ticks and vice versa\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidSqrtPrice(uint160)\":[{\"notice\":\"Thrown when the price passed to #getTickAtSqrtPrice does not correspond to a price between MIN_TICK and MAX_TICK\"}],\"InvalidTick(int24)\":[{\"notice\":\"Thrown when the tick passed to #getSqrtPriceAtTick is not between MIN_TICK and MAX_TICK\"}]},\"kind\":\"user\",\"methods\":{},\"notice\":\"Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports prices between 2**-128 and 2**128\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol\":\"TickMath\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":100},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/\",\":@uniswap/v4-core/=node_modules/@uniswap/v4-core/\",\":@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/\",\":@zoralabs/coins/=node_modules/@zoralabs/coins/\",\":@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":permit2/src/=node_modules/@uniswap/permit2/src/\",\":solady/=node_modules/solady/src/\",\":solmate/=node_modules/solmate/src/\"],\"viaIR\":true},\"sources\":{\"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol\":{\"keccak256\":\"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070\",\"dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN\"]},\"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol\":{\"keccak256\":\"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a\",\"dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU\"]},\"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol\":{\"keccak256\":\"0xb8d86efe55d877582bdd2d2580d5c57c0fd955fdfb08116dba033f2e8f429e2e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://997e7fc24b30ff5464a5d3db14ac17eb07bed862bbce553a060f38affd8cb6f7\",\"dweb:/ipfs/QmfQ8bo8zEGT6NEDVRdWJaCWaAXMoH7eH8xz14XA1p4Ex3\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"}],"type":"error","name":"InvalidSqrtPrice"},{"inputs":[{"internalType":"int24","name":"tick","type":"int24"}],"type":"error","name":"InvalidTick"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/=node_modules/@openzeppelin/","@uniswap/universal-router/contracts/=node_modules/@uniswap/universal-router/contracts/","@uniswap/v4-core/=node_modules/@uniswap/v4-core/","@uniswap/v4-periphery/=node_modules/@uniswap/v4-periphery/","@zoralabs/coins/=node_modules/@zoralabs/coins/","@zoralabs/shared-contracts/=node_modules/@zoralabs/shared-contracts/src/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","permit2/src/=node_modules/@uniswap/permit2/src/","solady/=node_modules/solady/src/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":100},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol":"TickMath"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"node_modules/@zoralabs/coins/src/utils/uniswap/BitMath.sol":{"keccak256":"0x4b5411b3868695776c707738846c79a2dd96bf2fd29e5fe8a47818cd20e1a19d","urls":["bzz-raw://3d9016ed3d9902f455ce8aba6cb4e29d7cb47e5af555de00bb802d7f01566070","dweb:/ipfs/QmeHZHQsXkuCN3i1YAt9WayYTTWWtNz5F8R1EspyEER2JN"],"license":"MIT"},"node_modules/@zoralabs/coins/src/utils/uniswap/CustomRevert.sol":{"keccak256":"0x5c17fced6eedcacc452d65842bb5904bd26b8a72a7973a2d6fac0167700328d4","urls":["bzz-raw://07044645057353591b0e9f03e0c6802d225307963b45f443c082bce0738c0c2a","dweb:/ipfs/QmWPo2kbp4jkm6CETwPjpqhdVgeA3EfJAtF1SVZMGbf8xU"],"license":"MIT"},"node_modules/@zoralabs/coins/src/utils/uniswap/TickMath.sol":{"keccak256":"0xb8d86efe55d877582bdd2d2580d5c57c0fd955fdfb08116dba033f2e8f429e2e","urls":["bzz-raw://997e7fc24b30ff5464a5d3db14ac17eb07bed862bbce553a060f38affd8cb6f7","dweb:/ipfs/QmfQ8bo8zEGT6NEDVRdWJaCWaAXMoH7eH8xz14XA1p4Ex3"],"license":"MIT"}},"version":1},"id":69}
@@ -238,12 +238,6 @@ export const swapWithLimitOrdersABI = [
238
238
  ],
239
239
  indexed: false,
240
240
  },
241
- {
242
- name: 'delta',
243
- internalType: 'BalanceDelta',
244
- type: 'int256',
245
- indexed: false,
246
- },
247
241
  {
248
242
  name: 'tickBeforeSwap',
249
243
  internalType: 'int24',
@@ -256,6 +250,24 @@ export const swapWithLimitOrdersABI = [
256
250
  type: 'int24',
257
251
  indexed: false,
258
252
  },
253
+ {
254
+ name: 'amount0',
255
+ internalType: 'int128',
256
+ type: 'int128',
257
+ indexed: false,
258
+ },
259
+ {
260
+ name: 'amount1',
261
+ internalType: 'int128',
262
+ type: 'int128',
263
+ indexed: false,
264
+ },
265
+ {
266
+ name: 'sqrtPriceX96',
267
+ internalType: 'uint160',
268
+ type: 'uint160',
269
+ indexed: false,
270
+ },
259
271
  {
260
272
  name: 'orders',
261
273
  internalType: 'struct SwapWithLimitOrders.CreatedOrder[]',
@@ -271,7 +283,6 @@ export const swapWithLimitOrdersABI = [
271
283
  name: 'SwapWithLimitOrdersExecuted',
272
284
  },
273
285
  { type: 'error', inputs: [], name: 'EmptyV4Route' },
274
- { type: 'error', inputs: [], name: 'FromAddressIsNotOwner' },
275
286
  {
276
287
  type: 'error',
277
288
  inputs: [
@@ -315,6 +326,7 @@ export const zoraLimitOrderBookABI = [
315
326
  },
316
327
  { name: 'zoraHookRegistry_', internalType: 'address', type: 'address' },
317
328
  { name: 'authority_', internalType: 'address', type: 'address' },
329
+ { name: 'weth_', internalType: 'address', type: 'address' },
318
330
  ],
319
331
  stateMutability: 'nonpayable',
320
332
  },
@@ -460,6 +472,13 @@ export const zoraLimitOrderBookABI = [
460
472
  outputs: [{ name: '', internalType: 'bytes', type: 'bytes' }],
461
473
  stateMutability: 'nonpayable',
462
474
  },
475
+ {
476
+ type: 'function',
477
+ inputs: [],
478
+ name: 'weth',
479
+ outputs: [{ name: '', internalType: 'address', type: 'address' }],
480
+ stateMutability: 'view',
481
+ },
463
482
  {
464
483
  type: 'function',
465
484
  inputs: [
@@ -727,11 +746,13 @@ export const zoraLimitOrderBookABI = [
727
746
  { type: 'error', inputs: [], name: 'NotPoolManager' },
728
747
  { type: 'error', inputs: [], name: 'OnlyZoraHook' },
729
748
  { type: 'error', inputs: [], name: 'OrderClosed' },
749
+ { type: 'error', inputs: [], name: 'OrderFillable' },
730
750
  { type: 'error', inputs: [], name: 'OrderNotMaker' },
731
751
  { type: 'error', inputs: [], name: 'PathMustHaveAtLeastOneStep' },
732
752
  { type: 'error', inputs: [], name: 'RouterMsgSenderInvalid' },
733
753
  { type: 'error', inputs: [], name: 'UnknownCallback' },
734
754
  { type: 'error', inputs: [], name: 'UnlockedFillNotAllowed' },
755
+ { type: 'error', inputs: [], name: 'WethTransferFailed' },
735
756
  { type: 'error', inputs: [], name: 'ZeroMaker' },
736
757
  { type: 'error', inputs: [], name: 'ZeroOrderSize' },
737
758
  { type: 'error', inputs: [], name: 'ZeroRealizedOrder' },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zoralabs/limit-orders",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -124,6 +124,8 @@ interface IZoraLimitOrderBook is IZoraLimitOrderBookCoinsInterface {
124
124
  error OrderNotMaker();
125
125
  /// @notice Order is no longer open.
126
126
  error OrderClosed();
127
+ /// @notice Order is fillable and must be filled, not withdrawn.
128
+ error OrderFillable();
127
129
  /// @notice Callback realized zero fills when one was expected.
128
130
  error ZeroRealizedOrder();
129
131
  /// @notice Unlock callback id was not recognized.
@@ -19,17 +19,29 @@ import {LimitOrderStorage} from "./libs/LimitOrderStorage.sol";
19
19
  import {LimitOrderCreate} from "./libs/LimitOrderCreate.sol";
20
20
  import {LimitOrderFill} from "./libs/LimitOrderFill.sol";
21
21
  import {LimitOrderWithdraw} from "./libs/LimitOrderWithdraw.sol";
22
+ import {LimitOrderViews} from "./libs/LimitOrderViews.sol";
22
23
  import {LimitOrderTypes} from "./libs/LimitOrderTypes.sol";
23
24
 
24
25
  contract ZoraLimitOrderBook is IZoraLimitOrderBook, SimpleAccessManaged {
25
26
  IPoolManager public immutable poolManager;
26
27
  IDeployedCoinVersionLookup public immutable zoraCoinVersionLookup;
27
28
  IZoraHookRegistry public immutable zoraHookRegistry;
28
-
29
- constructor(address poolManager_, address zoraCoinVersionLookup_, address zoraHookRegistry_, address authority_) SimpleAccessManaged(authority_) {
29
+ address public immutable weth;
30
+
31
+ constructor(
32
+ address poolManager_,
33
+ address zoraCoinVersionLookup_,
34
+ address zoraHookRegistry_,
35
+ address authority_,
36
+ address weth_
37
+ ) SimpleAccessManaged(authority_) {
30
38
  poolManager = IPoolManager(poolManager_);
31
39
  zoraCoinVersionLookup = IDeployedCoinVersionLookup(zoraCoinVersionLookup_);
32
40
  zoraHookRegistry = IZoraHookRegistry(zoraHookRegistry_);
41
+ if (weth_ == address(0)) {
42
+ revert AddressZero();
43
+ }
44
+ weth = weth_;
33
45
  }
34
46
 
35
47
  function tickQueueBalance(bytes32 poolKeyHash, address coin, int24 tick) internal view returns (uint256) {
@@ -62,7 +74,7 @@ contract ZoraLimitOrderBook is IZoraLimitOrderBook, SimpleAccessManaged {
62
74
  }
63
75
 
64
76
  function getOrderId(bytes32 poolKeyHash, address coin, int24 tick, address maker, uint256 nonce) internal pure returns (bytes32) {
65
- return keccak256(abi.encodePacked(poolKeyHash, coin, tick, maker, nonce));
77
+ return keccak256(abi.encode(poolKeyHash, coin, tick, maker, nonce));
66
78
  }
67
79
 
68
80
  /// @inheritdoc IZoraLimitOrderBook
@@ -79,8 +91,9 @@ contract ZoraLimitOrderBook is IZoraLimitOrderBook, SimpleAccessManaged {
79
91
 
80
92
  /// @inheritdoc IZoraLimitOrderBook
81
93
  function fill(PoolKey calldata key, bool isCurrency0, int24 startTick, int24 endTick, uint256 maxFillCount, address fillReferral) external override {
82
- if (maxFillCount == 0) {
83
- maxFillCount = getMaxFillCount();
94
+ uint256 defaultMaxFillCount = getMaxFillCount();
95
+ if (maxFillCount == 0 || maxFillCount > defaultMaxFillCount) {
96
+ maxFillCount = defaultMaxFillCount;
84
97
  }
85
98
 
86
99
  bool isUnlocked = TransientStateLibrary.isUnlocked(poolManager);
@@ -93,9 +106,9 @@ contract ZoraLimitOrderBook is IZoraLimitOrderBook, SimpleAccessManaged {
93
106
  LimitOrderStorage.Layout storage state = LimitOrderStorage.layout();
94
107
  LimitOrderFill.Context memory ctx = _fillContext();
95
108
 
96
- (PoolKey memory canonicalKey, int24 resolvedStart, int24 resolvedEnd) = LimitOrderFill.validateTickRange(
109
+ (PoolKey memory canonicalKey, int24 resolvedStart, int24 resolvedEnd) = LimitOrderViews.validateTickRange(
97
110
  state,
98
- ctx,
111
+ ctx.poolManager,
99
112
  key,
100
113
  isCurrency0,
101
114
  startTick,
@@ -159,7 +172,7 @@ contract ZoraLimitOrderBook is IZoraLimitOrderBook, SimpleAccessManaged {
159
172
  if (callbackId == CallbackId.FILL) {
160
173
  LimitOrderFill.handleFillCallback(state, _fillContext(), callbackData);
161
174
  } else if (callbackId == CallbackId.WITHDRAW_ORDERS) {
162
- LimitOrderWithdraw.handleWithdrawOrdersCallback(state, poolManager, callbackData);
175
+ LimitOrderWithdraw.handleWithdrawOrdersCallback(state, poolManager, weth, callbackData);
163
176
  } else {
164
177
  revert UnknownCallback();
165
178
  }
@@ -184,6 +197,7 @@ contract ZoraLimitOrderBook is IZoraLimitOrderBook, SimpleAccessManaged {
184
197
  function _fillContext() private view returns (LimitOrderFill.Context memory ctx) {
185
198
  ctx.poolManager = poolManager;
186
199
  ctx.versionLookup = zoraCoinVersionLookup;
200
+ ctx.weth = weth;
187
201
  }
188
202
 
189
203
  function _fillData(
@@ -27,57 +27,6 @@ library LimitOrderBitmap {
27
27
  }
28
28
  }
29
29
 
30
- function getExecutableTicks(
31
- mapping(int16 => uint256) storage bm,
32
- mapping(int24 => LimitOrderTypes.Queue) storage poolQueue,
33
- int24 tickSpacing,
34
- bool zeroForOne,
35
- int24 tickBeforeSwap,
36
- int24 tickAfterSwap
37
- ) internal view returns (int24[] memory) {
38
- uint256 numTicksCrossed = uint256(int256(_abs(tickBeforeSwap - tickAfterSwap)));
39
- uint256 numTicksToCheck = numTicksCrossed / uint256(int256(tickSpacing)) + 1;
40
-
41
- int24[] memory ticksToCheck = new int24[](numTicksToCheck);
42
- uint256 numExecutableTicks;
43
-
44
- int24 targetTick = tickAfterSwap;
45
- int24 currentTick = tickBeforeSwap;
46
-
47
- while (true) {
48
- if (zeroForOne ? currentTick <= targetTick : currentTick >= targetTick) {
49
- break;
50
- }
51
-
52
- (int24 nextInitializedTick, bool initialized) = TickBitmap.nextInitializedTickWithinOneWord(bm, currentTick, tickSpacing, zeroForOne);
53
-
54
- bool crossesTarget = zeroForOne ? nextInitializedTick <= targetTick : nextInitializedTick > targetTick;
55
-
56
- if (crossesTarget) {
57
- nextInitializedTick = targetTick;
58
- initialized = false;
59
- }
60
-
61
- if (initialized) {
62
- if (poolQueue[nextInitializedTick].length > 0) {
63
- ticksToCheck[numExecutableTicks++] = nextInitializedTick;
64
- }
65
- }
66
-
67
- if (nextInitializedTick == targetTick) {
68
- break;
69
- }
70
-
71
- currentTick = zeroForOne ? nextInitializedTick - 1 : nextInitializedTick;
72
- }
73
-
74
- assembly {
75
- mstore(ticksToCheck, numExecutableTicks)
76
- }
77
-
78
- return ticksToCheck;
79
- }
80
-
81
30
  function _abs(int24 x) private pure returns (int24) {
82
31
  return x < 0 ? -x : x;
83
32
  }
@@ -15,12 +15,13 @@ import {LimitOrderStorage} from "./LimitOrderStorage.sol";
15
15
  import {LimitOrderTypes} from "./LimitOrderTypes.sol";
16
16
  import {LimitOrderQueues} from "./LimitOrderQueues.sol";
17
17
  import {LimitOrderBitmap} from "./LimitOrderBitmap.sol";
18
+ import {LimitOrderCreate} from "./LimitOrderCreate.sol";
18
19
 
19
20
  library LimitOrderCommon {
20
- /// @dev Currency0 orders are executed when the price rises to the lower tick.
21
- /// Currency1 orders are executed when the price falls to the upper tick.
21
+ /// @dev Currency0 orders are executed when the price rises to the upper tick.
22
+ /// Currency1 orders are executed when the price falls to the lower tick.
22
23
  function getOrderTick(LimitOrderTypes.LimitOrder storage order) internal view returns (int24) {
23
- return order.isCurrency0 ? order.tickLower : order.tickUpper;
24
+ return order.isCurrency0 ? order.tickUpper : order.tickLower;
24
25
  }
25
26
 
26
27
  function getOrderCoin(PoolKey memory key, bool isCurrency0) internal pure returns (address) {
@@ -29,42 +30,59 @@ library LimitOrderCommon {
29
30
 
30
31
  function recordCreation(
31
32
  LimitOrderStorage.Layout storage state,
32
- PoolKey memory key,
33
- bytes32 poolKeyHash,
34
- bytes32 orderId,
35
- address maker,
36
- address coin,
37
- bool isCurrency0,
33
+ LimitOrderCreate.CreateContext memory ctx,
34
+ LimitOrderCreate.MintParams memory mintParams,
38
35
  int24 orderTick,
39
- int24 currentTick,
40
- uint256 epoch,
41
- uint128 liquidity,
42
- uint128 realizedSize,
43
- int24 tickLower,
44
- int24 tickUpper
36
+ uint128 realizedSize
45
37
  ) internal {
46
- LimitOrderTypes.LimitOrder storage order = state.limitOrders[orderId];
38
+ _initializeOrder(state.limitOrders[mintParams.orderId], ctx, mintParams, realizedSize);
39
+ _addToQueue(state, ctx, mintParams, orderTick, realizedSize);
40
+ _updateMakerBalanceAndEmit(state, ctx, mintParams.orderId, orderTick, realizedSize);
41
+ }
42
+
43
+ function _initializeOrder(
44
+ LimitOrderTypes.LimitOrder storage order,
45
+ LimitOrderCreate.CreateContext memory ctx,
46
+ LimitOrderCreate.MintParams memory mintParams,
47
+ uint128 realizedSize
48
+ ) private {
47
49
  order.orderSize = realizedSize;
48
- order.liquidity = liquidity;
49
- order.tickLower = tickLower;
50
- order.tickUpper = tickUpper;
51
- order.createdEpoch = uint32(epoch);
50
+ order.liquidity = mintParams.liquidity;
51
+ order.tickLower = mintParams.tickLower;
52
+ order.tickUpper = mintParams.tickUpper;
53
+ order.createdEpoch = uint32(ctx.epoch);
52
54
  order.status = LimitOrderTypes.OrderStatus.OPEN;
53
- order.isCurrency0 = isCurrency0;
54
- order.maker = maker;
55
- order.poolKeyHash = poolKeyHash;
55
+ order.isCurrency0 = ctx.isCurrency0;
56
+ order.maker = ctx.maker;
57
+ order.poolKeyHash = ctx.poolKeyHash;
58
+ }
56
59
 
57
- LimitOrderTypes.Queue storage tickQueue = state.tickQueues[poolKeyHash][coin][orderTick];
60
+ function _addToQueue(
61
+ LimitOrderStorage.Layout storage state,
62
+ LimitOrderCreate.CreateContext memory ctx,
63
+ LimitOrderCreate.MintParams memory mintParams,
64
+ int24 orderTick,
65
+ uint128 realizedSize
66
+ ) private {
67
+ LimitOrderTypes.Queue storage tickQueue = state.tickQueues[ctx.poolKeyHash][ctx.coin][orderTick];
58
68
  tickQueue.balance += realizedSize;
59
69
 
60
- LimitOrderBitmap.setIfFirst(state.tickBitmaps[poolKeyHash][coin], orderTick, key.tickSpacing, tickQueue.length);
61
- LimitOrderQueues.enqueue(tickQueue, state.limitOrders, orderId);
70
+ LimitOrderBitmap.setIfFirst(state.tickBitmaps[ctx.poolKeyHash][ctx.coin], orderTick, mintParams.key.tickSpacing, tickQueue.length);
71
+ LimitOrderQueues.enqueue(tickQueue, state.limitOrders, mintParams.orderId);
72
+ }
62
73
 
63
- uint256 newMakerBalance = state.makerBalances[maker][coin] + realizedSize;
64
- state.makerBalances[maker][coin] = newMakerBalance;
74
+ function _updateMakerBalanceAndEmit(
75
+ LimitOrderStorage.Layout storage state,
76
+ LimitOrderCreate.CreateContext memory ctx,
77
+ bytes32 orderId,
78
+ int24 orderTick,
79
+ uint128 realizedSize
80
+ ) private {
81
+ uint256 newMakerBalance = state.makerBalances[ctx.maker][ctx.coin] + realizedSize;
82
+ state.makerBalances[ctx.maker][ctx.coin] = newMakerBalance;
65
83
 
66
- emit IZoraLimitOrderBook.LimitOrderCreated(maker, coin, poolKeyHash, isCurrency0, orderTick, currentTick, realizedSize, orderId);
67
- emit IZoraLimitOrderBook.MakerBalanceUpdated(maker, coin, newMakerBalance);
84
+ emit IZoraLimitOrderBook.LimitOrderCreated(ctx.maker, ctx.coin, ctx.poolKeyHash, ctx.isCurrency0, orderTick, ctx.currentTick, realizedSize, orderId);
85
+ emit IZoraLimitOrderBook.MakerBalanceUpdated(ctx.maker, ctx.coin, newMakerBalance);
68
86
  }
69
87
 
70
88
  function removeOrder(
@@ -17,6 +17,7 @@ import {LimitOrderStorage} from "./LimitOrderStorage.sol";
17
17
  import {IZoraLimitOrderBook} from "../IZoraLimitOrderBook.sol";
18
18
  import {LimitOrderLiquidity} from "./LimitOrderLiquidity.sol";
19
19
  import {LimitOrderCommon} from "./LimitOrderCommon.sol";
20
+ import {LimitOrderViews} from "./LimitOrderViews.sol";
20
21
  import {CoinCommon} from "@zoralabs/coins/src/libs/CoinCommon.sol";
21
22
  import {TransientStateLibrary} from "@uniswap/v4-core/src/libraries/TransientStateLibrary.sol";
22
23
  import {StateLibrary} from "@uniswap/v4-core/src/libraries/StateLibrary.sol";
@@ -71,7 +72,6 @@ library LimitOrderCreate {
71
72
 
72
73
  function handleCreateCallback(LimitOrderStorage.Layout storage state, IPoolManager poolManager, bytes memory payload) internal returns (bytes memory) {
73
74
  IZoraLimitOrderBook.CreateCallbackData memory data = abi.decode(payload, (IZoraLimitOrderBook.CreateCallbackData));
74
- _validateOrderInputs(data.orderSizes, data.orderTicks, data.maker);
75
75
 
76
76
  bytes32[] memory orderIds = _create(state, poolManager, data);
77
77
 
@@ -159,8 +159,10 @@ library LimitOrderCreate {
159
159
  }
160
160
 
161
161
  (int24 tickLower, int24 tickUpper) = _calculateTickRange(ctx.isCurrency0, orderTick, key.tickSpacing);
162
+ // Record the tick where the order becomes fillable
163
+ orderTick = ctx.isCurrency0 ? tickUpper : tickLower;
162
164
 
163
- uint128 liquidity = LimitOrderLiquidity.liquidityForOrder(ctx.isCurrency0, orderSize, tickLower, tickUpper);
165
+ uint128 liquidity = LimitOrderViews.liquidityForOrder(ctx.isCurrency0, orderSize, tickLower, tickUpper);
164
166
  require(liquidity != 0, IZoraLimitOrderBook.ZeroRealizedOrder());
165
167
 
166
168
  orderId = _generateOrderId(ctx.poolKeyHash, ctx.coin, orderTick, ctx.maker, ++state.makerNonces[ctx.maker]);
@@ -212,22 +214,7 @@ library LimitOrderCreate {
212
214
  LimitOrderLiquidity.refundResidual(mintParams.key, ctx.isCurrency0, ctx.maker, refunded);
213
215
  }
214
216
 
215
- LimitOrderCommon.recordCreation(
216
- state,
217
- mintParams.key,
218
- ctx.poolKeyHash,
219
- mintParams.orderId,
220
- ctx.maker,
221
- ctx.coin,
222
- ctx.isCurrency0,
223
- orderTick,
224
- ctx.currentTick,
225
- ctx.epoch,
226
- mintParams.liquidity,
227
- realized,
228
- mintParams.tickLower,
229
- mintParams.tickUpper
230
- );
217
+ LimitOrderCommon.recordCreation(state, ctx, mintParams, orderTick, realized);
231
218
  }
232
219
 
233
220
  function _mintLiquidity(IPoolManager poolManager, bool isCurrency0, MintParams memory params) private returns (uint128 realizedSize, uint128 refunded) {