From 9504e4a697ae6a6926184a013ddbabc76470d1ba Mon Sep 17 00:00:00 2001 From: Lazaro Raul Date: Fri, 7 Aug 2026 20:38:29 +0200 Subject: [PATCH 1/4] feat: Add OrvexCL PancakeInfinity fork to Robinhood Co-Authored-By: Claude Fable 5 --- ...ceHolder_pancakeInfinityVIP_USDT-CAKE.snap | 2 +- ...ceHolder_pancakeInfinityVIP_USDT-WBNB.snap | 2 +- ...ler_metaTxn_pancakeInfinity_USDT-CAKE.snap | 2 +- ...ler_metaTxn_pancakeInfinity_USDT-WBNB.snap | 2 +- .../settler_pancakeInfinityVIP_USDT-CAKE.snap | 2 +- .../settler_pancakeInfinityVIP_USDT-WBNB.snap | 2 +- .../settler_pancakeInfinity_USDT-CAKE.snap | 2 +- .../settler_pancakeInfinity_USDT-WBNB.snap | 2 +- src/chains/Base/Common.sol | 2 +- src/chains/Bnb/Common.sol | 2 +- src/chains/RobinHood/Common.sol | 10 +- src/chains/RobinHood/MetaTxn.sol | 7 +- src/chains/RobinHood/TakerSubmitted.sol | 7 +- src/core/PancakeInfinity.sol | 100 +++++++++++------- src/core/SettlerErrors.sol | 8 ++ src/core/pancakeInfinityForks/OrvexCL.sol | 30 ++++++ .../pancakeInfinityForks/PancakeInfinity.sol | 35 ++++++ test/integration/PancakeInfinity.t.sol | 28 +++-- 18 files changed, 174 insertions(+), 71 deletions(-) create mode 100644 src/core/pancakeInfinityForks/OrvexCL.sol create mode 100644 src/core/pancakeInfinityForks/PancakeInfinity.sol diff --git a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap index 619e621ba..d46eb40f3 100644 --- a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap +++ b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap @@ -1 +1 @@ -585030 \ No newline at end of file +585058 \ No newline at end of file diff --git a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap index 214edc36f..0f44a5354 100644 --- a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap +++ b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap @@ -1 +1 @@ -171654 \ No newline at end of file +171614 \ No newline at end of file diff --git a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap index ef23caa9c..d92a12be6 100644 --- a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap +++ b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap @@ -1 +1 @@ -598543 \ No newline at end of file +598545 \ No newline at end of file diff --git a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap index 64b4b9c0c..7bb941c3f 100644 --- a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap +++ b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap @@ -1 +1 @@ -185828 \ No newline at end of file +185762 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap index 8249207a9..64c0e3090 100644 --- a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap +++ b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap @@ -1 +1 @@ -593537 \ No newline at end of file +593565 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap index dcb9e6d6e..032716eb4 100644 --- a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap +++ b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap @@ -1 +1 @@ -180498 \ No newline at end of file +180458 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap b/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap index 55dc926ce..1a81854d1 100644 --- a/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap +++ b/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap @@ -1 +1 @@ -619881 \ No newline at end of file +619909 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap b/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap index 0b0e81433..cd29fcfc9 100644 --- a/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap +++ b/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap @@ -1 +1 @@ -206841 \ No newline at end of file +206801 \ No newline at end of file diff --git a/src/chains/Base/Common.sol b/src/chains/Base/Common.sol index 413f4c03e..f027207a1 100644 --- a/src/chains/Base/Common.sol +++ b/src/chains/Base/Common.sol @@ -10,7 +10,7 @@ import {UniswapV4} from "../../core/UniswapV4.sol"; import {IPoolManager} from "../../core/UniswapV4Types.sol"; import {EulerSwap, IEVC, IEulerSwap} from "../../core/EulerSwap.sol"; import {BalancerV3} from "../../core/BalancerV3.sol"; -import {PancakeInfinity} from "../../core/PancakeInfinity.sol"; +import {PancakeInfinity} from "../../core/pancakeInfinityForks/PancakeInfinity.sol"; import {Renegade, BASE_SELECTOR} from "../../core/Renegade.sol"; import {Bebop} from "../../core/Bebop.sol"; import {Hanji} from "../../core/Hanji.sol"; diff --git a/src/chains/Bnb/Common.sol b/src/chains/Bnb/Common.sol index f997b8c3f..9b0c20dbd 100644 --- a/src/chains/Bnb/Common.sol +++ b/src/chains/Bnb/Common.sol @@ -9,7 +9,7 @@ import {DodoV1, IDodoV1} from "../../core/DodoV1.sol"; import {DodoV2, IDodoV2} from "../../core/DodoV2.sol"; import {UniswapV4} from "../../core/UniswapV4.sol"; import {IPoolManager} from "../../core/UniswapV4Types.sol"; -import {PancakeInfinity} from "../../core/PancakeInfinity.sol"; +import {PancakeInfinity} from "../../core/pancakeInfinityForks/PancakeInfinity.sol"; import {EulerSwap, IEVC, IEulerSwap} from "../../core/EulerSwap.sol"; import {Bebop} from "../../core/Bebop.sol"; diff --git a/src/chains/RobinHood/Common.sol b/src/chains/RobinHood/Common.sol index b1dc71459..c30e657f3 100644 --- a/src/chains/RobinHood/Common.sol +++ b/src/chains/RobinHood/Common.sol @@ -35,6 +35,7 @@ import {swapHoodV3Factory, swapHoodV3InitHash, swapHoodV3ForkId} from "../../cor import {gigaDexV3Factory, gigaDexV3InitHash, gigaDexV3ForkId} from "../../core/univ3forks/GigaDexV3.sol"; import {IAlgebraCallback} from "../../core/univ3forks/Algebra.sol"; import {ROBINHOOD_POOL_MANAGER} from "../../core/UniswapV4Addresses.sol"; +import {OrvexCL} from "../../core/pancakeInfinityForks/OrvexCL.sol"; import {FastLogic} from "../../utils/FastLogic.sol"; @@ -42,7 +43,7 @@ import {FastLogic} from "../../utils/FastLogic.sol"; import {SettlerSwapAbstract} from "../../SettlerAbstract.sol"; import {Permit2PaymentAbstract} from "../../core/Permit2PaymentAbstract.sol"; -abstract contract RobinHoodMixin is FreeMemory, SettlerBase, UniswapV4, EkuboV3, Hanji { +abstract contract RobinHoodMixin is FreeMemory, SettlerBase, UniswapV4, EkuboV3, Hanji, OrvexCL { using FastLogic for bool; constructor() { @@ -59,7 +60,8 @@ abstract contract RobinHoodMixin is FreeMemory, SettlerBase, UniswapV4, EkuboV3, if (super._dispatch(i, action, data, slippage)) { return true; } else if ((action == uint32(ISettlerActions.UNISWAPV4.selector)) - .or(action == uint32(ISettlerActions.EKUBOV3.selector))) { + .or(action == uint32(ISettlerActions.EKUBOV3.selector)) + .or(action == uint32(ISettlerActions.PANCAKE_INFINITY.selector))) { ( address recipient, IERC20 sellToken, @@ -73,8 +75,10 @@ abstract contract RobinHoodMixin is FreeMemory, SettlerBase, UniswapV4, EkuboV3, if (action == uint32(ISettlerActions.UNISWAPV4.selector)) { sellToUniswapV4(recipient, sellToken, bps, feeOnTransfer, hashMul, hashMod, fills, amountOutMin); - } else { // if (action == uint32(ISettlerActions.EKUBOV3.selector)) + } else if (action == uint32(ISettlerActions.EKUBOV3.selector)) { sellToEkuboV3(recipient, sellToken, bps, feeOnTransfer, hashMul, hashMod, fills, amountOutMin); + } else { // if (action == uint32(ISettlerActions.PANCAKE_INFINITY.selector)) + sellToPancakeInfinity(recipient, sellToken, bps, feeOnTransfer, hashMul, hashMod, fills, amountOutMin); } } else if (action == uint32(ISettlerActions.HANJI.selector)) { ( diff --git a/src/chains/RobinHood/MetaTxn.sol b/src/chains/RobinHood/MetaTxn.sol index 26ee0e61f..56a6d478d 100644 --- a/src/chains/RobinHood/MetaTxn.sol +++ b/src/chains/RobinHood/MetaTxn.sol @@ -32,7 +32,8 @@ contract RobinHoodSettlerMetaTxn is SettlerMetaTxn, RobinHoodMixin { if (super._dispatchVIP(action, data, sig)) { return true; } else if ((action == uint32(ISettlerActions.METATXN_UNISWAPV4_VIP.selector)) - .or(action == uint32(ISettlerActions.METATXN_EKUBOV3_VIP.selector))) { + .or(action == uint32(ISettlerActions.METATXN_EKUBOV3_VIP.selector)) + .or(action == uint32(ISettlerActions.METATXN_PANCAKE_INFINITY_VIP.selector))) { ( address recipient, ISignatureTransfer.PermitTransferFrom memory permit, @@ -47,8 +48,10 @@ contract RobinHoodSettlerMetaTxn is SettlerMetaTxn, RobinHoodMixin { if (action == uint32(ISettlerActions.METATXN_UNISWAPV4_VIP.selector)) { sellToUniswapV4VIP(recipient, feeOnTransfer, hashMul, hashMod, fills, permit, sig, amountOutMin); - } else { // if (action == uint32(ISettlerActions.METATXN_EKUBOV3_VIP.selector)) + } else if (action == uint32(ISettlerActions.METATXN_EKUBOV3_VIP.selector)) { sellToEkuboV3VIP(recipient, feeOnTransfer, hashMul, hashMod, fills, permit, sig, amountOutMin); + } else { // if (action == uint32(ISettlerActions.METATXN_PANCAKE_INFINITY_VIP.selector)) + sellToPancakeInfinityVIP(recipient, feeOnTransfer, hashMul, hashMod, fills, permit, sig, amountOutMin); } } else { return false; diff --git a/src/chains/RobinHood/TakerSubmitted.sol b/src/chains/RobinHood/TakerSubmitted.sol index 04de48c4c..6c6158272 100644 --- a/src/chains/RobinHood/TakerSubmitted.sol +++ b/src/chains/RobinHood/TakerSubmitted.sol @@ -25,7 +25,8 @@ contract RobinHoodSettler is Settler, RobinHoodMixin { if (super._dispatchVIP(action, data)) { return true; } else if ((action == uint32(ISettlerActions.UNISWAPV4_VIP.selector)) - .or(action == uint32(ISettlerActions.EKUBOV3_VIP.selector))) { + .or(action == uint32(ISettlerActions.EKUBOV3_VIP.selector)) + .or(action == uint32(ISettlerActions.PANCAKE_INFINITY_VIP.selector))) { ( address recipient, ISignatureTransfer.PermitTransferFrom memory permit, @@ -41,8 +42,10 @@ contract RobinHoodSettler is Settler, RobinHoodMixin { if (action == uint32(ISettlerActions.UNISWAPV4_VIP.selector)) { sellToUniswapV4VIP(recipient, feeOnTransfer, hashMul, hashMod, fills, permit, sig, amountOutMin); - } else { // if (action == uint32(ISettlerActions.EKUBOV3_VIP.selector)) + } else if (action == uint32(ISettlerActions.EKUBOV3_VIP.selector)) { sellToEkuboV3VIP(recipient, feeOnTransfer, hashMul, hashMod, fills, permit, sig, amountOutMin); + } else { // if (action == uint32(ISettlerActions.PANCAKE_INFINITY_VIP.selector)) + sellToPancakeInfinityVIP(recipient, feeOnTransfer, hashMul, hashMod, fills, permit, sig, amountOutMin); } } else { return false; diff --git a/src/core/PancakeInfinity.sol b/src/core/PancakeInfinity.sol index 0483e0aee..e01c49dec 100644 --- a/src/core/PancakeInfinity.sol +++ b/src/core/PancakeInfinity.sol @@ -37,8 +37,6 @@ interface IPancakeInfinityVault { function lock(bytes calldata data) external returns (bytes memory); } -IPancakeInfinityVault constant VAULT = IPancakeInfinityVault(0x238a358808379702088667322f80aC48bAd5e6c4); - /// @notice Interface for the callback executed when an address locks the vault interface IPancakeInfinityLockCallback { /// @notice Called by the pool manager on `msg.sender` when a lock is acquired @@ -92,9 +90,6 @@ interface IPancakeInfinityCLPoolManager is IPancakeInfinityPoolManager { returns (BalanceDelta delta); } -IPancakeInfinityCLPoolManager constant CL_MANAGER = - IPancakeInfinityCLPoolManager(0xa0FfB9c1CE1Fe56963B0321B32E7A0302114058b); - interface IPancakeInfinityBinPoolManager is IPancakeInfinityPoolManager { /// @notice Peform a swap to a pool /// @param key The pool key @@ -194,10 +189,7 @@ library UnsafePancakeInfinityBinPoolManager { } } -IPancakeInfinityBinPoolManager constant BIN_MANAGER = - IPancakeInfinityBinPoolManager(0xC697d2898e0D09264376196696c51D7aBbbAA4a9); - -abstract contract PancakeInfinity is SettlerSwapAbstract { +abstract contract PancakeInfinityBase is SettlerSwapAbstract { using UnsafeMath for uint256; using UnsafeMath for int256; using Ternary for bool; @@ -214,6 +206,8 @@ abstract contract PancakeInfinity is SettlerSwapAbstract { assert(address(ETH_ADDRESS) == NotesLib.ETH_ADDRESS); } + function _PANCAKE_INFINITY_VAULT() internal pure virtual returns (address vault); + //// How to generate `fills` for Pancake Infinity: //// //// Linearize your DAG of fills by doing a topological sort on the tokens involved. In the @@ -279,7 +273,10 @@ abstract contract PancakeInfinity is SettlerSwapAbstract { amountOutMin ); bytes memory encodedBuyAmount = _setOperatorAndCall( - address(VAULT), data, uint32(IPancakeInfinityLockCallback.lockAcquired.selector), _pancakeInfinityCallback + _PANCAKE_INFINITY_VAULT(), + data, + uint32(IPancakeInfinityLockCallback.lockAcquired.selector), + _pancakeInfinityCallback ); // buyAmount = abi.decode(abi.decode(encodedBuyAmount, (bytes)), (uint256)); assembly ("memory-safe") { @@ -313,7 +310,10 @@ abstract contract PancakeInfinity is SettlerSwapAbstract { amountOutMin ); bytes memory encodedBuyAmount = _setOperatorAndCall( - address(VAULT), data, uint32(IPancakeInfinityLockCallback.lockAcquired.selector), _pancakeInfinityCallback + _PANCAKE_INFINITY_VAULT(), + data, + uint32(IPancakeInfinityLockCallback.lockAcquired.selector), + _pancakeInfinityCallback ); // buyAmount = abi.decode(abi.decode(encodedBuyAmount, (bytes)), (uint256)); assembly ("memory-safe") { @@ -506,33 +506,13 @@ abstract contract PancakeInfinity is SettlerSwapAbstract { Decoder.overflowCheck(data); - if (uint256(poolManagerId) == 0) { - poolKey.poolManager = CL_MANAGER; - - _pancakeInfinitySettleDelta( - state, - IPancakeInfinityCLPoolManager(address(poolKey.poolManager)) - .unsafeSwap(poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData), - zeroForOne - ); - } else if (uint256(poolManagerId) == 1) { - poolKey.poolManager = BIN_MANAGER; - if (amountSpecified >> 127 != amountSpecified >> 128) { - Panic.panic(Panic.ARITHMETIC_OVERFLOW); - } - _pancakeInfinitySettleDelta( - state, - IPancakeInfinityBinPoolManager(address(poolKey.poolManager)) - .unsafeSwap(poolKey, zeroForOne, int128(amountSpecified), hookData), - zeroForOne - ); - } else { - assembly ("memory-safe") { - mstore(0x00, 0x0a9a7da6) // selector for `UnknownPoolManagerId(uint8)` - mstore(0x20, and(0xff, poolManagerId)) - revert(0x1c, 0x24) - } - } + _pancakeInfinitySettleDelta( + state, + _dispatchPancakeInfinity( + poolManagerId, poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData + ), + zeroForOne + ); } } @@ -593,4 +573,48 @@ abstract contract PancakeInfinity is SettlerSwapAbstract { return returndata; } } + + // Each fork mixin in `pancakeInfinityForks/` defines its binding of pool manager IDs to pool + // managers by overriding this function with one that routes each recognized ID to + // `swapToClManager` or `swapToBinManager` with the appropriate pool manager's address, and + // calls `revertUnknownPoolManagerId` otherwise. A fork that lacks one of the pool manager + // types simply omits that route, which also omits the corresponding swap code from the + // compiled contract. + function _dispatchPancakeInfinity( + uint8 poolManagerId, + PoolKey memory poolKey, + bool zeroForOne, + int256 amountSpecified, + uint160 sqrtPriceLimitX96, + bytes calldata hookData + ) internal virtual returns (BalanceDelta); + + function swapToClManager( + address clManager, + PoolKey memory poolKey, + bool zeroForOne, + int256 amountSpecified, + uint160 sqrtPriceLimitX96, + bytes calldata hookData + ) internal returns (BalanceDelta) { + poolKey.poolManager = IPancakeInfinityPoolManager(clManager); + return IPancakeInfinityCLPoolManager(clManager) + .unsafeSwap(poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData); + } + + function swapToBinManager( + address binManager, + PoolKey memory poolKey, + bool zeroForOne, + int256 amountSpecified, + bytes calldata hookData + ) internal returns (BalanceDelta) { + poolKey.poolManager = IPancakeInfinityPoolManager(binManager); + if (amountSpecified >> 127 != amountSpecified >> 128) { + Panic.panic(Panic.ARITHMETIC_OVERFLOW); + } + return + IPancakeInfinityBinPoolManager(binManager) + .unsafeSwap(poolKey, zeroForOne, int128(amountSpecified), hookData); + } } diff --git a/src/core/SettlerErrors.sol b/src/core/SettlerErrors.sol index b7a4ce6d6..891aa9cf8 100644 --- a/src/core/SettlerErrors.sol +++ b/src/core/SettlerErrors.sol @@ -116,6 +116,14 @@ error NotConverged(); /// the list of recognized pool managers. error UnknownPoolManagerId(uint8 poolManagerId); +function revertUnknownPoolManagerId(uint8 poolManagerId) pure { + assembly ("memory-safe") { + mstore(0x00, 0x0a9a7da6) // selector for `UnknownPoolManagerId(uint8)` + mstore(0x20, and(0xff, poolManagerId)) + revert(0x1c, 0x24) + } +} + /// @notice Thrown when the `msg.value` is less than the minimum expected value. error Underpayment(uint256 msgValueMin, uint256 msgValueActual); diff --git a/src/core/pancakeInfinityForks/OrvexCL.sol b/src/core/pancakeInfinityForks/OrvexCL.sol new file mode 100644 index 000000000..01c56701d --- /dev/null +++ b/src/core/pancakeInfinityForks/OrvexCL.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import {PancakeInfinityBase, PoolKey} from "../PancakeInfinity.sol"; +import {BalanceDelta} from "../UniswapV4Types.sol"; +import {revertUnknownPoolManagerId} from "../SettlerErrors.sol"; + +address constant orvexVault = 0xFe7E25dE55e5cBbEcCcb661F3679F873f72B9b0D; +address constant orvexClManager = 0xd01C774d4A66408326Bc65728Ac5Ae5aAf004032; + +abstract contract OrvexCL is PancakeInfinityBase { + function _PANCAKE_INFINITY_VAULT() internal pure override returns (address) { + return orvexVault; + } + + function _dispatchPancakeInfinity( + uint8 poolManagerId, + PoolKey memory poolKey, + bool zeroForOne, + int256 amountSpecified, + uint160 sqrtPriceLimitX96, + bytes calldata hookData + ) internal override returns (BalanceDelta) { + if (poolManagerId == 0) { + return swapToClManager(orvexClManager, poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData); + } else { + revertUnknownPoolManagerId(poolManagerId); + } + } +} diff --git a/src/core/pancakeInfinityForks/PancakeInfinity.sol b/src/core/pancakeInfinityForks/PancakeInfinity.sol new file mode 100644 index 000000000..867e766b8 --- /dev/null +++ b/src/core/pancakeInfinityForks/PancakeInfinity.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.25; + +import {PancakeInfinityBase, PoolKey} from "../PancakeInfinity.sol"; +import {BalanceDelta} from "../UniswapV4Types.sol"; +import {revertUnknownPoolManagerId} from "../SettlerErrors.sol"; + +address constant pancakeInfinityVault = 0x238a358808379702088667322f80aC48bAd5e6c4; +address constant pancakeInfinityClManager = 0xa0FfB9c1CE1Fe56963B0321B32E7A0302114058b; +address constant pancakeInfinityBinManager = 0xC697d2898e0D09264376196696c51D7aBbbAA4a9; + +abstract contract PancakeInfinity is PancakeInfinityBase { + function _PANCAKE_INFINITY_VAULT() internal pure override returns (address) { + return pancakeInfinityVault; + } + + function _dispatchPancakeInfinity( + uint8 poolManagerId, + PoolKey memory poolKey, + bool zeroForOne, + int256 amountSpecified, + uint160 sqrtPriceLimitX96, + bytes calldata hookData + ) internal override returns (BalanceDelta) { + if (poolManagerId == 0) { + return swapToClManager( + pancakeInfinityClManager, poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData + ); + } else if (poolManagerId == 1) { + return swapToBinManager(pancakeInfinityBinManager, poolKey, zeroForOne, amountSpecified, hookData); + } else { + revertUnknownPoolManagerId(poolManagerId); + } + } +} diff --git a/test/integration/PancakeInfinity.t.sol b/test/integration/PancakeInfinity.t.sol index 656e9a5fc..23ba5d91c 100644 --- a/test/integration/PancakeInfinity.t.sol +++ b/test/integration/PancakeInfinity.t.sol @@ -20,15 +20,12 @@ import {tmp} from "src/utils/512Math.sol"; import {SettlerMetaTxnPairTest} from "./SettlerMetaTxnPairTest.t.sol"; import {AllowanceHolderPairTest} from "./AllowanceHolderPairTest.t.sol"; +import {PoolKey, PoolId, IPancakeInfinityPoolManager} from "src/core/PancakeInfinity.sol"; import { - PancakeInfinity, - PoolKey, - VAULT, - CL_MANAGER, - BIN_MANAGER, - PoolId, - IPancakeInfinityPoolManager -} from "src/core/PancakeInfinity.sol"; + pancakeInfinityVault, + pancakeInfinityClManager, + pancakeInfinityBinManager +} from "src/core/pancakeInfinityForks/PancakeInfinity.sol"; interface IPancakeInfinityCLPoolManagerSlot0 { function getSlot0(bytes32 poolId) external view returns (uint160 sqrtPriceX96); @@ -90,9 +87,9 @@ abstract contract PancakeInfinityTest is AllowanceHolderPairTest, SettlerMetaTxn } function _setPancakeInfinityLabels() private { - vm.label(address(VAULT), "Vault"); - vm.label(address(CL_MANAGER), "CLPoolManager"); - vm.label(address(BIN_MANAGER), "BINPoolManager"); + vm.label(pancakeInfinityVault, "Vault"); + vm.label(pancakeInfinityClManager, "CLPoolManager"); + vm.label(pancakeInfinityBinManager, "BINPoolManager"); } function _readSlot0Cold(bytes32 poolId_) private view returns (uint160 sqrtPriceX96) { @@ -105,7 +102,7 @@ abstract contract PancakeInfinityTest is AllowanceHolderPairTest, SettlerMetaTxn } function _readSlot0AndRevert(bytes32 poolId_) external view { - uint160 sqrtPriceX96 = IPancakeInfinityCLPoolManagerSlot0(address(CL_MANAGER)).getSlot0(poolId_); + uint160 sqrtPriceX96 = IPancakeInfinityCLPoolManagerSlot0(pancakeInfinityClManager).getSlot0(poolId_); assembly ("memory-safe") { mstore(0x00, sqrtPriceX96) revert(0x00, 0x20) @@ -138,10 +135,9 @@ abstract contract PancakeInfinityTest is AllowanceHolderPairTest, SettlerMetaTxn function pancakeInfinityFills(IERC20 fromToken, IERC20 toToken) internal view virtual returns (bytes memory) { bytes32 poolId_ = poolId(); uint8 managerId = poolManagerId(); - PoolKey memory poolKey = (managerId == 0 - ? IPancakeInfinityPoolManager(CL_MANAGER) - : IPancakeInfinityPoolManager(BIN_MANAGER)) - .poolIdToPoolKey(PoolId.wrap(poolId_)); + PoolKey memory poolKey = IPancakeInfinityPoolManager( + managerId == 0 ? pancakeInfinityClManager : pancakeInfinityBinManager + ).poolIdToPoolKey(PoolId.wrap(poolId_)); return abi.encodePacked( uint16(10_000), From 4c4a1fbbc7303334978b6629242150ab42b89cbf Mon Sep 17 00:00:00 2001 From: Lazaro Raul Date: Fri, 7 Aug 2026 20:55:36 +0200 Subject: [PATCH 2/4] doc: Update Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ca612ddd..055e3427c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * Fix a `metaTx` malleability bug in `CrossChainReceiverFactory` (contract is not deployed; no funds at risk) after a report in Immunefi bug 78645 +* Add Orvex CL PancakeInfinity fork to RobinHood chain ## 2026-07-27 From ed70d90f19615832146381aaf89b32ffb2ce49bf Mon Sep 17 00:00:00 2001 From: Lazaro Raul Date: Mon, 10 Aug 2026 11:15:37 +0200 Subject: [PATCH 3/4] doc: mention the new actions in the changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 055e3427c..237f3516e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ (contract is not deployed; no funds at risk) after a report in Immunefi bug 78645 * Add Orvex CL PancakeInfinity fork to RobinHood chain + * Add `PANCAKE_INFINITY`, `PANCAKE_INFINITY_VIP`, and `METATXN_PANCAKE_INFINITY_VIP` ## 2026-07-27 From 55d73e3156af376604599b135f70f5c71b9218f2 Mon Sep 17 00:00:00 2001 From: Lazaro Raul Date: Mon, 17 Aug 2026 17:07:37 +0200 Subject: [PATCH 4/4] chore: review comments --- ...ceHolder_pancakeInfinityVIP_USDT-CAKE.snap | 2 +- ...ceHolder_pancakeInfinityVIP_USDT-WBNB.snap | 2 +- ...ler_metaTxn_pancakeInfinity_USDT-CAKE.snap | 2 +- ...ler_metaTxn_pancakeInfinity_USDT-WBNB.snap | 2 +- .../settler_pancakeInfinityVIP_USDT-CAKE.snap | 2 +- .../settler_pancakeInfinityVIP_USDT-WBNB.snap | 2 +- .../settler_pancakeInfinity_USDT-CAKE.snap | 2 +- .../settler_pancakeInfinity_USDT-WBNB.snap | 2 +- src/chains/Base/Common.sol | 19 +++- src/chains/Bnb/Common.sol | 19 +++- src/chains/RobinHood/Common.sol | 20 ++++- src/core/PancakeInfinity.sol | 88 +++++++------------ src/core/SettlerErrors.sol | 2 +- src/core/pancakeInfinityForks/OrvexCL.sol | 26 +----- .../pancakeInfinityForks/PancakeInfinity.sol | 29 ------ 15 files changed, 96 insertions(+), 123 deletions(-) diff --git a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap index d46eb40f3..619e621ba 100644 --- a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap +++ b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-CAKE.snap @@ -1 +1 @@ -585058 \ No newline at end of file +585030 \ No newline at end of file diff --git a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap index 0f44a5354..214edc36f 100644 --- a/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap +++ b/.forge-snapshots/allowanceHolder_pancakeInfinityVIP_USDT-WBNB.snap @@ -1 +1 @@ -171614 \ No newline at end of file +171654 \ No newline at end of file diff --git a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap index d92a12be6..ef23caa9c 100644 --- a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap +++ b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-CAKE.snap @@ -1 +1 @@ -598545 \ No newline at end of file +598543 \ No newline at end of file diff --git a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap index 7bb941c3f..64b4b9c0c 100644 --- a/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap +++ b/.forge-snapshots/settler_metaTxn_pancakeInfinity_USDT-WBNB.snap @@ -1 +1 @@ -185762 \ No newline at end of file +185828 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap index 64c0e3090..8249207a9 100644 --- a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap +++ b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-CAKE.snap @@ -1 +1 @@ -593565 \ No newline at end of file +593537 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap index 032716eb4..dcb9e6d6e 100644 --- a/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap +++ b/.forge-snapshots/settler_pancakeInfinityVIP_USDT-WBNB.snap @@ -1 +1 @@ -180458 \ No newline at end of file +180498 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap b/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap index 1a81854d1..55dc926ce 100644 --- a/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap +++ b/.forge-snapshots/settler_pancakeInfinity_USDT-CAKE.snap @@ -1 +1 @@ -619909 \ No newline at end of file +619881 \ No newline at end of file diff --git a/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap b/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap index cd29fcfc9..0b0e81433 100644 --- a/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap +++ b/.forge-snapshots/settler_pancakeInfinity_USDT-WBNB.snap @@ -1 +1 @@ -206801 \ No newline at end of file +206841 \ No newline at end of file diff --git a/src/chains/Base/Common.sol b/src/chains/Base/Common.sol index f027207a1..d6f3cab39 100644 --- a/src/chains/Base/Common.sol +++ b/src/chains/Base/Common.sol @@ -10,7 +10,12 @@ import {UniswapV4} from "../../core/UniswapV4.sol"; import {IPoolManager} from "../../core/UniswapV4Types.sol"; import {EulerSwap, IEVC, IEulerSwap} from "../../core/EulerSwap.sol"; import {BalancerV3} from "../../core/BalancerV3.sol"; -import {PancakeInfinity} from "../../core/pancakeInfinityForks/PancakeInfinity.sol"; +import {PancakeInfinity} from "../../core/PancakeInfinity.sol"; +import { + pancakeInfinityVault, + pancakeInfinityClManager, + pancakeInfinityBinManager +} from "../../core/pancakeInfinityForks/PancakeInfinity.sol"; import {Renegade, BASE_SELECTOR} from "../../core/Renegade.sol"; import {Bebop} from "../../core/Bebop.sol"; import {Hanji} from "../../core/Hanji.sol"; @@ -227,6 +232,18 @@ abstract contract BaseMixin is return BASE_POOL_MANAGER; } + function _PANCAKE_INFINITY_VAULT() internal pure override returns (address) { + return pancakeInfinityVault; + } + + function _PANCAKE_INFINITY_CL_MANAGER() internal pure override returns (address) { + return pancakeInfinityClManager; + } + + function _PANCAKE_INFINITY_BIN_MANAGER() internal pure override returns (address) { + return pancakeInfinityBinManager; + } + /* function _EVC() internal pure override returns (IEVC) { return IEVC(0x5301c7dD20bD945D2013b48ed0DEE3A284ca8989); diff --git a/src/chains/Bnb/Common.sol b/src/chains/Bnb/Common.sol index 9b0c20dbd..0ef99d975 100644 --- a/src/chains/Bnb/Common.sol +++ b/src/chains/Bnb/Common.sol @@ -9,7 +9,12 @@ import {DodoV1, IDodoV1} from "../../core/DodoV1.sol"; import {DodoV2, IDodoV2} from "../../core/DodoV2.sol"; import {UniswapV4} from "../../core/UniswapV4.sol"; import {IPoolManager} from "../../core/UniswapV4Types.sol"; -import {PancakeInfinity} from "../../core/pancakeInfinityForks/PancakeInfinity.sol"; +import {PancakeInfinity} from "../../core/PancakeInfinity.sol"; +import { + pancakeInfinityVault, + pancakeInfinityClManager, + pancakeInfinityBinManager +} from "../../core/pancakeInfinityForks/PancakeInfinity.sol"; import {EulerSwap, IEVC, IEulerSwap} from "../../core/EulerSwap.sol"; import {Bebop} from "../../core/Bebop.sol"; @@ -177,6 +182,18 @@ abstract contract BnbMixin is return BNB_POOL_MANAGER; } + function _PANCAKE_INFINITY_VAULT() internal pure override returns (address) { + return pancakeInfinityVault; + } + + function _PANCAKE_INFINITY_CL_MANAGER() internal pure override returns (address) { + return pancakeInfinityClManager; + } + + function _PANCAKE_INFINITY_BIN_MANAGER() internal pure override returns (address) { + return pancakeInfinityBinManager; + } + function _EVC() internal pure override returns (IEVC) { return IEVC(0xb2E5a73CeE08593d1a076a2AE7A6e02925a640ea); } diff --git a/src/chains/RobinHood/Common.sol b/src/chains/RobinHood/Common.sol index c30e657f3..856d02584 100644 --- a/src/chains/RobinHood/Common.sol +++ b/src/chains/RobinHood/Common.sol @@ -12,7 +12,7 @@ import {Hanji} from "../../core/Hanji.sol"; import {ISettlerActions} from "../../ISettlerActions.sol"; import {ISignatureTransfer} from "@permit2/interfaces/ISignatureTransfer.sol"; -import {revertUnknownForkId} from "../../core/SettlerErrors.sol"; +import {revertUnknownForkId, revertUnknownPoolManagerId} from "../../core/SettlerErrors.sol"; import { uniswapV3RobinhoodFactory, @@ -35,7 +35,8 @@ import {swapHoodV3Factory, swapHoodV3InitHash, swapHoodV3ForkId} from "../../cor import {gigaDexV3Factory, gigaDexV3InitHash, gigaDexV3ForkId} from "../../core/univ3forks/GigaDexV3.sol"; import {IAlgebraCallback} from "../../core/univ3forks/Algebra.sol"; import {ROBINHOOD_POOL_MANAGER} from "../../core/UniswapV4Addresses.sol"; -import {OrvexCL} from "../../core/pancakeInfinityForks/OrvexCL.sol"; +import {PancakeInfinity} from "../../core/PancakeInfinity.sol"; +import {orvexVault, orvexClManager} from "../../core/pancakeInfinityForks/OrvexCL.sol"; import {FastLogic} from "../../utils/FastLogic.sol"; @@ -43,7 +44,7 @@ import {FastLogic} from "../../utils/FastLogic.sol"; import {SettlerSwapAbstract} from "../../SettlerAbstract.sol"; import {Permit2PaymentAbstract} from "../../core/Permit2PaymentAbstract.sol"; -abstract contract RobinHoodMixin is FreeMemory, SettlerBase, UniswapV4, EkuboV3, Hanji, OrvexCL { +abstract contract RobinHoodMixin is FreeMemory, SettlerBase, UniswapV4, EkuboV3, Hanji, PancakeInfinity { using FastLogic for bool; constructor() { @@ -146,6 +147,19 @@ abstract contract RobinHoodMixin is FreeMemory, SettlerBase, UniswapV4, EkuboV3, return ROBINHOOD_POOL_MANAGER; } + function _PANCAKE_INFINITY_VAULT() internal pure override returns (address) { + return orvexVault; + } + + function _PANCAKE_INFINITY_CL_MANAGER() internal pure override returns (address) { + return orvexClManager; + } + + // Orvex does not have a Bin pool manager + function _PANCAKE_INFINITY_BIN_MANAGER() internal pure override returns (address) { + revertUnknownPoolManagerId(1); + } + // I hate Solidity inheritance function _fallback(bytes calldata data) internal diff --git a/src/core/PancakeInfinity.sol b/src/core/PancakeInfinity.sol index e01c49dec..42175885c 100644 --- a/src/core/PancakeInfinity.sol +++ b/src/core/PancakeInfinity.sol @@ -9,7 +9,7 @@ import {SettlerSwapAbstract} from "../SettlerAbstract.sol"; import {UnsafeMath} from "../utils/UnsafeMath.sol"; import {Panic} from "../utils/Panic.sol"; import {Ternary} from "../utils/Ternary.sol"; -import {ZeroSellAmount, UnknownPoolManagerId} from "./SettlerErrors.sol"; +import {ZeroSellAmount, UnknownPoolManagerId, revertUnknownPoolManagerId} from "./SettlerErrors.sol"; import {CreditDebt, Encoder, NotePtr, NotesLib, State, Decoder, Take} from "./FlashAccountingCommon.sol"; import {BalanceDelta} from "./UniswapV4Types.sol"; @@ -189,7 +189,7 @@ library UnsafePancakeInfinityBinPoolManager { } } -abstract contract PancakeInfinityBase is SettlerSwapAbstract { +abstract contract PancakeInfinity is SettlerSwapAbstract { using UnsafeMath for uint256; using UnsafeMath for int256; using Ternary for bool; @@ -206,7 +206,13 @@ abstract contract PancakeInfinityBase is SettlerSwapAbstract { assert(address(ETH_ADDRESS) == NotesLib.ETH_ADDRESS); } - function _PANCAKE_INFINITY_VAULT() internal pure virtual returns (address vault); + function _PANCAKE_INFINITY_VAULT() internal pure virtual returns (address); + + // A chain hosting a fork that lacks CL_MANAGER must unconditionally call `revertUnknownPoolManagerId(0)` + function _PANCAKE_INFINITY_CL_MANAGER() internal pure virtual returns (address); + + // A chain hosting a fork that lacks BIN_MANAGER must unconditionally call `revertUnknownPoolManagerId(1)` + function _PANCAKE_INFINITY_BIN_MANAGER() internal pure virtual returns (address); //// How to generate `fills` for Pancake Infinity: //// @@ -475,7 +481,7 @@ abstract contract PancakeInfinityBase is SettlerSwapAbstract { } { - uint8 poolManagerId; + uint256 poolManagerId; assembly ("memory-safe") { poolManagerId := shr(0xf8, calldataload(data.offset)) data.offset := add(0x01, data.offset) @@ -506,13 +512,29 @@ abstract contract PancakeInfinityBase is SettlerSwapAbstract { Decoder.overflowCheck(data); - _pancakeInfinitySettleDelta( - state, - _dispatchPancakeInfinity( - poolManagerId, poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData - ), - zeroForOne - ); + if (poolManagerId == 0) { + poolKey.poolManager = IPancakeInfinityPoolManager(_PANCAKE_INFINITY_CL_MANAGER()); + + _pancakeInfinitySettleDelta( + state, + IPancakeInfinityCLPoolManager(address(poolKey.poolManager)) + .unsafeSwap(poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData), + zeroForOne + ); + } else if (poolManagerId == 1) { + poolKey.poolManager = IPancakeInfinityPoolManager(_PANCAKE_INFINITY_BIN_MANAGER()); + if (amountSpecified >> 127 != amountSpecified >> 128) { + Panic.panic(Panic.ARITHMETIC_OVERFLOW); + } + _pancakeInfinitySettleDelta( + state, + IPancakeInfinityBinPoolManager(address(poolKey.poolManager)) + .unsafeSwap(poolKey, zeroForOne, int128(amountSpecified), hookData), + zeroForOne + ); + } else { + revertUnknownPoolManagerId(poolManagerId); + } } } @@ -573,48 +595,4 @@ abstract contract PancakeInfinityBase is SettlerSwapAbstract { return returndata; } } - - // Each fork mixin in `pancakeInfinityForks/` defines its binding of pool manager IDs to pool - // managers by overriding this function with one that routes each recognized ID to - // `swapToClManager` or `swapToBinManager` with the appropriate pool manager's address, and - // calls `revertUnknownPoolManagerId` otherwise. A fork that lacks one of the pool manager - // types simply omits that route, which also omits the corresponding swap code from the - // compiled contract. - function _dispatchPancakeInfinity( - uint8 poolManagerId, - PoolKey memory poolKey, - bool zeroForOne, - int256 amountSpecified, - uint160 sqrtPriceLimitX96, - bytes calldata hookData - ) internal virtual returns (BalanceDelta); - - function swapToClManager( - address clManager, - PoolKey memory poolKey, - bool zeroForOne, - int256 amountSpecified, - uint160 sqrtPriceLimitX96, - bytes calldata hookData - ) internal returns (BalanceDelta) { - poolKey.poolManager = IPancakeInfinityPoolManager(clManager); - return IPancakeInfinityCLPoolManager(clManager) - .unsafeSwap(poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData); - } - - function swapToBinManager( - address binManager, - PoolKey memory poolKey, - bool zeroForOne, - int256 amountSpecified, - bytes calldata hookData - ) internal returns (BalanceDelta) { - poolKey.poolManager = IPancakeInfinityPoolManager(binManager); - if (amountSpecified >> 127 != amountSpecified >> 128) { - Panic.panic(Panic.ARITHMETIC_OVERFLOW); - } - return - IPancakeInfinityBinPoolManager(binManager) - .unsafeSwap(poolKey, zeroForOne, int128(amountSpecified), hookData); - } } diff --git a/src/core/SettlerErrors.sol b/src/core/SettlerErrors.sol index 891aa9cf8..2e01b1e31 100644 --- a/src/core/SettlerErrors.sol +++ b/src/core/SettlerErrors.sol @@ -116,7 +116,7 @@ error NotConverged(); /// the list of recognized pool managers. error UnknownPoolManagerId(uint8 poolManagerId); -function revertUnknownPoolManagerId(uint8 poolManagerId) pure { +function revertUnknownPoolManagerId(uint256 poolManagerId) pure { assembly ("memory-safe") { mstore(0x00, 0x0a9a7da6) // selector for `UnknownPoolManagerId(uint8)` mstore(0x20, and(0xff, poolManagerId)) diff --git a/src/core/pancakeInfinityForks/OrvexCL.sol b/src/core/pancakeInfinityForks/OrvexCL.sol index 01c56701d..613e0667a 100644 --- a/src/core/pancakeInfinityForks/OrvexCL.sol +++ b/src/core/pancakeInfinityForks/OrvexCL.sol @@ -1,30 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.25; -import {PancakeInfinityBase, PoolKey} from "../PancakeInfinity.sol"; -import {BalanceDelta} from "../UniswapV4Types.sol"; -import {revertUnknownPoolManagerId} from "../SettlerErrors.sol"; - +// Orvex is a fork of PancakeSwap Infinity without the Bin pool manager address constant orvexVault = 0xFe7E25dE55e5cBbEcCcb661F3679F873f72B9b0D; address constant orvexClManager = 0xd01C774d4A66408326Bc65728Ac5Ae5aAf004032; - -abstract contract OrvexCL is PancakeInfinityBase { - function _PANCAKE_INFINITY_VAULT() internal pure override returns (address) { - return orvexVault; - } - - function _dispatchPancakeInfinity( - uint8 poolManagerId, - PoolKey memory poolKey, - bool zeroForOne, - int256 amountSpecified, - uint160 sqrtPriceLimitX96, - bytes calldata hookData - ) internal override returns (BalanceDelta) { - if (poolManagerId == 0) { - return swapToClManager(orvexClManager, poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData); - } else { - revertUnknownPoolManagerId(poolManagerId); - } - } -} diff --git a/src/core/pancakeInfinityForks/PancakeInfinity.sol b/src/core/pancakeInfinityForks/PancakeInfinity.sol index 867e766b8..ce00ba59c 100644 --- a/src/core/pancakeInfinityForks/PancakeInfinity.sol +++ b/src/core/pancakeInfinityForks/PancakeInfinity.sol @@ -1,35 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.25; -import {PancakeInfinityBase, PoolKey} from "../PancakeInfinity.sol"; -import {BalanceDelta} from "../UniswapV4Types.sol"; -import {revertUnknownPoolManagerId} from "../SettlerErrors.sol"; - address constant pancakeInfinityVault = 0x238a358808379702088667322f80aC48bAd5e6c4; address constant pancakeInfinityClManager = 0xa0FfB9c1CE1Fe56963B0321B32E7A0302114058b; address constant pancakeInfinityBinManager = 0xC697d2898e0D09264376196696c51D7aBbbAA4a9; - -abstract contract PancakeInfinity is PancakeInfinityBase { - function _PANCAKE_INFINITY_VAULT() internal pure override returns (address) { - return pancakeInfinityVault; - } - - function _dispatchPancakeInfinity( - uint8 poolManagerId, - PoolKey memory poolKey, - bool zeroForOne, - int256 amountSpecified, - uint160 sqrtPriceLimitX96, - bytes calldata hookData - ) internal override returns (BalanceDelta) { - if (poolManagerId == 0) { - return swapToClManager( - pancakeInfinityClManager, poolKey, zeroForOne, amountSpecified, sqrtPriceLimitX96, hookData - ); - } else if (poolManagerId == 1) { - return swapToBinManager(pancakeInfinityBinManager, poolKey, zeroForOne, amountSpecified, hookData); - } else { - revertUnknownPoolManagerId(poolManagerId); - } - } -}