From ecba4d36383a82eae4574574074de785c8949d57 Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Mon, 10 Nov 2025 11:55:05 -0500 Subject: [PATCH 01/21] feat: AAVE external lib and Approve internal lib (SC-1182) (#162) * feat: AAVE external lib and Approve internal lib - cuts down on much needed contract size for future integrations * fix: PR Review --- src/MainnetController.sol | 135 +++++++++---------------------- src/libraries/AaveLib.sol | 94 +++++++++++++++++++++ src/libraries/ApproveLib.sol | 35 ++++++++ src/libraries/CurveLib.sol | 48 ++--------- test/mainnet-fork/Approve.t.sol | 9 ++- test/mainnet-fork/OTCSwaps.t.sol | 2 - 6 files changed, 176 insertions(+), 147 deletions(-) create mode 100644 src/libraries/AaveLib.sol create mode 100644 src/libraries/ApproveLib.sol diff --git a/src/MainnetController.sol b/src/MainnetController.sol index d1078b36..e721bd1d 100644 --- a/src/MainnetController.sol +++ b/src/MainnetController.sol @@ -1,8 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.21; -import { IAToken } from "aave-v3-origin/src/core/contracts/interfaces/IAToken.sol"; -import { IPool as IAavePool } from "aave-v3-origin/src/core/contracts/interfaces/IPool.sol"; +import { IAToken } from "aave-v3-origin/src/core/contracts/interfaces/IAToken.sol"; import { AccessControlEnumerable } from "../lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sol"; import { ReentrancyGuard } from "../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; @@ -17,8 +16,10 @@ import { IALMProxy } from "./interfaces/IALMProxy.sol"; import { ICCTPLike } from "./interfaces/CCTPInterfaces.sol"; import { IRateLimits } from "./interfaces/IRateLimits.sol"; -import "./interfaces/ILayerZero.sol"; +import { ILayerZero, SendParam, OFTReceipt, MessagingFee } from "./interfaces/ILayerZero.sol"; +import { ApproveLib } from "./libraries/ApproveLib.sol"; +import { AaveLib } from "./libraries/AaveLib.sol"; import { CCTPLib } from "./libraries/CCTPLib.sol"; import { CurveLib } from "./libraries/CurveLib.sol"; import { IDaiUsdsLike, IPSMLike, PSMLib } from "./libraries/PSMLib.sol"; @@ -81,18 +82,18 @@ interface IWstETHLike { function getStETHByWstETH(uint256 _wstETHAmount) external view returns (uint256); } -struct OTC { - address buffer; - uint256 rechargeRate18; - uint256 sent18; - uint256 sentTimestamp; - uint256 claimed18; -} - contract MainnetController is ReentrancyGuard, AccessControlEnumerable { using OptionsBuilder for bytes; + struct OTC { + address buffer; + uint256 rechargeRate18; + uint256 sent18; + uint256 sentTimestamp; + uint256 claimed18; + } + /**********************************************************************************************/ /*** Events ***/ /**********************************************************************************************/ @@ -459,7 +460,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { _rateLimitedAddress(LIMIT_4626_DEPOSIT, token, amount); // Approve asset to token from the proxy (assumes the proxy has enough of the asset). - _approve(IERC4626(token).asset(), token, amount); + ApproveLib.approve(IERC4626(token).asset(), address(proxy), token, amount); // Deposit asset into the token, proxy receives token shares, decode the resulting shares. shares = abi.decode( @@ -525,62 +526,30 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { function depositAave(address aToken, uint256 amount) external nonReentrant { _checkRole(RELAYER); - _rateLimitedAddress(LIMIT_AAVE_DEPOSIT, aToken, amount); - - require(maxSlippages[aToken] != 0, "MC/max-slippage-not-set"); - - IERC20 underlying = IERC20(IATokenWithPool(aToken).UNDERLYING_ASSET_ADDRESS()); - IAavePool pool = IAavePool(IATokenWithPool(aToken).POOL()); - - // Approve underlying to Aave pool from the proxy (assumes the proxy has enough underlying). - _approve(address(underlying), address(pool), amount); - - uint256 aTokenBalance = IERC20(aToken).balanceOf(address(proxy)); - - // Deposit underlying into Aave pool, proxy receives aTokens - proxy.doCall( - address(pool), - abi.encodeCall(pool.supply, (address(underlying), amount, address(proxy), 0)) - ); - - uint256 newATokens = IERC20(aToken).balanceOf(address(proxy)) - aTokenBalance; - require( - newATokens >= amount * maxSlippages[aToken] / 1e18, - "MC/slippage-too-high" - ); + AaveLib.deposit({ + proxy : address(proxy), + aToken : aToken, + amount : amount, + maxSlippage : maxSlippages[aToken], + rateLimits : address(rateLimits), + rateLimitId : LIMIT_AAVE_DEPOSIT + }); } - // NOTE: !!! Rate limited at end of function !!! function withdrawAave(address aToken, uint256 amount) external nonReentrant returns (uint256 amountWithdrawn) { _checkRole(RELAYER); - IAavePool pool = IAavePool(IATokenWithPool(aToken).POOL()); - - // Withdraw underlying from Aave pool, decode resulting amount withdrawn. - // Assumes proxy has adequate aTokens. - amountWithdrawn = abi.decode( - proxy.doCall( - address(pool), - abi.encodeCall( - pool.withdraw, - (IATokenWithPool(aToken).UNDERLYING_ASSET_ADDRESS(), amount, address(proxy)) - ) - ), - (uint256) - ); - - rateLimits.triggerRateLimitDecrease( - RateLimitHelpers.makeAddressKey(LIMIT_AAVE_WITHDRAW, aToken), - amountWithdrawn - ); - - _cancelRateLimit( - RateLimitHelpers.makeAddressKey(LIMIT_AAVE_DEPOSIT, aToken), - amountWithdrawn - ); + return AaveLib.withdraw({ + proxy : address(proxy), + aToken : aToken, + amount : amount, + rateLimits : address(rateLimits), + rateLimitWithdrawId : LIMIT_AAVE_WITHDRAW, + rateLimitDepositId : LIMIT_AAVE_DEPOSIT + }); } /**********************************************************************************************/ @@ -674,13 +643,13 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { function prepareUSDeMint(uint256 usdcAmount) external nonReentrant { _checkRole(RELAYER); _rateLimited(LIMIT_USDE_MINT, usdcAmount); - _approve(address(usdc), address(ethenaMinter), usdcAmount); + ApproveLib.approve(address(usdc), address(proxy), address(ethenaMinter), usdcAmount); } function prepareUSDeBurn(uint256 usdeAmount) external nonReentrant { _checkRole(RELAYER); _rateLimited(LIMIT_USDE_BURN, usdeAmount); - _approve(address(usde), address(ethenaMinter), usdeAmount); + ApproveLib.approve(address(usde), address(proxy), address(ethenaMinter), usdeAmount); } function cooldownAssetsSUSDe(uint256 usdeAmount) external nonReentrant { @@ -755,7 +724,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { _checkRole(RELAYER); _rateLimited(LIMIT_SUPERSTATE_SUBSCRIBE, usdcAmount); - _approve(address(usdc), address(ustb), usdcAmount); + ApproveLib.approve(address(usdc), address(proxy), address(ustb), usdcAmount); proxy.doCall( address(ustb), @@ -769,7 +738,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { function swapUSDSToDAI(uint256 usdsAmount) external nonReentrant onlyRole(RELAYER) { // Approve USDS to DaiUsds migrator from the proxy (assumes the proxy has enough USDS) - _approve(address(usds), address(daiUsds), usdsAmount); + ApproveLib.approve(address(usds), address(proxy), address(daiUsds), usdsAmount); // Swap USDS to DAI 1:1 proxy.doCall( @@ -780,7 +749,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { function swapDAIToUSDS(uint256 daiAmount) external nonReentrant onlyRole(RELAYER) { // Approve DAI to DaiUsds migrator from the proxy (assumes the proxy has enough DAI) - _approve(address(dai), address(daiUsds), daiAmount); + ApproveLib.approve(address(dai), address(proxy), address(daiUsds), daiAmount); // Swap DAI to USDS 1:1 proxy.doCall( @@ -847,7 +816,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { // approvalRequired == false. Add integration testing for this case before // using in production. if (ILayerZero(oftAddress).approvalRequired()) { - _approve(ILayerZero(oftAddress).token(), oftAddress, amount); + ApproveLib.approve(ILayerZero(oftAddress).token(), address(proxy), oftAddress, amount); } bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200_000, 0); @@ -908,7 +877,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { usdsAmount ); - _approve(address(usds), farm, usdsAmount); + ApproveLib.approve(address(usds), address(proxy), farm, usdsAmount); proxy.doCall( farm, @@ -1032,38 +1001,6 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { /*** Relayer helper functions ***/ /**********************************************************************************************/ - // NOTE: This logic was inspired by OpenZeppelin's forceApprove in SafeERC20 library - function _approve(address token, address spender, uint256 amount) internal { - bytes memory approveData = abi.encodeCall(IERC20.approve, (spender, amount)); - - // Call doCall on proxy to approve the token - ( bool success, bytes memory data ) - = address(proxy).call(abi.encodeCall(IALMProxy.doCall, (token, approveData))); - - bytes memory approveCallReturnData; - - if (success) { - // Data is the ABI-encoding of the approve call bytes return data, need to - // decode it first - approveCallReturnData = abi.decode(data, (bytes)); - // Approve was successful if 1) no return value or 2) true return value - if (approveCallReturnData.length == 0 || abi.decode(approveCallReturnData, (bool))) { - return; - } - } - - // If call was unsuccessful, set to zero and try again - proxy.doCall(token, abi.encodeCall(IERC20.approve, (spender, 0))); - - approveCallReturnData = proxy.doCall(token, approveData); - - // Revert if approve returns false - require( - approveCallReturnData.length == 0 || abi.decode(approveCallReturnData, (bool)), - "MC/approve-failed" - ); - } - function _transfer(address asset, address destination, uint256 amount) internal { bytes memory returnData = proxy.doCall( asset, diff --git a/src/libraries/AaveLib.sol b/src/libraries/AaveLib.sol new file mode 100644 index 00000000..8424688f --- /dev/null +++ b/src/libraries/AaveLib.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.21; + +import { IAToken } from "aave-v3-origin/src/core/contracts/interfaces/IAToken.sol"; +import { IPool } from "aave-v3-origin/src/core/contracts/interfaces/IPool.sol"; + +import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; + +import { IALMProxy } from "../interfaces/IALMProxy.sol"; +import { IRateLimits } from "../interfaces/IRateLimits.sol"; + +import { ApproveLib } from "./ApproveLib.sol"; + +import { RateLimitHelpers } from "../RateLimitHelpers.sol"; + +interface IATokenWithPool is IAToken { + function POOL() external view returns(address); +} + +library AaveLib { + + function deposit( + address proxy, + address aToken, + uint256 amount, + uint256 maxSlippage, + address rateLimits, + bytes32 rateLimitId + ) external { + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeAddressKey(rateLimitId, aToken), + amount + ); + + require(maxSlippage != 0, "MC/max-slippage-not-set"); + + address underlying = IATokenWithPool(aToken).UNDERLYING_ASSET_ADDRESS(); + address pool = IATokenWithPool(aToken).POOL(); + + // Approve underlying to Aave pool from the proxy (assumes the proxy has enough underlying). + ApproveLib.approve(underlying, proxy, pool, amount); + + uint256 aTokenBalance = IERC20(aToken).balanceOf(proxy); + + // Deposit underlying into Aave pool, proxy receives aTokens + IALMProxy(proxy).doCall( + pool, + abi.encodeCall(IPool(pool).supply, (underlying, amount, proxy, 0)) + ); + + uint256 newATokens = IERC20(aToken).balanceOf(proxy) - aTokenBalance; + + require( + newATokens >= amount * maxSlippage / 1e18, + "MC/slippage-too-high" + ); + } + + // NOTE: !!! Rate limited at end of function !!! + function withdraw( + address proxy, + address aToken, + uint256 amount, + address rateLimits, + bytes32 rateLimitWithdrawId, + bytes32 rateLimitDepositId + ) external returns (uint256 amountWithdrawn) { + address pool = IATokenWithPool(aToken).POOL(); + + // Withdraw underlying from Aave pool, decode resulting amount withdrawn. + // Assumes proxy has adequate aTokens. + amountWithdrawn = abi.decode( + IALMProxy(proxy).doCall( + pool, + abi.encodeCall( + IPool(pool).withdraw, + (IATokenWithPool(aToken).UNDERLYING_ASSET_ADDRESS(), amount, proxy) + ) + ), + (uint256) + ); + + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeAddressKey(rateLimitWithdrawId, aToken), + amountWithdrawn + ); + + IRateLimits(rateLimits).triggerRateLimitIncrease( + RateLimitHelpers.makeAddressKey(rateLimitDepositId, aToken), + amountWithdrawn + ); + } + +} diff --git a/src/libraries/ApproveLib.sol b/src/libraries/ApproveLib.sol new file mode 100644 index 00000000..062e680f --- /dev/null +++ b/src/libraries/ApproveLib.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.21; + +import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; + +import { IALMProxy } from "../interfaces/IALMProxy.sol"; + +library ApproveLib { + + // NOTE: This logic was inspired by OpenZeppelin's forceApprove in SafeERC20 library. + function approve(address token, address proxy, address spender, uint256 amount) internal { + bytes memory approveData = abi.encodeCall(IERC20.approve, (spender, amount)); + + // Call doCall on proxy to approve the token. + ( bool success, bytes memory data ) + = proxy.call(abi.encodeCall(IALMProxy.doCall, (token, approveData))); + + if (success) { + // Decode the ABI-encoding of the approve call bytes return data first. + bytes memory returnData = abi.decode(data, (bytes)); + + // Approve was successful if 1) no return value or 2) true return value. + if (returnData.length == 0 || abi.decode(returnData, (bool))) return; + } + + // If call was unsuccessful, set to zero and try again. + IALMProxy(proxy).doCall(token, abi.encodeCall(IERC20.approve, (spender, 0))); + + bytes memory returnData = IALMProxy(proxy).doCall(token, approveData); + + // Revert if approve returns false. + require(returnData.length == 0 || abi.decode(returnData, (bool)), "MC/approve-failed"); + } + +} diff --git a/src/libraries/CurveLib.sol b/src/libraries/CurveLib.sol index 757ba255..d5369ff7 100644 --- a/src/libraries/CurveLib.sol +++ b/src/libraries/CurveLib.sol @@ -6,6 +6,8 @@ import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; import { IALMProxy } from "../interfaces/IALMProxy.sol"; import { IRateLimits } from "../interfaces/IRateLimits.sol"; +import { ApproveLib } from "./ApproveLib.sol"; + import { RateLimitHelpers } from "../RateLimitHelpers.sol"; interface ICurvePoolLike is IERC20 { @@ -113,9 +115,9 @@ library CurveLib { params.amountIn * rates[params.inputIndex] / 1e18 ); - _approve( - params.proxy, + ApproveLib.approve( curvePool.coins(params.inputIndex), + address(params.proxy), params.pool, params.amountIn ); @@ -154,9 +156,9 @@ library CurveLib { // Aggregate the value of the deposited assets (e.g. USD) uint256 valueDeposited; for (uint256 i = 0; i < params.depositAmounts.length; i++) { - _approve( - params.proxy, + ApproveLib.approve( curvePool.coins(i), + address(params.proxy), params.pool, params.depositAmounts[i] ); @@ -268,44 +270,6 @@ library CurveLib { /*** Helper functions ***/ /**********************************************************************************************/ - function _approve( - IALMProxy proxy, - address token, - address spender, - uint256 amount - ) - internal - { - bytes memory approveData = abi.encodeCall(IERC20.approve, (spender, amount)); - - // Call doCall on proxy to approve the token - ( bool success, bytes memory data ) - = address(proxy).call(abi.encodeCall(IALMProxy.doCall, (token, approveData))); - - bytes memory approveCallReturnData; - - if (success) { - // Data is the ABI-encoding of the approve call bytes return data, need to - // decode it first - approveCallReturnData = abi.decode(data, (bytes)); - // Approve was successful if 1) no return value or 2) true return value - if (approveCallReturnData.length == 0 || abi.decode(approveCallReturnData, (bool))) { - return; - } - } - - // If call was unsuccessful, set to zero and try again - proxy.doCall(token, abi.encodeCall(IERC20.approve, (spender, 0))); - - approveCallReturnData = proxy.doCall(token, approveData); - - // Revert if approve returns false - require( - approveCallReturnData.length == 0 || abi.decode(approveCallReturnData, (bool)), - "CurveLib/approve-failed" - ); - } - function _absSubtraction(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a - b : b - a; } diff --git a/test/mainnet-fork/Approve.t.sol b/test/mainnet-fork/Approve.t.sol index b34b1821..f7b68686 100644 --- a/test/mainnet-fork/Approve.t.sol +++ b/test/mainnet-fork/Approve.t.sol @@ -6,7 +6,8 @@ import "./ForkTestBase.t.sol"; import { ForeignController } from "../../src/ForeignController.sol"; import { MainnetController } from "../../src/MainnetController.sol"; -import { CurveLib } from "../../src/libraries/CurveLib.sol"; +import { ApproveLib } from "../../src/libraries/ApproveLib.sol"; +import { CurveLib } from "../../src/libraries/CurveLib.sol"; import { IALMProxy } from "../../src/interfaces/IALMProxy.sol"; @@ -60,11 +61,11 @@ contract MainnetControllerHarness is MainnetController { ) MainnetController(admin_, proxy_, rateLimits_, vault_, psm_, daiUsds_, cctp_) {} function approve(address token, address spender, uint256 amount) external { - _approve(token, spender, amount); + ApproveLib.approve(token, address(proxy), spender, amount); } function approveCurve(address proxy, address token, address spender, uint256 amount) external { - IALMProxy(proxy)._approve(token, spender, amount); + ApproveLib.approve(token, proxy, spender, amount); } } @@ -265,7 +266,7 @@ contract ERC20ApproveReturningFalseNonZeroAmountMainnetTest is MainnetController vm.expectRevert("MC/approve-failed"); IHarness(harness).approve(address(mock), makeAddr("spender"), 100); - vm.expectRevert("CurveLib/approve-failed"); + vm.expectRevert("MC/approve-failed"); IHarness(harness).approveCurve(address(almProxy), address(mock), makeAddr("spender"), 100); } diff --git a/test/mainnet-fork/OTCSwaps.t.sol b/test/mainnet-fork/OTCSwaps.t.sol index b12567d5..69bdb54e 100644 --- a/test/mainnet-fork/OTCSwaps.t.sol +++ b/test/mainnet-fork/OTCSwaps.t.sol @@ -6,8 +6,6 @@ import { IERC20Metadata } from "../../lib/openzeppelin-contracts/ import { IERC20 as OzIERC20, SafeERC20 } from "../../lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol"; import { ReentrancyGuard } from "../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; -import { OTC } from "src/MainnetController.sol"; - import { OTCBuffer } from "src/OTCBuffer.sol"; import { MockTokenReturnFalse } from "../mocks/Mocks.sol"; From 58a07352bda486a518652cbddc46ac51ace8d6da Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Mon, 10 Nov 2025 13:12:14 -0500 Subject: [PATCH 02/21] feat: Add ERC4626 lib (SC-1233) (#188) --- src/MainnetController.sol | 91 +++++++++------------------- src/libraries/AaveLib.sol | 2 +- src/libraries/ERC4626Lib.sol | 113 +++++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 63 deletions(-) create mode 100644 src/libraries/ERC4626Lib.sol diff --git a/src/MainnetController.sol b/src/MainnetController.sol index e721bd1d..cfe0d4eb 100644 --- a/src/MainnetController.sol +++ b/src/MainnetController.sol @@ -22,6 +22,7 @@ import { ApproveLib } from "./libraries/ApproveLib.sol"; import { AaveLib } from "./libraries/AaveLib.sol"; import { CCTPLib } from "./libraries/CCTPLib.sol"; import { CurveLib } from "./libraries/CurveLib.sol"; +import { ERC4626Lib } from "./libraries/ERC4626Lib.sol"; import { IDaiUsdsLike, IPSMLike, PSMLib } from "./libraries/PSMLib.sol"; import { OptionsBuilder } from "layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; @@ -133,8 +134,6 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { /*** State variables ***/ /**********************************************************************************************/ - uint256 public constant EXCHANGE_RATE_PRECISION = 1e36; - bytes32 public FREEZER = keccak256("FREEZER"); bytes32 public RELAYER = keccak256("RELAYER"); @@ -304,7 +303,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { emit MaxExchangeRateSet( token, - maxExchangeRates[token] = _getExchangeRate(shares, maxExpectedAssets) + maxExchangeRates[token] = ERC4626Lib.getExchangeRate(shares, maxExpectedAssets) ); } @@ -457,67 +456,49 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { external nonReentrant returns (uint256 shares) { _checkRole(RELAYER); - _rateLimitedAddress(LIMIT_4626_DEPOSIT, token, amount); - - // Approve asset to token from the proxy (assumes the proxy has enough of the asset). - ApproveLib.approve(IERC4626(token).asset(), address(proxy), token, amount); - - // Deposit asset into the token, proxy receives token shares, decode the resulting shares. - shares = abi.decode( - proxy.doCall( - token, - abi.encodeCall(IERC4626(token).deposit, (amount, address(proxy))) - ), - (uint256) - ); - require( - _getExchangeRate(shares, amount) <= maxExchangeRates[token], - "MC/exchange-rate-too-high" - ); + return ERC4626Lib.deposit({ + proxy : address(proxy), + token : token, + amount : amount, + maxExchangeRate : maxExchangeRates[token], + rateLimits : address(rateLimits), + rateLimitId : LIMIT_4626_DEPOSIT + }); } function withdrawERC4626(address token, uint256 amount) external nonReentrant returns (uint256 shares) { _checkRole(RELAYER); - _rateLimitedAddress(LIMIT_4626_WITHDRAW, token, amount); - // Withdraw asset from a token, decode resulting shares. - // Assumes proxy has adequate token shares. - shares = abi.decode( - proxy.doCall( - token, - abi.encodeCall(IERC4626(token).withdraw, (amount, address(proxy), address(proxy))) - ), - (uint256) - ); - - _cancelRateLimit(RateLimitHelpers.makeAddressKey(LIMIT_4626_DEPOSIT, token), amount); + return ERC4626Lib.withdraw({ + proxy : address(proxy), + token : token, + amount : amount, + rateLimits : address(rateLimits), + withdrawRateLimitId : LIMIT_4626_WITHDRAW, + depositRateLimitId : LIMIT_4626_DEPOSIT + }); } - // NOTE: !!! Rate limited at end of function !!! function redeemERC4626(address token, uint256 shares) external nonReentrant returns (uint256 assets) { _checkRole(RELAYER); - // Redeem shares for assets from the token, decode the resulting assets. - // Assumes proxy has adequate token shares. - assets = abi.decode( - proxy.doCall( - token, - abi.encodeCall(IERC4626(token).redeem, (shares, address(proxy), address(proxy))) - ), - (uint256) - ); - - rateLimits.triggerRateLimitDecrease( - RateLimitHelpers.makeAddressKey(LIMIT_4626_WITHDRAW, token), - assets - ); + return ERC4626Lib.redeem({ + proxy : address(proxy), + token : token, + shares : shares, + rateLimits : address(rateLimits), + withdrawRateLimitId : LIMIT_4626_WITHDRAW, + depositRateLimitId : LIMIT_4626_DEPOSIT + }); + } - _cancelRateLimit(RateLimitHelpers.makeAddressKey(LIMIT_4626_DEPOSIT, token), assets); + function EXCHANGE_RATE_PRECISION() external pure returns (uint256) { + return ERC4626Lib.EXCHANGE_RATE_PRECISION; } /**********************************************************************************************/ @@ -1053,18 +1034,4 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { ); } - /**********************************************************************************************/ - /*** Exchange rate helper functions ***/ - /**********************************************************************************************/ - - function _getExchangeRate(uint256 shares, uint256 assets) internal pure returns (uint256) { - // Return 0 for zero assets first, to handle the valid case of 0 shares and 0 assets. - if (assets == 0) return 0; - - // Zero shares with non-zero assets is invalid (infinite exchange rate). - if (shares == 0) revert("MC/zero-shares"); - - return (EXCHANGE_RATE_PRECISION * assets) / shares; - } - } diff --git a/src/libraries/AaveLib.sol b/src/libraries/AaveLib.sol index 8424688f..41511bf5 100644 --- a/src/libraries/AaveLib.sol +++ b/src/libraries/AaveLib.sol @@ -6,7 +6,7 @@ import { IPool } from "aave-v3-origin/src/core/contracts/interfaces/IPool.sol" import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; -import { IALMProxy } from "../interfaces/IALMProxy.sol"; +import { IALMProxy } from "../interfaces/IALMProxy.sol"; import { IRateLimits } from "../interfaces/IRateLimits.sol"; import { ApproveLib } from "./ApproveLib.sol"; diff --git a/src/libraries/ERC4626Lib.sol b/src/libraries/ERC4626Lib.sol new file mode 100644 index 00000000..2c9194ff --- /dev/null +++ b/src/libraries/ERC4626Lib.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.21; + +import { IERC4626 } from "../../lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; + +import { IALMProxy } from "../interfaces/IALMProxy.sol"; +import { IRateLimits } from "../interfaces/IRateLimits.sol"; + +import { ApproveLib } from "./ApproveLib.sol"; + +import { RateLimitHelpers } from "../RateLimitHelpers.sol"; + +library ERC4626Lib { + + uint256 internal constant EXCHANGE_RATE_PRECISION = 1e36; + + function deposit( + address proxy, + address token, + uint256 amount, + uint256 maxExchangeRate, + address rateLimits, + bytes32 rateLimitId + ) external returns (uint256 shares) { + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeAddressKey(rateLimitId, token), + amount + ); + + // Approve asset to token from the proxy (assumes the proxy has enough of the asset). + ApproveLib.approve(IERC4626(token).asset(), proxy, token, amount); + + // Deposit asset into the token, proxy receives token shares, decode the resulting shares. + shares = abi.decode( + IALMProxy(proxy).doCall( + token, + abi.encodeCall(IERC4626(token).deposit, (amount, proxy)) + ), + (uint256) + ); + + require(getExchangeRate(shares, amount) <= maxExchangeRate, "MC/exchange-rate-too-high"); + } + + function withdraw( + address proxy, + address token, + uint256 amount, + address rateLimits, + bytes32 withdrawRateLimitId, + bytes32 depositRateLimitId + ) external returns (uint256 shares) { + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeAddressKey(withdrawRateLimitId, token), + amount + ); + + // Withdraw asset from a token, decode resulting shares. + // Assumes proxy has adequate token shares. + shares = abi.decode( + IALMProxy(proxy).doCall( + token, + abi.encodeCall(IERC4626(token).withdraw, (amount, proxy, proxy)) + ), + (uint256) + ); + + IRateLimits(rateLimits).triggerRateLimitIncrease( + RateLimitHelpers.makeAddressKey(depositRateLimitId, token), + amount + ); + } + + function redeem( + address proxy, + address token, + uint256 shares, + address rateLimits, + bytes32 withdrawRateLimitId, + bytes32 depositRateLimitId + ) external returns (uint256 assets) { + // Redeem shares for assets from the token, decode the resulting assets. + // Assumes proxy has adequate token shares. + assets = abi.decode( + IALMProxy(proxy).doCall( + token, + abi.encodeCall(IERC4626(token).redeem, (shares, proxy, proxy)) + ), + (uint256) + ); + + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeAddressKey(withdrawRateLimitId, token), + assets + ); + + IRateLimits(rateLimits).triggerRateLimitIncrease( + RateLimitHelpers.makeAddressKey(depositRateLimitId, token), + assets + ); + } + + function getExchangeRate(uint256 shares, uint256 assets) public pure returns (uint256) { + // Return 0 for zero assets first, to handle the valid case of 0 shares and 0 assets. + if (assets == 0) return 0; + + // Zero shares with non-zero assets is invalid (infinite exchange rate). + if (shares == 0) revert("MC/zero-shares"); + + return (EXCHANGE_RATE_PRECISION * assets) / shares; + } + +} From 2aed93a67b74f9d267dcc7495b6075b2e52426fc Mon Sep 17 00:00:00 2001 From: supercontracts Date: Thu, 13 Nov 2025 20:21:33 +0530 Subject: [PATCH 03/21] fix: Use relative paths (#191) --- src/libraries/AaveLib.sol | 2 +- src/libraries/ApproveLib.sol | 2 +- src/libraries/CCTPLib.sol | 2 +- src/libraries/CurveLib.sol | 2 +- src/libraries/PSMLib.sol | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libraries/AaveLib.sol b/src/libraries/AaveLib.sol index 41511bf5..18c44c55 100644 --- a/src/libraries/AaveLib.sol +++ b/src/libraries/AaveLib.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.21; import { IAToken } from "aave-v3-origin/src/core/contracts/interfaces/IAToken.sol"; import { IPool } from "aave-v3-origin/src/core/contracts/interfaces/IPool.sol"; -import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; +import { IERC20 } from "../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import { IALMProxy } from "../interfaces/IALMProxy.sol"; import { IRateLimits } from "../interfaces/IRateLimits.sol"; diff --git a/src/libraries/ApproveLib.sol b/src/libraries/ApproveLib.sol index 062e680f..333ac40e 100644 --- a/src/libraries/ApproveLib.sol +++ b/src/libraries/ApproveLib.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.21; -import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; +import { IERC20 } from "../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import { IALMProxy } from "../interfaces/IALMProxy.sol"; diff --git a/src/libraries/CCTPLib.sol b/src/libraries/CCTPLib.sol index 7b0eacd9..a7fbfad4 100644 --- a/src/libraries/CCTPLib.sol +++ b/src/libraries/CCTPLib.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.21; -import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; +import { IERC20 } from "../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import { IRateLimits } from "../interfaces/IRateLimits.sol"; import { IALMProxy } from "../interfaces/IALMProxy.sol"; diff --git a/src/libraries/CurveLib.sol b/src/libraries/CurveLib.sol index d5369ff7..40e86981 100644 --- a/src/libraries/CurveLib.sol +++ b/src/libraries/CurveLib.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.21; -import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; +import { IERC20 } from "../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import { IALMProxy } from "../interfaces/IALMProxy.sol"; import { IRateLimits } from "../interfaces/IRateLimits.sol"; diff --git a/src/libraries/PSMLib.sol b/src/libraries/PSMLib.sol index eca11aee..50032049 100644 --- a/src/libraries/PSMLib.sol +++ b/src/libraries/PSMLib.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.21; -import { IERC20 } from "openzeppelin-contracts/contracts/interfaces/IERC20.sol"; +import { IERC20 } from "../../lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import { IRateLimits } from "../interfaces/IRateLimits.sol"; import { IALMProxy } from "../interfaces/IALMProxy.sol"; From 651885e0eff5199725eafb6ec3aebb4b9176ba4b Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Tue, 25 Nov 2025 13:01:34 -0500 Subject: [PATCH 04/21] feat: UniswapV4 mint/increase/decrease liquidity support (#189) * feat: UniswapV4 mint/increase/decrease liquidity support (SC-1234) * fix: PR review * fix: literal amount assertions * fix: PR Review --- .gitmodules | 6 + foundry.toml | 1 + lib/uniswap-v4-core | 1 + lib/uniswap-v4-periphery | 1 + src/MainnetController.sol | 112 +- src/RateLimitHelpers.sol | 16 +- src/interfaces/Common.sol | 18 + src/interfaces/UniswapV4.sol | 21 + src/libraries/UniswapV4Lib.sol | 446 +++++++ test/mainnet-fork/Curve.t.sol | 2 - test/mainnet-fork/Uniswapv4.t.sol | 1991 +++++++++++++++++++++++++++++ test/unit/controllers/Admin.t.sol | 62 + 12 files changed, 2668 insertions(+), 9 deletions(-) create mode 160000 lib/uniswap-v4-core create mode 160000 lib/uniswap-v4-periphery create mode 100644 src/interfaces/Common.sol create mode 100644 src/interfaces/UniswapV4.sol create mode 100644 src/libraries/UniswapV4Lib.sol create mode 100644 test/mainnet-fork/Uniswapv4.t.sol diff --git a/.gitmodules b/.gitmodules index 5ef5bd7f..fa78450c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -47,3 +47,9 @@ path = lib/spark-vaults-v2 url = https://github.com/sparkdotfi/spark-vaults-v2 branch = dev +[submodule "lib/uniswap-v4-periphery"] + path = lib/uniswap-v4-periphery + url = https://github.com/Uniswap/v4-periphery.git +[submodule "lib/uniswap-v4-core"] + path = lib/uniswap-v4-core + url = https://github.com/Uniswap/v4-core.git diff --git a/foundry.toml b/foundry.toml index 51720e59..8927e91b 100644 --- a/foundry.toml +++ b/foundry.toml @@ -18,6 +18,7 @@ remappings = [ '@layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/', 'solidity-bytes-utils/=lib/solidity-bytes-utils/', 'forge-std/=lib/forge-std/src/', + '@uniswap/v4-core/=lib/uniswap-v4-core/' ] [fuzz] diff --git a/lib/uniswap-v4-core b/lib/uniswap-v4-core new file mode 160000 index 00000000..e50237c4 --- /dev/null +++ b/lib/uniswap-v4-core @@ -0,0 +1 @@ +Subproject commit e50237c43811bd9b526eff40f26772152a42daba diff --git a/lib/uniswap-v4-periphery b/lib/uniswap-v4-periphery new file mode 160000 index 00000000..3779387e --- /dev/null +++ b/lib/uniswap-v4-periphery @@ -0,0 +1 @@ +Subproject commit 3779387e5d296f39df543d23524b050f89a62917 diff --git a/src/MainnetController.sol b/src/MainnetController.sol index cfe0d4eb..aa1a44be 100644 --- a/src/MainnetController.sol +++ b/src/MainnetController.sol @@ -24,6 +24,7 @@ import { CCTPLib } from "./libraries/CCTPLib.sol"; import { CurveLib } from "./libraries/CurveLib.sol"; import { ERC4626Lib } from "./libraries/ERC4626Lib.sol"; import { IDaiUsdsLike, IPSMLike, PSMLib } from "./libraries/PSMLib.sol"; +import { UniswapV4Lib } from "./libraries/UniswapV4Lib.sol"; import { OptionsBuilder } from "layerzerolabs/oapp-evm/contracts/oapp/libs/OptionsBuilder.sol"; @@ -129,6 +130,12 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { bool isWhitelisted ); event RelayerRemoved(address indexed relayer); + event UniswapV4TickLimitsSet( + bytes32 indexed poolId, + int24 tickLowerMin, + int24 tickUpperMax, + uint24 maxTickSpacing + ); /**********************************************************************************************/ /*** State variables ***/ @@ -153,6 +160,8 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { bytes32 public LIMIT_SPARK_VAULT_TAKE = keccak256("LIMIT_SPARK_VAULT_TAKE"); bytes32 public LIMIT_SUPERSTATE_SUBSCRIBE = keccak256("LIMIT_SUPERSTATE_SUBSCRIBE"); bytes32 public LIMIT_SUSDE_COOLDOWN = keccak256("LIMIT_SUSDE_COOLDOWN"); + bytes32 public LIMIT_UNISWAP_V4_DEPOSIT = UniswapV4Lib.LIMIT_DEPOSIT; + bytes32 public LIMIT_UNISWAP_V4_WITHDRAW = UniswapV4Lib.LIMIT_WITHDRAW; bytes32 public LIMIT_USDC_TO_CCTP = keccak256("LIMIT_USDC_TO_CCTP"); bytes32 public LIMIT_USDC_TO_DOMAIN = keccak256("LIMIT_USDC_TO_DOMAIN"); bytes32 public LIMIT_USDE_BURN = keccak256("LIMIT_USDE_BURN"); @@ -194,6 +203,9 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { // ERC4626 exchange rate thresholds (1e36 precision) mapping(address token => uint256 maxExchangeRate) public maxExchangeRates; + // Uniswap V4 tick ranges + mapping(bytes32 poolId => UniswapV4Lib.TickLimits tickLimits) public uniswapV4TickLimits; + /**********************************************************************************************/ /*** Initialization ***/ /**********************************************************************************************/ @@ -307,6 +319,31 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { ); } + function setUniswapV4TickLimits( + bytes32 poolId, + int24 tickLowerMin, + int24 tickUpperMax, + uint24 maxTickSpacing + ) + external nonReentrant + { + _checkRole(DEFAULT_ADMIN_ROLE); + + require( + ((tickLowerMin == 0) && (tickUpperMax == 0) && (maxTickSpacing == 0)) || + ((maxTickSpacing > 0) && (tickLowerMin < tickUpperMax)), + "MC/invalid-ticks" + ); + + uniswapV4TickLimits[poolId] = UniswapV4Lib.TickLimits({ + tickLowerMin : tickLowerMin, + tickUpperMax : tickUpperMax, + maxTickSpacing : maxTickSpacing + }); + + emit UniswapV4TickLimitsSet(poolId, tickLowerMin, tickUpperMax, maxTickSpacing); + } + /**********************************************************************************************/ /*** Freezer functions ***/ /**********************************************************************************************/ @@ -598,6 +635,79 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { })); } + /**********************************************************************************************/ + /*** Uniswap V4 functions ***/ + /**********************************************************************************************/ + + function mintPositionUniswapV4( + bytes32 poolId, + int24 tickLower, + int24 tickUpper, + uint128 liquidity, + uint256 amount0Max, + uint256 amount1Max + ) + external nonReentrant + { + _checkRole(RELAYER); + + UniswapV4Lib.mintPosition({ + proxy : address(proxy), + rateLimits : address(rateLimits), + poolId : poolId, + tickLower : tickLower, + tickUpper : tickUpper, + liquidity : liquidity, + amount0Max : amount0Max, + amount1Max : amount1Max, + tickLimits : uniswapV4TickLimits + }); + } + + function increaseLiquidityUniswapV4( + bytes32 poolId, + uint256 tokenId, + uint128 liquidityIncrease, + uint256 amount0Max, + uint256 amount1Max + ) + external nonReentrant + { + _checkRole(RELAYER); + + UniswapV4Lib.increasePosition({ + proxy : address(proxy), + rateLimits : address(rateLimits), + poolId : poolId, + tokenId : tokenId, + liquidityIncrease : liquidityIncrease, + amount0Max : amount0Max, + amount1Max : amount1Max + }); + } + + function decreaseLiquidityUniswapV4( + bytes32 poolId, + uint256 tokenId, + uint128 liquidityDecrease, + uint256 amount0Min, + uint256 amount1Min + ) + external nonReentrant + { + _checkRole(RELAYER); + + UniswapV4Lib.decreasePosition({ + proxy : address(proxy), + rateLimits : address(rateLimits), + poolId : poolId, + tokenId : tokenId, + liquidityDecrease : liquidityDecrease, + amount0Min : amount0Min, + amount1Min : amount1Min + }); + } + /**********************************************************************************************/ /*** Relayer Ethena functions ***/ /**********************************************************************************************/ @@ -813,7 +923,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { }); // Query the min amount received on the destination chain and set it. - ( ,, OFTReceipt memory receipt ) = ILayerZero(oftAddress).quoteOFT(sendParams); + ( , , OFTReceipt memory receipt ) = ILayerZero(oftAddress).quoteOFT(sendParams); sendParams.minAmountLD = receipt.amountReceivedLD; MessagingFee memory fee = ILayerZero(oftAddress).quoteSend(sendParams, false); diff --git a/src/RateLimitHelpers.sol b/src/RateLimitHelpers.sol index 5e634ea3..c2dc231c 100644 --- a/src/RateLimitHelpers.sol +++ b/src/RateLimitHelpers.sol @@ -3,16 +3,20 @@ pragma solidity ^0.8.21; library RateLimitHelpers { - function makeAddressKey(bytes32 key, address asset) internal pure returns (bytes32) { - return keccak256(abi.encode(key, asset)); + function makeAddressKey(bytes32 key, address a) internal pure returns (bytes32) { + return keccak256(abi.encode(key, a)); } - function makeAddressAddressKey(bytes32 key, address asset, address destination) internal pure returns (bytes32) { - return keccak256(abi.encode(key, asset, destination)); + function makeAddressAddressKey(bytes32 key, address a, address b) internal pure returns (bytes32) { + return keccak256(abi.encode(key, a, b)); } - function makeUint32Key(bytes32 key, uint32 domain) internal pure returns (bytes32) { - return keccak256(abi.encode(key, domain)); + function makeBytes32Key(bytes32 key, bytes32 a) internal pure returns (bytes32) { + return keccak256(abi.encode(key, a)); + } + + function makeUint32Key(bytes32 key, uint32 a) internal pure returns (bytes32) { + return keccak256(abi.encode(key, a)); } } diff --git a/src/interfaces/Common.sol b/src/interfaces/Common.sol new file mode 100644 index 00000000..27dfa7b7 --- /dev/null +++ b/src/interfaces/Common.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.21; + +interface IERC20Like { + + function approve(address spender, uint256 amount) external returns (bool success); + + function balanceOf(address account) external view returns (uint256 balance); + + function decimals() external view returns (uint8 decimals); + +} + +interface IPermit2Like { + + function approve(address token, address spender, uint160 amount, uint48 expiration) external; + +} diff --git a/src/interfaces/UniswapV4.sol b/src/interfaces/UniswapV4.sol new file mode 100644 index 00000000..6e225f74 --- /dev/null +++ b/src/interfaces/UniswapV4.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.21; + +import { PoolId } from "../../lib/uniswap-v4-core/src/types/PoolId.sol"; +import { PoolKey } from "../../lib/uniswap-v4-core/src/types/PoolKey.sol"; + +import { PositionInfo } from "../../lib/uniswap-v4-periphery/src/libraries/PositionInfoLibrary.sol"; + +interface IPositionManagerLike { + + function modifyLiquidities(bytes calldata unlockData, uint256 deadline) external payable; + + function getPoolAndPositionInfo( + uint256 tokenId + ) external view returns (PoolKey memory poolKey, PositionInfo info); + + function poolKeys(bytes25 poolId) external view returns (PoolKey memory poolKey); + + function ownerOf(uint256 tokenId) external view returns (address owner); + +} diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol new file mode 100644 index 00000000..51dd619d --- /dev/null +++ b/src/libraries/UniswapV4Lib.sol @@ -0,0 +1,446 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity ^0.8.21; + +import { Currency } from "../../lib/uniswap-v4-core/src/types/Currency.sol"; +import { PoolKey } from "../../lib/uniswap-v4-core/src/types/PoolKey.sol"; + +import { Actions } from "../../lib/uniswap-v4-periphery/src/libraries/Actions.sol"; + +import { IERC20Like, IPermit2Like } from "../interfaces/Common.sol"; +import { IALMProxy } from "../interfaces/IALMProxy.sol"; +import { IRateLimits } from "../interfaces/IRateLimits.sol"; +import { IPositionManagerLike } from "../interfaces/UniswapV4.sol"; + +import { RateLimitHelpers } from "../RateLimitHelpers.sol"; + +library UniswapV4Lib { + + struct TickLimits { + int24 tickLowerMin; + int24 tickUpperMax; + uint24 maxTickSpacing; + } + + bytes32 public constant LIMIT_DEPOSIT = keccak256("LIMIT_UNISWAP_V4_DEPOSIT"); + bytes32 public constant LIMIT_WITHDRAW = keccak256("LIMIT_UNISWAP_V4_WITHDRAW"); + + // NOTE: From https://docs.uniswap.org/contracts/v4/deployments (Ethereum Mainnet) + address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; + address internal constant _POSITION_MANAGER = 0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e; + + /**********************************************************************************************/ + /*** Interactive Functions ***/ + /**********************************************************************************************/ + + function mintPosition( + address proxy, + address rateLimits, + bytes32 poolId, + int24 tickLower, + int24 tickUpper, + uint128 liquidity, + uint256 amount0Max, + uint256 amount1Max, + mapping(bytes32 poolId => TickLimits tickLimits) storage tickLimits + ) + external + { + _checkTickLimits(tickLimits[poolId], tickLower, tickUpper); + + PoolKey memory poolKey = _getPoolKey(poolId); + + bytes memory callData = _getMintCalldata({ + poolKey : poolKey, + tickLower : tickLower, + tickUpper : tickUpper, + liquidity : liquidity, + amount0Max : amount0Max, + amount1Max : amount1Max, + proxy : proxy + }); + + _increaseLiquidity({ + proxy : proxy, + rateLimits : rateLimits, + poolId : poolId, + token0 : Currency.unwrap(poolKey.currency0), + token1 : Currency.unwrap(poolKey.currency1), + amount0Max : amount0Max, + amount1Max : amount1Max, + callData : callData + }); + } + + function increasePosition( + address proxy, + address rateLimits, + bytes32 poolId, + uint256 tokenId, + uint128 liquidityIncrease, + uint256 amount0Max, + uint256 amount1Max + ) + external + { + // Must not increase liquidity on a position that is not owned by the ALMProxy. + require( + IPositionManagerLike(_POSITION_MANAGER).ownerOf(tokenId) == proxy, + "MC/non-proxy-position" + ); + + _requirePoolIdMatch(poolId, tokenId); + + PoolKey memory poolKey = _getPoolKey(poolId); + + bytes memory callData = _getIncreaseLiquidityCallData({ + poolKey : poolKey, + tokenId : tokenId, + liquidityIncrease : liquidityIncrease, + amount0Max : amount0Max, + amount1Max : amount1Max + }); + + _increaseLiquidity({ + proxy : proxy, + rateLimits : rateLimits, + poolId : poolId, + token0 : Currency.unwrap(poolKey.currency0), + token1 : Currency.unwrap(poolKey.currency1), + amount0Max : amount0Max, + amount1Max : amount1Max, + callData : callData + }); + } + + function decreasePosition( + address proxy, + address rateLimits, + bytes32 poolId, + uint256 tokenId, + uint128 liquidityDecrease, + uint256 amount0Min, + uint256 amount1Min + ) + external + { + // NOTE: No need to check the token ownership here, as the proxy will be defined as the + // recipient of the tokens, so the worst case is that another account's position is + // decreased or closed by the proxy. + _requirePoolIdMatch(poolId, tokenId); + + PoolKey memory poolKey = _getPoolKey(poolId); + + bytes memory callData = _getDecreaseLiquidityCallData({ + proxy : proxy, + poolKey : poolKey, + tokenId : tokenId, + liquidityDecrease : liquidityDecrease, + amount0Min : amount0Min, + amount1Min : amount1Min + }); + + _decreaseLiquidity({ + proxy : proxy, + rateLimits : rateLimits, + poolId : poolId, + token0 : Currency.unwrap(poolKey.currency0), + token1 : Currency.unwrap(poolKey.currency1), + amount0Min : amount0Min, + amount1Min : amount1Min, + callData : callData + }); + } + + /**********************************************************************************************/ + /*** Internal Interactive Functions ***/ + /**********************************************************************************************/ + + function _approveWithPermit2( + address proxy, + address token, + address spender, + uint256 amount + ) + internal + { + // Approve the Permit2 contract to spend none of the token (success is optional). + // NOTE: We don't care about the success of this call, since the only outcomes are: + // - the allowance is 0 (it was reset or was already 0) + // - the allowance is not 0, in which case the success of the overall set of + // operations is dependent on the success of the subsequent calls. + // In other words, this is a convenience call that may not even be needed for success. + proxy.call( + abi.encodeCall( + IALMProxy.doCall, + (token, abi.encodeCall(IERC20Like.approve, (_PERMIT2, 0))) + ) + ); + + if (amount != 0) { + // Approve the Permit2 contract to spend the amount of token (success is mandatory). + bytes memory approveResult = IALMProxy(proxy).doCall( + token, + abi.encodeCall(IERC20Like.approve, (_PERMIT2, amount)) + ); + + // Revert if approve returns anything, and that anything is not `true`. + require( + approveResult.length == 0 || abi.decode(approveResult, (bool)), + "MC/permit2-approve-failed" + ); + } + + // Finally, approve the Position Manager contract to spend the token via Permit2. + IALMProxy(proxy).doCall( + _PERMIT2, + abi.encodeCall( + IPermit2Like.approve, + (token, spender, uint160(amount), uint48(block.timestamp)) + ) + ); + } + + function _increaseLiquidity( + address proxy, + address rateLimits, + bytes32 poolId, + address token0, + address token1, + uint256 amount0Max, + uint256 amount1Max, + bytes memory callData + ) + internal + { + _approveWithPermit2(proxy, token0, _POSITION_MANAGER, amount0Max); + _approveWithPermit2(proxy, token1, _POSITION_MANAGER, amount1Max); + + // Get token balances before liquidity increase. + uint256 startingBalance0 = _getBalance(token0, proxy); + uint256 startingBalance1 = _getBalance(token1, proxy); + + // Perform action + IALMProxy(proxy).doCall(_POSITION_MANAGER, callData); + + // Get token balances after liquidity increase. + uint256 endingBalance0 = _getBalance(token0, proxy); + uint256 endingBalance1 = _getBalance(token1, proxy); + + // Account for the theoretical possibility of receiving tokens when adding liquidity by + // using a clamped subtraction. + // NOTE: The limitation of this integration is the assumption that the tokens are valued + // equally (i.e. 1.00000 USDC = 1.000000000000000000 USDS). + uint256 rateLimitDecrease = _clampedSub( + _getNormalizedBalance(token0, startingBalance0) + + _getNormalizedBalance(token1, startingBalance1), + _getNormalizedBalance(token0, endingBalance0) + + _getNormalizedBalance(token1, endingBalance1) + ); + + // Perform rate limit decrease. + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeBytes32Key(LIMIT_DEPOSIT, poolId), + rateLimitDecrease + ); + + // Reset approval of Permit2 in token0 and token1 + // NOTE: It's not necessary to reset the Position Manager approval in Permit2 (as it + // doesn't have allowance in the token at this point), but prudent so there isn't a + // hanging unused approval. + _approveWithPermit2(proxy, token0, _POSITION_MANAGER, 0); + _approveWithPermit2(proxy, token1, _POSITION_MANAGER, 0); + } + + function _decreaseLiquidity( + address proxy, + address rateLimits, + bytes32 poolId, + address token0, + address token1, + uint256 amount0Min, + uint256 amount1Min, + bytes memory callData + ) + internal + { + // Get token balances before liquidity decrease. + uint256 startingBalance0 = _getBalance(token0, proxy); + uint256 startingBalance1 = _getBalance(token1, proxy); + + // Perform action + IALMProxy(proxy).doCall(_POSITION_MANAGER, callData); + + // Get token balances after liquidity decrease. + uint256 endingBalance0 = _getBalance(token0, proxy); + uint256 endingBalance1 = _getBalance(token1, proxy); + + // NOTE: The limitation of this integration is the assumption that the tokens are valued + // equally (i.e. 1.00000 USDC = 1.000000000000000000 USDS). + uint256 rateLimitDecrease = + _getNormalizedBalance(token0, endingBalance0 - startingBalance0) + + _getNormalizedBalance(token1, endingBalance1 - startingBalance1); + + // Perform rate limit decrease. + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeBytes32Key(LIMIT_WITHDRAW, poolId), + rateLimitDecrease + ); + } + + /**********************************************************************************************/ + /*** Internal View/Pure Functions ***/ + /**********************************************************************************************/ + + function _checkTickLimits(TickLimits memory limits, int24 tickLower, int24 tickUpper) + internal pure + { + require(limits.maxTickSpacing != 0, "MC/tickLimits-not-set"); + require(tickLower < tickUpper, "MC/ticks-misordered"); + require(tickLower >= limits.tickLowerMin, "MC/tickLower-too-low"); + require(tickUpper <= limits.tickUpperMax, "MC/tickUpper-too-high"); + + require( + uint256(int256(tickUpper) - int256(tickLower)) <= limits.maxTickSpacing, + "MC/tickSpacing-too-wide" + ); + } + + function _clampedSub(uint256 a, uint256 b) internal pure returns (uint256 c) { + return a > b ? a - b : 0; + } + + function _getBalance(address token, address account) internal view returns (uint256 balance) { + return IERC20Like(token).balanceOf(account); + } + + function _getMintCalldata( + address proxy, + PoolKey memory poolKey, + int24 tickLower, + int24 tickUpper, + uint128 liquidity, + uint256 amount0Max, + uint256 amount1Max + ) + internal view returns (bytes memory callData) + { + bytes memory actions = abi.encodePacked( + uint8(Actions.MINT_POSITION), + uint8(Actions.SETTLE_PAIR) + ); + + bytes[] memory params = new bytes[](2); + + params[0] = abi.encode( + poolKey, // Which pool to mint in + tickLower, // Position's lower price bound + tickUpper, // Position's upper price bound + liquidity, // Amount of liquidity to mint + amount0Max, // Maximum amount of token0 to use + amount1Max, // Maximum amount of token1 to use + proxy, // NFT recipient + "" // No hook data needed + ); + + params[1] = abi.encode( + poolKey.currency0, // First token to settle + poolKey.currency1 // Second token to settle + ); + + return _getModifyLiquiditiesCallData(actions, params); + } + + function _getIncreaseLiquidityCallData( + PoolKey memory poolKey, + uint256 tokenId, + uint128 liquidityIncrease, + uint256 amount0Max, + uint256 amount1Max + ) + internal view returns (bytes memory callData) + { + bytes memory actions = abi.encodePacked( + uint8(Actions.INCREASE_LIQUIDITY), + uint8(Actions.CLOSE_CURRENCY), + uint8(Actions.CLOSE_CURRENCY) + ); + + bytes[] memory params = new bytes[](3); + + params[0] = abi.encode( + tokenId, // Position to increase + liquidityIncrease, // Amount to add + amount0Max, // Maximum token0 to spend + amount1Max, // Maximum token1 to spend + "" // No hook data needed + ); + + params[1] = abi.encode(poolKey.currency0); + params[2] = abi.encode(poolKey.currency1); + + return _getModifyLiquiditiesCallData(actions, params); + } + + function _getDecreaseLiquidityCallData( + address proxy, + PoolKey memory poolKey, + uint256 tokenId, + uint128 liquidityDecrease, + uint256 amount0Min, + uint256 amount1Min + ) + internal view returns (bytes memory callData) + { + bytes memory actions = abi.encodePacked( + uint8(Actions.DECREASE_LIQUIDITY), + uint8(Actions.TAKE_PAIR) + ); + + bytes[] memory params = new bytes[](2); + + params[0] = abi.encode( + tokenId, // Position to decrease + liquidityDecrease, // Amount to remove + amount0Min, // Minimum token0 to receive + amount1Min, // Minimum token1 to receive + "" // No hook data needed + ); + + params[1] = abi.encode( + poolKey.currency0, // First token + poolKey.currency1, // Second token + proxy // Who receives the tokens + ); + + return _getModifyLiquiditiesCallData(actions, params); + } + + function _getModifyLiquiditiesCallData(bytes memory actions, bytes[] memory params) + internal view returns (bytes memory callData) + { + return abi.encodeCall( + IPositionManagerLike.modifyLiquidities, + (abi.encode(actions, params), block.timestamp) + ); + } + + function _getNormalizedBalance(address token, uint256 balance) + internal view returns (uint256 normalizedBalance) + { + return balance * 1e18 / (10 ** IERC20Like(token).decimals()); + } + + function _getPoolKey(bytes32 poolId) internal view returns (PoolKey memory poolKey) { + return IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); + } + + function _requirePoolIdMatch(bytes32 poolId, uint256 tokenId) internal view { + ( + PoolKey memory poolKey, + // PositionInfo not needed + ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + + require(keccak256(abi.encode(poolKey)) == poolId, "MC/tokenId-poolId-mismatch"); + } + +} diff --git a/test/mainnet-fork/Curve.t.sol b/test/mainnet-fork/Curve.t.sol index 3c676194..f2fa5748 100644 --- a/test/mainnet-fork/Curve.t.sol +++ b/test/mainnet-fork/Curve.t.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity >=0.8.0; -import { IERC4626 } from "forge-std/interfaces/IERC4626.sol"; - import { ReentrancyGuard } from "../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; import "./ForkTestBase.t.sol"; diff --git a/test/mainnet-fork/Uniswapv4.t.sol b/test/mainnet-fork/Uniswapv4.t.sol new file mode 100644 index 00000000..1d08e0d9 --- /dev/null +++ b/test/mainnet-fork/Uniswapv4.t.sol @@ -0,0 +1,1991 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +pragma solidity >=0.8.0; + +import { console } from "../../lib/forge-std/src/console.sol"; + +import { ReentrancyGuard } from "../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; + +import { PoolId } from "../../lib/uniswap-v4-core/src/types/PoolId.sol"; +import { PoolKey } from "../../lib/uniswap-v4-core/src/types/PoolKey.sol"; +import { PositionInfo } from "../../lib/uniswap-v4-periphery/src/libraries/PositionInfoLibrary.sol"; +import { FullMath } from "../../lib/uniswap-v4-core/src/libraries/FullMath.sol"; +import { TickMath } from "../../lib/uniswap-v4-core/src/libraries/TickMath.sol"; + +import { IV4Router } from "../../lib/uniswap-v4-periphery/src/interfaces/IV4Router.sol"; +import { Actions } from "../../lib/uniswap-v4-periphery/src/libraries/Actions.sol"; +import { SlippageCheck } from "../../lib/uniswap-v4-periphery/src/libraries/SlippageCheck.sol"; + +import { IAccessControl } from "../../lib/openzeppelin-contracts/contracts/access/IAccessControl.sol"; + +import { UniswapV4Lib } from "../../src/libraries/UniswapV4Lib.sol"; + +import { MainnetController } from "../../src/MainnetController.sol"; + +import { ForkTestBase } from "./ForkTestBase.t.sol"; + +interface IERC20Like { + + // NOTE: Purposely not returning bool to avoid issues with non-conformant tokens. + function approve(address spender, uint256 amount) external; + + function allowance(address owner, address spender) external view returns (uint256 allowance); + + function balanceOf(address owner) external view returns (uint256 balance); + +} + +interface IPermit2Like { + + function approve(address token, address spender, uint160 amount, uint48 expiration) external; + + function allowance( + address user, + address token, + address spender + ) external view returns (uint160 allowance, uint48 expiration, uint48 nonce); + +} + +interface IPoolManagerLike { + + error CurrencyNotSettled(); + +} + +interface IPositionManagerLike { + + function transferFrom(address from, address to, uint256 id) external; + + function getPoolAndPositionInfo( + uint256 tokenId + ) external view returns (PoolKey memory poolKey, PositionInfo info); + + function getPositionLiquidity(uint256 tokenId) external view returns (uint128 liquidity); + + function nextTokenId() external view returns (uint256 nextTokenId); + + function ownerOf(uint256 tokenId) external view returns (address owner); + + function poolKeys(bytes25 poolId) external view returns (PoolKey memory poolKeys); + +} + +interface IStateViewLike { + + function getSlot0(PoolId poolId) + external + view + returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee); + +} + +interface IUniversalRouterLike { + + function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external; + +} + +contract MainnetControllerUniswapV4Tests is ForkTestBase { + + struct IncreasePositionResult { + uint256 tokenId; + uint256 amount0Spent; + uint256 amount1Spent; + uint128 liquidityIncrease; + int24 tickLower; + int24 tickUpper; + } + + struct DecreasePositionResult { + uint256 tokenId; + uint256 amount0Received; + uint256 amount1Received; + uint128 liquidityDecrease; + int24 tickLower; + int24 tickUpper; + } + + uint256 internal constant _V4_SWAP = 0x10; + + bytes32 internal constant _LIMIT_DEPOSIT = keccak256("LIMIT_UNISWAP_V4_DEPOSIT"); + bytes32 internal constant _LIMIT_WITHDRAW = keccak256("LIMIT_UNISWAP_V4_WITHDRAW"); + + bytes32 internal constant _DEPOSIT_LIMIT_KEY = keccak256(abi.encode(_LIMIT_DEPOSIT, _POOL_ID)); + bytes32 internal constant _WITHDRAW_LIMIT_KEY = keccak256(abi.encode(_LIMIT_WITHDRAW, _POOL_ID)); + + address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; + address internal constant _POSITION_MANAGER = 0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e; + address internal constant _ROUTER = 0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af; + address internal constant _STATE_VIEW = 0x7fFE42C4a5DEeA5b0feC41C94C136Cf115597227; + + // Uniswap V4 USDC/USDT pool + bytes32 internal constant _POOL_ID = 0x8aa4e11cbdf30eedc92100f4c8a31ff748e201d44712cc8c90d189edaa8e4e47; + + address internal immutable _unauthorized = makeAddr("unauthorized"); + address internal immutable _user = makeAddr("user"); + + /**********************************************************************************************/ + /*** mintPositionUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_mintPositionUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.mintPositionUniswapV4({ + poolId : bytes32(0), + tickLower : 0, + tickUpper : 0, + liquidity : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_mintPositionUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.mintPositionUniswapV4({ + poolId : bytes32(0), + tickLower : 0, + tickUpper : 0, + liquidity : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickLimitsNotSet() external { + vm.prank(relayer); + vm.expectRevert("MC/tickLimits-not-set"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 0, + tickUpper : 0, + liquidity : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTicksMisordered() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/ticks-misordered"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : -6, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + vm.expectRevert("MC/ticks-misordered"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : -5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : -4, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickLowerTooLow() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickLower-too-low"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -11, + tickUpper : -5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : -5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickUpperTooHigh() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickUpper-too-high"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 1, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickSpacingTooWide() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 10, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickSpacing-too-wide"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 6, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassed() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(-10, 0, 1_000_000e6); + + deal(address(usdc), address(almProxy), amount0Forecasted + 1); + deal(address(usdt), address(almProxy), amount1Forecasted + 1); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + } + + function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassed() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(-10, 0, 1_000_000e6); + + deal(address(usdc), address(almProxy), amount0Forecasted + 1); + deal(address(usdt), address(almProxy), amount1Forecasted + 1); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + } + + function test_mintPositionUniswapV4_revertsWhenRateLimitExceeded() external { + uint256 expectedDecrease = 499.966111e18; + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(-10, 0, 1_000_000e6); + + deal(address(usdc), address(almProxy), amount0Forecasted + 1); + deal(address(usdt), address(almProxy), amount1Forecasted + 1); + + vm.prank(relayer); + vm.expectRevert("RateLimits/rate-limit-exceeded"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease, 0); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + } + + function test_mintPositionUniswapV4() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(-10, 0, 1_000_000e6, 0.99e18); + + vm.record(); + + IncreasePositionResult memory result = _mintPosition(-10, 0, 1_000_000e6, amount0Max, amount1Max); + + _assertReentrancyGuardWrittenToTwice(); + + assertEq(result.amount0Spent, 340.756158e6); + assertEq(result.amount1Spent, 159.209953e6); + } + + /**********************************************************************************************/ + /*** increaseLiquidity Tests ***/ + /**********************************************************************************************/ + + function test_increaseLiquidityUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_increaseLiquidityUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenPositionIsNotOwnedByProxy() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(address(almProxy)); + IPositionManagerLike(_POSITION_MANAGER).transferFrom(address(almProxy), address(1), minted.tokenId); + + vm.prank(relayer); + vm.expectRevert("MC/non-proxy-position"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : minted.tokenId, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenTokenIsNotForPool() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(relayer); + vm.expectRevert("MC/tokenId-poolId-mismatch"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : minted.tokenId, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassed() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + minted.tickLower, + minted.tickUpper, + 1_000_000e6 + ); + + deal(address(usdc), address(almProxy), amount0Forecasted + 1); + deal(address(usdt), address(almProxy), amount1Forecasted + 1); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + ); + + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassed() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + minted.tickLower, + minted.tickUpper, + 1_000_000e6 + ); + + deal(address(usdc), address(almProxy), amount0Forecasted + 1); + deal(address(usdt), address(almProxy), amount1Forecasted + 1); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) + ); + + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenRateLimitExceeded() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + uint256 expectedDecrease = 499.966111e18; + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(minted.tickLower, minted.tickUpper, 1_000_000e6); + + deal(address(usdc), address(almProxy), amount0Forecasted + 1); + deal(address(usdt), address(almProxy), amount1Forecasted + 1); + + vm.prank(relayer); + vm.expectRevert("RateLimits/rate-limit-exceeded"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease, 0); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + } + + function test_increaseLiquidityUniswapV4() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(minted.tickLower, minted.tickUpper, 1_000_000e6, 0.99e18); + + vm.record(); + + IncreasePositionResult memory result = _increasePosition(minted.tokenId, 1_000_000e6, amount0Max, amount1Max); + + _assertReentrancyGuardWrittenToTwice(); + + assertEq(result.amount0Spent, 340.756158e6); + assertEq(result.amount1Spent, 159.209953e6); + } + + /**********************************************************************************************/ + /*** decreaseLiquidityUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_decreaseLiquidityUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityDecrease : 0, + amount0Min : 0, + amount1Min : 0 + }); + } + + function test_decreaseLiquidityUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityDecrease : 0, + amount0Min : 0, + amount1Min : 0 + }); + } + + function test_decreaseLiquidityUniswapV4_revertsWhenTokenIsNotForPool() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(relayer); + vm.expectRevert("MC/tokenId-poolId-mismatch"); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : minted.tokenId, + liquidityDecrease : 0, + amount0Min : 0, + amount1Min : 0 + }); + } + + function test_decreaseLiquidityUniswapV4_revertsWhenAmount0MinNotMet() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + minted.tickLower, + minted.tickUpper, + minted.liquidityIncrease / 2 + ); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector( + SlippageCheck.MinimumAmountInsufficient.selector, + amount0Forecasted + 1, + amount0Forecasted + ) + ); + + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted + 1, + amount1Min : amount1Forecasted + }); + + vm.prank(relayer); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + }); + } + + function test_decreaseLiquidityUniswapV4_revertsWhenAmount1MinNotMet() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + minted.tickLower, + minted.tickUpper, + minted.liquidityIncrease / 2 + ); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector( + SlippageCheck.MinimumAmountInsufficient.selector, + amount1Forecasted + 1, + amount1Forecasted + ) + ); + + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + 1 + }); + + vm.prank(relayer); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + }); + } + + function test_decreaseLiquidityUniswapV4_revertsWhenRateLimitExceeded() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + uint256 expectedDecrease = 249.983054e18; + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, expectedDecrease - 1, 0); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + minted.tickLower, + minted.tickUpper, + minted.liquidityIncrease / 2 + ); + + vm.prank(relayer); + vm.expectRevert("RateLimits/rate-limit-exceeded"); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + }); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, expectedDecrease, 0); + + vm.prank(relayer); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + }); + } + + function test_decreaseLiquidityUniswapV4_partial() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + + ( uint256 amount0Min, uint256 amount1Min ) = _getDecreasePositionMinAmounts(minted.tokenId, minted.liquidityIncrease / 2, 0.99e18); + + vm.record(); + + DecreasePositionResult memory result = _decreasePosition(minted.tokenId, minted.liquidityIncrease / 2, amount0Min, amount1Min); + + _assertReentrancyGuardWrittenToTwice(); + + assertEq(result.amount0Received, 170.378078e6); + assertEq(result.amount1Received, 79.604976e6); + } + + function test_decreaseLiquidityUniswapV4_all() external { + IncreasePositionResult memory minted = _setupLiquidity(); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + + ( uint256 amount0Min, uint256 amount1Min ) = _getDecreasePositionMinAmounts(minted.tokenId, minted.liquidityIncrease, 0.99e18); + + vm.record(); + + DecreasePositionResult memory result = _decreasePosition(minted.tokenId, minted.liquidityIncrease, amount0Min, amount1Min); + + _assertReentrancyGuardWrittenToTwice(); + + assertEq(result.amount0Received, 340.756157e6); + assertEq(result.amount1Received, 159.209952e6); + } + + /**********************************************************************************************/ + /*** Story Tests ***/ + /**********************************************************************************************/ + + /** + * @dev Story 1 is a round trip of liquidity minting, increase, decreasing, and closing/burning, + * each 90 days apart, while an external account swaps tokens in and out of the pool. + * - The relayer mints a position with 1,000,000 liquidity. + * - The relayer increases the liquidity position by 50% (to 1,500,000 liquidity). + * - The relayer decreases the liquidity position by 50% (to 750,000 liquidity). + * - The relayer decreases the remaining liquidity position (to 0 liquidity). + */ + function test_uniswapV4_story1() external { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + vm.stopPrank(); + + // 1. The relayer mints a position with 1,000,000 liquidity. + IncreasePositionResult memory increaseResult = _mintPosition(-10, 0, 1_000_000e6, type(uint160).max, type(uint160).max); + + uint256 expectedDecrease = _to18From6Decimals(increaseResult.amount0Spent) + _to18From6Decimals(increaseResult.amount1Spent); + assertEq(rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY), 2_000_000e18 - expectedDecrease); + + // 2. 90 days elapse. + vm.warp(block.timestamp + 90 days); + + // 3. Some account swaps 500,000 USDT for USDC. + _externalSwap(_user, address(usdt), 500_000e6); + + // 4. The relayer increases the liquidity position by 50%. + increaseResult = _increasePosition(increaseResult.tokenId, 500_000e6, type(uint160).max, type(uint160).max); + + // NOTE: Rate recharged to max since 90 days elapsed. + expectedDecrease = _to18From6Decimals(increaseResult.amount0Spent) + _to18From6Decimals(increaseResult.amount1Spent); + assertEq(rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY), 2_000_000e18 - expectedDecrease); + + // 5. 90 days elapse. + vm.warp(block.timestamp + 90 days); + + // 6. Some account swaps 750,000 USDC for USDT. + _externalSwap(_user, address(usdc), 750_000e6); + + // 7. The relayer decreases the liquidity position by 50%. + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 750_000e6, 0, 0); + + expectedDecrease = _to18From6Decimals(decreaseResult.amount0Received) + _to18From6Decimals(decreaseResult.amount1Received); + assertEq(rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY), 2_000_000e18 - expectedDecrease); + + // 8. 90 days elapse. + vm.warp(block.timestamp + 90 days); + + // 9. Some account swaps 1,000,000 USDT for USDC. + _externalSwap(_user, address(usdt), 1_000_000e6); + + // 10. The relayer decreases the remaining liquidity position. + decreaseResult = _decreasePosition(increaseResult.tokenId, 750_000e6, 0, 0); + + // NOTE: Rate recharged to max since 90 days elapsed. + expectedDecrease = _to18From6Decimals(decreaseResult.amount0Received) + _to18From6Decimals(decreaseResult.amount1Received); + assertEq(rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY), 2_000_000e18 - expectedDecrease); + + assertEq( + IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(decreaseResult.tokenId), + 0 + ); + } + + /**********************************************************************************************/ + /*** Log Price And Ticks Tests ***/ + /**********************************************************************************************/ + + function test_uniswapV4_logPriceAndTicks_increasingPrice() public { + vm.skip(true); + + for (uint256 i = 0; i <= 100; ++i) { + if (i != 0) { + _externalSwap(_user, address(usdt), 200_000e6); + } + + _logCurrentPriceAndTick(); + console.log(" -> After swapping: %s USDT\n", uint256(i * 200_000)); + } + } + + function test_uniswapV4_logPriceAndTicks_decreasingPrice() public { + vm.skip(true); + + for (uint256 i = 0; i <= 100; ++i) { + if (i != 0) { + _externalSwap(_user, address(usdc), 200_000e6); + } + + _logCurrentPriceAndTick(); + console.log(" -> After swapping: %s USDC\n", uint256(i * 200_000)); + } + } + + /**********************************************************************************************/ + /*** Attack Tests (Current price is expected to be between the range) ***/ + /**********************************************************************************************/ + + function test_uniswapV4_baseline_priceMid() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Add Liquidity (Current price is expected to be between the range) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + IncreasePositionResult memory increaseResult = _mintPosition(-10, 10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 840_606.192834e6); + assertEq(increaseResult.amount1Spent, 159_209.952358e6); + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_816.145192e6); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 840_606.192833e6); + assertEq(decreaseResult.amount1Received, 159_209.952357e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_816.145190e6); // Lost 0 USD. + } + + function test_uniswapV4_attack_priceMidToAbove() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + uint256 amountOut1 = _externalSwap(_user, address(usdt), 19_200_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be between the range, but is above) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), 11); + + IncreasePositionResult memory increaseResult = _mintPosition(-10, 10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 0); // Expected 840_606.192834e6 as per baseline + assertEq(increaseResult.amount1Spent, 999_950.044994e6); // Expected 159_209.952358e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_950.044994e6); // Expected 999_816.145192e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), 11); + + uint256 amountOut2 = _externalSwap(_user, address(usdc), uint128(amountOut1)); + + assertEq(amountOut2, 19_200_305.050324e6); + assertEq(usdc.balanceOf(_user), 0); + assertEq(usdt.balanceOf(_user), 19_200_305.050324e6); // Gained 305 USDT. + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 819_742.888121e6); + assertEq(decreaseResult.amount1Received, 180_067.672764e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_810.560885e6); // Lost 139 USD from mint + } + + function test_uniswapV4_attack_priceMidToBelow() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + uint256 amountOut1 = _externalSwap(_user, address(usdc), 2_500_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be between the range, but is below) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -11); + + IncreasePositionResult memory increaseResult = _mintPosition(-10, 10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 999_950.044994e6); // Expected 840_606.192834e6 as per baseline + assertEq(increaseResult.amount1Spent, 0); // Expected 159_209.952358e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_950.044994e6); // Expected 999_816.145192e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -11); + + uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); + + assertEq(amountOut2, 2_499_974.750232e6); + assertEq(usdc.balanceOf(_user), 2_499_974.750232e6); // Lost 26 USDC. + assertEq(usdt.balanceOf(_user), 0); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 844_561.661143e6); + assertEq(decreaseResult.amount1Received, 155_258.746587e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_820.40773e6); // Lost 129 USD from mint + } + + /**********************************************************************************************/ + /*** Attack Tests (Current price is expected to be below the range) ***/ + /**********************************************************************************************/ + + function test_uniswapV4_baseline_priceBelow() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Add Liquidity (Current price is expected to be below the range) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + IncreasePositionResult memory increaseResult = _mintPosition(-5, 15, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 999_700.101224e6); + assertEq(increaseResult.amount1Spent, 0); + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_700.101224e6); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 999_700.101223e6); + assertEq(decreaseResult.amount1Received, 0); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_700.101223e6); // Lost 0 USD. + } + + function test_uniswapV4_attack_priceBelowToMid() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + uint256 amountOut1 = _externalSwap(_user, address(usdt), 18_000_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be below the range, but is between) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), 2); + + IncreasePositionResult memory increaseResult = _mintPosition(-5, 15, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 632_055.655046e6); // Expected 999_700.101224e6 as per baseline + assertEq(increaseResult.amount1Spent, 367_595.789859e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_651.444905e6); // Expected 999_700.101224e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), 2); + + uint256 amountOut2 = _externalSwap(_user, address(usdc), uint128(amountOut1)); + + assertEq(amountOut2, 17_999_838.406844e6); + assertEq(usdc.balanceOf(_user), 0); + assertEq(usdt.balanceOf(_user), 17_999_838.406844e6); // Lost 161 USDT. + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 999_703.777704e6); + assertEq(decreaseResult.amount1Received, 0); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_703.777704e6); // Gained 52 USD from mint. + } + + function test_uniswapV4_attack_priceBelowToAbove() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + uint256 amountOut1 = _externalSwap(_user, address(usdt), 19_300_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be below the range, but is above) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), 34); + + IncreasePositionResult memory increaseResult = _mintPosition(-5, 15, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 0); // Expected 999_700.101224e6 as per baseline + assertEq(increaseResult.amount1Spent, 1_000_200.051255e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 1_000_200.051255e6); // Expected 999_700.101224e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), 34); + + uint256 amountOut2 = _externalSwap(_user, address(usdc), uint128(amountOut1)); + + assertEq(amountOut2, 19_300_769.578693e6); + assertEq(usdc.balanceOf(_user), 0); + assertEq(usdt.balanceOf(_user), 19_300_769.578693e6); // Gained 769 USDT. + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 999_710.098327e6); + assertEq(decreaseResult.amount1Received, 0); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_710.098327e6); // Lost 490 USD from mint + } + + /**********************************************************************************************/ + /*** Attack Tests (Current price is expected to be above the range) ***/ + /**********************************************************************************************/ + + function test_uniswapV4_baseline_priceAbove() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Add Liquidity (Current price is expected to be above the range) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + IncreasePositionResult memory increaseResult = _mintPosition(-30, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 0); + assertEq(increaseResult.amount1Spent, 998_950.644702e6); + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 998_950.644702e6); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 0); + assertEq(decreaseResult.amount1Received, 998_950.644701e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_950.644701e6); // Lost 0 USD. + } + + function test_uniswapV4_attack_priceAboveToMid() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + uint256 amountOut1 = _externalSwap(_user, address(usdc), 2_840_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be above the range, but is between) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -20); + + IncreasePositionResult memory increaseResult = _mintPosition(-30, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 457_787.249555e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent, 541_830.090075e6); // Expected 998_950.644702e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_617.339630e6); // Expected 998_950.644702e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -20); + + uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); + + assertEq(amountOut2, 2_840_292.929030e6); + assertEq(usdc.balanceOf(_user), 2_840_292.929030e6); // Gained 292 USDC. + assertEq(usdt.balanceOf(_user), 0); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -8); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 0); + assertEq(decreaseResult.amount1Received, 998_955.215954e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_955.215954e6); // Lost 662 USD from mint + } + + function test_uniswapV4_attack_priceAboveToBelow() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + uint256 amountOut1 = _externalSwap(_user, address(usdc), 2_900_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -50); + + IncreasePositionResult memory increaseResult = _mintPosition(-30, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 1_000_950.445137e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent, 0); // Expected 998_950.644702e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 1_000_950.445137e6); // Expected 998_950.644702e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -50); + + uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); + + assertEq(amountOut2, 2_901_232.701533e6); + assertEq(usdc.balanceOf(_user), 2_901_232.701533e6); // Gained 1_232 USDC. + assertEq(usdt.balanceOf(_user), 0); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -8); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 0); + assertEq(decreaseResult.amount1Received, 998_960.634310e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_960.634310e6); // Lost 1,989 USD from mint + } + + function test_uniswapV4_attack_priceAboveToBelow_defended() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Get max amounts ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + // While recommended usage is to use max amounts that are exactly (or close to exactly) the + // forecasted amounts in production, however this shows that even a value of 0.99 is + // sufficient to prevent an attack. + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(-30, -10, 1_000_000_000e6, 0.99e18); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + _externalSwap(_user, address(usdc), 2_900_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -50); + + deal(address(usdc), address(almProxy), usdc.balanceOf(address(almProxy)) + amount0Max); + deal(address(usdt), address(almProxy), usdt.balanceOf(address(almProxy)) + amount1Max); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, 0, 1_000_950.445137e6) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -30, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : amount0Max, + amount1Max : amount1Max + }); + } + + /**********************************************************************************************/ + /*** Attack Tests (Current price is expected to be above the range, with wide tick spacing) ***/ + /**********************************************************************************************/ + + function test_uniswapV4_baseline_priceAbove_wideTicks() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 200); // Allow wider tick range. + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Add Liquidity (Current price is expected to be above the range) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + IncreasePositionResult memory increaseResult = _mintPosition(-200, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 0); + assertEq(increaseResult.amount1Spent, 9_449_821.223798e6); + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 9_449_821.223798e6); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 0); + assertEq(decreaseResult.amount1Received, 9_449_821.223797e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 9_449_821.223797e6); // Lost 0 USD. + } + + function test_uniswapV4_attack_priceAboveToBelow_wideTicks() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 200); // Allow wider tick spacing. + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + uint256 amountOut1 = _externalSwap(_user, address(usdc), 3_020_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -501); + + IncreasePositionResult memory increaseResult = _mintPosition(-200, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 9_549_562.082877e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent, 0); // Expected 9_449_821.223798e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 9_549_562.082877e6); // Expected 9_449_821.223798e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -501); + + uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); + + assertEq(amountOut2, 3_067_685.526025e6); + assertEq(usdc.balanceOf(_user), 3_067_685.526025e6); // Gained 47_685 USDC. + assertEq(usdt.balanceOf(_user), 0); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -141); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 6_528_153.154390e6); + assertEq(decreaseResult.amount1Received, 2_970_499.394905e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 9_498_652.549295e6); // Lost 50,909 USD from mint + } + + function test_uniswapV4_attack_priceAboveToBelow_defended_wideTicks() public { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); // Disallow wider tick spacing. + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -7); + + _externalSwap(_user, address(usdc), 3_020_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(), -501); + + vm.prank(relayer); + vm.expectRevert("MC/tickSpacing-too-wide"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -200, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); + } + + /**********************************************************************************************/ + /*** Helper Functions ***/ + /**********************************************************************************************/ + + function _setupLiquidity() internal returns (IncreasePositionResult memory minted) { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(-10, 0, 1_000_000e6, 0.99e18); + + minted = _mintPosition(-10, 0, 1_000_000e6, amount0Max, amount1Max); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 0, 0, 0); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 0, 0); + vm.stopPrank(); + } + + function _getIncreasePositionMaxAmounts( + int24 tickLower, + int24 tickUpper, + uint128 liquidity, + uint256 maxSlippage + ) internal returns (uint256 amount0Max, uint256 amount1Max) { + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + tickLower, + tickUpper, + liquidity + ); + + amount0Max = (amount0Forecasted * 1e18) / maxSlippage; + amount1Max = (amount1Forecasted * 1e18) / maxSlippage; + } + + function _mintPosition( + int24 tickLower, + int24 tickUpper, + uint128 liquidity, + uint256 amount0Max, + uint256 amount1Max + ) internal returns (IncreasePositionResult memory result) { + uint256 tokenIdToMint = IPositionManagerLike(_POSITION_MANAGER).nextTokenId(); + + deal(address(usdc), address(almProxy), usdc.balanceOf(address(almProxy)) + amount0Max); + deal(address(usdt), address(almProxy), usdt.balanceOf(address(almProxy)) + amount1Max); + + uint256 usdcBeforeCall = usdc.balanceOf(address(almProxy)); + uint256 usdtBeforeCall = usdt.balanceOf(address(almProxy)); + + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : tickLower, + tickUpper : tickUpper, + liquidity : liquidity, + amount0Max : amount0Max, + amount1Max : amount1Max + }); + + uint256 usdcAfterCall = usdc.balanceOf(address(almProxy)); + uint256 usdtAfterCall = usdt.balanceOf(address(almProxy)); + + uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + + result.tokenId = tokenIdToMint; + result.amount0Spent = usdcBeforeCall - usdcAfterCall; + result.amount1Spent = usdtBeforeCall - usdtAfterCall; + result.liquidityIncrease = liquidity; + result.tickLower = tickLower; + result.tickUpper = tickUpper; + + assertLe(result.amount0Spent, amount0Max); + assertLe(result.amount1Spent, amount1Max); + + assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(result.amount0Spent + result.amount1Spent)); + + assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); + + assertEq(IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(result.tokenId), result.liquidityIncrease); + + _assertZeroAllowances(address(usdc)); + _assertZeroAllowances(address(usdt)); + } + + function _increasePosition( + uint256 tokenId, + uint128 liquidityIncrease, + uint256 amount0Max, + uint256 amount1Max + ) internal returns (IncreasePositionResult memory result) { + ( + , // PoolKey + PositionInfo positionInfo + ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + + deal(address(usdc), address(almProxy), usdc.balanceOf(address(almProxy)) + amount0Max); + deal(address(usdt), address(almProxy), usdt.balanceOf(address(almProxy)) + amount1Max); + + uint256 usdcBeforeCall = usdc.balanceOf(address(almProxy)); + uint256 usdtBeforeCall = usdt.balanceOf(address(almProxy)); + + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + + uint256 positionLiquidityBeforeCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : tokenId, + liquidityIncrease : liquidityIncrease, + amount0Max : amount0Max, + amount1Max : amount1Max + }); + + uint256 usdcAfterCall = usdc.balanceOf(address(almProxy)); + uint256 usdtAfterCall = usdt.balanceOf(address(almProxy)); + + uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + + uint256 positionLiquidityAfterCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + + result.tokenId = tokenId; + result.amount0Spent = usdcBeforeCall - usdcAfterCall; + result.amount1Spent = usdtBeforeCall - usdtAfterCall; + result.liquidityIncrease = liquidityIncrease; + result.tickLower = positionInfo.tickLower(); + result.tickUpper = positionInfo.tickUpper(); + + assertLe(result.amount0Spent, amount0Max); + assertLe(result.amount1Spent, amount1Max); + + assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(result.amount0Spent + result.amount1Spent)); + + assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); + + assertEq(positionLiquidityAfterCall, positionLiquidityBeforeCall + result.liquidityIncrease); + + _assertZeroAllowances(address(usdc)); + _assertZeroAllowances(address(usdt)); + } + + function _getDecreasePositionMinAmounts( + uint256 tokenId, + uint128 liquidity, + uint256 maxSlippage + ) internal returns (uint256 amount0Min, uint256 amount1Min) { + ( + , // PoolKey + PositionInfo positionInfo + ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + positionInfo.tickLower(), + positionInfo.tickUpper(), + liquidity + ); + + amount0Min = (amount0Forecasted * maxSlippage) / 1e18; + amount1Min = (amount1Forecasted * maxSlippage) / 1e18; + } + + function _decreasePosition( + uint256 tokenId, + uint128 liquidityDecrease, + uint256 amount0Min, + uint256 amount1Min + ) internal returns (DecreasePositionResult memory result) { + ( + , // PoolKey + PositionInfo positionInfo + ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + + uint256 usdcBeforeCall = usdc.balanceOf(address(almProxy)); + uint256 usdtBeforeCall = usdt.balanceOf(address(almProxy)); + + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY); + + uint256 positionLiquidityBeforeCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + + vm.prank(relayer); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : tokenId, + liquidityDecrease : liquidityDecrease, + amount0Min : amount0Min, + amount1Min : amount1Min + }); + + uint256 usdcAfterCall = usdc.balanceOf(address(almProxy)); + uint256 usdtAfterCall = usdt.balanceOf(address(almProxy)); + + uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY); + + uint256 positionLiquidityAfterCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + + result.tokenId = tokenId; + result.amount0Received = usdcAfterCall - usdcBeforeCall; + result.amount1Received = usdtAfterCall - usdtBeforeCall; + result.liquidityDecrease = liquidityDecrease; + result.tickLower = positionInfo.tickLower(); + result.tickUpper = positionInfo.tickUpper(); + + assertGe(result.amount0Received, amount0Min); + assertGe(result.amount1Received, amount1Min); + + assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(result.amount0Received + result.amount1Received)); + + assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); + + assertEq(positionLiquidityAfterCall, positionLiquidityBeforeCall - result.liquidityDecrease); + } + + function _getAmount0ForLiquidity( + uint160 sqrtPriceAX96, + uint160 sqrtPriceBX96, + uint128 liquidity + ) internal pure returns (uint256 amount0) { + require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-0"); + + return FullMath.mulDiv( + uint256(liquidity) << 96, + sqrtPriceBX96 - sqrtPriceAX96, + uint256(sqrtPriceBX96) * sqrtPriceAX96 + ); + } + + function _getAmount1ForLiquidity( + uint160 sqrtPriceAX96, + uint160 sqrtPriceBX96, + uint128 liquidity + ) internal pure returns (uint256 amount1) { + require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-1"); + + return FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, 1 << 96); + } + + function _getAmountsForLiquidity( + uint160 sqrtPriceX96, + uint160 sqrtPriceAX96, + uint160 sqrtPriceBX96, + uint128 liquidity + ) internal pure returns (uint256 amount0, uint256 amount1) { + require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices"); + + if (sqrtPriceX96 <= sqrtPriceAX96) { + return ( + _getAmount0ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity), + 0 + ); + } + + if (sqrtPriceX96 >= sqrtPriceBX96) { + return ( + 0, + _getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity) + ); + } + + return ( + _getAmount0ForLiquidity(sqrtPriceX96, sqrtPriceBX96, liquidity), + _getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceX96, liquidity) + ); + } + + function _getPrice(uint160 sqrtPriceX96) internal view returns (uint256 price) { + uint256 priceRoot = (uint256(sqrtPriceX96) * 1e18) >> 96; + + return (priceRoot * priceRoot) / 1e18; + } + + function _getPrice(int24 tick) internal view returns (uint256 price) { + return _getPrice(TickMath.getSqrtPriceAtTick(tick)); + } + + function _getCurrentTick() internal view returns (int24 tick) { + ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(_POOL_ID)); + + return TickMath.getTickAtSqrtPrice(sqrtPriceX96); + } + + function _logCurrentPriceAndTick() internal view { + ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(_POOL_ID)); + + uint256 price = _getPrice(sqrtPriceX96); + int24 tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96); + + if (price < 1e1) { + console.log("price: 0.00000000000000000%s", price); + } else if (price < 1e2) { + console.log("price: 0.0000000000000000%s", price); + } else if (price < 1e3) { + console.log("price: 0.000000000000000%s", price); + } else if (price < 1e4) { + console.log("price: 0.00000000000000%s", price); + } else if (price < 1e5) { + console.log("price: 0.0000000000000%s", price); + } else if (price < 1e6) { + console.log("price: 0.000000000000%s", price); + } else if (price < 1e7) { + console.log("price: 0.00000000000%s", price); + } else if (price < 1e8) { + console.log("price: 0.0000000000%s", price); + } else if (price < 1e9) { + console.log("price: 0.000000000%s", price); + } else if (price < 1e10) { + console.log("price: 0.00000000%s", price); + } else if (price < 1e11) { + console.log("price: 0.0000000%s", price); + } else if (price < 1e12) { + console.log("price: 0.000000%s", price); + } else if (price < 1e13) { + console.log("price: 0.00000%s", price); + } else if (price < 1e14) { + console.log("price: 0.0000%s", price); + } else if (price < 1e15) { + console.log("price: 0.000%s", price); + } else if (price < 1e16) { + console.log("price: 0.00%s", price); + } else if (price < 1e17) { + console.log("price: 0.0%s", price); + } else { + uint256 quotient = price / 1e18; + uint256 remainder = price % 1e18; + + if (remainder < 1e1) { + console.log("price: %s.00000000000000000%s", quotient, remainder); + } else if (remainder < 1e2) { + console.log("price: %s.0000000000000000%s", quotient, remainder); + } else if (remainder < 1e3) { + console.log("price: %s.000000000000000%s", quotient, remainder); + } else if (remainder < 1e4) { + console.log("price: %s.00000000000000%s", quotient, remainder); + } else if (remainder < 1e5) { + console.log("price: %s.0000000000000%s", quotient, remainder); + } else if (remainder < 1e6) { + console.log("price: %s.000000000000%s", quotient, remainder); + } else if (remainder < 1e7) { + console.log("price: %s.00000000000%s", quotient, remainder); + } else if (remainder < 1e8) { + console.log("price: %s.0000000000%s", quotient, remainder); + } else if (remainder < 1e9) { + console.log("price: %s.000000000%s", quotient, remainder); + } else if (remainder < 1e10) { + console.log("price: %s.00000000%s", quotient, remainder); + } else if (remainder < 1e11) { + console.log("price: %s.0000000%s", quotient, remainder); + } else if (remainder < 1e12) { + console.log("price: %s.000000%s", quotient, remainder); + } else if (remainder < 1e13) { + console.log("price: %s.00000%s", quotient, remainder); + } else if (remainder < 1e14) { + console.log("price: %s.0000%s", quotient, remainder); + } else if (remainder < 1e15) { + console.log("price: %s.000%s", quotient, remainder); + } else if (remainder < 1e16) { + console.log("price: %s.00%s", quotient, remainder); + } else if (remainder < 1e17) { + console.log("price: %s.0%s", quotient, remainder); + } else { + console.log("price: %s.%s", quotient, remainder); + } + } + + console.log(" -> tick: %s", tick); + } + + function _quoteLiquidity( + int24 tickLower, + int24 tickUpper, + uint128 liquidityAmount + ) internal view returns (uint256 amount0, uint256 amount1) { + ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(_POOL_ID)); + + return _getAmountsForLiquidity( + sqrtPriceX96, + TickMath.getSqrtPriceAtTick(tickLower), + TickMath.getSqrtPriceAtTick(tickUpper), + liquidityAmount + ); + } + + function _assertZeroAllowances(address token) internal { + ( uint160 allowance, , ) = IPermit2Like(_PERMIT2).allowance(address(almProxy), token, _POSITION_MANAGER); + + assertEq(allowance, 0, "permit2 allowance not 0"); + + assertEq(IERC20Like(token).allowance(address(almProxy), _PERMIT2), 0, "allowance to permit2 not 0"); + } + + function _to18From6Decimals(uint256 amount) internal pure returns (uint256) { + return amount * 1e12; + } + + function _getBlock() internal pure override returns (uint256) { + return 23470490; // September 29, 2025 + } + + function _externalSwap(address account, address tokenIn, uint128 amountIn) internal returns (uint256 amountOut) { + address tokenOut = tokenIn == address(usdc) ? address(usdt) : address(usdc); + + deal(tokenIn, account, amountIn); + + bytes memory commands = abi.encodePacked(uint8(_V4_SWAP)); + + bytes[] memory inputs = new bytes[](1); + + bytes memory actions = abi.encodePacked( + uint8(Actions.SWAP_EXACT_IN_SINGLE), + uint8(Actions.SETTLE_ALL), + uint8(Actions.TAKE_ALL) + ); + + bytes[] memory params = new bytes[](3); + + params[0] = abi.encode( + IV4Router.ExactInputSingleParams({ + poolKey : IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(_POOL_ID)), + zeroForOne : tokenIn == address(usdc), + amountIn : amountIn, + amountOutMinimum : 0, + hookData : bytes("") + }) + ); + + params[1] = abi.encode(tokenIn, amountIn); + params[2] = abi.encode(tokenOut, 0); + + // Combine actions and params into inputs + inputs[0] = abi.encode(actions, params); + + uint256 startingOutBalance = IERC20Like(tokenOut).balanceOf(account); + + // Execute the swap + vm.startPrank(account); + IERC20Like(tokenIn).approve(_PERMIT2, amountIn); + IPermit2Like(_PERMIT2).approve(tokenIn, _ROUTER, amountIn, uint48(block.timestamp)); + IUniversalRouterLike(_ROUTER).execute(commands, inputs, block.timestamp); + vm.stopPrank(); + + return IERC20Like(tokenOut).balanceOf(account) - startingOutBalance; + } + +} diff --git a/test/unit/controllers/Admin.t.sol b/test/unit/controllers/Admin.t.sol index 80280bd8..b310ceae 100644 --- a/test/unit/controllers/Admin.t.sol +++ b/test/unit/controllers/Admin.t.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.21; +import { IAccessControl } from "../../../lib/openzeppelin-contracts/contracts/access/IAccessControl.sol"; import { IERC20Metadata } from "../../../lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import { IERC4626 } from "../../../lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol"; import { ReentrancyGuard } from "../../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; @@ -438,6 +439,67 @@ contract MainnetControllerSetMaxExchangeRateTests is MainnetControllerAdminTestB } +contract MainnetControllerSetUniswapV4TickLimitsTests is MainnetControllerAdminTestBase { + + bytes32 internal constant _POOL_ID = 0x8aa4e11cbdf30eedc92100f4c8a31ff748e201d44712cc8c90d189edaa8e4e47; + + address internal immutable _unauthorized = makeAddr("unauthorized"); + + function test_setUniswapV4TickLimits_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.setUniswapV4TickLimits(bytes32(0), 0, 0, 0); + } + + function test_setUniswapV4TickLimits_revertsForNonAdmin() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.DEFAULT_ADMIN_ROLE() + ) + ); + + vm.prank(_unauthorized); + mainnetController.setUniswapV4TickLimits(bytes32(0), 0, 0, 0); + } + + function test_setUniswapV4TickLimits_revertsWhenInvalidTicks() external { + vm.prank(admin); + vm.expectRevert("MC/invalid-ticks"); + mainnetController.setUniswapV4TickLimits(bytes32(0), 1, 1, 1); // Reverts when lower >= upper + + vm.prank(admin); + mainnetController.setUniswapV4TickLimits(bytes32(0), 0, 1, 1); // lower must be less than upper + + vm.prank(admin); + vm.expectRevert("MC/invalid-ticks"); + mainnetController.setUniswapV4TickLimits(bytes32(0), 0, 1, 0); // Reverts when maxTickSpacing is zero + + vm.prank(admin); + mainnetController.setUniswapV4TickLimits(bytes32(0), 0, 0, 0); // maxTickSpacing can only be 0 if all 0 + } + + function test_setUniswapV4TickLimits() external { + vm.expectEmit(address(mainnetController)); + emit MainnetController.UniswapV4TickLimitsSet(_POOL_ID, -60, 60, 20); + + vm.record(); + + vm.prank(admin); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + + _assertReentrancyGuardWrittenToTwice(); + + ( int24 tickLowerMin, int24 tickUpperMax, uint24 maxTickSpacing ) = mainnetController.uniswapV4TickLimits(_POOL_ID); + + assertEq(tickLowerMin, -60); + assertEq(tickUpperMax, 60); + assertEq(maxTickSpacing, 20); + } + +} + contract ForeignControllerAdminTests is UnitTestBase { ForeignController foreignController; From 01094c8924f0a924ee708f3454b2fce94ded0139 Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Wed, 26 Nov 2025 11:36:31 -0500 Subject: [PATCH 05/21] feat: UniswapV4 swap support (SC-1249) (#194) * feat: UniswapV4 swap support (SC-1249) * fix: PR review * fix: PR Review 2 * fix: build workflow --- .github/workflows/ci.yml | 2 +- src/MainnetController.sol | 22 +++ src/interfaces/UniswapV4.sol | 6 + src/libraries/UniswapV4Lib.sol | 87 ++++++++++- test/mainnet-fork/Uniswapv4.t.sol | 247 ++++++++++++++++++++++++++++-- 5 files changed, 344 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5dad3183..8127ce0c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: - name: Build contracts run: | forge --version - forge build --skip test --sizes + forge build --sizes ./src test: runs-on: ubuntu-latest diff --git a/src/MainnetController.sol b/src/MainnetController.sol index aa1a44be..8a29db64 100644 --- a/src/MainnetController.sol +++ b/src/MainnetController.sol @@ -162,6 +162,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { bytes32 public LIMIT_SUSDE_COOLDOWN = keccak256("LIMIT_SUSDE_COOLDOWN"); bytes32 public LIMIT_UNISWAP_V4_DEPOSIT = UniswapV4Lib.LIMIT_DEPOSIT; bytes32 public LIMIT_UNISWAP_V4_WITHDRAW = UniswapV4Lib.LIMIT_WITHDRAW; + bytes32 public LIMIT_UNISWAP_V4_SWAP = UniswapV4Lib.LIMIT_SWAP; bytes32 public LIMIT_USDC_TO_CCTP = keccak256("LIMIT_USDC_TO_CCTP"); bytes32 public LIMIT_USDC_TO_DOMAIN = keccak256("LIMIT_USDC_TO_DOMAIN"); bytes32 public LIMIT_USDE_BURN = keccak256("LIMIT_USDE_BURN"); @@ -708,6 +709,27 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { }); } + function swapUniswapV4( + bytes32 poolId, + address tokenIn, + uint128 amountIn, + uint128 amountOutMin + ) + external nonReentrant + { + _checkRole(RELAYER); + + UniswapV4Lib.swap({ + proxy : address(proxy), + rateLimits : address(rateLimits), + poolId : poolId, + tokenIn : tokenIn, + amountIn : amountIn, + amountOutMin : amountOutMin, + maxSlippage : maxSlippages[address(uint160(uint256(poolId)))] + }); + } + /**********************************************************************************************/ /*** Relayer Ethena functions ***/ /**********************************************************************************************/ diff --git a/src/interfaces/UniswapV4.sol b/src/interfaces/UniswapV4.sol index 6e225f74..78363ff1 100644 --- a/src/interfaces/UniswapV4.sol +++ b/src/interfaces/UniswapV4.sol @@ -19,3 +19,9 @@ interface IPositionManagerLike { function ownerOf(uint256 tokenId) external view returns (address owner); } + +interface IUniversalRouterLike { + + function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external; + +} diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index 51dd619d..57688e7b 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -4,12 +4,13 @@ pragma solidity ^0.8.21; import { Currency } from "../../lib/uniswap-v4-core/src/types/Currency.sol"; import { PoolKey } from "../../lib/uniswap-v4-core/src/types/PoolKey.sol"; +import { IV4Router } from "../../lib/uniswap-v4-periphery/src/interfaces/IV4Router.sol"; import { Actions } from "../../lib/uniswap-v4-periphery/src/libraries/Actions.sol"; -import { IERC20Like, IPermit2Like } from "../interfaces/Common.sol"; -import { IALMProxy } from "../interfaces/IALMProxy.sol"; -import { IRateLimits } from "../interfaces/IRateLimits.sol"; -import { IPositionManagerLike } from "../interfaces/UniswapV4.sol"; +import { IERC20Like, IPermit2Like } from "../interfaces/Common.sol"; +import { IALMProxy } from "../interfaces/IALMProxy.sol"; +import { IRateLimits } from "../interfaces/IRateLimits.sol"; +import { IPositionManagerLike, IUniversalRouterLike } from "../interfaces/UniswapV4.sol"; import { RateLimitHelpers } from "../RateLimitHelpers.sol"; @@ -23,10 +24,14 @@ library UniswapV4Lib { bytes32 public constant LIMIT_DEPOSIT = keccak256("LIMIT_UNISWAP_V4_DEPOSIT"); bytes32 public constant LIMIT_WITHDRAW = keccak256("LIMIT_UNISWAP_V4_WITHDRAW"); + bytes32 public constant LIMIT_SWAP = keccak256("LIMIT_UNISWAP_V4_SWAP"); - // NOTE: From https://docs.uniswap.org/contracts/v4/deployments (Ethereum Mainnet) + uint256 internal constant _V4_SWAP = 0x10; + + // NOTE: From https://docs.uniswap.org/contracts/v4/deployments (Ethereum Mainnet). address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; address internal constant _POSITION_MANAGER = 0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e; + address internal constant _ROUTER = 0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af; /**********************************************************************************************/ /*** Interactive Functions ***/ @@ -151,6 +156,76 @@ library UniswapV4Lib { }); } + function swap( + address proxy, + address rateLimits, + bytes32 poolId, + address tokenIn, + uint128 amountIn, + uint128 amountOutMin, + uint256 maxSlippage + ) + external + { + require(maxSlippage != 0, "MC/max-slippage-not-set"); + + require(amountOutMin * 1e18 >= amountIn * maxSlippage, "MC/amountOutMin-too-low"); + + // Perform rate limit decrease. + IRateLimits(rateLimits).triggerRateLimitDecrease( + RateLimitHelpers.makeBytes32Key(LIMIT_SWAP, poolId), + _getNormalizedBalance(tokenIn, amountIn) + ); + + PoolKey memory poolKey = _getPoolKey(poolId); + + bytes memory actions = abi.encodePacked( + uint8(Actions.SWAP_EXACT_IN_SINGLE), + uint8(Actions.SETTLE_ALL), + uint8(Actions.TAKE_ALL) + ); + + bool zeroForOne = tokenIn == Currency.unwrap(poolKey.currency0); + + address tokenOut = zeroForOne + ? Currency.unwrap(poolKey.currency1) + : Currency.unwrap(poolKey.currency0); + + bytes[] memory params = new bytes[](3); + + params[0] = abi.encode( + IV4Router.ExactInputSingleParams({ + poolKey : poolKey, + zeroForOne : zeroForOne, + amountIn : amountIn, + amountOutMinimum : amountOutMin, + hookData : bytes("") + }) + ); + + params[1] = abi.encode(tokenIn, amountIn); + params[2] = abi.encode(tokenOut, amountOutMin); + + // Combine actions and params into inputs. + bytes[] memory inputs = new bytes[](1); + + inputs[0] = abi.encode(actions, params); + + _approveWithPermit2(proxy, tokenIn, _ROUTER, amountIn); + + // Perform action. + IALMProxy(proxy).doCall( + _ROUTER, + abi.encodeCall( + IUniversalRouterLike.execute, + (abi.encodePacked(uint8(_V4_SWAP)), inputs, block.timestamp) + ) + ); + + // Reset approval of Permit2 in tokenIn. + _approveWithPermit2(proxy, tokenIn, _ROUTER, 0); + } + /**********************************************************************************************/ /*** Internal Interactive Functions ***/ /**********************************************************************************************/ @@ -267,7 +342,7 @@ library UniswapV4Lib { uint256 startingBalance0 = _getBalance(token0, proxy); uint256 startingBalance1 = _getBalance(token1, proxy); - // Perform action + // Perform action. IALMProxy(proxy).doCall(_POSITION_MANAGER, callData); // Get token balances after liquidity decrease. diff --git a/test/mainnet-fork/Uniswapv4.t.sol b/test/mainnet-fork/Uniswapv4.t.sol index 1d08e0d9..d44899cc 100644 --- a/test/mainnet-fork/Uniswapv4.t.sol +++ b/test/mainnet-fork/Uniswapv4.t.sol @@ -85,6 +85,27 @@ interface IUniversalRouterLike { } +interface IV4QuoterLike { + + struct QuoteExactSingleParams { + PoolKey poolKey; + bool zeroForOne; + uint128 exactAmount; + bytes hookData; + } + + function quoteExactInputSingle(QuoteExactSingleParams memory params) + external + returns (uint256 amountOut, uint256 gasEstimate); + +} + +interface IV4RouterLike { + + error V4TooLittleReceived(uint256 minAmountOutReceived, uint256 amountReceived); + +} + contract MainnetControllerUniswapV4Tests is ForkTestBase { struct IncreasePositionResult { @@ -109,14 +130,17 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { bytes32 internal constant _LIMIT_DEPOSIT = keccak256("LIMIT_UNISWAP_V4_DEPOSIT"); bytes32 internal constant _LIMIT_WITHDRAW = keccak256("LIMIT_UNISWAP_V4_WITHDRAW"); + bytes32 internal constant _LIMIT_SWAP = keccak256("LIMIT_UNISWAP_V4_SWAP"); bytes32 internal constant _DEPOSIT_LIMIT_KEY = keccak256(abi.encode(_LIMIT_DEPOSIT, _POOL_ID)); bytes32 internal constant _WITHDRAW_LIMIT_KEY = keccak256(abi.encode(_LIMIT_WITHDRAW, _POOL_ID)); + bytes32 internal constant _SWAP_LIMIT_KEY = keccak256(abi.encode(_LIMIT_SWAP, _POOL_ID)); address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; address internal constant _POSITION_MANAGER = 0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e; address internal constant _ROUTER = 0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af; address internal constant _STATE_VIEW = 0x7fFE42C4a5DEeA5b0feC41C94C136Cf115597227; + address internal constant _V4_QUOTER = 0x52F0E24D1c21C8A0cB1e5a5dD6198556BD9E1203; // Uniswap V4 USDC/USDT pool bytes32 internal constant _POOL_ID = 0x8aa4e11cbdf30eedc92100f4c8a31ff748e201d44712cc8c90d189edaa8e4e47; @@ -174,7 +198,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_mintPositionUniswapV4_revertsWhenTicksMisordered() external { + function test_mintPositionUniswapV4_revertsWhenTicksMisorderedBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -216,7 +240,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_mintPositionUniswapV4_revertsWhenTickLowerTooLow() external { + function test_mintPositionUniswapV4_revertsWhenTickLowerTooLowBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -247,7 +271,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_mintPositionUniswapV4_revertsWhenTickUpperTooHigh() external { + function test_mintPositionUniswapV4_revertsWhenTickUpperTooHighBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -278,7 +302,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_mintPositionUniswapV4_revertsWhenTickSpacingTooWide() external { + function test_mintPositionUniswapV4_revertsWhenTickSpacingTooWideBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 10, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -309,7 +333,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassed() external { + function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -346,7 +370,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassed() external { + function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -383,7 +407,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_mintPositionUniswapV4_revertsWhenRateLimitExceeded() external { + function test_mintPositionUniswapV4_revertsWhenRateLimitExceededBoundary() external { uint256 expectedDecrease = 499.966111e18; vm.startPrank(SPARK_PROXY); @@ -505,7 +529,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassed() external { + function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(); vm.prank(SPARK_PROXY); @@ -544,7 +568,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassed() external { + function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(); vm.prank(SPARK_PROXY); @@ -583,7 +607,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_increaseLiquidityUniswapV4_revertsWhenRateLimitExceeded() external { + function test_increaseLiquidityUniswapV4_revertsWhenRateLimitExceededBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(); uint256 expectedDecrease = 499.966111e18; @@ -686,7 +710,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_decreaseLiquidityUniswapV4_revertsWhenAmount0MinNotMet() external { + function test_decreaseLiquidityUniswapV4_revertsWhenAmount0MinNotMetBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(); vm.prank(SPARK_PROXY); @@ -726,7 +750,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_decreaseLiquidityUniswapV4_revertsWhenAmount1MinNotMet() external { + function test_decreaseLiquidityUniswapV4_revertsWhenAmount1MinNotMetBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(); vm.prank(SPARK_PROXY); @@ -766,7 +790,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { }); } - function test_decreaseLiquidityUniswapV4_revertsWhenRateLimitExceeded() external { + function test_decreaseLiquidityUniswapV4_revertsWhenRateLimitExceededBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(); uint256 expectedDecrease = 249.983054e18; @@ -839,6 +863,148 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { assertEq(result.amount1Received, 159.209952e6); } + /**********************************************************************************************/ + /*** swapUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_swapUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.swapUniswapV4(bytes32(0), address(0), 0, 0); + } + + function test_swapUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.swapUniswapV4(bytes32(0), address(0), 0, 0); + } + + function test_swapUniswapV4_revertsWhenMaxSlippageNotSet() external { + vm.prank(relayer); + vm.expectRevert("MC/max-slippage-not-set"); + mainnetController.swapUniswapV4(_POOL_ID, address(0), 0, 0); + } + + function test_swapUniswapV4_revertsWhenAmountOutMinTooLowBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/amountOutMin-too-low"); + mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 980_000e6 - 1); + + vm.prank(relayer); + mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 980_000e6); + } + + function test_swapUniswapV4_revertsWhenRateLimitExceededBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 1_000_000e18, 0); + vm.stopPrank(); + + uint128 amountOutMin = _getSwapAmountOutMin(address(usdc), 1_000_000e6, 0.99e18); + + deal(address(usdc), address(almProxy), 1_000_000e6 + 1); + + vm.prank(relayer); + vm.expectRevert("RateLimits/rate-limit-exceeded"); + mainnetController.swapUniswapV4({ + poolId : _POOL_ID, + tokenIn : address(usdc), + amountIn : 1_000_000e6 + 1, + amountOutMin : amountOutMin + }); + + vm.prank(relayer); + mainnetController.swapUniswapV4({ + poolId : _POOL_ID, + tokenIn : address(usdc), + amountIn : 1_000_000e6, + amountOutMin : amountOutMin + }); + } + + function test_swapUniswapV4_revertsWhenInputTokenNotForPool() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + vm.prank(relayer); + vm.expectRevert(IPoolManagerLike.CurrencyNotSettled.selector); + mainnetController.swapUniswapV4(_POOL_ID, address(dai), 1_000_000e6, 1_000_000e6); + } + + function test_swapUniswapV4_revertsWhenAmountOutMinNotMetBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector( + IV4RouterLike.V4TooLittleReceived.selector, + 999_280.652247e6 + 1, + 999_280.652247e6 + ) + ); + + mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 999_280.652247e6 + 1); + + vm.prank(relayer); + mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 999_280.652247e6); + } + + function test_swapUniswapV4_token0toToken1() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + uint128 amountOutMin = _getSwapAmountOutMin(address(usdc), 1_000_000e6, 0.99e18); + + vm.record(); + + uint256 amountOut = _swap(address(usdc), 1_000_000e6, amountOutMin); + + _assertReentrancyGuardWrittenToTwice(); + + assertEq(amountOut, 999_280.652247e6); + } + + function test_swapUniswapV4_token1toToken0() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + uint128 amountOutMin = _getSwapAmountOutMin(address(usdt), 1_000_000e6, 0.99e18); + + vm.record(); + + uint256 amountOut = _swap(address(usdt), 1_000_000e6, amountOutMin); + + _assertReentrancyGuardWrittenToTwice(); + + assertEq(amountOut, 1_000_646.141415e6); + } + /**********************************************************************************************/ /*** Story Tests ***/ /**********************************************************************************************/ @@ -1758,6 +1924,61 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { assertEq(positionLiquidityAfterCall, positionLiquidityBeforeCall - result.liquidityDecrease); } + function _getSwapAmountOutMin( + address tokenIn, + uint128 amountIn, + uint256 maxSlippage + ) internal returns (uint128 amountOutMin) { + IV4QuoterLike.QuoteExactSingleParams memory params = IV4QuoterLike.QuoteExactSingleParams({ + poolKey : IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(_POOL_ID)), + zeroForOne : tokenIn == address(usdc), + exactAmount : amountIn, + hookData : bytes("") + }); + + ( uint256 amountOut, ) = IV4QuoterLike(_V4_QUOTER).quoteExactInputSingle(params); + + return uint128((amountOut * maxSlippage) / 1e18); + } + + function _swap( + address tokenIn, + uint128 amountIn, + uint128 amountOutMin + ) internal returns (uint256 amountOut) { + address tokenOut = tokenIn == address(usdc) ? address(usdt) : address(usdc); + + deal(tokenIn, address(almProxy), IERC20Like(tokenIn).balanceOf(address(almProxy)) + amountIn); + + uint256 tokenInBeforeCall = IERC20Like(tokenIn).balanceOf(address(almProxy)); + uint256 tokenOutBeforeCall = IERC20Like(tokenOut).balanceOf(address(almProxy)); + + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY); + + vm.prank(relayer); + mainnetController.swapUniswapV4({ + poolId : _POOL_ID, + tokenIn : tokenIn, + amountIn : amountIn, + amountOutMin : amountOutMin + }); + + uint256 tokenInAfterCall = IERC20Like(tokenIn).balanceOf(address(almProxy)); + uint256 tokenOutAfterCall = IERC20Like(tokenOut).balanceOf(address(almProxy)); + + uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY); + + assertEq(tokenInBeforeCall - tokenInAfterCall, amountIn); + assertGe(tokenOutAfterCall - tokenOutBeforeCall, amountOutMin); + + assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(amountIn)); + + _assertZeroAllowances(address(usdc)); + _assertZeroAllowances(address(usdt)); + + return tokenOutAfterCall - tokenOutBeforeCall; + } + function _getAmount0ForLiquidity( uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, From a97565bb20c35484b7f50adca51efa3f63fc4341 Mon Sep 17 00:00:00 2001 From: supercontracts Date: Sat, 29 Nov 2025 00:01:33 +0530 Subject: [PATCH 06/21] feat: Add `ALM_PROXY` and `RATE_LIMITS` addresses to deploy json (#190) * feat: AAVE external lib and Approve internal lib (SC-1182) (#162) * feat: AAVE external lib and Approve internal lib - cuts down on much needed contract size for future integrations * fix: PR Review * feat: Add ERC4626 lib (SC-1233) (#188) * add * fix: Use relative paths (#191) --------- Co-authored-by: Michael De Luca Co-authored-by: Lucas Manuel --- script/input/1/arbitrum_one-production.json | 4 +++- script/input/1/avalanche-production.json | 4 +++- script/input/1/optimism-production.json | 4 +++- script/input/1/unichain-production.json | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/script/input/1/arbitrum_one-production.json b/script/input/1/arbitrum_one-production.json index 7c1d7c70..51673293 100644 --- a/script/input/1/arbitrum_one-production.json +++ b/script/input/1/arbitrum_one-production.json @@ -6,5 +6,7 @@ "freezer": "0x90D8c80C028B4C09C0d8dcAab9bbB057F0513431", "usdc": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "usds": "0x6491c05A82219b8D1479057361ff1654749b876b", - "susds": "0xdDb46999F8891663a8F2828d25298f70416d7610" + "susds": "0xdDb46999F8891663a8F2828d25298f70416d7610", + "almProxy": "0x92afd6F2385a90e44da3a8B60fe36f6cBe1D8709", + "rateLimits": "0x19D08879851FB54C2dCc4bb32b5a1EA5E9Ad6838" } diff --git a/script/input/1/avalanche-production.json b/script/input/1/avalanche-production.json index 103c001b..886b5ae7 100644 --- a/script/input/1/avalanche-production.json +++ b/script/input/1/avalanche-production.json @@ -4,5 +4,7 @@ "psm": "0x0000000000000000000000000000000000000000", "relayer": "0x8a25A24EDE9482C4Fc0738F99611BE58F1c839AB", "freezer": "0x90D8c80C028B4C09C0d8dcAab9bbB057F0513431", - "usdc": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E" + "usdc": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + "rateLimits": "0xb79972e8B21f0dE911E65AC342ac85ad38C9A77a", + "almProxy": "0xecE6B0E8a54c2f44e066fBb9234e7157B15b7FeC" } diff --git a/script/input/1/optimism-production.json b/script/input/1/optimism-production.json index 6466d3c4..8752e532 100644 --- a/script/input/1/optimism-production.json +++ b/script/input/1/optimism-production.json @@ -6,5 +6,7 @@ "freezer": "0x90D8c80C028B4C09C0d8dcAab9bbB057F0513431", "usdc": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", "usds": "0x4F13a96EC5C4Cf34e442b46Bbd98a0791F20edC3", - "susds": "0xb5B2dc7fd34C249F4be7fB1fCea07950784229e0" + "susds": "0xb5B2dc7fd34C249F4be7fB1fCea07950784229e0", + "rateLimits": "0x6B34A6B84444dC3Fc692821D5d077a1e4927342d", + "almProxy": "0x876664f0c9Ff24D1aa355Ce9f1680AE1A5bf36fB" } diff --git a/script/input/1/unichain-production.json b/script/input/1/unichain-production.json index bdde7e36..9339e53b 100644 --- a/script/input/1/unichain-production.json +++ b/script/input/1/unichain-production.json @@ -6,5 +6,7 @@ "freezer": "0x90D8c80C028B4C09C0d8dcAab9bbB057F0513431", "usdc": "0x078D782b760474a361dDA0AF3839290b0EF57AD6", "usds": "0x7E10036Acc4B56d4dFCa3b77810356CE52313F9C", - "susds": "0xA06b10Db9F390990364A3984C04FaDf1c13691b5" + "susds": "0xA06b10Db9F390990364A3984C04FaDf1c13691b5", + "rateLimits": "0x5A1a44D2192Dd1e21efB9caA50E32D0716b35535", + "almProxy": "0x345E368fcCd62266B3f5F37C9a131FD1c39f5869" } From 3e9be4e86f7ce524df6c374f0b22452080168600 Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Sun, 30 Nov 2025 14:53:25 -0500 Subject: [PATCH 07/21] fix: Uniswap V4 USDT/USDS tests and swap fix (SC-1253) (#196) * UniswapV4TestBase * use UniswapV4TestBase * refactor for generics * USDT/USDS pool tests --- src/libraries/UniswapV4Lib.sol | 8 +- test/mainnet-fork/Uniswapv4.t.sol | 3002 ++++++++++++++++++++--------- 2 files changed, 2072 insertions(+), 938 deletions(-) diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index 57688e7b..543b4b5f 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -169,8 +169,6 @@ library UniswapV4Lib { { require(maxSlippage != 0, "MC/max-slippage-not-set"); - require(amountOutMin * 1e18 >= amountIn * maxSlippage, "MC/amountOutMin-too-low"); - // Perform rate limit decrease. IRateLimits(rateLimits).triggerRateLimitDecrease( RateLimitHelpers.makeBytes32Key(LIMIT_SWAP, poolId), @@ -191,6 +189,12 @@ library UniswapV4Lib { ? Currency.unwrap(poolKey.currency1) : Currency.unwrap(poolKey.currency0); + require( + _getNormalizedBalance(tokenOut, amountOutMin) * 1e18 >= + _getNormalizedBalance(tokenIn, amountIn) * maxSlippage, + "MC/amountOutMin-too-low" + ); + bytes[] memory params = new bytes[](3); params[0] = abi.encode( diff --git a/test/mainnet-fork/Uniswapv4.t.sol b/test/mainnet-fork/Uniswapv4.t.sol index d44899cc..420477bd 100644 --- a/test/mainnet-fork/Uniswapv4.t.sol +++ b/test/mainnet-fork/Uniswapv4.t.sol @@ -5,6 +5,7 @@ import { console } from "../../lib/forge-std/src/console.sol"; import { ReentrancyGuard } from "../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; +import { Currency } from "../../lib/uniswap-v4-core/src/types/Currency.sol"; import { PoolId } from "../../lib/uniswap-v4-core/src/types/PoolId.sol"; import { PoolKey } from "../../lib/uniswap-v4-core/src/types/PoolKey.sol"; import { PositionInfo } from "../../lib/uniswap-v4-periphery/src/libraries/PositionInfoLibrary.sol"; @@ -17,10 +18,6 @@ import { SlippageCheck } from "../../lib/uniswap-v4-periphery/src/libraries/Slip import { IAccessControl } from "../../lib/openzeppelin-contracts/contracts/access/IAccessControl.sol"; -import { UniswapV4Lib } from "../../src/libraries/UniswapV4Lib.sol"; - -import { MainnetController } from "../../src/MainnetController.sol"; - import { ForkTestBase } from "./ForkTestBase.t.sol"; interface IERC20Like { @@ -32,6 +29,8 @@ interface IERC20Like { function balanceOf(address owner) external view returns (uint256 balance); + function decimals() external view returns (uint8 decimals); + } interface IPermit2Like { @@ -106,7 +105,7 @@ interface IV4RouterLike { } -contract MainnetControllerUniswapV4Tests is ForkTestBase { +contract UniswapV4TestBase is ForkTestBase { struct IncreasePositionResult { uint256 tokenId; @@ -132,235 +131,917 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { bytes32 internal constant _LIMIT_WITHDRAW = keccak256("LIMIT_UNISWAP_V4_WITHDRAW"); bytes32 internal constant _LIMIT_SWAP = keccak256("LIMIT_UNISWAP_V4_SWAP"); - bytes32 internal constant _DEPOSIT_LIMIT_KEY = keccak256(abi.encode(_LIMIT_DEPOSIT, _POOL_ID)); - bytes32 internal constant _WITHDRAW_LIMIT_KEY = keccak256(abi.encode(_LIMIT_WITHDRAW, _POOL_ID)); - bytes32 internal constant _SWAP_LIMIT_KEY = keccak256(abi.encode(_LIMIT_SWAP, _POOL_ID)); - address internal constant _PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3; address internal constant _POSITION_MANAGER = 0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e; address internal constant _ROUTER = 0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af; address internal constant _STATE_VIEW = 0x7fFE42C4a5DEeA5b0feC41C94C136Cf115597227; address internal constant _V4_QUOTER = 0x52F0E24D1c21C8A0cB1e5a5dD6198556BD9E1203; - // Uniswap V4 USDC/USDT pool - bytes32 internal constant _POOL_ID = 0x8aa4e11cbdf30eedc92100f4c8a31ff748e201d44712cc8c90d189edaa8e4e47; - address internal immutable _unauthorized = makeAddr("unauthorized"); address internal immutable _user = makeAddr("user"); /**********************************************************************************************/ - /*** mintPositionUniswapV4 Tests ***/ + /*** Helper Functions ***/ /**********************************************************************************************/ - function test_mintPositionUniswapV4_reentrancy() external { - _setControllerEntered(); - vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); - mainnetController.mintPositionUniswapV4({ - poolId : bytes32(0), - tickLower : 0, - tickUpper : 0, - liquidity : 0, - amount0Max : 0, - amount1Max : 0 - }); - } + function _setupLiquidity(bytes32 poolId, int24 tickLower, int24 tickUpper, uint128 liquidity) internal returns (IncreasePositionResult memory minted) { + bytes32 depositLimitKey = keccak256(abi.encode(_LIMIT_DEPOSIT, poolId)); - function test_mintPositionUniswapV4_revertsForNonRelayer() external { - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, - _unauthorized, - mainnetController.RELAYER() - ) - ); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(poolId, tickLower, tickUpper, uint24(uint256(int256(tickUpper) - int256(tickLower)))); + rateLimits.setRateLimitData(depositLimitKey, 2_000_000e18, 0); + vm.stopPrank(); - vm.prank(_unauthorized); - mainnetController.mintPositionUniswapV4({ - poolId : bytes32(0), - tickLower : 0, - tickUpper : 0, - liquidity : 0, - amount0Max : 0, - amount1Max : 0 - }); - } + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(poolId, tickLower, tickUpper, liquidity, 0.9999e18); - function test_mintPositionUniswapV4_revertsWhenTickLimitsNotSet() external { - vm.prank(relayer); - vm.expectRevert("MC/tickLimits-not-set"); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : 0, - tickUpper : 0, - liquidity : 0, - amount0Max : 0, - amount1Max : 0 - }); - } + minted = _mintPosition(poolId, tickLower, tickUpper, liquidity, amount0Max, amount1Max); - function test_mintPositionUniswapV4_revertsWhenTicksMisorderedBoundary() external { vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + mainnetController.setUniswapV4TickLimits(poolId, 0, 0, 0); + rateLimits.setRateLimitData(depositLimitKey, 0, 0); vm.stopPrank(); + } - deal(address(usdc), address(almProxy), 1_000_000e6); - deal(address(usdt), address(almProxy), 1_000_000e6); + function _getIncreasePositionMaxAmounts( + bytes32 poolId, + int24 tickLower, + int24 tickUpper, + uint128 liquidity, + uint256 maxSlippage + ) internal returns (uint256 amount0Max, uint256 amount1Max) { + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + poolId, + tickLower, + tickUpper, + liquidity + ); - vm.prank(relayer); - vm.expectRevert("MC/ticks-misordered"); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -5, - tickUpper : -6, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 - }); + amount0Max = (amount0Forecasted * 1e18) / maxSlippage; + amount1Max = (amount1Forecasted * 1e18) / maxSlippage; + } - vm.prank(relayer); - vm.expectRevert("MC/ticks-misordered"); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -5, - tickUpper : -5, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 - }); + function _mintPosition( + bytes32 poolId, + int24 tickLower, + int24 tickUpper, + uint128 liquidity, + uint256 amount0Max, + uint256 amount1Max + ) internal returns (IncreasePositionResult memory result) { + PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); - vm.prank(relayer); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -5, - tickUpper : -4, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 - }); - } + deal( + Currency.unwrap(poolKey.currency0), + address(almProxy), + _getBalanceOf(poolKey.currency0, address(almProxy)) + amount0Max + ); - function test_mintPositionUniswapV4_revertsWhenTickLowerTooLowBoundary() external { - vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - vm.stopPrank(); + deal( + Currency.unwrap(poolKey.currency1), + address(almProxy), + _getBalanceOf(poolKey.currency1, address(almProxy)) + amount1Max + ); - deal(address(usdc), address(almProxy), 1_000_000e6); - deal(address(usdt), address(almProxy), 1_000_000e6); + uint256 token0BeforeCall = _getBalanceOf(poolKey.currency0, address(almProxy)); + uint256 token1BeforeCall = _getBalanceOf(poolKey.currency1, address(almProxy)); + bytes32 depositLimitKey = keccak256(abi.encode(_LIMIT_DEPOSIT, poolId)); + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(depositLimitKey); vm.prank(relayer); - vm.expectRevert("MC/tickLower-too-low"); mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -11, - tickUpper : -5, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 + poolId : poolId, + tickLower : tickLower, + tickUpper : tickUpper, + liquidity : liquidity, + amount0Max : amount0Max, + amount1Max : amount1Max }); - vm.prank(relayer); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -10, - tickUpper : -5, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 - }); - } + result.tokenId = IPositionManagerLike(_POSITION_MANAGER).nextTokenId() - 1; + result.amount0Spent = token0BeforeCall - _getBalanceOf(poolKey.currency0, address(almProxy)); + result.amount1Spent = token1BeforeCall - _getBalanceOf(poolKey.currency1, address(almProxy)); + result.liquidityIncrease = liquidity; + result.tickLower = tickLower; + result.tickUpper = tickUpper; - function test_mintPositionUniswapV4_revertsWhenTickUpperTooHighBoundary() external { - vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - vm.stopPrank(); + assertLe(result.amount0Spent, amount0Max); + assertLe(result.amount1Spent, amount1Max); - deal(address(usdc), address(almProxy), 1_000_000e6); - deal(address(usdt), address(almProxy), 1_000_000e6); + assertEq( + rateLimitBeforeCall - rateLimits.getCurrentRateLimit(depositLimitKey), + _toNormalizedAmount(poolKey.currency0, result.amount0Spent) + + _toNormalizedAmount(poolKey.currency1, result.amount1Spent) + ); - vm.prank(relayer); - vm.expectRevert("MC/tickUpper-too-high"); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -5, - tickUpper : 1, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 - }); + assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); - vm.prank(relayer); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -5, - tickUpper : 0, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 - }); + assertEq(IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(result.tokenId), result.liquidityIncrease); + + _assertZeroAllowances(Currency.unwrap(poolKey.currency0)); + _assertZeroAllowances(Currency.unwrap(poolKey.currency1)); } - function test_mintPositionUniswapV4_revertsWhenTickSpacingTooWideBoundary() external { - vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 10, 10); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - vm.stopPrank(); + function _increasePosition( + uint256 tokenId, + uint128 liquidityIncrease, + uint256 amount0Max, + uint256 amount1Max + ) internal returns (IncreasePositionResult memory result) { + ( + PoolKey memory poolKey, + PositionInfo positionInfo + ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); - deal(address(usdc), address(almProxy), 1_000_000e6); - deal(address(usdt), address(almProxy), 1_000_000e6); + bytes32 poolId = keccak256(abi.encode(poolKey)); - vm.prank(relayer); - vm.expectRevert("MC/tickSpacing-too-wide"); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -5, - tickUpper : 6, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 - }); + deal( + Currency.unwrap(poolKey.currency0), + address(almProxy), + _getBalanceOf(poolKey.currency0, address(almProxy)) + amount0Max + ); + + deal( + Currency.unwrap(poolKey.currency1), + address(almProxy), + _getBalanceOf(poolKey.currency1, address(almProxy)) + amount1Max + ); + + uint256 token0BeforeCall = _getBalanceOf(poolKey.currency0, address(almProxy)); + uint256 token1BeforeCall = _getBalanceOf(poolKey.currency1, address(almProxy)); + bytes32 depositLimitKey = keccak256(abi.encode(_LIMIT_DEPOSIT, poolId)); + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(depositLimitKey); + + uint256 positionLiquidityBeforeCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); vm.prank(relayer); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -5, - tickUpper : 5, - liquidity : 1_000_000e6, - amount0Max : 1_000_000e6, - amount1Max : 1_000_000e6 + mainnetController.increaseLiquidityUniswapV4({ + poolId : poolId, + tokenId : tokenId, + liquidityIncrease : liquidityIncrease, + amount0Max : amount0Max, + amount1Max : amount1Max }); - } - function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { - vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - vm.stopPrank(); + result.tokenId = tokenId; + result.amount0Spent = token0BeforeCall - _getBalanceOf(poolKey.currency0, address(almProxy)); + result.amount1Spent = token1BeforeCall - _getBalanceOf(poolKey.currency1, address(almProxy)); + result.liquidityIncrease = liquidityIncrease; + result.tickLower = positionInfo.tickLower(); + result.tickUpper = positionInfo.tickUpper(); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(-10, 0, 1_000_000e6); + assertLe(result.amount0Spent, amount0Max); + assertLe(result.amount1Spent, amount1Max); - deal(address(usdc), address(almProxy), amount0Forecasted + 1); - deal(address(usdt), address(almProxy), amount1Forecasted + 1); + assertEq( + rateLimitBeforeCall - rateLimits.getCurrentRateLimit(depositLimitKey), + _toNormalizedAmount(poolKey.currency0, result.amount0Spent) + + _toNormalizedAmount(poolKey.currency1, result.amount1Spent) + ); - vm.prank(relayer); + assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); - vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + assertEq( + IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId), + positionLiquidityBeforeCall + result.liquidityIncrease ); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -10, - tickUpper : 0, - liquidity : 1_000_000e6, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + 1 // Quote is off by 1 - }); + _assertZeroAllowances(Currency.unwrap(poolKey.currency0)); + _assertZeroAllowances(Currency.unwrap(poolKey.currency1)); + } - vm.prank(relayer); - mainnetController.mintPositionUniswapV4({ + function _getDecreasePositionMinAmounts( + uint256 tokenId, + uint128 liquidity, + uint256 maxSlippage + ) internal returns (uint256 amount0Min, uint256 amount1Min) { + ( + PoolKey memory poolKey, + PositionInfo positionInfo + ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + keccak256(abi.encode(poolKey)), + positionInfo.tickLower(), + positionInfo.tickUpper(), + liquidity + ); + + amount0Min = (amount0Forecasted * maxSlippage) / 1e18; + amount1Min = (amount1Forecasted * maxSlippage) / 1e18; + } + + function _decreasePosition( + uint256 tokenId, + uint128 liquidityDecrease, + uint256 amount0Min, + uint256 amount1Min + ) internal returns (DecreasePositionResult memory result) { + ( + PoolKey memory poolKey, + PositionInfo positionInfo + ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + + bytes32 poolId = keccak256(abi.encode(poolKey)); + + uint256 token0BeforeCall = _getBalanceOf(poolKey.currency0, address(almProxy)); + uint256 token1BeforeCall = _getBalanceOf(poolKey.currency1, address(almProxy)); + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(keccak256(abi.encode(_LIMIT_WITHDRAW, poolId))); + + uint256 positionLiquidityBeforeCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + + vm.prank(relayer); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : poolId, + tokenId : tokenId, + liquidityDecrease : liquidityDecrease, + amount0Min : amount0Min, + amount1Min : amount1Min + }); + + result.tokenId = tokenId; + result.amount0Received = _getBalanceOf(poolKey.currency0, address(almProxy)) - token0BeforeCall; + result.amount1Received = _getBalanceOf(poolKey.currency1, address(almProxy)) - token1BeforeCall; + result.liquidityDecrease = liquidityDecrease; + result.tickLower = positionInfo.tickLower(); + result.tickUpper = positionInfo.tickUpper(); + + assertGe(result.amount0Received, amount0Min); + assertGe(result.amount1Received, amount1Min); + + assertEq( + rateLimitBeforeCall - rateLimits.getCurrentRateLimit(keccak256(abi.encode(_LIMIT_WITHDRAW, poolId))), + _toNormalizedAmount(poolKey.currency0, result.amount0Received) + + _toNormalizedAmount(poolKey.currency1, result.amount1Received) + ); + + assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); + + assertEq( + IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId), + positionLiquidityBeforeCall - result.liquidityDecrease + ); + } + + function _getSwapAmountOutMin( + bytes32 poolId, + address tokenIn, + uint128 amountIn, + uint256 maxSlippage + ) internal returns (uint128 amountOutMin) { + PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); + + address token0 = Currency.unwrap(poolKey.currency0); + address token1 = Currency.unwrap(poolKey.currency1); + + IV4QuoterLike.QuoteExactSingleParams memory params = IV4QuoterLike.QuoteExactSingleParams({ + poolKey : poolKey, + zeroForOne : tokenIn == token0, + exactAmount : amountIn, + hookData : bytes("") + }); + + ( uint256 amountOut, ) = IV4QuoterLike(_V4_QUOTER).quoteExactInputSingle(params); + + return uint128((amountOut * maxSlippage) / 1e18); + } + + function _swap( + bytes32 poolId, + address tokenIn, + uint128 amountIn, + uint128 amountOutMin + ) internal returns (uint256 amountOut) { + Currency currencyIn = Currency.wrap(tokenIn); + Currency currencyOut = _getCurrencyOut(poolId, tokenIn); + + deal( + Currency.unwrap(currencyIn), + address(almProxy), _getBalanceOf(currencyIn, address(almProxy)) + amountIn + ); + + uint256 tokenInBeforeCall = _getBalanceOf(currencyIn, address(almProxy)); + uint256 tokenOutBeforeCall = _getBalanceOf(currencyOut, address(almProxy)); + uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(keccak256(abi.encode(_LIMIT_SWAP, poolId))); + + vm.prank(relayer); + mainnetController.swapUniswapV4({ + poolId : poolId, + tokenIn : tokenIn, + amountIn : amountIn, + amountOutMin : amountOutMin + }); + + uint256 tokenInAfterCall = _getBalanceOf(currencyIn, address(almProxy)); + uint256 tokenOutAfterCall = _getBalanceOf(currencyOut, address(almProxy)); + uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(keccak256(abi.encode(_LIMIT_SWAP, poolId))); + + assertEq(tokenInBeforeCall - tokenInAfterCall, amountIn); + assertGe(tokenOutAfterCall - tokenOutBeforeCall, amountOutMin); + + assertEq( + rateLimitBeforeCall - rateLimitAfterCall, + _toNormalizedAmount(currencyIn, amountIn) + ); + + _assertZeroAllowances(Currency.unwrap(currencyIn)); + _assertZeroAllowances(Currency.unwrap(currencyOut)); + + return tokenOutAfterCall - tokenOutBeforeCall; + } + + function _getAmount0ForLiquidity( + uint160 sqrtPriceAX96, + uint160 sqrtPriceBX96, + uint128 liquidity + ) internal pure returns (uint256 amount0) { + require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-0"); + + return FullMath.mulDiv( + uint256(liquidity) << 96, + sqrtPriceBX96 - sqrtPriceAX96, + uint256(sqrtPriceBX96) * sqrtPriceAX96 + ); + } + + function _getAmount1ForLiquidity( + uint160 sqrtPriceAX96, + uint160 sqrtPriceBX96, + uint128 liquidity + ) internal pure returns (uint256 amount1) { + require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-1"); + + return FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, 1 << 96); + } + + function _getAmountsForLiquidity( + uint160 sqrtPriceX96, + uint160 sqrtPriceAX96, + uint160 sqrtPriceBX96, + uint128 liquidity + ) internal pure returns (uint256 amount0, uint256 amount1) { + require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices"); + + if (sqrtPriceX96 <= sqrtPriceAX96) { + return ( + _getAmount0ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity), + 0 + ); + } + + if (sqrtPriceX96 >= sqrtPriceBX96) { + return ( + 0, + _getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity) + ); + } + + return ( + _getAmount0ForLiquidity(sqrtPriceX96, sqrtPriceBX96, liquidity), + _getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceX96, liquidity) + ); + } + + function _getPrice(uint160 sqrtPriceX96) internal view returns (uint256 price) { + uint256 priceRoot = (uint256(sqrtPriceX96) * 1e18) >> 96; + + return (priceRoot * priceRoot) / 1e18; + } + + function _getPrice(int24 tick) internal view returns (uint256 price) { + return _getPrice(TickMath.getSqrtPriceAtTick(tick)); + } + + function _getCurrentTick(bytes32 poolId) internal view returns (int24 tick) { + ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(poolId)); + + return TickMath.getTickAtSqrtPrice(sqrtPriceX96); + } + + function _logCurrentPriceAndTick(bytes32 poolId) internal view { + ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(poolId)); + + uint256 price = _getPrice(sqrtPriceX96); + int24 tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96); + + if (price < 1e1) { + console.log("price: 0.00000000000000000%s", price); + } else if (price < 1e2) { + console.log("price: 0.0000000000000000%s", price); + } else if (price < 1e3) { + console.log("price: 0.000000000000000%s", price); + } else if (price < 1e4) { + console.log("price: 0.00000000000000%s", price); + } else if (price < 1e5) { + console.log("price: 0.0000000000000%s", price); + } else if (price < 1e6) { + console.log("price: 0.000000000000%s", price); + } else if (price < 1e7) { + console.log("price: 0.00000000000%s", price); + } else if (price < 1e8) { + console.log("price: 0.0000000000%s", price); + } else if (price < 1e9) { + console.log("price: 0.000000000%s", price); + } else if (price < 1e10) { + console.log("price: 0.00000000%s", price); + } else if (price < 1e11) { + console.log("price: 0.0000000%s", price); + } else if (price < 1e12) { + console.log("price: 0.000000%s", price); + } else if (price < 1e13) { + console.log("price: 0.00000%s", price); + } else if (price < 1e14) { + console.log("price: 0.0000%s", price); + } else if (price < 1e15) { + console.log("price: 0.000%s", price); + } else if (price < 1e16) { + console.log("price: 0.00%s", price); + } else if (price < 1e17) { + console.log("price: 0.0%s", price); + } else { + uint256 quotient = price / 1e18; + uint256 remainder = price % 1e18; + + if (remainder < 1e1) { + console.log("price: %s.00000000000000000%s", quotient, remainder); + } else if (remainder < 1e2) { + console.log("price: %s.0000000000000000%s", quotient, remainder); + } else if (remainder < 1e3) { + console.log("price: %s.000000000000000%s", quotient, remainder); + } else if (remainder < 1e4) { + console.log("price: %s.00000000000000%s", quotient, remainder); + } else if (remainder < 1e5) { + console.log("price: %s.0000000000000%s", quotient, remainder); + } else if (remainder < 1e6) { + console.log("price: %s.000000000000%s", quotient, remainder); + } else if (remainder < 1e7) { + console.log("price: %s.00000000000%s", quotient, remainder); + } else if (remainder < 1e8) { + console.log("price: %s.0000000000%s", quotient, remainder); + } else if (remainder < 1e9) { + console.log("price: %s.000000000%s", quotient, remainder); + } else if (remainder < 1e10) { + console.log("price: %s.00000000%s", quotient, remainder); + } else if (remainder < 1e11) { + console.log("price: %s.0000000%s", quotient, remainder); + } else if (remainder < 1e12) { + console.log("price: %s.000000%s", quotient, remainder); + } else if (remainder < 1e13) { + console.log("price: %s.00000%s", quotient, remainder); + } else if (remainder < 1e14) { + console.log("price: %s.0000%s", quotient, remainder); + } else if (remainder < 1e15) { + console.log("price: %s.000%s", quotient, remainder); + } else if (remainder < 1e16) { + console.log("price: %s.00%s", quotient, remainder); + } else if (remainder < 1e17) { + console.log("price: %s.0%s", quotient, remainder); + } else { + console.log("price: %s.%s", quotient, remainder); + } + } + + console.log(" -> tick: %s", tick); + } + + function _quoteLiquidity( + bytes32 poolId, + int24 tickLower, + int24 tickUpper, + uint128 liquidityAmount + ) internal view returns (uint256 amount0, uint256 amount1) { + ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(poolId)); + + return _getAmountsForLiquidity( + sqrtPriceX96, + TickMath.getSqrtPriceAtTick(tickLower), + TickMath.getSqrtPriceAtTick(tickUpper), + liquidityAmount + ); + } + + function _assertZeroAllowances(address token) internal { + ( uint160 allowance, , ) = IPermit2Like(_PERMIT2).allowance(address(almProxy), token, _POSITION_MANAGER); + + assertEq(allowance, 0, "permit2 allowance not 0"); + + assertEq(IERC20Like(token).allowance(address(almProxy), _PERMIT2), 0, "allowance to permit2 not 0"); + } + + function _to18From6Decimals(uint256 amount) internal pure returns (uint256) { + return amount * 1e12; + } + + function _toNormalizedAmount(address token, uint256 amount) + internal view returns (uint256 normalizedAmount) + { + return amount * 1e18 / (10 ** IERC20Like(token).decimals()); + } + + function _toNormalizedAmount(Currency currency, uint256 amount) + internal view returns (uint256 normalizedAmount) + { + return amount * 1e18 / (10 ** IERC20Like(Currency.unwrap(currency)).decimals()); + } + + function _getBlock() internal pure override returns (uint256) { + return 23470490; // September 29, 2025 + } + + function _externalSwap( + bytes32 poolId, + address account, + address tokenIn, + uint128 amountIn + ) internal returns (uint256 amountOut) { + PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); + + address token0 = Currency.unwrap(poolKey.currency0); + address token1 = Currency.unwrap(poolKey.currency1); + address tokenOut = tokenIn == token0 ? token1 : token0; + + deal(tokenIn, account, amountIn); + + bytes memory commands = abi.encodePacked(uint8(_V4_SWAP)); + + bytes[] memory inputs = new bytes[](1); + + bytes memory actions = abi.encodePacked( + uint8(Actions.SWAP_EXACT_IN_SINGLE), + uint8(Actions.SETTLE_ALL), + uint8(Actions.TAKE_ALL) + ); + + bytes[] memory params = new bytes[](3); + + params[0] = abi.encode( + IV4Router.ExactInputSingleParams({ + poolKey : poolKey, + zeroForOne : tokenIn == token0, + amountIn : amountIn, + amountOutMinimum : 0, + hookData : bytes("") + }) + ); + + params[1] = abi.encode(tokenIn, amountIn); + params[2] = abi.encode(tokenOut, 0); + + // Combine actions and params into inputs + inputs[0] = abi.encode(actions, params); + + uint256 startingOutBalance = IERC20Like(tokenOut).balanceOf(account); + + // Execute the swap + vm.startPrank(account); + IERC20Like(tokenIn).approve(_PERMIT2, amountIn); + IPermit2Like(_PERMIT2).approve(tokenIn, _ROUTER, amountIn, uint48(block.timestamp)); + IUniversalRouterLike(_ROUTER).execute(commands, inputs, block.timestamp); + vm.stopPrank(); + + return IERC20Like(tokenOut).balanceOf(account) - startingOutBalance; + } + + function _getBalanceOf( + Currency currency, + address account + ) internal view returns (uint256 balance) { + return IERC20Like(Currency.unwrap(currency)).balanceOf(account); + } + + function _getCurrencyOut( + bytes32 poolId, + address tokenIn + ) internal view returns (Currency currencyOut) { + PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); + + return tokenIn == Currency.unwrap(poolKey.currency0) ? poolKey.currency1 : poolKey.currency0; + } + +} + +contract MainnetController_UniswapV4_Tests is UniswapV4TestBase { + + /**********************************************************************************************/ + /*** mintPositionUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_mintPositionUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.mintPositionUniswapV4({ + poolId : bytes32(0), + tickLower : 0, + tickUpper : 0, + liquidity : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_mintPositionUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.mintPositionUniswapV4({ + poolId : bytes32(0), + tickLower : 0, + tickUpper : 0, + liquidity : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + /**********************************************************************************************/ + /*** increaseLiquidity Tests ***/ + /**********************************************************************************************/ + + function test_increaseLiquidityUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_increaseLiquidityUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + /**********************************************************************************************/ + /*** decreaseLiquidityUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_decreaseLiquidityUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityDecrease : 0, + amount0Min : 0, + amount1Min : 0 + }); + } + + function test_decreaseLiquidityUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : 0, + liquidityDecrease : 0, + amount0Min : 0, + amount1Min : 0 + }); + } + + /**********************************************************************************************/ + /*** swapUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_swapUniswapV4_reentrancy() external { + _setControllerEntered(); + vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); + mainnetController.swapUniswapV4(bytes32(0), address(0), 0, 0); + } + + function test_swapUniswapV4_revertsForNonRelayer() external { + vm.expectRevert( + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, + _unauthorized, + mainnetController.RELAYER() + ) + ); + + vm.prank(_unauthorized); + mainnetController.swapUniswapV4(bytes32(0), address(0), 0, 0); + } + +} + +contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { + + // Uniswap V4 USDC/USDT pool + bytes32 internal constant _POOL_ID = 0x8aa4e11cbdf30eedc92100f4c8a31ff748e201d44712cc8c90d189edaa8e4e47; + + bytes32 internal constant _DEPOSIT_LIMIT_KEY = keccak256(abi.encode(_LIMIT_DEPOSIT, _POOL_ID)); + bytes32 internal constant _WITHDRAW_LIMIT_KEY = keccak256(abi.encode(_LIMIT_WITHDRAW, _POOL_ID)); + bytes32 internal constant _SWAP_LIMIT_KEY = keccak256(abi.encode(_LIMIT_SWAP, _POOL_ID)); + + /**********************************************************************************************/ + /*** mintPositionUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_mintPositionUniswapV4_revertsWhenTickLimitsNotSet() external { + vm.prank(relayer); + vm.expectRevert("MC/tickLimits-not-set"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 0, + tickUpper : 0, + liquidity : 0, + amount0Max : 0, + amount1Max : 0 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTicksMisorderedBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/ticks-misordered"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : -6, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + vm.expectRevert("MC/ticks-misordered"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : -5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : -4, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickLowerTooLowBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickLower-too-low"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -11, + tickUpper : -5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : -5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickUpperTooHighBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickUpper-too-high"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 1, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickSpacingTooWideBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 10, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickSpacing-too-wide"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 6, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 5, + liquidity : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6); + + deal(address(usdc), address(almProxy), amount0Forecasted + 1); + deal(address(usdt), address(almProxy), amount1Forecasted + 1); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ poolId : _POOL_ID, tickLower : -10, tickUpper : 0, @@ -376,7 +1057,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(-10, 0, 1_000_000e6); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6); deal(address(usdc), address(almProxy), amount0Forecasted + 1); deal(address(usdt), address(almProxy), amount1Forecasted + 1); @@ -415,7 +1096,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); vm.stopPrank(); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(-10, 0, 1_000_000e6); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6); deal(address(usdc), address(almProxy), amount0Forecasted + 1); deal(address(usdt), address(almProxy), amount1Forecasted + 1); @@ -451,11 +1132,18 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(-10, 0, 1_000_000e6, 0.99e18); + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(_POOL_ID, -10, 0, 1_000_000e6, 0.99e18); vm.record(); - IncreasePositionResult memory result = _mintPosition(-10, 0, 1_000_000e6, amount0Max, amount1Max); + IncreasePositionResult memory result = _mintPosition({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Max, + amount1Max : amount1Max + }); _assertReentrancyGuardWrittenToTwice(); @@ -467,39 +1155,8 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** increaseLiquidity Tests ***/ /**********************************************************************************************/ - function test_increaseLiquidityUniswapV4_reentrancy() external { - _setControllerEntered(); - vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); - mainnetController.increaseLiquidityUniswapV4({ - poolId : bytes32(0), - tokenId : 0, - liquidityIncrease : 0, - amount0Max : 0, - amount1Max : 0 - }); - } - - function test_increaseLiquidityUniswapV4_revertsForNonRelayer() external { - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, - _unauthorized, - mainnetController.RELAYER() - ) - ); - - vm.prank(_unauthorized); - mainnetController.increaseLiquidityUniswapV4({ - poolId : bytes32(0), - tokenId : 0, - liquidityIncrease : 0, - amount0Max : 0, - amount1Max : 0 - }); - } - function test_increaseLiquidityUniswapV4_revertsWhenPositionIsNotOwnedByProxy() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(address(almProxy)); IPositionManagerLike(_POSITION_MANAGER).transferFrom(address(almProxy), address(1), minted.tokenId); @@ -516,7 +1173,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_increaseLiquidityUniswapV4_revertsWhenTokenIsNotForPool() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(relayer); vm.expectRevert("MC/tokenId-poolId-mismatch"); @@ -530,12 +1187,13 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, minted.tickLower, minted.tickUpper, 1_000_000e6 @@ -569,12 +1227,13 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, minted.tickLower, minted.tickUpper, 1_000_000e6 @@ -608,14 +1267,19 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_increaseLiquidityUniswapV4_revertsWhenRateLimitExceededBoundary() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); uint256 expectedDecrease = 499.966111e18; vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(minted.tickLower, minted.tickUpper, 1_000_000e6); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e6 + ); deal(address(usdc), address(almProxy), amount0Forecasted + 1); deal(address(usdt), address(almProxy), amount1Forecasted + 1); @@ -644,16 +1308,27 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_increaseLiquidityUniswapV4() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(minted.tickLower, minted.tickUpper, 1_000_000e6, 0.99e18); + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e6, + 0.99e18 + ); vm.record(); - IncreasePositionResult memory result = _increasePosition(minted.tokenId, 1_000_000e6, amount0Max, amount1Max); + IncreasePositionResult memory result = _increasePosition( + minted.tokenId, + 1_000_000e6, + amount0Max, + amount1Max + ); _assertReentrancyGuardWrittenToTwice(); @@ -665,39 +1340,8 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** decreaseLiquidityUniswapV4 Tests ***/ /**********************************************************************************************/ - function test_decreaseLiquidityUniswapV4_reentrancy() external { - _setControllerEntered(); - vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); - mainnetController.decreaseLiquidityUniswapV4({ - poolId : bytes32(0), - tokenId : 0, - liquidityDecrease : 0, - amount0Min : 0, - amount1Min : 0 - }); - } - - function test_decreaseLiquidityUniswapV4_revertsForNonRelayer() external { - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, - _unauthorized, - mainnetController.RELAYER() - ) - ); - - vm.prank(_unauthorized); - mainnetController.decreaseLiquidityUniswapV4({ - poolId : bytes32(0), - tokenId : 0, - liquidityDecrease : 0, - amount0Min : 0, - amount1Min : 0 - }); - } - function test_decreaseLiquidityUniswapV4_revertsWhenTokenIsNotForPool() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(relayer); vm.expectRevert("MC/tokenId-poolId-mismatch"); @@ -711,12 +1355,13 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_decreaseLiquidityUniswapV4_revertsWhenAmount0MinNotMetBoundary() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, minted.tickLower, minted.tickUpper, minted.liquidityIncrease / 2 @@ -751,12 +1396,13 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_decreaseLiquidityUniswapV4_revertsWhenAmount1MinNotMetBoundary() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, minted.tickLower, minted.tickUpper, minted.liquidityIncrease / 2 @@ -791,7 +1437,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_decreaseLiquidityUniswapV4_revertsWhenRateLimitExceededBoundary() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); uint256 expectedDecrease = 249.983054e18; @@ -799,6 +1445,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, expectedDecrease - 1, 0); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, minted.tickLower, minted.tickUpper, minted.liquidityIncrease / 2 @@ -828,7 +1475,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_decreaseLiquidityUniswapV4_partial() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); @@ -837,7 +1484,12 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { vm.record(); - DecreasePositionResult memory result = _decreasePosition(minted.tokenId, minted.liquidityIncrease / 2, amount0Min, amount1Min); + DecreasePositionResult memory result = _decreasePosition( + minted.tokenId, + minted.liquidityIncrease / 2, + amount0Min, + amount1Min + ); _assertReentrancyGuardWrittenToTwice(); @@ -846,75 +1498,49 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { } function test_decreaseLiquidityUniswapV4_all() external { - IncreasePositionResult memory minted = _setupLiquidity(); + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); - ( uint256 amount0Min, uint256 amount1Min ) = _getDecreasePositionMinAmounts(minted.tokenId, minted.liquidityIncrease, 0.99e18); + ( uint256 amount0Min, uint256 amount1Min ) = _getDecreasePositionMinAmounts( + minted.tokenId, + minted.liquidityIncrease, + 0.99e18 + ); vm.record(); - DecreasePositionResult memory result = _decreasePosition(minted.tokenId, minted.liquidityIncrease, amount0Min, amount1Min); + DecreasePositionResult memory result = _decreasePosition( + minted.tokenId, + minted.liquidityIncrease, + amount0Min, + amount1Min + ); _assertReentrancyGuardWrittenToTwice(); - assertEq(result.amount0Received, 340.756157e6); - assertEq(result.amount1Received, 159.209952e6); - } - - /**********************************************************************************************/ - /*** swapUniswapV4 Tests ***/ - /**********************************************************************************************/ - - function test_swapUniswapV4_reentrancy() external { - _setControllerEntered(); - vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); - mainnetController.swapUniswapV4(bytes32(0), address(0), 0, 0); - } - - function test_swapUniswapV4_revertsForNonRelayer() external { - vm.expectRevert( - abi.encodeWithSelector( - IAccessControl.AccessControlUnauthorizedAccount.selector, - _unauthorized, - mainnetController.RELAYER() - ) - ); - - vm.prank(_unauthorized); - mainnetController.swapUniswapV4(bytes32(0), address(0), 0, 0); + assertEq(result.amount0Received, 340.756157e6); + assertEq(result.amount1Received, 159.209952e6); } + /**********************************************************************************************/ + /*** swapUniswapV4 Tests ***/ + /**********************************************************************************************/ + function test_swapUniswapV4_revertsWhenMaxSlippageNotSet() external { vm.prank(relayer); vm.expectRevert("MC/max-slippage-not-set"); mainnetController.swapUniswapV4(_POOL_ID, address(0), 0, 0); } - function test_swapUniswapV4_revertsWhenAmountOutMinTooLowBoundary() external { - vm.startPrank(SPARK_PROXY); - mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); - rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); - vm.stopPrank(); - - deal(address(usdc), address(almProxy), 1_000_000e6); - - vm.prank(relayer); - vm.expectRevert("MC/amountOutMin-too-low"); - mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 980_000e6 - 1); - - vm.prank(relayer); - mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 980_000e6); - } - function test_swapUniswapV4_revertsWhenRateLimitExceededBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 1_000_000e18, 0); vm.stopPrank(); - uint128 amountOutMin = _getSwapAmountOutMin(address(usdc), 1_000_000e6, 0.99e18); + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, address(usdc), 1_000_000e6, 0.99e18); deal(address(usdc), address(almProxy), 1_000_000e6 + 1); @@ -947,6 +1573,22 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { mainnetController.swapUniswapV4(_POOL_ID, address(dai), 1_000_000e6, 1_000_000e6); } + function test_swapUniswapV4_revertsWhenAmountOutMinTooLowBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/amountOutMin-too-low"); + mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 980_000e6 - 1); + + vm.prank(relayer); + mainnetController.swapUniswapV4(_POOL_ID, address(usdc), 1_000_000e6, 980_000e6); + } + function test_swapUniswapV4_revertsWhenAmountOutMinNotMetBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); @@ -977,11 +1619,11 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - uint128 amountOutMin = _getSwapAmountOutMin(address(usdc), 1_000_000e6, 0.99e18); + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, address(usdc), 1_000_000e6, 0.99e18); vm.record(); - uint256 amountOut = _swap(address(usdc), 1_000_000e6, amountOutMin); + uint256 amountOut = _swap(_POOL_ID, address(usdc), 1_000_000e6, amountOutMin); _assertReentrancyGuardWrittenToTwice(); @@ -994,11 +1636,11 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - uint128 amountOutMin = _getSwapAmountOutMin(address(usdt), 1_000_000e6, 0.99e18); + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, address(usdt), 1_000_000e6, 0.99e18); vm.record(); - uint256 amountOut = _swap(address(usdt), 1_000_000e6, amountOutMin); + uint256 amountOut = _swap(_POOL_ID, address(usdt), 1_000_000e6, amountOutMin); _assertReentrancyGuardWrittenToTwice(); @@ -1012,12 +1654,12 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /** * @dev Story 1 is a round trip of liquidity minting, increase, decreasing, and closing/burning, * each 90 days apart, while an external account swaps tokens in and out of the pool. - * - The relayer mints a position with 1,000,000 liquidity. - * - The relayer increases the liquidity position by 50% (to 1,500,000 liquidity). - * - The relayer decreases the liquidity position by 50% (to 750,000 liquidity). + * - The relayer mints a position with 4_000e12 liquidity. + * - The relayer increases the liquidity position by 50% (to 2_000e12 liquidity). + * - The relayer decreases the liquidity position by 50% (to 3_000e12 liquidity). * - The relayer decreases the remaining liquidity position (to 0 liquidity). */ - function test_uniswapV4_story1() external { + function test_uniswapV4_story1_xxx() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); @@ -1026,7 +1668,17 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { vm.stopPrank(); // 1. The relayer mints a position with 1,000,000 liquidity. - IncreasePositionResult memory increaseResult = _mintPosition(-10, 0, 1_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 4_000e12, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); + + assertEq(increaseResult.amount0Spent, 1_363_024.631364e6); + assertEq(increaseResult.amount1Spent, 636_839.809432e6); uint256 expectedDecrease = _to18From6Decimals(increaseResult.amount0Spent) + _to18From6Decimals(increaseResult.amount1Spent); assertEq(rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY), 2_000_000e18 - expectedDecrease); @@ -1034,11 +1686,14 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { // 2. 90 days elapse. vm.warp(block.timestamp + 90 days); - // 3. Some account swaps 500,000 USDT for USDC. - _externalSwap(_user, address(usdt), 500_000e6); + // 3. Some account swaps 1,000,000 USDT for USDC. + assertEq(_externalSwap(_POOL_ID, _user, address(usdt), 1_000_000e6), 1_000_648.496032e6); // 4. The relayer increases the liquidity position by 50%. - increaseResult = _increasePosition(increaseResult.tokenId, 500_000e6, type(uint160).max, type(uint160).max); + increaseResult = _increasePosition(increaseResult.tokenId, 2_000e12, type(uint160).max, type(uint160).max); + + assertEq(increaseResult.amount0Spent, 635_276.445136e6); + assertEq(increaseResult.amount1Spent, 364_624.424738e6); // NOTE: Rate recharged to max since 90 days elapsed. expectedDecrease = _to18From6Decimals(increaseResult.amount0Spent) + _to18From6Decimals(increaseResult.amount1Spent); @@ -1047,11 +1702,14 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { // 5. 90 days elapse. vm.warp(block.timestamp + 90 days); - // 6. Some account swaps 750,000 USDC for USDT. - _externalSwap(_user, address(usdc), 750_000e6); + // 6. Some account swaps 1,500,000 USDC for USDT. + assertEq(_externalSwap(_POOL_ID, _user, address(usdc), 1_500_000e6), 1_498_982.907513e6); // 7. The relayer decreases the liquidity position by 50%. - DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 750_000e6, 0, 0); + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 3_000e12, 0, 0); + + assertEq(decreaseResult.amount0Received, 1_052_773.305651e6); + assertEq(decreaseResult.amount1Received, 447_148.109354e6); expectedDecrease = _to18From6Decimals(decreaseResult.amount0Received) + _to18From6Decimals(decreaseResult.amount1Received); assertEq(rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY), 2_000_000e18 - expectedDecrease); @@ -1060,10 +1718,13 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { vm.warp(block.timestamp + 90 days); // 9. Some account swaps 1,000,000 USDT for USDC. - _externalSwap(_user, address(usdt), 1_000_000e6); + assertEq(_externalSwap(_POOL_ID, _user, address(usdt), 1_000_000e6), 1_000_667.948623e6); // 10. The relayer decreases the remaining liquidity position. - decreaseResult = _decreasePosition(increaseResult.tokenId, 750_000e6, 0, 0); + decreaseResult = _decreasePosition(increaseResult.tokenId, 3_000e12, 0, 0); + + assertEq(decreaseResult.amount0Received, 981_255.571670e6); + assertEq(decreaseResult.amount1Received, 518_616.097207e6); // NOTE: Rate recharged to max since 90 days elapsed. expectedDecrease = _to18From6Decimals(decreaseResult.amount0Received) + _to18From6Decimals(decreaseResult.amount1Received); @@ -1079,28 +1740,28 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Log Price And Ticks Tests ***/ /**********************************************************************************************/ - function test_uniswapV4_logPriceAndTicks_increasingPrice() public { + function test_uniswapV4_logPriceAndTicks_increasingPrice() external { vm.skip(true); for (uint256 i = 0; i <= 100; ++i) { if (i != 0) { - _externalSwap(_user, address(usdt), 200_000e6); + _externalSwap(_POOL_ID, _user, address(usdt), 200_000e6); } - _logCurrentPriceAndTick(); + _logCurrentPriceAndTick(_POOL_ID); console.log(" -> After swapping: %s USDT\n", uint256(i * 200_000)); } } - function test_uniswapV4_logPriceAndTicks_decreasingPrice() public { + function test_uniswapV4_logPriceAndTicks_decreasingPrice() external { vm.skip(true); for (uint256 i = 0; i <= 100; ++i) { if (i != 0) { - _externalSwap(_user, address(usdc), 200_000e6); + _externalSwap(_POOL_ID, _user, address(usdc), 200_000e6); } - _logCurrentPriceAndTick(); + _logCurrentPriceAndTick(_POOL_ID); console.log(" -> After swapping: %s USDC\n", uint256(i * 200_000)); } } @@ -1109,7 +1770,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Attack Tests (Current price is expected to be between the range) ***/ /**********************************************************************************************/ - function test_uniswapV4_baseline_priceMid() public { + function test_uniswapV4_baseline_priceMid() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); @@ -1121,9 +1782,16 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Add Liquidity (Current price is expected to be between the range) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - IncreasePositionResult memory increaseResult = _mintPosition(-10, 10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); assertEq(increaseResult.amount0Spent, 840_606.192834e6); assertEq(increaseResult.amount1Spent, 159_209.952358e6); @@ -1133,7 +1801,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Remove Liquidity ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); @@ -1142,7 +1810,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_816.145190e6); // Lost 0 USD. } - function test_uniswapV4_attack_priceMidToAbove() public { + function test_uniswapV4_attack_priceMidToAbove() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); @@ -1154,17 +1822,24 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Frontrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - uint256 amountOut1 = _externalSwap(_user, address(usdt), 19_200_000e6); + uint256 amountOut1 = _externalSwap(_POOL_ID, _user, address(usdt), 19_200_000e6); /******************************************************************************************/ /*** Add Liquidity (Current price was expected to be between the range, but is above) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), 11); + assertEq(_getCurrentTick(_POOL_ID), 11); - IncreasePositionResult memory increaseResult = _mintPosition(-10, 10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); assertEq(increaseResult.amount0Spent, 0); // Expected 840_606.192834e6 as per baseline assertEq(increaseResult.amount1Spent, 999_950.044994e6); // Expected 159_209.952358e6 as per baseline @@ -1174,9 +1849,9 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Backrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), 11); + assertEq(_getCurrentTick(_POOL_ID), 11); - uint256 amountOut2 = _externalSwap(_user, address(usdc), uint128(amountOut1)); + uint256 amountOut2 = _externalSwap(_POOL_ID, _user, address(usdc), uint128(amountOut1)); assertEq(amountOut2, 19_200_305.050324e6); assertEq(usdc.balanceOf(_user), 0); @@ -1186,7 +1861,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Remove Liquidity ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); @@ -1195,7 +1870,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_810.560885e6); // Lost 139 USD from mint } - function test_uniswapV4_attack_priceMidToBelow() public { + function test_uniswapV4_attack_priceMidToBelow() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); @@ -1207,17 +1882,24 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Frontrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - uint256 amountOut1 = _externalSwap(_user, address(usdc), 2_500_000e6); + uint256 amountOut1 = _externalSwap(_POOL_ID, _user, address(usdc), 2_500_000e6); /******************************************************************************************/ /*** Add Liquidity (Current price was expected to be between the range, but is below) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -11); + assertEq(_getCurrentTick(_POOL_ID), -11); - IncreasePositionResult memory increaseResult = _mintPosition(-10, 10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); assertEq(increaseResult.amount0Spent, 999_950.044994e6); // Expected 840_606.192834e6 as per baseline assertEq(increaseResult.amount1Spent, 0); // Expected 159_209.952358e6 as per baseline @@ -1227,9 +1909,9 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Backrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -11); + assertEq(_getCurrentTick(_POOL_ID), -11); - uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); + uint256 amountOut2 = _externalSwap(_POOL_ID, _user, address(usdt), uint128(amountOut1)); assertEq(amountOut2, 2_499_974.750232e6); assertEq(usdc.balanceOf(_user), 2_499_974.750232e6); // Lost 26 USDC. @@ -1239,7 +1921,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Remove Liquidity ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); @@ -1252,7 +1934,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Attack Tests (Current price is expected to be below the range) ***/ /**********************************************************************************************/ - function test_uniswapV4_baseline_priceBelow() public { + function test_uniswapV4_baseline_priceBelow() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); @@ -1264,9 +1946,16 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Add Liquidity (Current price is expected to be below the range) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - IncreasePositionResult memory increaseResult = _mintPosition(-5, 15, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 15, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); assertEq(increaseResult.amount0Spent, 999_700.101224e6); assertEq(increaseResult.amount1Spent, 0); @@ -1276,7 +1965,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Remove Liquidity ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); @@ -1285,7 +1974,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_700.101223e6); // Lost 0 USD. } - function test_uniswapV4_attack_priceBelowToMid() public { + function test_uniswapV4_attack_priceBelowToMid() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); @@ -1297,17 +1986,24 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Frontrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - uint256 amountOut1 = _externalSwap(_user, address(usdt), 18_000_000e6); + uint256 amountOut1 = _externalSwap(_POOL_ID, _user, address(usdt), 18_000_000e6); /******************************************************************************************/ /*** Add Liquidity (Current price was expected to be below the range, but is between) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), 2); + assertEq(_getCurrentTick(_POOL_ID), 2); - IncreasePositionResult memory increaseResult = _mintPosition(-5, 15, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 15, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); assertEq(increaseResult.amount0Spent, 632_055.655046e6); // Expected 999_700.101224e6 as per baseline assertEq(increaseResult.amount1Spent, 367_595.789859e6); // Expected 0 as per baseline @@ -1317,9 +2013,9 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Backrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), 2); + assertEq(_getCurrentTick(_POOL_ID), 2); - uint256 amountOut2 = _externalSwap(_user, address(usdc), uint128(amountOut1)); + uint256 amountOut2 = _externalSwap(_POOL_ID, _user, address(usdc), uint128(amountOut1)); assertEq(amountOut2, 17_999_838.406844e6); assertEq(usdc.balanceOf(_user), 0); @@ -1329,7 +2025,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Remove Liquidity ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); @@ -1338,7 +2034,7 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_703.777704e6); // Gained 52 USD from mint. } - function test_uniswapV4_attack_priceBelowToAbove() public { + function test_uniswapV4_attack_priceBelowToAbove() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); @@ -1350,17 +2046,24 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Frontrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - uint256 amountOut1 = _externalSwap(_user, address(usdt), 19_300_000e6); + uint256 amountOut1 = _externalSwap(_POOL_ID, _user, address(usdt), 19_300_000e6); /******************************************************************************************/ /*** Add Liquidity (Current price was expected to be below the range, but is above) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), 34); + assertEq(_getCurrentTick(_POOL_ID), 34); - IncreasePositionResult memory increaseResult = _mintPosition(-5, 15, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -5, + tickUpper : 15, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); assertEq(increaseResult.amount0Spent, 0); // Expected 999_700.101224e6 as per baseline assertEq(increaseResult.amount1Spent, 1_000_200.051255e6); // Expected 0 as per baseline @@ -1370,843 +2073,1270 @@ contract MainnetControllerUniswapV4Tests is ForkTestBase { /*** Backrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), 34); + assertEq(_getCurrentTick(_POOL_ID), 34); + + uint256 amountOut2 = _externalSwap(_POOL_ID, _user, address(usdc), uint128(amountOut1)); + + assertEq(amountOut2, 19_300_769.578693e6); + assertEq(usdc.balanceOf(_user), 0); + assertEq(usdt.balanceOf(_user), 19_300_769.578693e6); // Gained 769 USDT. + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 999_710.098327e6); + assertEq(decreaseResult.amount1Received, 0); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_710.098327e6); // Lost 490 USD from mint + } + + /**********************************************************************************************/ + /*** Attack Tests (Current price is expected to be above the range) ***/ + /**********************************************************************************************/ + + function test_uniswapV4_baseline_priceAbove() external { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Add Liquidity (Current price is expected to be above the range) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -7); + + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -30, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); + + assertEq(increaseResult.amount0Spent, 0); + assertEq(increaseResult.amount1Spent, 998_950.644702e6); + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 998_950.644702e6); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -7); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 0); + assertEq(decreaseResult.amount1Received, 998_950.644701e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_950.644701e6); // Lost 0 USD. + } + + function test_uniswapV4_attack_priceAboveToMid() external { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -7); + + uint256 amountOut1 = _externalSwap(_POOL_ID, _user, address(usdc), 2_840_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be above the range, but is between) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -20); + + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -30, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); + + assertEq(increaseResult.amount0Spent, 457_787.249555e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent, 541_830.090075e6); // Expected 998_950.644702e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_617.339630e6); // Expected 998_950.644702e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -20); + + uint256 amountOut2 = _externalSwap(_POOL_ID, _user, address(usdt), uint128(amountOut1)); + + assertEq(amountOut2, 2_840_292.929030e6); + assertEq(usdc.balanceOf(_user), 2_840_292.929030e6); // Gained 292 USDC. + assertEq(usdt.balanceOf(_user), 0); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -8); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 0); + assertEq(decreaseResult.amount1Received, 998_955.215954e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_955.215954e6); // Lost 662 USD from mint + } + + function test_uniswapV4_attack_priceAboveToBelow() external { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -7); + + uint256 amountOut1 = _externalSwap(_POOL_ID, _user, address(usdc), 2_900_000e6); + + /******************************************************************************************/ + /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -50); + + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -30, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); + + assertEq(increaseResult.amount0Spent, 1_000_950.445137e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent, 0); // Expected 998_950.644702e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 1_000_950.445137e6); // Expected 998_950.644702e6 as per baseline + + /******************************************************************************************/ + /*** Backrun ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -50); + + uint256 amountOut2 = _externalSwap(_POOL_ID, _user, address(usdt), uint128(amountOut1)); + + assertEq(amountOut2, 2_901_232.701533e6); + assertEq(usdc.balanceOf(_user), 2_901_232.701533e6); // Gained 1_232 USDC. + assertEq(usdt.balanceOf(_user), 0); + + /******************************************************************************************/ + /*** Remove Liquidity ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -8); + + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + + assertEq(decreaseResult.amount0Received, 0); + assertEq(decreaseResult.amount1Received, 998_960.634310e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_960.634310e6); // Lost 1,989 USD from mint + } + + function test_uniswapV4_attack_priceAboveToBelow_defended() external { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + /******************************************************************************************/ + /*** Get max amounts ***/ + /******************************************************************************************/ + + assertEq(_getCurrentTick(_POOL_ID), -7); - uint256 amountOut2 = _externalSwap(_user, address(usdc), uint128(amountOut1)); + // While recommended usage is to use max amounts that are exactly (or close to exactly) the + // forecasted amounts in production, however this shows that even a value of 0.99 is + // sufficient to prevent an attack. + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(_POOL_ID, -30, -10, 1_000_000_000e6, 0.99e18); - assertEq(amountOut2, 19_300_769.578693e6); - assertEq(usdc.balanceOf(_user), 0); - assertEq(usdt.balanceOf(_user), 19_300_769.578693e6); // Gained 769 USDT. + /******************************************************************************************/ + /*** Frontrun ***/ + /******************************************************************************************/ + + _externalSwap(_POOL_ID, _user, address(usdc), 2_900_000e6); /******************************************************************************************/ - /*** Remove Liquidity ***/ + /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -50); - DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + deal(address(usdc), address(almProxy), usdc.balanceOf(address(almProxy)) + amount0Max); + deal(address(usdt), address(almProxy), usdt.balanceOf(address(almProxy)) + amount1Max); - assertEq(decreaseResult.amount0Received, 999_710.098327e6); - assertEq(decreaseResult.amount1Received, 0); - assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 999_710.098327e6); // Lost 490 USD from mint + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, 0, 1_000_950.445137e6) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -30, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : amount0Max, + amount1Max : amount1Max + }); } /**********************************************************************************************/ - /*** Attack Tests (Current price is expected to be above the range) ***/ + /*** Attack Tests (Current price is expected to be above the range, with wide tick spacing) ***/ /**********************************************************************************************/ - function test_uniswapV4_baseline_priceAbove() public { + function test_uniswapV4_baseline_priceAbove_wideTicks() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 200); // Allow wider tick range. + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); vm.stopPrank(); /******************************************************************************************/ /*** Add Liquidity (Current price is expected to be above the range) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - IncreasePositionResult memory increaseResult = _mintPosition(-30, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -200, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); assertEq(increaseResult.amount0Spent, 0); - assertEq(increaseResult.amount1Spent, 998_950.644702e6); - assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 998_950.644702e6); + assertEq(increaseResult.amount1Spent, 9_449_821.223798e6); + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 9_449_821.223798e6); /******************************************************************************************/ /*** Remove Liquidity ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); assertEq(decreaseResult.amount0Received, 0); - assertEq(decreaseResult.amount1Received, 998_950.644701e6); - assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_950.644701e6); // Lost 0 USD. + assertEq(decreaseResult.amount1Received, 9_449_821.223797e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 9_449_821.223797e6); // Lost 0 USD. } - function test_uniswapV4_attack_priceAboveToMid() public { + function test_uniswapV4_attack_priceAboveToBelow_wideTicks() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 200); // Allow wider tick spacing. + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); vm.stopPrank(); /******************************************************************************************/ /*** Frontrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - uint256 amountOut1 = _externalSwap(_user, address(usdc), 2_840_000e6); + uint256 amountOut1 = _externalSwap(_POOL_ID, _user, address(usdc), 3_020_000e6); /******************************************************************************************/ - /*** Add Liquidity (Current price was expected to be above the range, but is between) ***/ + /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -20); + assertEq(_getCurrentTick(_POOL_ID), -501); - IncreasePositionResult memory increaseResult = _mintPosition(-30, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : -200, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); - assertEq(increaseResult.amount0Spent, 457_787.249555e6); // Expected 0 as per baseline - assertEq(increaseResult.amount1Spent, 541_830.090075e6); // Expected 998_950.644702e6 as per baseline - assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 999_617.339630e6); // Expected 998_950.644702e6 as per baseline + assertEq(increaseResult.amount0Spent, 9_549_562.082877e6); // Expected 0 as per baseline + assertEq(increaseResult.amount1Spent, 0); // Expected 9_449_821.223798e6 as per baseline + assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 9_549_562.082877e6); // Expected 9_449_821.223798e6 as per baseline /******************************************************************************************/ /*** Backrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -20); + assertEq(_getCurrentTick(_POOL_ID), -501); - uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); + uint256 amountOut2 = _externalSwap(_POOL_ID, _user, address(usdt), uint128(amountOut1)); - assertEq(amountOut2, 2_840_292.929030e6); - assertEq(usdc.balanceOf(_user), 2_840_292.929030e6); // Gained 292 USDC. + assertEq(amountOut2, 3_067_685.526025e6); + assertEq(usdc.balanceOf(_user), 3_067_685.526025e6); // Gained 47_685 USDC. assertEq(usdt.balanceOf(_user), 0); /******************************************************************************************/ /*** Remove Liquidity ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -8); + assertEq(_getCurrentTick(_POOL_ID), -141); DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); - assertEq(decreaseResult.amount0Received, 0); - assertEq(decreaseResult.amount1Received, 998_955.215954e6); - assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_955.215954e6); // Lost 662 USD from mint + assertEq(decreaseResult.amount0Received, 6_528_153.154390e6); + assertEq(decreaseResult.amount1Received, 2_970_499.394905e6); + assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 9_498_652.549295e6); // Lost 50,909 USD from mint } - function test_uniswapV4_attack_priceAboveToBelow() public { + function test_uniswapV4_attack_priceAboveToBelow_defended_wideTicks() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); // Disallow wider tick spacing. + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); vm.stopPrank(); /******************************************************************************************/ /*** Frontrun ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -7); + assertEq(_getCurrentTick(_POOL_ID), -7); - uint256 amountOut1 = _externalSwap(_user, address(usdc), 2_900_000e6); + _externalSwap(_POOL_ID, _user, address(usdc), 3_020_000e6); /******************************************************************************************/ /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ /******************************************************************************************/ - assertEq(_getCurrentTick(), -50); + assertEq(_getCurrentTick(_POOL_ID), -501); + + vm.prank(relayer); + vm.expectRevert("MC/tickSpacing-too-wide"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -200, + tickUpper : -10, + liquidity : 1_000_000_000e6, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); + } - IncreasePositionResult memory increaseResult = _mintPosition(-30, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); +} - assertEq(increaseResult.amount0Spent, 1_000_950.445137e6); // Expected 0 as per baseline - assertEq(increaseResult.amount1Spent, 0); // Expected 998_950.644702e6 as per baseline - assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 1_000_950.445137e6); // Expected 998_950.644702e6 as per baseline +contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { - /******************************************************************************************/ - /*** Backrun ***/ - /******************************************************************************************/ + bytes32 internal constant _POOL_ID = 0xb54ece65cc2ddd3eaec0ad18657470fb043097220273d87368a062c7d4e59180; - assertEq(_getCurrentTick(), -50); + bytes32 internal constant _DEPOSIT_LIMIT_KEY = keccak256(abi.encode(_LIMIT_DEPOSIT, _POOL_ID)); + bytes32 internal constant _WITHDRAW_LIMIT_KEY = keccak256(abi.encode(_LIMIT_WITHDRAW, _POOL_ID)); + bytes32 internal constant _SWAP_LIMIT_KEY = keccak256(abi.encode(_LIMIT_SWAP, _POOL_ID)); - uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); - assertEq(amountOut2, 2_901_232.701533e6); - assertEq(usdc.balanceOf(_user), 2_901_232.701533e6); // Gained 1_232 USDC. - assertEq(usdt.balanceOf(_user), 0); + /**********************************************************************************************/ + /*** mintPositionUniswapV4 Tests ***/ + /**********************************************************************************************/ - /******************************************************************************************/ - /*** Remove Liquidity ***/ - /******************************************************************************************/ + function test_mintPositionUniswapV4_revertsWhenTickLimitsNotSet() external { + vm.prank(relayer); + vm.expectRevert("MC/tickLimits-not-set"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 0, + tickUpper : 0, + liquidity : 0, + amount0Max : 0, + amount1Max : 0 + }); + } - assertEq(_getCurrentTick(), -8); + function test_mintPositionUniswapV4_revertsWhenTicksMisorderedBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); - DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + deal(address(usdt), address(almProxy), 1_000_000e6); + deal(address(usds), address(almProxy), 1_000_000e18); - assertEq(decreaseResult.amount0Received, 0); - assertEq(decreaseResult.amount1Received, 998_960.634310e6); - assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 998_960.634310e6); // Lost 1,989 USD from mint + vm.prank(relayer); + vm.expectRevert("MC/ticks-misordered"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_302, + tickUpper : 276_301, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); + + vm.prank(relayer); + vm.expectRevert("MC/ticks-misordered"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_301, + tickUpper : 276_301, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_301, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); } - function test_uniswapV4_attack_priceAboveToBelow_defended() public { - // Setup the pool and the controller. + function test_mintPositionUniswapV4_revertsWhenTickLowerTooLowBoundary() external { vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_300, 280_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - /******************************************************************************************/ - /*** Get max amounts ***/ - /******************************************************************************************/ + deal(address(usdt), address(almProxy), 1_000_000e6); + deal(address(usds), address(almProxy), 1_000_000e18); - assertEq(_getCurrentTick(), -7); + vm.prank(relayer); + vm.expectRevert("MC/tickLower-too-low"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_299, + tickUpper : 276_600, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); - // While recommended usage is to use max amounts that are exactly (or close to exactly) the - // forecasted amounts in production, however this shows that even a value of 0.99 is - // sufficient to prevent an attack. - ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(-30, -10, 1_000_000_000e6, 0.99e18); + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_600, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); + } - /******************************************************************************************/ - /*** Frontrun ***/ - /******************************************************************************************/ + function test_mintPositionUniswapV4_revertsWhenTickUpperTooHighBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 276_600, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdt), address(almProxy), 1_000_000e6); + deal(address(usds), address(almProxy), 1_000_000e18); + + vm.prank(relayer); + vm.expectRevert("MC/tickUpper-too-high"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_601, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_600, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); + } + + function test_mintPositionUniswapV4_revertsWhenTickSpacingTooWideBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_300, 276_600, 100); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdt), address(almProxy), 1_000_000e6); + deal(address(usds), address(almProxy), 1_000_000e18); + + vm.prank(relayer); + vm.expectRevert("MC/tickSpacing-too-wide"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_400, + tickUpper : 276_501, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_400, + tickUpper : 276_500, + liquidity : 1_000_000e12, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e18 + }); + } + + function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_300, 276_400, 1_000_000e12); + + deal(address(usdt), address(almProxy), amount0Forecasted + 1); + deal(address(usds), address(almProxy), amount1Forecasted + 1); - _externalSwap(_user, address(usdc), 2_900_000e6); + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_400, + liquidity : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_400, + liquidity : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + } - /******************************************************************************************/ - /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ - /******************************************************************************************/ + function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); - assertEq(_getCurrentTick(), -50); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_300, 276_400, 1_000_000e12); - deal(address(usdc), address(almProxy), usdc.balanceOf(address(almProxy)) + amount0Max); - deal(address(usdt), address(almProxy), usdt.balanceOf(address(almProxy)) + amount1Max); + deal(address(usdt), address(almProxy), amount0Forecasted + 1); + deal(address(usds), address(almProxy), amount1Forecasted + 1); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, 0, 1_000_950.445137e6) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) ); mainnetController.mintPositionUniswapV4({ poolId : _POOL_ID, - tickLower : -30, - tickUpper : -10, - liquidity : 1_000_000_000e6, - amount0Max : amount0Max, - amount1Max : amount1Max + tickLower : 276_300, + tickUpper : 276_400, + liquidity : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_400, + liquidity : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 }); } - /**********************************************************************************************/ - /*** Attack Tests (Current price is expected to be above the range, with wide tick spacing) ***/ - /**********************************************************************************************/ + function test_mintPositionUniswapV4_revertsWhenRateLimitExceededBoundary() external { + uint256 expectedDecrease = 29_773.913458368778256533e18; - function test_uniswapV4_baseline_priceAbove_wideTicks() public { - // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 200); // Allow wider tick range. - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); - rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); vm.stopPrank(); - /******************************************************************************************/ - /*** Add Liquidity (Current price is expected to be above the range) ***/ - /******************************************************************************************/ - - assertEq(_getCurrentTick(), -7); - - IncreasePositionResult memory increaseResult = _mintPosition(-200, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); - - assertEq(increaseResult.amount0Spent, 0); - assertEq(increaseResult.amount1Spent, 9_449_821.223798e6); - assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 9_449_821.223798e6); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - /******************************************************************************************/ - /*** Remove Liquidity ***/ - /******************************************************************************************/ + deal(address(usdt), address(almProxy), amount0Forecasted + 1); + deal(address(usds), address(almProxy), amount1Forecasted + 1); - assertEq(_getCurrentTick(), -7); + vm.prank(relayer); + vm.expectRevert("RateLimits/rate-limit-exceeded"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_000, + tickUpper : 276_600, + liquidity : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); - DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease, 0); - assertEq(decreaseResult.amount0Received, 0); - assertEq(decreaseResult.amount1Received, 9_449_821.223797e6); - assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 9_449_821.223797e6); // Lost 0 USD. + vm.prank(relayer); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_000, + tickUpper : 276_600, + liquidity : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); } - function test_uniswapV4_attack_priceAboveToBelow_wideTicks() public { - // Setup the pool and the controller. + function test_mintPositionUniswapV4() external { vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 200); // Allow wider tick spacing. - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); - rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - /******************************************************************************************/ - /*** Frontrun ***/ - /******************************************************************************************/ - - assertEq(_getCurrentTick(), -7); - - uint256 amountOut1 = _externalSwap(_user, address(usdc), 3_020_000e6); - - /******************************************************************************************/ - /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ - /******************************************************************************************/ - - assertEq(_getCurrentTick(), -501); + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(_POOL_ID, 276_000, 276_600, 1_000_000e12, 0.99e18); - IncreasePositionResult memory increaseResult = _mintPosition(-200, -10, 1_000_000_000e6, type(uint160).max, type(uint160).max); + vm.record(); - assertEq(increaseResult.amount0Spent, 9_549_562.082877e6); // Expected 0 as per baseline - assertEq(increaseResult.amount1Spent, 0); // Expected 9_449_821.223798e6 as per baseline - assertEq(increaseResult.amount1Spent + increaseResult.amount0Spent, 9_549_562.082877e6); // Expected 9_449_821.223798e6 as per baseline + IncreasePositionResult memory result = _mintPosition({ + poolId : _POOL_ID, + tickLower : 276_000, + tickUpper : 276_600, + liquidity : 1_000_000e12, + amount0Max : amount0Max, + amount1Max : amount1Max + }); - /******************************************************************************************/ - /*** Backrun ***/ - /******************************************************************************************/ + _assertReentrancyGuardWrittenToTwice(); - assertEq(_getCurrentTick(), -501); + assertEq(result.amount0Spent, 12_871.843781e6); + assertEq(result.amount1Spent, 16_902.069677368778256533e18); + } - uint256 amountOut2 = _externalSwap(_user, address(usdt), uint128(amountOut1)); + /**********************************************************************************************/ + /*** increaseLiquidity Tests ***/ + /**********************************************************************************************/ - assertEq(amountOut2, 3_067_685.526025e6); - assertEq(usdc.balanceOf(_user), 3_067_685.526025e6); // Gained 47_685 USDC. - assertEq(usdt.balanceOf(_user), 0); + function test_increaseLiquidityUniswapV4_revertsWhenPositionIsNotOwnedByProxy() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - /******************************************************************************************/ - /*** Remove Liquidity ***/ - /******************************************************************************************/ + vm.prank(address(almProxy)); + IPositionManagerLike(_POSITION_MANAGER).transferFrom(address(almProxy), address(1), minted.tokenId); - assertEq(_getCurrentTick(), -141); + vm.prank(relayer); + vm.expectRevert("MC/non-proxy-position"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : minted.tokenId, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); + } - DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 1_000_000_000e6, 0, 0); + function test_increaseLiquidityUniswapV4_revertsWhenTokenIsNotForPool() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - assertEq(decreaseResult.amount0Received, 6_528_153.154390e6); - assertEq(decreaseResult.amount1Received, 2_970_499.394905e6); - assertEq(decreaseResult.amount0Received + decreaseResult.amount1Received, 9_498_652.549295e6); // Lost 50,909 USD from mint + vm.prank(relayer); + vm.expectRevert("MC/tokenId-poolId-mismatch"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : minted.tokenId, + liquidityIncrease : 0, + amount0Max : 0, + amount1Max : 0 + }); } - function test_uniswapV4_attack_priceAboveToBelow_defended_wideTicks() public { - // Setup the pool and the controller. - vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -200, 200, 20); // Disallow wider tick spacing. - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 20_000_000e18, 0); - rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 20_000_000e18, 0); - vm.stopPrank(); + function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - /******************************************************************************************/ - /*** Frontrun ***/ - /******************************************************************************************/ + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - assertEq(_getCurrentTick(), -7); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e12 + ); - _externalSwap(_user, address(usdc), 3_020_000e6); + deal(address(usdt), address(almProxy), amount0Forecasted + 1); + deal(address(usds), address(almProxy), amount1Forecasted + 1); - /******************************************************************************************/ - /*** Add Liquidity (Current price was expected to be above the range, but is below) ***/ - /******************************************************************************************/ + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + ); - assertEq(_getCurrentTick(), -501); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); vm.prank(relayer); - vm.expectRevert("MC/tickSpacing-too-wide"); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : -200, - tickUpper : -10, - liquidity : 1_000_000_000e6, - amount0Max : type(uint160).max, - amount1Max : type(uint160).max + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 }); } - /**********************************************************************************************/ - /*** Helper Functions ***/ - /**********************************************************************************************/ + function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - function _setupLiquidity() internal returns (IncreasePositionResult memory minted) { - vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); + vm.prank(SPARK_PROXY); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - vm.stopPrank(); - ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(-10, 0, 1_000_000e6, 0.99e18); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e12 + ); - minted = _mintPosition(-10, 0, 1_000_000e6, amount0Max, amount1Max); + deal(address(usdt), address(almProxy), amount0Forecasted + 1); + deal(address(usds), address(almProxy), amount1Forecasted + 1); - vm.startPrank(SPARK_PROXY); - mainnetController.setUniswapV4TickLimits(_POOL_ID, 0, 0, 0); - rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 0, 0); - vm.stopPrank(); - } + vm.prank(relayer); - function _getIncreasePositionMaxAmounts( - int24 tickLower, - int24 tickUpper, - uint128 liquidity, - uint256 maxSlippage - ) internal returns (uint256 amount0Max, uint256 amount1Max) { - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( - tickLower, - tickUpper, - liquidity + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) ); - amount0Max = (amount0Forecasted * 1e18) / maxSlippage; - amount1Max = (amount1Forecasted * 1e18) / maxSlippage; + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); } - function _mintPosition( - int24 tickLower, - int24 tickUpper, - uint128 liquidity, - uint256 amount0Max, - uint256 amount1Max - ) internal returns (IncreasePositionResult memory result) { - uint256 tokenIdToMint = IPositionManagerLike(_POSITION_MANAGER).nextTokenId(); + function test_increaseLiquidityUniswapV4_revertsWhenRateLimitExceededBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - deal(address(usdc), address(almProxy), usdc.balanceOf(address(almProxy)) + amount0Max); - deal(address(usdt), address(almProxy), usdt.balanceOf(address(almProxy)) + amount1Max); + uint256 expectedDecrease = 29_773.913458368778256533e18; + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); - uint256 usdcBeforeCall = usdc.balanceOf(address(almProxy)); - uint256 usdtBeforeCall = usdt.balanceOf(address(almProxy)); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e12 + ); - uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + deal(address(usdt), address(almProxy), amount0Forecasted + 1); + deal(address(usds), address(almProxy), amount1Forecasted + 1); vm.prank(relayer); - mainnetController.mintPositionUniswapV4({ - poolId : _POOL_ID, - tickLower : tickLower, - tickUpper : tickUpper, - liquidity : liquidity, - amount0Max : amount0Max, - amount1Max : amount1Max + vm.expectRevert("RateLimits/rate-limit-exceeded"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 + }); + + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease, 0); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount1Max : amount1Forecasted + 1 // Quote is off by 1 }); + } - uint256 usdcAfterCall = usdc.balanceOf(address(almProxy)); - uint256 usdtAfterCall = usdt.balanceOf(address(almProxy)); + function test_increaseLiquidityUniswapV4() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); - result.tokenId = tokenIdToMint; - result.amount0Spent = usdcBeforeCall - usdcAfterCall; - result.amount1Spent = usdtBeforeCall - usdtAfterCall; - result.liquidityIncrease = liquidity; - result.tickLower = tickLower; - result.tickUpper = tickUpper; + ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e12, + 0.99e18 + ); - assertLe(result.amount0Spent, amount0Max); - assertLe(result.amount1Spent, amount1Max); + vm.record(); - assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(result.amount0Spent + result.amount1Spent)); + IncreasePositionResult memory result = _increasePosition( + minted.tokenId, + 1_000_000e12, + amount0Max, + amount1Max + ); - assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); + _assertReentrancyGuardWrittenToTwice(); - assertEq(IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(result.tokenId), result.liquidityIncrease); + assertEq(result.amount0Spent, 12_871.843781e6); + assertEq(result.amount1Spent, 16_902.069677368778256533e18); + } + + /**********************************************************************************************/ + /*** decreaseLiquidityUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_decreaseLiquidityUniswapV4_revertsWhenTokenIsNotForPool() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - _assertZeroAllowances(address(usdc)); - _assertZeroAllowances(address(usdt)); + vm.prank(relayer); + vm.expectRevert("MC/tokenId-poolId-mismatch"); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : bytes32(0), + tokenId : minted.tokenId, + liquidityDecrease : 0, + amount0Min : 0, + amount1Min : 0 + }); } - function _increasePosition( - uint256 tokenId, - uint128 liquidityIncrease, - uint256 amount0Max, - uint256 amount1Max - ) internal returns (IncreasePositionResult memory result) { - ( - , // PoolKey - PositionInfo positionInfo - ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + function test_decreaseLiquidityUniswapV4_revertsWhenAmount0MinNotMetBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - deal(address(usdc), address(almProxy), usdc.balanceOf(address(almProxy)) + amount0Max); - deal(address(usdt), address(almProxy), usdt.balanceOf(address(almProxy)) + amount1Max); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); - uint256 usdcBeforeCall = usdc.balanceOf(address(almProxy)); - uint256 usdtBeforeCall = usdt.balanceOf(address(almProxy)); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + minted.liquidityIncrease / 2 + ); - uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + vm.prank(relayer); - uint256 positionLiquidityBeforeCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + vm.expectRevert( + abi.encodeWithSelector( + SlippageCheck.MinimumAmountInsufficient.selector, + amount0Forecasted + 1, + amount0Forecasted + ) + ); + + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted + 1, + amount1Min : amount1Forecasted + }); vm.prank(relayer); - mainnetController.increaseLiquidityUniswapV4({ + mainnetController.decreaseLiquidityUniswapV4({ poolId : _POOL_ID, - tokenId : tokenId, - liquidityIncrease : liquidityIncrease, - amount0Max : amount0Max, - amount1Max : amount1Max + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted }); + } - uint256 usdcAfterCall = usdc.balanceOf(address(almProxy)); - uint256 usdtAfterCall = usdt.balanceOf(address(almProxy)); + function test_decreaseLiquidityUniswapV4_revertsWhenAmount1MinNotMetBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); - uint256 positionLiquidityAfterCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + minted.liquidityIncrease / 2 + ); - result.tokenId = tokenId; - result.amount0Spent = usdcBeforeCall - usdcAfterCall; - result.amount1Spent = usdtBeforeCall - usdtAfterCall; - result.liquidityIncrease = liquidityIncrease; - result.tickLower = positionInfo.tickLower(); - result.tickUpper = positionInfo.tickUpper(); + vm.prank(relayer); - assertLe(result.amount0Spent, amount0Max); - assertLe(result.amount1Spent, amount1Max); + vm.expectRevert( + abi.encodeWithSelector( + SlippageCheck.MinimumAmountInsufficient.selector, + amount1Forecasted + 1, + amount1Forecasted + ) + ); - assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(result.amount0Spent + result.amount1Spent)); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + 1 + }); - assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); + vm.prank(relayer); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + }); + } - assertEq(positionLiquidityAfterCall, positionLiquidityBeforeCall + result.liquidityIncrease); + function test_decreaseLiquidityUniswapV4_revertsWhenRateLimitExceededBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - _assertZeroAllowances(address(usdc)); - _assertZeroAllowances(address(usdt)); - } + uint256 expectedDecrease = 14_886.956728684389128266e18; - function _getDecreasePositionMinAmounts( - uint256 tokenId, - uint128 liquidity, - uint256 maxSlippage - ) internal returns (uint256 amount0Min, uint256 amount1Min) { - ( - , // PoolKey - PositionInfo positionInfo - ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, expectedDecrease - 1, 0); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( - positionInfo.tickLower(), - positionInfo.tickUpper(), - liquidity + _POOL_ID, + minted.tickLower, + minted.tickUpper, + minted.liquidityIncrease / 2 ); - amount0Min = (amount0Forecasted * maxSlippage) / 1e18; - amount1Min = (amount1Forecasted * maxSlippage) / 1e18; - } - - function _decreasePosition( - uint256 tokenId, - uint128 liquidityDecrease, - uint256 amount0Min, - uint256 amount1Min - ) internal returns (DecreasePositionResult memory result) { - ( - , // PoolKey - PositionInfo positionInfo - ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); - - uint256 usdcBeforeCall = usdc.balanceOf(address(almProxy)); - uint256 usdtBeforeCall = usdt.balanceOf(address(almProxy)); - - uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY); + vm.prank(relayer); + vm.expectRevert("RateLimits/rate-limit-exceeded"); + mainnetController.decreaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted + }); - uint256 positionLiquidityBeforeCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, expectedDecrease, 0); vm.prank(relayer); mainnetController.decreaseLiquidityUniswapV4({ poolId : _POOL_ID, - tokenId : tokenId, - liquidityDecrease : liquidityDecrease, - amount0Min : amount0Min, - amount1Min : amount1Min + tokenId : minted.tokenId, + liquidityDecrease : minted.liquidityIncrease / 2, + amount0Min : amount0Forecasted, + amount1Min : amount1Forecasted }); + } - uint256 usdcAfterCall = usdc.balanceOf(address(almProxy)); - uint256 usdtAfterCall = usdt.balanceOf(address(almProxy)); - - uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY); + function test_decreaseLiquidityUniswapV4_partial() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - uint256 positionLiquidityAfterCall = IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(tokenId); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); - result.tokenId = tokenId; - result.amount0Received = usdcAfterCall - usdcBeforeCall; - result.amount1Received = usdtAfterCall - usdtBeforeCall; - result.liquidityDecrease = liquidityDecrease; - result.tickLower = positionInfo.tickLower(); - result.tickUpper = positionInfo.tickUpper(); + ( uint256 amount0Min, uint256 amount1Min ) = _getDecreasePositionMinAmounts(minted.tokenId, minted.liquidityIncrease / 2, 0.99e18); - assertGe(result.amount0Received, amount0Min); - assertGe(result.amount1Received, amount1Min); + vm.record(); - assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(result.amount0Received + result.amount1Received)); + DecreasePositionResult memory result = _decreasePosition( + minted.tokenId, + minted.liquidityIncrease / 2, + amount0Min, + amount1Min + ); - assertEq(IPositionManagerLike(_POSITION_MANAGER).ownerOf(result.tokenId), address(almProxy)); + _assertReentrancyGuardWrittenToTwice(); - assertEq(positionLiquidityAfterCall, positionLiquidityBeforeCall - result.liquidityDecrease); + assertEq(result.amount0Received, 6_435.921890e6); + assertEq(result.amount1Received, 8_451.034838684389128266e18); } - function _getSwapAmountOutMin( - address tokenIn, - uint128 amountIn, - uint256 maxSlippage - ) internal returns (uint128 amountOutMin) { - IV4QuoterLike.QuoteExactSingleParams memory params = IV4QuoterLike.QuoteExactSingleParams({ - poolKey : IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(_POOL_ID)), - zeroForOne : tokenIn == address(usdc), - exactAmount : amountIn, - hookData : bytes("") - }); + function test_decreaseLiquidityUniswapV4_all() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - ( uint256 amountOut, ) = IV4QuoterLike(_V4_QUOTER).quoteExactInputSingle(params); + vm.prank(SPARK_PROXY); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, 0); - return uint128((amountOut * maxSlippage) / 1e18); + ( uint256 amount0Min, uint256 amount1Min ) = _getDecreasePositionMinAmounts( + minted.tokenId, + minted.liquidityIncrease, + 0.99e18 + ); + + vm.record(); + + DecreasePositionResult memory result = _decreasePosition( + minted.tokenId, + minted.liquidityIncrease, + amount0Min, + amount1Min + ); + + _assertReentrancyGuardWrittenToTwice(); + + assertEq(result.amount0Received, 12_871.843780e6); + assertEq(result.amount1Received, 16_902.069677368778256532e18); } - function _swap( - address tokenIn, - uint128 amountIn, - uint128 amountOutMin - ) internal returns (uint256 amountOut) { - address tokenOut = tokenIn == address(usdc) ? address(usdt) : address(usdc); + /**********************************************************************************************/ + /*** swapUniswapV4 Tests ***/ + /**********************************************************************************************/ + + function test_swapUniswapV4_revertsWhenMaxSlippageNotSet() external { + vm.prank(relayer); + vm.expectRevert("MC/max-slippage-not-set"); + mainnetController.swapUniswapV4(_POOL_ID, address(0), 0, 0); + } - deal(tokenIn, address(almProxy), IERC20Like(tokenIn).balanceOf(address(almProxy)) + amountIn); + function test_swapUniswapV4_revertsWhenRateLimitExceededBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 10_000e18, 0); + vm.stopPrank(); - uint256 tokenInBeforeCall = IERC20Like(tokenIn).balanceOf(address(almProxy)); - uint256 tokenOutBeforeCall = IERC20Like(tokenOut).balanceOf(address(almProxy)); + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, address(usdt), 10_000e6, 0.99e18); - uint256 rateLimitBeforeCall = rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY); + deal(address(usdt), address(almProxy), 10_000e6 + 1); vm.prank(relayer); + vm.expectRevert("RateLimits/rate-limit-exceeded"); mainnetController.swapUniswapV4({ poolId : _POOL_ID, - tokenIn : tokenIn, - amountIn : amountIn, + tokenIn : address(usdt), + amountIn : 10_000e6 + 1, + amountOutMin : amountOutMin + }); + + vm.prank(relayer); + mainnetController.swapUniswapV4({ + poolId : _POOL_ID, + tokenIn : address(usdt), + amountIn : 10_000e6, amountOutMin : amountOutMin }); + } + + function test_swapUniswapV4_revertsWhenInputTokenNotForPool() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); - uint256 tokenInAfterCall = IERC20Like(tokenIn).balanceOf(address(almProxy)); - uint256 tokenOutAfterCall = IERC20Like(tokenOut).balanceOf(address(almProxy)); + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector( + IV4RouterLike.V4TooLittleReceived.selector, + 10_000e6, + 0 + ) + ); - uint256 rateLimitAfterCall = rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY); + mainnetController.swapUniswapV4(_POOL_ID, address(dai), 10_000e6, 10_000e6); + } - assertEq(tokenInBeforeCall - tokenInAfterCall, amountIn); - assertGe(tokenOutAfterCall - tokenOutBeforeCall, amountOutMin); + function test_swapUniswapV4_revertsWhenAmountOutMinTooLowBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); - assertEq(rateLimitBeforeCall - rateLimitAfterCall, _to18From6Decimals(amountIn)); + deal(address(usdt), address(almProxy), 10_000e6); - _assertZeroAllowances(address(usdc)); - _assertZeroAllowances(address(usdt)); + vm.prank(relayer); + vm.expectRevert("MC/amountOutMin-too-low"); + mainnetController.swapUniswapV4(_POOL_ID, address(usdt), 10_000e6, 9_800e18 - 1); - return tokenOutAfterCall - tokenOutBeforeCall; + vm.prank(relayer); + mainnetController.swapUniswapV4(_POOL_ID, address(usdt), 10_000e6, 9_800e18); } - function _getAmount0ForLiquidity( - uint160 sqrtPriceAX96, - uint160 sqrtPriceBX96, - uint128 liquidity - ) internal pure returns (uint256 amount0) { - require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-0"); + function test_swapUniswapV4_revertsWhenAmountOutMinNotMetBoundary() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); - return FullMath.mulDiv( - uint256(liquidity) << 96, - sqrtPriceBX96 - sqrtPriceAX96, - uint256(sqrtPriceBX96) * sqrtPriceAX96 + deal(address(usdt), address(almProxy), 10_000e6); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector( + IV4RouterLike.V4TooLittleReceived.selector, + 9_963.585379886102636344e18 + 1, + 9_963.585379886102636344e18 + ) ); - } - function _getAmount1ForLiquidity( - uint160 sqrtPriceAX96, - uint160 sqrtPriceBX96, - uint128 liquidity - ) internal pure returns (uint256 amount1) { - require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-1"); + mainnetController.swapUniswapV4(_POOL_ID, address(usdt), 10_000e6, 9_963.585379886102636344e18 + 1); - return FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, 1 << 96); + vm.prank(relayer); + mainnetController.swapUniswapV4(_POOL_ID, address(usdt), 10_000e6, 9_963.585379886102636344e18); } - function _getAmountsForLiquidity( - uint160 sqrtPriceX96, - uint160 sqrtPriceAX96, - uint160 sqrtPriceBX96, - uint128 liquidity - ) internal pure returns (uint256 amount0, uint256 amount1) { - require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices"); + function test_swapUniswapV4_token0toToken1() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); - if (sqrtPriceX96 <= sqrtPriceAX96) { - return ( - _getAmount0ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity), - 0 - ); - } + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, address(usdt), 10_000e6, 0.99e18); - if (sqrtPriceX96 >= sqrtPriceBX96) { - return ( - 0, - _getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity) - ); - } + vm.record(); - return ( - _getAmount0ForLiquidity(sqrtPriceX96, sqrtPriceBX96, liquidity), - _getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceX96, liquidity) - ); - } + uint256 amountOut = _swap(_POOL_ID, address(usdt), 10_000e6, amountOutMin); - function _getPrice(uint160 sqrtPriceX96) internal view returns (uint256 price) { - uint256 priceRoot = (uint256(sqrtPriceX96) * 1e18) >> 96; + _assertReentrancyGuardWrittenToTwice(); - return (priceRoot * priceRoot) / 1e18; + assertEq(amountOut, 9_963.585379886102636344e18); } - function _getPrice(int24 tick) internal view returns (uint256 price) { - return _getPrice(TickMath.getSqrtPriceAtTick(tick)); - } + function test_swapUniswapV4_token1toToken0() external { + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); - function _getCurrentTick() internal view returns (int24 tick) { - ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(_POOL_ID)); + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, address(usds), 3_000e18, 0.99e18); - return TickMath.getTickAtSqrtPrice(sqrtPriceX96); - } + vm.record(); - function _logCurrentPriceAndTick() internal view { - ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(_POOL_ID)); + uint256 amountOut = _swap(_POOL_ID, address(usds), 3_000e18, amountOutMin); - uint256 price = _getPrice(sqrtPriceX96); - int24 tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96); + _assertReentrancyGuardWrittenToTwice(); - if (price < 1e1) { - console.log("price: 0.00000000000000000%s", price); - } else if (price < 1e2) { - console.log("price: 0.0000000000000000%s", price); - } else if (price < 1e3) { - console.log("price: 0.000000000000000%s", price); - } else if (price < 1e4) { - console.log("price: 0.00000000000000%s", price); - } else if (price < 1e5) { - console.log("price: 0.0000000000000%s", price); - } else if (price < 1e6) { - console.log("price: 0.000000000000%s", price); - } else if (price < 1e7) { - console.log("price: 0.00000000000%s", price); - } else if (price < 1e8) { - console.log("price: 0.0000000000%s", price); - } else if (price < 1e9) { - console.log("price: 0.000000000%s", price); - } else if (price < 1e10) { - console.log("price: 0.00000000%s", price); - } else if (price < 1e11) { - console.log("price: 0.0000000%s", price); - } else if (price < 1e12) { - console.log("price: 0.000000%s", price); - } else if (price < 1e13) { - console.log("price: 0.00000%s", price); - } else if (price < 1e14) { - console.log("price: 0.0000%s", price); - } else if (price < 1e15) { - console.log("price: 0.000%s", price); - } else if (price < 1e16) { - console.log("price: 0.00%s", price); - } else if (price < 1e17) { - console.log("price: 0.0%s", price); - } else { - uint256 quotient = price / 1e18; - uint256 remainder = price % 1e18; + assertEq(amountOut, 2_990.034994e6); + } - if (remainder < 1e1) { - console.log("price: %s.00000000000000000%s", quotient, remainder); - } else if (remainder < 1e2) { - console.log("price: %s.0000000000000000%s", quotient, remainder); - } else if (remainder < 1e3) { - console.log("price: %s.000000000000000%s", quotient, remainder); - } else if (remainder < 1e4) { - console.log("price: %s.00000000000000%s", quotient, remainder); - } else if (remainder < 1e5) { - console.log("price: %s.0000000000000%s", quotient, remainder); - } else if (remainder < 1e6) { - console.log("price: %s.000000000000%s", quotient, remainder); - } else if (remainder < 1e7) { - console.log("price: %s.00000000000%s", quotient, remainder); - } else if (remainder < 1e8) { - console.log("price: %s.0000000000%s", quotient, remainder); - } else if (remainder < 1e9) { - console.log("price: %s.000000000%s", quotient, remainder); - } else if (remainder < 1e10) { - console.log("price: %s.00000000%s", quotient, remainder); - } else if (remainder < 1e11) { - console.log("price: %s.0000000%s", quotient, remainder); - } else if (remainder < 1e12) { - console.log("price: %s.000000%s", quotient, remainder); - } else if (remainder < 1e13) { - console.log("price: %s.00000%s", quotient, remainder); - } else if (remainder < 1e14) { - console.log("price: %s.0000%s", quotient, remainder); - } else if (remainder < 1e15) { - console.log("price: %s.000%s", quotient, remainder); - } else if (remainder < 1e16) { - console.log("price: %s.00%s", quotient, remainder); - } else if (remainder < 1e17) { - console.log("price: %s.0%s", quotient, remainder); - } else { - console.log("price: %s.%s", quotient, remainder); - } - } + /**********************************************************************************************/ + /*** Story Tests ***/ + /**********************************************************************************************/ - console.log(" -> tick: %s", tick); - } + /** + * @dev Story 1 is a round trip of liquidity minting, increase, decreasing, and closing/burning, + * each 90 days apart, while an external account swaps tokens in and out of the pool. + * - The relayer mints a position with 400_000_000e12 liquidity. + * - The relayer increases the liquidity position by 50% (to 200_000_000e12 liquidity). + * - The relayer decreases the liquidity position by 50% (to 300_000_000e12 liquidity). + * - The relayer decreases the remaining liquidity position (to 0 liquidity). + */ + function test_uniswapV4_story1() external { + // Setup the pool and the controller. + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_300, 280_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + vm.stopPrank(); - function _quoteLiquidity( - int24 tickLower, - int24 tickUpper, - uint128 liquidityAmount - ) internal view returns (uint256 amount0, uint256 amount1) { - ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(_POOL_ID)); + // 1. The relayer mints a position with 1,000,000 liquidity. + IncreasePositionResult memory increaseResult = _mintPosition({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_400, + liquidity : 4_000e17, + amount0Max : type(uint160).max, + amount1Max : type(uint160).max + }); - return _getAmountsForLiquidity( - sqrtPriceX96, - TickMath.getSqrtPriceAtTick(tickLower), - TickMath.getSqrtPriceAtTick(tickUpper), - liquidityAmount - ); - } + assertEq(increaseResult.amount0Spent, 1_183_957.816516e6); + assertEq(increaseResult.amount1Spent, 813_048.360317266265664850e18); - function _assertZeroAllowances(address token) internal { - ( uint160 allowance, , ) = IPermit2Like(_PERMIT2).allowance(address(almProxy), token, _POSITION_MANAGER); + uint256 expectedDecrease = _to18From6Decimals(increaseResult.amount0Spent) + increaseResult.amount1Spent; + assertEq(rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY), 2_000_000e18 - expectedDecrease); - assertEq(allowance, 0, "permit2 allowance not 0"); + // 2. 90 days elapse. + vm.warp(block.timestamp + 90 days); - assertEq(IERC20Like(token).allowance(address(almProxy), _PERMIT2), 0, "allowance to permit2 not 0"); - } + // 3. Some account swaps 500,000 USDT for USDS. + assertEq(_externalSwap(_POOL_ID, _user, address(usdt), 500_000e6), 500_159.667307969852203416e18); - function _to18From6Decimals(uint256 amount) internal pure returns (uint256) { - return amount * 1e12; - } + // 4. The relayer increases the liquidity position by 50%. + increaseResult = _increasePosition(increaseResult.tokenId, 2_000e17, type(uint160).max, type(uint160).max); - function _getBlock() internal pure override returns (uint256) { - return 23470490; // September 29, 2025 - } + assertEq(increaseResult.amount0Spent, 840_712.962029e6); + assertEq(increaseResult.amount1Spent, 157_636.030550204975395201e18); - function _externalSwap(address account, address tokenIn, uint128 amountIn) internal returns (uint256 amountOut) { - address tokenOut = tokenIn == address(usdc) ? address(usdt) : address(usdc); + // NOTE: Rate recharged to max since 90 days elapsed. + expectedDecrease = _to18From6Decimals(increaseResult.amount0Spent) + increaseResult.amount1Spent; + assertEq(rateLimits.getCurrentRateLimit(_DEPOSIT_LIMIT_KEY), 2_000_000e18 - expectedDecrease); - deal(tokenIn, account, amountIn); + // 5. 90 days elapse. + vm.warp(block.timestamp + 90 days); - bytes memory commands = abi.encodePacked(uint8(_V4_SWAP)); + // 6. Some account swaps 750,000 USDS for USDT. + assertEq(_externalSwap(_POOL_ID, _user, address(usds), 750_000e18), 749_609.539364e6); - bytes[] memory inputs = new bytes[](1); + // 7. The relayer decreases the liquidity position by 50%. + DecreasePositionResult memory decreaseResult = _decreasePosition(increaseResult.tokenId, 3_000e17, 0, 0); - bytes memory actions = abi.encodePacked( - uint8(Actions.SWAP_EXACT_IN_SINGLE), - uint8(Actions.SETTLE_ALL), - uint8(Actions.TAKE_ALL) - ); + assertEq(decreaseResult.amount0Received, 887_531.893676e6); + assertEq(decreaseResult.amount1Received, 610_298.227601444650560686e18); - bytes[] memory params = new bytes[](3); + expectedDecrease = _to18From6Decimals(decreaseResult.amount0Received) + decreaseResult.amount1Received; + assertEq(rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY), 2_000_000e18 - expectedDecrease); - params[0] = abi.encode( - IV4Router.ExactInputSingleParams({ - poolKey : IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(_POOL_ID)), - zeroForOne : tokenIn == address(usdc), - amountIn : amountIn, - amountOutMinimum : 0, - hookData : bytes("") - }) - ); + // 8. 90 days elapse. + vm.warp(block.timestamp + 90 days); - params[1] = abi.encode(tokenIn, amountIn); - params[2] = abi.encode(tokenOut, 0); + // 9. Some account swaps 200,000 USDT for USDS. + assertEq(_externalSwap(_POOL_ID, _user, address(usdt), 200_000e6), 200_180.816044995828458470e18); - // Combine actions and params into inputs - inputs[0] = abi.encode(actions, params); + // 10. The relayer decreases the remaining liquidity position. + decreaseResult = _decreasePosition(increaseResult.tokenId, 3_000e17, 0, 0); - uint256 startingOutBalance = IERC20Like(tokenOut).balanceOf(account); + assertEq(decreaseResult.amount0Received, 1_086_263.185036e6); + assertEq(decreaseResult.amount1Received, 411_312.505850170682613151e18); - // Execute the swap - vm.startPrank(account); - IERC20Like(tokenIn).approve(_PERMIT2, amountIn); - IPermit2Like(_PERMIT2).approve(tokenIn, _ROUTER, amountIn, uint48(block.timestamp)); - IUniversalRouterLike(_ROUTER).execute(commands, inputs, block.timestamp); - vm.stopPrank(); + // NOTE: Rate recharged to max since 90 days elapsed. + expectedDecrease = _to18From6Decimals(decreaseResult.amount0Received) + decreaseResult.amount1Received; + assertEq(rateLimits.getCurrentRateLimit(_WITHDRAW_LIMIT_KEY), 2_000_000e18 - expectedDecrease); - return IERC20Like(tokenOut).balanceOf(account) - startingOutBalance; + assertEq( + IPositionManagerLike(_POSITION_MANAGER).getPositionLiquidity(decreaseResult.tokenId), + 0 + ); } } From 29edee5ffcb04618252fa772a8ba2a896c32fac2 Mon Sep 17 00:00:00 2001 From: supercontracts Date: Wed, 3 Dec 2025 21:44:35 +0530 Subject: [PATCH 08/21] add: Uniswap fuzz tests (SC-1250) (#195) * test: UniswapV4 fuzz tests (SC-1250) * format and usdt-usds fuzz tests * fix: fuzz runs instructions --------- Co-authored-by: Michael De Luca --- test/mainnet-fork/Uniswapv4.t.sol | 300 ++++++++++++++++++++++++++---- 1 file changed, 262 insertions(+), 38 deletions(-) diff --git a/test/mainnet-fork/Uniswapv4.t.sol b/test/mainnet-fork/Uniswapv4.t.sol index 420477bd..def93b32 100644 --- a/test/mainnet-fork/Uniswapv4.t.sol +++ b/test/mainnet-fork/Uniswapv4.t.sol @@ -144,12 +144,14 @@ contract UniswapV4TestBase is ForkTestBase { /*** Helper Functions ***/ /**********************************************************************************************/ - function _setupLiquidity(bytes32 poolId, int24 tickLower, int24 tickUpper, uint128 liquidity) internal returns (IncreasePositionResult memory minted) { - bytes32 depositLimitKey = keccak256(abi.encode(_LIMIT_DEPOSIT, poolId)); + function _setupLiquidity(bytes32 poolId, int24 tickLower, int24 tickUpper, uint128 liquidity) + internal returns (IncreasePositionResult memory minted) + { + bytes32 depositLimitKey = keccak256(abi.encode(_LIMIT_DEPOSIT, poolId)); vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(poolId, tickLower, tickUpper, uint24(uint256(int256(tickUpper) - int256(tickLower)))); - rateLimits.setRateLimitData(depositLimitKey, 2_000_000e18, 0); + rateLimits.setRateLimitData(depositLimitKey, 200_000_000e18, 0); vm.stopPrank(); ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts(poolId, tickLower, tickUpper, liquidity, 0.9999e18); @@ -168,7 +170,9 @@ contract UniswapV4TestBase is ForkTestBase { int24 tickUpper, uint128 liquidity, uint256 maxSlippage - ) internal returns (uint256 amount0Max, uint256 amount1Max) { + ) + internal returns (uint256 amount0Max, uint256 amount1Max) + { ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( poolId, tickLower, @@ -187,7 +191,9 @@ contract UniswapV4TestBase is ForkTestBase { uint128 liquidity, uint256 amount0Max, uint256 amount1Max - ) internal returns (IncreasePositionResult memory result) { + ) + internal returns (IncreasePositionResult memory result) + { PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); deal( @@ -246,7 +252,9 @@ contract UniswapV4TestBase is ForkTestBase { uint128 liquidityIncrease, uint256 amount0Max, uint256 amount1Max - ) internal returns (IncreasePositionResult memory result) { + ) + internal returns (IncreasePositionResult memory result) + { ( PoolKey memory poolKey, PositionInfo positionInfo @@ -309,11 +317,9 @@ contract UniswapV4TestBase is ForkTestBase { _assertZeroAllowances(Currency.unwrap(poolKey.currency1)); } - function _getDecreasePositionMinAmounts( - uint256 tokenId, - uint128 liquidity, - uint256 maxSlippage - ) internal returns (uint256 amount0Min, uint256 amount1Min) { + function _getDecreasePositionMinAmounts(uint256 tokenId, uint128 liquidity, uint256 maxSlippage) + internal returns (uint256 amount0Min, uint256 amount1Min) + { ( PoolKey memory poolKey, PositionInfo positionInfo @@ -335,7 +341,9 @@ contract UniswapV4TestBase is ForkTestBase { uint128 liquidityDecrease, uint256 amount0Min, uint256 amount1Min - ) internal returns (DecreasePositionResult memory result) { + ) + internal returns (DecreasePositionResult memory result) + { ( PoolKey memory poolKey, PositionInfo positionInfo @@ -387,7 +395,9 @@ contract UniswapV4TestBase is ForkTestBase { address tokenIn, uint128 amountIn, uint256 maxSlippage - ) internal returns (uint128 amountOutMin) { + ) + internal returns (uint128 amountOutMin) + { PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); address token0 = Currency.unwrap(poolKey.currency0); @@ -405,12 +415,9 @@ contract UniswapV4TestBase is ForkTestBase { return uint128((amountOut * maxSlippage) / 1e18); } - function _swap( - bytes32 poolId, - address tokenIn, - uint128 amountIn, - uint128 amountOutMin - ) internal returns (uint256 amountOut) { + function _swap(bytes32 poolId, address tokenIn, uint128 amountIn, uint128 amountOutMin) + internal returns (uint256 amountOut) + { Currency currencyIn = Currency.wrap(tokenIn); Currency currencyOut = _getCurrencyOut(poolId, tokenIn); @@ -453,7 +460,9 @@ contract UniswapV4TestBase is ForkTestBase { uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity - ) internal pure returns (uint256 amount0) { + ) + internal pure returns (uint256 amount0) + { require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-0"); return FullMath.mulDiv( @@ -467,7 +476,9 @@ contract UniswapV4TestBase is ForkTestBase { uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity - ) internal pure returns (uint256 amount1) { + ) + internal pure returns (uint256 amount1) + { require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices-1"); return FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, 1 << 96); @@ -478,7 +489,9 @@ contract UniswapV4TestBase is ForkTestBase { uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity - ) internal pure returns (uint256 amount0, uint256 amount1) { + ) + internal pure returns (uint256 amount0, uint256 amount1) + { require(sqrtPriceAX96 < sqrtPriceBX96, "invalid-sqrtPrices"); if (sqrtPriceX96 <= sqrtPriceAX96) { @@ -608,7 +621,9 @@ contract UniswapV4TestBase is ForkTestBase { int24 tickLower, int24 tickUpper, uint128 liquidityAmount - ) internal view returns (uint256 amount0, uint256 amount1) { + ) + internal view returns (uint256 amount0, uint256 amount1) + { ( uint160 sqrtPriceX96, , , ) = IStateViewLike(_STATE_VIEW).getSlot0(PoolId.wrap(poolId)); return _getAmountsForLiquidity( @@ -647,12 +662,9 @@ contract UniswapV4TestBase is ForkTestBase { return 23470490; // September 29, 2025 } - function _externalSwap( - bytes32 poolId, - address account, - address tokenIn, - uint128 amountIn - ) internal returns (uint256 amountOut) { + function _externalSwap(bytes32 poolId, address account, address tokenIn, uint128 amountIn) + internal returns (uint256 amountOut) + { PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); address token0 = Currency.unwrap(poolKey.currency0); @@ -701,17 +713,15 @@ contract UniswapV4TestBase is ForkTestBase { return IERC20Like(tokenOut).balanceOf(account) - startingOutBalance; } - function _getBalanceOf( - Currency currency, - address account - ) internal view returns (uint256 balance) { + function _getBalanceOf(Currency currency, address account) + internal view returns (uint256 balance) + { return IERC20Like(Currency.unwrap(currency)).balanceOf(account); } - function _getCurrencyOut( - bytes32 poolId, - address tokenIn - ) internal view returns (Currency currencyOut) { + function _getCurrencyOut(bytes32 poolId, address tokenIn) + internal view returns (Currency currencyOut) + { PoolKey memory poolKey = IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); return tokenIn == Currency.unwrap(poolKey.currency0) ? poolKey.currency1 : poolKey.currency0; @@ -1647,6 +1657,106 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { assertEq(amountOut, 1_000_646.141415e6); } + /**********************************************************************************************/ + /*** Fuzz Tests ***/ + /**********************************************************************************************/ + + /// forge-config: default.fuzz.runs = 100 + function testFuzz_uniswapV4_mintAndDecreaseFullAmounts( + int24 tickLower, + int24 tickUpper, + uint128 liquidity + ) + external + { + tickLower = int24(_bound(int256(tickLower), -10_000, 10_000 - 1)); + + int256 boundedUpperMax = int256(tickLower) + 1_000 > 10_000 ? int256(10_000) : int256(tickLower) + 1_000; + + tickUpper = int24(_bound(int256(tickUpper), int256(tickLower) + 1, boundedUpperMax)); + liquidity = uint128(_bound(uint256(liquidity), 1e6, 1_000_000_000e6)); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10_000, 10_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 1_000_000_000e18, uint256(1_000_000_000e18) / 1 days); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 1_000_000_000e18, uint256(1_000_000_000e18) / 1 days); + vm.stopPrank(); + + IncreasePositionResult memory mintResult = _mintPosition(_POOL_ID, tickLower, tickUpper, liquidity, type(uint160).max, type(uint160).max); + DecreasePositionResult memory decreaseResult = _decreasePosition(mintResult.tokenId, mintResult.liquidityIncrease, 0, 0); + + uint256 valueDeposited = mintResult.amount0Spent + mintResult.amount1Spent; + uint256 valueReceived = decreaseResult.amount0Received + decreaseResult.amount1Received; + + assertApproxEqAbs(valueReceived, valueDeposited, 2); + } + + /// forge-config: default.fuzz.runs = 100 + function testFuzz_uniswapV4_increaseAndDecreaseFullAmounts( + int24 tickLower, + int24 tickUpper, + uint128 initialLiquidity + ) + external + { + tickLower = int24(_bound(int256(tickLower), -10_000, 10_000 - 1)); + + int256 boundedUpperMax = int256(tickLower) + 1_000 > 10_000 ? int256(10_000) : int256(tickLower) + 1_000; + + tickUpper = int24(_bound(int256(tickUpper), int256(tickLower) + 1, boundedUpperMax)); + initialLiquidity = uint128(_bound(uint256(initialLiquidity), 1e6, 2_000_000e6)); + + uint128 additionalLiquidity = initialLiquidity / 2; + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10_000, 10_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + vm.stopPrank(); + + IncreasePositionResult memory mintResult = _mintPosition(_POOL_ID, tickLower, tickUpper, initialLiquidity, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _increasePosition(mintResult.tokenId, additionalLiquidity, type(uint160).max, type(uint160).max); + + uint256 valueBeforeIncrease = mintResult.amount0Spent + mintResult.amount1Spent; + uint256 valueAdded = increaseResult.amount0Spent + increaseResult.amount1Spent; + uint256 totalValueDeposited = valueBeforeIncrease + valueAdded; + + uint128 totalLiquidity = mintResult.liquidityIncrease + increaseResult.liquidityIncrease; + + DecreasePositionResult memory decreaseResult = _decreasePosition(mintResult.tokenId, totalLiquidity, 0, 0); + + uint256 valueReceived = decreaseResult.amount0Received + decreaseResult.amount1Received; + + assertApproxEqAbs(totalValueDeposited, valueReceived, 10); + } + + /// @param swapDirection true = USDC->USDT, false = USDT->USDC + /// forge-config: default.fuzz.runs = 100 + function testFuzz_uniswapV4_swapUniswapV4_amounts(uint128 amountIn, bool swapDirection) + external + { + amountIn = uint128(_bound(uint256(amountIn), 1e6, 1_000_000e6)); + + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 1_000_000e18, 0); + vm.stopPrank(); + + address tokenIn = swapDirection ? address(usdc) : address(usdt); + + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, tokenIn, amountIn, 0.99e18); + + uint256 rateLimitBefore = rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY); + + uint256 amountOut = _swap(_POOL_ID, tokenIn, amountIn, amountOutMin); + + assertEq(rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY), rateLimitBefore - _to18From6Decimals(amountIn)); + + assertGe(amountOut, amountOutMin); + + assertApproxEqRel(amountIn, amountOut, 0.005e18); + } + /**********************************************************************************************/ /*** Story Tests ***/ /**********************************************************************************************/ @@ -1659,7 +1769,7 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { * - The relayer decreases the liquidity position by 50% (to 3_000e12 liquidity). * - The relayer decreases the remaining liquidity position (to 0 liquidity). */ - function test_uniswapV4_story1_xxx() external { + function test_uniswapV4_story1() external { // Setup the pool and the controller. vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); @@ -3250,6 +3360,120 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { assertEq(amountOut, 2_990.034994e6); } + /**********************************************************************************************/ + /*** Fuzz Tests ***/ + /**********************************************************************************************/ + + /// forge-config: default.fuzz.runs = 100 + function testFuzz_uniswapV4_mintAndDecreaseFullAmounts( + int24 tickLower, + int24 tickUpper, + uint128 liquidity + ) + external + { + tickLower = int24(_bound(int256(tickLower), 100_000, 300_000 - 1)); + + int256 boundedUpperMax = int256(tickLower) + 1_000 > 400_000 ? int256(400_000) : int256(tickLower) + 1_000; + + tickUpper = int24(_bound(int256(tickUpper), int256(tickLower) + 1, boundedUpperMax)); + liquidity = uint128(_bound(uint256(liquidity), 1e6, 1_000_000_000e12)); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 100_000, 400_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 1_000_000_000e18, uint256(1_000_000_000e18) / 1 days); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 1_000_000_000e18, uint256(1_000_000_000e18) / 1 days); + vm.stopPrank(); + + IncreasePositionResult memory mintResult = _mintPosition(_POOL_ID, tickLower, tickUpper, liquidity, type(uint160).max, type(uint160).max); + DecreasePositionResult memory decreaseResult = _decreasePosition(mintResult.tokenId, mintResult.liquidityIncrease, 0, 0); + + uint256 valueDeposited = mintResult.amount0Spent + mintResult.amount1Spent; + uint256 valueReceived = decreaseResult.amount0Received + decreaseResult.amount1Received; + + assertApproxEqAbs(valueReceived, valueDeposited, 2); + } + + /// forge-config: default.fuzz.runs = 100 + function testFuzz_uniswapV4_increaseAndDecreaseFullAmounts( + int24 tickLower, + int24 tickUpper, + uint128 initialLiquidity + ) + external + { + tickLower = int24(_bound(int256(tickLower), 100_000, 300_000 - 1)); + + int256 boundedUpperMax = int256(tickLower) + 1_000 > 400_000 ? int256(400_000) : int256(tickLower) + 1_000; + + tickUpper = int24(_bound(int256(tickUpper), int256(tickLower) + 1, boundedUpperMax)); + initialLiquidity = uint128(_bound(uint256(initialLiquidity), 1e6, 2_000_000e12)); + + uint128 additionalLiquidity = initialLiquidity / 2; + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 100_000, 400_000, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + rateLimits.setRateLimitData(_WITHDRAW_LIMIT_KEY, 2_000_000e18, uint256(2_000_000e18) / 1 days); + vm.stopPrank(); + + IncreasePositionResult memory mintResult = _mintPosition(_POOL_ID, tickLower, tickUpper, initialLiquidity, type(uint160).max, type(uint160).max); + IncreasePositionResult memory increaseResult = _increasePosition(mintResult.tokenId, additionalLiquidity, type(uint160).max, type(uint160).max); + + uint256 valueBeforeIncrease = mintResult.amount0Spent + mintResult.amount1Spent; + uint256 valueAdded = increaseResult.amount0Spent + increaseResult.amount1Spent; + uint256 totalValueDeposited = valueBeforeIncrease + valueAdded; + + uint128 totalLiquidity = mintResult.liquidityIncrease + increaseResult.liquidityIncrease; + + DecreasePositionResult memory decreaseResult = _decreasePosition(mintResult.tokenId, totalLiquidity, 0, 0); + + uint256 valueReceived = decreaseResult.amount0Received + decreaseResult.amount1Received; + + assertApproxEqAbs(totalValueDeposited, valueReceived, 10); + } + + /// @param swapDirection true = USDT->USDS, false = USDS->USDT + /// forge-config: default.fuzz.runs = 100 + function testFuzz_uniswapV4_swapUniswapV4_amounts(uint128 amountIn, bool swapDirection) + external + { + // Needed due to low liquidity currently in the pool. + _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000_000e12); + + if (swapDirection) { + amountIn = uint128(_bound(uint256(amountIn), 1e6, 1_000_000e6)); + } else { + amountIn = uint128(_bound(uint256(amountIn), 1e18, 1_000_000e18)); + } + + vm.startPrank(SPARK_PROXY); + mainnetController.setMaxSlippage(address(uint160(uint256(_POOL_ID))), 0.98e18); + rateLimits.setRateLimitData(_SWAP_LIMIT_KEY, 1_000_000e18, 0); + vm.stopPrank(); + + address tokenIn = swapDirection ? address(usdt) : address(usds); + + uint128 amountOutMin = _getSwapAmountOutMin(_POOL_ID, tokenIn, amountIn, 0.99e18); + + uint256 rateLimitBefore = rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY); + + uint256 amountOut = _swap(_POOL_ID, tokenIn, amountIn, amountOutMin); + + assertEq( + rateLimits.getCurrentRateLimit(_SWAP_LIMIT_KEY), + rateLimitBefore - (swapDirection ? _to18From6Decimals(amountIn) : amountIn) + ); + + assertGe(amountOut, amountOutMin); + + if (swapDirection) { + assertApproxEqRel(_to18From6Decimals(amountIn), amountOut, 0.005e18); + } else { + assertApproxEqRel(amountIn, _to18From6Decimals(amountOut), 0.005e18); + } + } + /**********************************************************************************************/ /*** Story Tests ***/ /**********************************************************************************************/ From c94811272658d7014bf8bcde9cbda2ccbfd67592 Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Tue, 9 Dec 2025 11:47:57 -0500 Subject: [PATCH 09/21] feat: Apply Tick Checks on `increaseLiquidityUniswapV4` (SC-1262) (#197) * feat: Apply Tick Checks on `increaseLiquidityUniswapV4` (SC-1262) * fix: PR Review * fix: PR Review * fix: PR Review * fix: remove extra line --- src/MainnetController.sol | 3 +- src/libraries/UniswapV4Lib.sol | 46 +-- test/mainnet-fork/Uniswapv4.t.sol | 462 ++++++++++++++++++++++++------ 3 files changed, 406 insertions(+), 105 deletions(-) diff --git a/src/MainnetController.sol b/src/MainnetController.sol index 8a29db64..fa2b2fe5 100644 --- a/src/MainnetController.sol +++ b/src/MainnetController.sol @@ -683,7 +683,8 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { tokenId : tokenId, liquidityIncrease : liquidityIncrease, amount0Max : amount0Max, - amount1Max : amount1Max + amount1Max : amount1Max, + tickLimits : uniswapV4TickLimits }); } diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index 543b4b5f..d2373f25 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -4,8 +4,9 @@ pragma solidity ^0.8.21; import { Currency } from "../../lib/uniswap-v4-core/src/types/Currency.sol"; import { PoolKey } from "../../lib/uniswap-v4-core/src/types/PoolKey.sol"; -import { IV4Router } from "../../lib/uniswap-v4-periphery/src/interfaces/IV4Router.sol"; -import { Actions } from "../../lib/uniswap-v4-periphery/src/libraries/Actions.sol"; +import { IV4Router } from "../../lib/uniswap-v4-periphery/src/interfaces/IV4Router.sol"; +import { Actions } from "../../lib/uniswap-v4-periphery/src/libraries/Actions.sol"; +import { PositionInfo } from "../../lib/uniswap-v4-periphery/src/libraries/PositionInfoLibrary.sol"; import { IERC20Like, IPermit2Like } from "../interfaces/Common.sol"; import { IALMProxy } from "../interfaces/IALMProxy.sol"; @@ -52,7 +53,7 @@ library UniswapV4Lib { { _checkTickLimits(tickLimits[poolId], tickLower, tickUpper); - PoolKey memory poolKey = _getPoolKey(poolId); + PoolKey memory poolKey = _getPoolKeyFromPoolId(poolId); bytes memory callData = _getMintCalldata({ poolKey : poolKey, @@ -83,7 +84,8 @@ library UniswapV4Lib { uint256 tokenId, uint128 liquidityIncrease, uint256 amount0Max, - uint256 amount1Max + uint256 amount1Max, + mapping(bytes32 poolId => TickLimits tickLimits) storage tickLimits ) external { @@ -93,9 +95,14 @@ library UniswapV4Lib { "MC/non-proxy-position" ); - _requirePoolIdMatch(poolId, tokenId); + ( PoolKey memory poolKey, PositionInfo info ) = _getPoolKeyAndPositionInfo(tokenId); + + _requirePoolIdMatch(poolId, poolKey); - PoolKey memory poolKey = _getPoolKey(poolId); + // Since funds are being added to the position, the ticks of the position need to be checked + // since it's possible the position was transferred to the proxy, and its tick range may not + // adhere to the constraints that would have been applied if it were minted by the proxy. + _checkTickLimits(tickLimits[poolId], info.tickLower(), info.tickUpper()); bytes memory callData = _getIncreaseLiquidityCallData({ poolKey : poolKey, @@ -128,12 +135,12 @@ library UniswapV4Lib { ) external { + PoolKey memory poolKey = _getPoolKeyFromTokenId(tokenId); + // NOTE: No need to check the token ownership here, as the proxy will be defined as the // recipient of the tokens, so the worst case is that another account's position is // decreased or closed by the proxy. - _requirePoolIdMatch(poolId, tokenId); - - PoolKey memory poolKey = _getPoolKey(poolId); + _requirePoolIdMatch(poolId, poolKey); bytes memory callData = _getDecreaseLiquidityCallData({ proxy : proxy, @@ -175,7 +182,7 @@ library UniswapV4Lib { _getNormalizedBalance(tokenIn, amountIn) ); - PoolKey memory poolKey = _getPoolKey(poolId); + PoolKey memory poolKey = _getPoolKeyFromPoolId(poolId); bytes memory actions = abi.encodePacked( uint8(Actions.SWAP_EXACT_IN_SINGLE), @@ -509,16 +516,23 @@ library UniswapV4Lib { return balance * 1e18 / (10 ** IERC20Like(token).decimals()); } - function _getPoolKey(bytes32 poolId) internal view returns (PoolKey memory poolKey) { + function _getPoolKeyAndPositionInfo(uint256 tokenId) + internal view returns (PoolKey memory poolKey, PositionInfo info) + { + return IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + } + + function _getPoolKeyFromPoolId(bytes32 poolId) internal view returns (PoolKey memory poolKey) { return IPositionManagerLike(_POSITION_MANAGER).poolKeys(bytes25(poolId)); } - function _requirePoolIdMatch(bytes32 poolId, uint256 tokenId) internal view { - ( - PoolKey memory poolKey, - // PositionInfo not needed - ) = IPositionManagerLike(_POSITION_MANAGER).getPoolAndPositionInfo(tokenId); + function _getPoolKeyFromTokenId(uint256 tokenId) + internal view returns (PoolKey memory poolKey) + { + (poolKey, ) = _getPoolKeyAndPositionInfo(tokenId); + } + function _requirePoolIdMatch(bytes32 poolId, PoolKey memory poolKey) internal pure { require(keccak256(abi.encode(poolKey)) == poolId, "MC/tokenId-poolId-mismatch"); } diff --git a/test/mainnet-fork/Uniswapv4.t.sol b/test/mainnet-fork/Uniswapv4.t.sol index def93b32..32913426 100644 --- a/test/mainnet-fork/Uniswapv4.t.sol +++ b/test/mainnet-fork/Uniswapv4.t.sol @@ -1032,13 +1032,16 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6); - deal(address(usdc), address(almProxy), amount0Forecasted + 1); - deal(address(usdt), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdc), address(almProxy), amount0Forecasted); + deal(address(usdt), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) ); mainnetController.mintPositionUniswapV4({ @@ -1046,8 +1049,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted - 1, + amount1Max : amount1Forecasted }); vm.prank(relayer); @@ -1056,8 +1059,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -1069,13 +1072,16 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6); - deal(address(usdc), address(almProxy), amount0Forecasted + 1); - deal(address(usdt), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdc), address(almProxy), amount0Forecasted); + deal(address(usdt), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) ); mainnetController.mintPositionUniswapV4({ @@ -1083,8 +1089,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted - 1 }); vm.prank(relayer); @@ -1093,8 +1099,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -1108,8 +1114,11 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6); - deal(address(usdc), address(almProxy), amount0Forecasted + 1); - deal(address(usdt), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdc), address(almProxy), amount0Forecasted); + deal(address(usdt), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert("RateLimits/rate-limit-exceeded"); @@ -1118,8 +1127,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); vm.prank(SPARK_PROXY); @@ -1131,8 +1140,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -1196,11 +1205,115 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + function test_increaseLiquidityUniswapV4_revertsWhenTickLowerTooLowBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -9, 0, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickLower-too-low"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenTickUpperTooHighBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, -1, 10); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickUpper-too-high"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + + vm.prank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenTickSpacingTooWideBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 9); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); + + vm.prank(relayer); + vm.expectRevert("MC/tickSpacing-too-wide"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + vm.prank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : 1_000_000e6, + amount1Max : 1_000_000e6 + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( _POOL_ID, @@ -1209,21 +1322,24 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { 1_000_000e6 ); - deal(address(usdc), address(almProxy), amount0Forecasted + 1); - deal(address(usdt), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdc), address(almProxy), amount0Forecasted); + deal(address(usdt), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) ); mainnetController.increaseLiquidityUniswapV4({ poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted - 1, + amount1Max : amount1Forecasted }); vm.prank(relayer); @@ -1231,16 +1347,18 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); - vm.prank(SPARK_PROXY); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( _POOL_ID, @@ -1249,21 +1367,24 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { 1_000_000e6 ); - deal(address(usdc), address(almProxy), amount0Forecasted + 1); - deal(address(usdt), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdc), address(almProxy), amount0Forecasted); + deal(address(usdt), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) ); mainnetController.increaseLiquidityUniswapV4({ poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted - 1 }); vm.prank(relayer); @@ -1271,8 +1392,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -1281,8 +1402,10 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { uint256 expectedDecrease = 499.966111e18; - vm.prank(SPARK_PROXY); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); + vm.stopPrank(); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( _POOL_ID, @@ -1291,8 +1414,11 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { 1_000_000e6 ); - deal(address(usdc), address(almProxy), amount0Forecasted + 1); - deal(address(usdt), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdc), address(almProxy), amount0Forecasted); + deal(address(usdt), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert("RateLimits/rate-limit-exceeded"); @@ -1300,8 +1426,8 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); vm.prank(SPARK_PROXY); @@ -1312,16 +1438,18 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } function test_increaseLiquidityUniswapV4() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); - vm.prank(SPARK_PROXY); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, -10, 0, 10); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts( _POOL_ID, @@ -2727,13 +2855,16 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_300, 276_400, 1_000_000e12); - deal(address(usdt), address(almProxy), amount0Forecasted + 1); - deal(address(usds), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) ); mainnetController.mintPositionUniswapV4({ @@ -2741,8 +2872,8 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { tickLower : 276_300, tickUpper : 276_400, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted - 1, + amount1Max : amount1Forecasted }); vm.prank(relayer); @@ -2751,8 +2882,8 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { tickLower : 276_300, tickUpper : 276_400, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -2764,13 +2895,16 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_300, 276_400, 1_000_000e12); - deal(address(usdt), address(almProxy), amount0Forecasted + 1); - deal(address(usds), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) ); mainnetController.mintPositionUniswapV4({ @@ -2778,8 +2912,8 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { tickLower : 276_300, tickUpper : 276_400, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted - 1 }); vm.prank(relayer); @@ -2788,8 +2922,8 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { tickLower : 276_300, tickUpper : 276_400, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -2803,8 +2937,11 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - deal(address(usdt), address(almProxy), amount0Forecasted + 1); - deal(address(usds), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert("RateLimits/rate-limit-exceeded"); @@ -2813,8 +2950,8 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { tickLower : 276_000, tickUpper : 276_600, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); vm.prank(SPARK_PROXY); @@ -2826,8 +2963,8 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { tickLower : 276_000, tickUpper : 276_600, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -2891,11 +3028,13 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + function test_increaseLiquidityUniswapV4_revertsWhenTickLowerTooLowBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - vm.prank(SPARK_PROXY); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_001, 276_600, 1_000); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( _POOL_ID, @@ -2904,38 +3043,130 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { 1_000_000e12 ); - deal(address(usdt), address(almProxy), amount0Forecasted + 1); - deal(address(usds), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); vm.prank(relayer); + vm.expectRevert("MC/tickLower-too-low"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + }); - vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted, amount0Forecasted + 1) + vm.prank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 1_000); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenTickUpperTooHighBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_599, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e12 ); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); + + vm.prank(relayer); + vm.expectRevert("MC/tickUpper-too-high"); mainnetController.increaseLiquidityUniswapV4({ poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount1Max : amount1Forecasted }); + vm.prank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 1_000); + vm.prank(relayer); mainnetController.increaseLiquidityUniswapV4({ poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + function test_increaseLiquidityUniswapV4_revertsWhenTickSpacingTooWideBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 599); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e12 + ); + + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); + + vm.prank(relayer); + vm.expectRevert("MC/tickSpacing-too-wide"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + }); + vm.prank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 600); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 1_000); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( _POOL_ID, @@ -2944,20 +3175,23 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { 1_000_000e12 ); - deal(address(usdt), address(almProxy), amount0Forecasted + 1); - deal(address(usds), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted, amount1Forecasted + 1) + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) ); mainnetController.increaseLiquidityUniswapV4({ poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 + amount0Max : amount0Forecasted - 1, amount1Max : amount1Forecasted }); @@ -2966,8 +3200,53 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted + }); + } + + function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); + + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 1_000); + rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); + + ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( + _POOL_ID, + minted.tickLower, + minted.tickUpper, + 1_000_000e12 + ); + + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); + + vm.prank(relayer); + + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) + ); + + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted - 1 + }); + + vm.prank(relayer); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } @@ -2976,8 +3255,10 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { uint256 expectedDecrease = 29_773.913458368778256533e18; - vm.prank(SPARK_PROXY); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 1_000); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, expectedDecrease - 1, 0); + vm.stopPrank(); ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( _POOL_ID, @@ -2986,8 +3267,11 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { 1_000_000e12 ); - deal(address(usdt), address(almProxy), amount0Forecasted + 1); - deal(address(usds), address(almProxy), amount1Forecasted + 1); + amount0Forecasted += 1; // Quote is off by 1 + amount1Forecasted += 1; // Quote is off by 1 + + deal(address(usdt), address(almProxy), amount0Forecasted); + deal(address(usds), address(almProxy), amount1Forecasted); vm.prank(relayer); vm.expectRevert("RateLimits/rate-limit-exceeded"); @@ -2995,8 +3279,8 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); vm.prank(SPARK_PROXY); @@ -3007,16 +3291,18 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, - amount0Max : amount0Forecasted + 1, // Quote is off by 1 - amount1Max : amount1Forecasted + 1 // Quote is off by 1 + amount0Max : amount0Forecasted, + amount1Max : amount1Forecasted }); } function test_increaseLiquidityUniswapV4() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); - vm.prank(SPARK_PROXY); + vm.startPrank(SPARK_PROXY); + mainnetController.setUniswapV4TickLimits(_POOL_ID, 276_000, 276_600, 1_000); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); + vm.stopPrank(); ( uint256 amount0Max, uint256 amount1Max ) = _getIncreasePositionMaxAmounts( _POOL_ID, From 235186fb360242654f8076a78e3f6548fd380d30 Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Wed, 10 Dec 2025 12:38:20 -0500 Subject: [PATCH 10/21] feat: UniswapV4 swap invalid tokenIn clear error (SC-1259) (#199) * feat: UniswapV4 swap invalid tokenIn clear error (SC-1259) * fix: PR review --- src/libraries/UniswapV4Lib.sol | 10 ++++++++-- test/mainnet-fork/Uniswapv4.t.sol | 31 ++++++++----------------------- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index d2373f25..645a3c3b 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -176,14 +176,20 @@ library UniswapV4Lib { { require(maxSlippage != 0, "MC/max-slippage-not-set"); + PoolKey memory poolKey = _getPoolKeyFromPoolId(poolId); + + require( + tokenIn == Currency.unwrap(poolKey.currency0) || + tokenIn == Currency.unwrap(poolKey.currency1), + "MC/invalid-tokenIn" + ); + // Perform rate limit decrease. IRateLimits(rateLimits).triggerRateLimitDecrease( RateLimitHelpers.makeBytes32Key(LIMIT_SWAP, poolId), _getNormalizedBalance(tokenIn, amountIn) ); - PoolKey memory poolKey = _getPoolKeyFromPoolId(poolId); - bytes memory actions = abi.encodePacked( uint8(Actions.SWAP_EXACT_IN_SINGLE), uint8(Actions.SETTLE_ALL), diff --git a/test/mainnet-fork/Uniswapv4.t.sol b/test/mainnet-fork/Uniswapv4.t.sol index 32913426..f5a3bf64 100644 --- a/test/mainnet-fork/Uniswapv4.t.sol +++ b/test/mainnet-fork/Uniswapv4.t.sol @@ -37,11 +37,8 @@ interface IPermit2Like { function approve(address token, address spender, uint160 amount, uint48 expiration) external; - function allowance( - address user, - address token, - address spender - ) external view returns (uint160 allowance, uint48 expiration, uint48 nonce); + function allowance(address user, address token, address spender) + external view returns (uint160 amount, uint48 expiration, uint48 nonce); } @@ -55,9 +52,8 @@ interface IPositionManagerLike { function transferFrom(address from, address to, uint256 id) external; - function getPoolAndPositionInfo( - uint256 tokenId - ) external view returns (PoolKey memory poolKey, PositionInfo info); + function getPoolAndPositionInfo(uint256 tokenId) + external view returns (PoolKey memory poolKey, PositionInfo info); function getPositionLiquidity(uint256 tokenId) external view returns (uint128 liquidity); @@ -72,9 +68,7 @@ interface IPositionManagerLike { interface IStateViewLike { function getSlot0(PoolId poolId) - external - view - returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee); + external view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee); } @@ -94,8 +88,7 @@ interface IV4QuoterLike { } function quoteExactInputSingle(QuoteExactSingleParams memory params) - external - returns (uint256 amountOut, uint256 gasEstimate); + external returns (uint256 amountOut, uint256 gasEstimate); } @@ -1707,7 +1700,7 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { vm.stopPrank(); vm.prank(relayer); - vm.expectRevert(IPoolManagerLike.CurrencyNotSettled.selector); + vm.expectRevert("MC/invalid-tokenIn"); mainnetController.swapUniswapV4(_POOL_ID, address(dai), 1_000_000e6, 1_000_000e6); } @@ -3560,15 +3553,7 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { vm.stopPrank(); vm.prank(relayer); - - vm.expectRevert( - abi.encodeWithSelector( - IV4RouterLike.V4TooLittleReceived.selector, - 10_000e6, - 0 - ) - ); - + vm.expectRevert("MC/invalid-tokenIn"); mainnetController.swapUniswapV4(_POOL_ID, address(dai), 10_000e6, 10_000e6); } From 9ef81e880e363f73813fd5c4a9ada8ead42d2a3e Mon Sep 17 00:00:00 2001 From: Lucas Manuel Date: Thu, 11 Dec 2025 10:06:20 -0500 Subject: [PATCH 11/21] feat: Remove shadow declaration warning and add zero address check (SC-1277) (#200) * feat: rm warning and add check * fix: explicit casting * fix: update maxAmount test * fix: new lines --- src/ForeignController.sol | 7 ++- src/MainnetController.sol | 6 +- src/libraries/ApproveLib.sol | 6 +- test/mainnet-fork/LayerZero.t.sol | 100 ++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 4 deletions(-) diff --git a/src/ForeignController.sol b/src/ForeignController.sol index ffa834bc..0ce05f5d 100644 --- a/src/ForeignController.sol +++ b/src/ForeignController.sol @@ -301,6 +301,11 @@ contract ForeignController is ReentrancyGuard, AccessControlEnumerable { external payable nonReentrant { _checkRole(RELAYER); + + bytes32 recipient = layerZeroRecipients[destinationEndpointId]; + + require(recipient != bytes32(0), "FC/recipient-not-set"); + _rateLimited( keccak256(abi.encode(LIMIT_LAYERZERO_TRANSFER, oftAddress, destinationEndpointId)), amount @@ -317,7 +322,7 @@ contract ForeignController is ReentrancyGuard, AccessControlEnumerable { SendParam memory sendParams = SendParam({ dstEid : destinationEndpointId, - to : layerZeroRecipients[destinationEndpointId], + to : recipient, amountLD : amount, minAmountLD : 0, extraOptions : options, diff --git a/src/MainnetController.sol b/src/MainnetController.sol index fa2b2fe5..4c4530da 100644 --- a/src/MainnetController.sol +++ b/src/MainnetController.sol @@ -926,6 +926,10 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { amount ); + bytes32 recipient = layerZeroRecipients[destinationEndpointId]; + + require(recipient != bytes32(0), "MC/recipient-not-set"); + // NOTE: Full integration testing of this logic is not possible without OFTs with // approvalRequired == false. Add integration testing for this case before // using in production. @@ -937,7 +941,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { SendParam memory sendParams = SendParam({ dstEid : destinationEndpointId, - to : layerZeroRecipients[destinationEndpointId], + to : recipient, amountLD : amount, minAmountLD : 0, extraOptions : options, diff --git a/src/libraries/ApproveLib.sol b/src/libraries/ApproveLib.sol index 333ac40e..4988ac85 100644 --- a/src/libraries/ApproveLib.sol +++ b/src/libraries/ApproveLib.sol @@ -15,9 +15,11 @@ library ApproveLib { ( bool success, bytes memory data ) = proxy.call(abi.encodeCall(IALMProxy.doCall, (token, approveData))); + bytes memory returnData; + if (success) { // Decode the ABI-encoding of the approve call bytes return data first. - bytes memory returnData = abi.decode(data, (bytes)); + returnData = abi.decode(data, (bytes)); // Approve was successful if 1) no return value or 2) true return value. if (returnData.length == 0 || abi.decode(returnData, (bool))) return; @@ -26,7 +28,7 @@ library ApproveLib { // If call was unsuccessful, set to zero and try again. IALMProxy(proxy).doCall(token, abi.encodeCall(IERC20.approve, (spender, 0))); - bytes memory returnData = IALMProxy(proxy).doCall(token, approveData); + returnData = IALMProxy(proxy).doCall(token, approveData); // Revert if approve returns false. require(returnData.length == 0 || abi.decode(returnData, (bool)), "MC/approve-failed"); diff --git a/test/mainnet-fork/LayerZero.t.sol b/test/mainnet-fork/LayerZero.t.sol index 8f42ae1e..6b5e8748 100644 --- a/test/mainnet-fork/LayerZero.t.sol +++ b/test/mainnet-fork/LayerZero.t.sol @@ -62,6 +62,7 @@ contract MainnetControllerTransferLayerZeroFailureTests is MainnetControllerLaye function test_transferTokenLayerZero_zeroMaxAmount() external { vm.startPrank(SPARK_PROXY); + rateLimits.setRateLimitData( keccak256(abi.encode( mainnetController.LIMIT_LAYERZERO_TRANSFER(), @@ -71,6 +72,12 @@ contract MainnetControllerTransferLayerZeroFailureTests is MainnetControllerLaye 0, 0 ); + + mainnetController.setLayerZeroRecipient( + destinationEndpointId, + bytes32(uint256(uint160(makeAddr("layerZeroRecipient")))) + ); + vm.stopPrank(); vm.prank(relayer); @@ -131,6 +138,49 @@ contract MainnetControllerTransferLayerZeroFailureTests is MainnetControllerLaye ); } + function test_transferTokenLayerZero_recipientNotSet() external { + // Set up rate limit, but forget to set recipient + vm.startPrank(SPARK_PROXY); + + rateLimits.setRateLimitData( + keccak256(abi.encode( + mainnetController.LIMIT_LAYERZERO_TRANSFER(), + USDT_OFT, + destinationEndpointId + )), + 10_000_000e6, + 0 + ); + + vm.stopPrank(); + + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200_000, 0); + + bytes32 target = bytes32(uint256(uint160(makeAddr("layerZeroRecipient")))); + + SendParam memory sendParams = SendParam({ + dstEid : destinationEndpointId, + to : target, + amountLD : 10_000_000e6, + minAmountLD : 10_000_000e6, + extraOptions : options, + composeMsg : "", + oftCmd : "" + }); + + MessagingFee memory fee = ILayerZero(USDT_OFT).quoteSend(sendParams, false); + + deal(relayer, fee.nativeFee); + + vm.prank(relayer); + vm.expectRevert("MC/recipient-not-set"); + mainnetController.transferTokenLayerZero{value: fee.nativeFee}( + USDT_OFT, + 10_000_000e6, + destinationEndpointId + ); + } + } contract MainnetControllerTransferLayerZeroSuccessTests is MainnetControllerLayerZeroTestBase { @@ -376,6 +426,7 @@ contract ForeignControllerTransferLayerZeroFailureTests is ArbitrumChainLayerZer function test_transferTokenLayerZero_zeroMaxAmount() external { vm.startPrank(SPARK_EXECUTOR); + foreignRateLimits.setRateLimitData( keccak256(abi.encode( foreignController.LIMIT_LAYERZERO_TRANSFER(), @@ -385,6 +436,12 @@ contract ForeignControllerTransferLayerZeroFailureTests is ArbitrumChainLayerZer 0, 0 ); + + foreignController.setLayerZeroRecipient( + destinationEndpointId, + bytes32(uint256(uint160(makeAddr("layerZeroRecipient")))) + ); + vm.stopPrank(); vm.prank(relayer); @@ -448,6 +505,49 @@ contract ForeignControllerTransferLayerZeroFailureTests is ArbitrumChainLayerZer ); } + function test_transferTokenLayerZero_recipientNotSet() external { + // Set up rate limit, but forget to set recipient + vm.startPrank(SPARK_EXECUTOR); + + foreignRateLimits.setRateLimitData( + keccak256(abi.encode( + foreignController.LIMIT_LAYERZERO_TRANSFER(), + USDT_OFT, + destinationEndpointId + )), + 10_000_000e6, + 0 + ); + + vm.stopPrank(); + + bytes memory options = OptionsBuilder.newOptions().addExecutorLzReceiveOption(200_000, 0); + + bytes32 target = bytes32(uint256(uint160(makeAddr("layerZeroRecipient")))); + + SendParam memory sendParams = SendParam({ + dstEid : destinationEndpointId, + to : target, + amountLD : 10_000_000e6, + minAmountLD : 10_000_000e6, + extraOptions : options, + composeMsg : "", + oftCmd : "" + }); + + MessagingFee memory fee = ILayerZero(USDT_OFT).quoteSend(sendParams, false); + + deal(relayer, fee.nativeFee); + + vm.prank(relayer); + vm.expectRevert("FC/recipient-not-set"); + foreignController.transferTokenLayerZero{value: fee.nativeFee}( + USDT_OFT, + 10_000_000e6, + destinationEndpointId + ); + } + } contract ForeignControllerTransferLayerZeroSuccessTests is ArbitrumChainLayerZeroTestBase { From 9441a7e218f0eb07327c944625ab1961d16cbc0f Mon Sep 17 00:00:00 2001 From: supercontracts Date: Wed, 17 Dec 2025 21:08:42 +0530 Subject: [PATCH 12/21] feat: Update ForeignController to use modifiers (SC-1281) (#201) * save * add: modifiers --- src/ForeignController.sol | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/ForeignController.sol b/src/ForeignController.sol index 0ce05f5d..b1da7f85 100644 --- a/src/ForeignController.sol +++ b/src/ForeignController.sol @@ -161,10 +161,8 @@ contract ForeignController is ReentrancyGuard, AccessControlEnumerable { } function setMaxExchangeRate(address token, uint256 shares, uint256 maxExpectedAssets) - external nonReentrant + external nonReentrant onlyRole(DEFAULT_ADMIN_ROLE) { - _checkRole(DEFAULT_ADMIN_ROLE); - require(token != address(0), "FC/token-zero-address"); emit MaxExchangeRateSet( @@ -187,13 +185,14 @@ contract ForeignController is ReentrancyGuard, AccessControlEnumerable { /**********************************************************************************************/ function transferAsset(address asset, address destination, uint256 amount) - external nonReentrant onlyRole(RELAYER) - { - _rateLimited( + external + nonReentrant + onlyRole(RELAYER) + rateLimited( RateLimitHelpers.makeAddressAddressKey(LIMIT_ASSET_TRANSFER, asset, destination), amount - ); - + ) + { bytes memory returnData = proxy.doCall( asset, abi.encodeCall(IERC20(asset).transfer, (destination, amount)) @@ -298,19 +297,19 @@ contract ForeignController is ReentrancyGuard, AccessControlEnumerable { uint256 amount, uint32 destinationEndpointId ) - external payable nonReentrant + external + payable + nonReentrant + onlyRole(RELAYER) + rateLimited( + keccak256(abi.encode(LIMIT_LAYERZERO_TRANSFER, oftAddress, destinationEndpointId)), + amount + ) { - _checkRole(RELAYER); - bytes32 recipient = layerZeroRecipients[destinationEndpointId]; require(recipient != bytes32(0), "FC/recipient-not-set"); - _rateLimited( - keccak256(abi.encode(LIMIT_LAYERZERO_TRANSFER, oftAddress, destinationEndpointId)), - amount - ); - // NOTE: Full integration testing of this logic is not possible without OFTs with // approvalRequired == true. Add integration testing for this case before // using in production. @@ -602,10 +601,6 @@ contract ForeignController is ReentrancyGuard, AccessControlEnumerable { emit CCTPTransferInitiated(nonce, destinationDomain, mintRecipient, usdcAmount); } - function _rateLimited(bytes32 key, uint256 amount) internal { - rateLimits.triggerRateLimitDecrease(key, amount); - } - /**********************************************************************************************/ /*** Exchange rate helper functions ***/ /**********************************************************************************************/ From c1e80c4d7c4398863d75e46f3acb3a5845c66513 Mon Sep 17 00:00:00 2001 From: supercontracts Date: Fri, 19 Dec 2025 02:04:43 +0530 Subject: [PATCH 13/21] cleanup: Remove Morpho Allocations (#202) Co-authored-by: Lucas Manuel --- src/ForeignController.sol | 40 ---- test/base-fork/MorphoAllocations.t.sol | 297 ------------------------- 2 files changed, 337 deletions(-) delete mode 100644 test/base-fork/MorphoAllocations.t.sol diff --git a/src/ForeignController.sol b/src/ForeignController.sol index b1da7f85..2893cd3c 100644 --- a/src/ForeignController.sol +++ b/src/ForeignController.sol @@ -482,46 +482,6 @@ contract ForeignController is ReentrancyGuard, AccessControlEnumerable { ); } - /**********************************************************************************************/ - /*** Relayer Morpho functions ***/ - /**********************************************************************************************/ - - function setSupplyQueueMorpho(address morphoVault, Id[] memory newSupplyQueue) - external - nonReentrant - onlyRole(RELAYER) - rateLimitExists(RateLimitHelpers.makeAddressKey(LIMIT_4626_DEPOSIT, morphoVault)) - { - proxy.doCall( - morphoVault, - abi.encodeCall(IMetaMorpho(morphoVault).setSupplyQueue, (newSupplyQueue)) - ); - } - - function updateWithdrawQueueMorpho(address morphoVault, uint256[] calldata indexes) - external - nonReentrant - onlyRole(RELAYER) - rateLimitExists(RateLimitHelpers.makeAddressKey(LIMIT_4626_DEPOSIT, morphoVault)) - { - proxy.doCall( - morphoVault, - abi.encodeCall(IMetaMorpho(morphoVault).updateWithdrawQueue, (indexes)) - ); - } - - function reallocateMorpho(address morphoVault, MarketAllocation[] calldata allocations) - external - nonReentrant - onlyRole(RELAYER) - rateLimitExists(RateLimitHelpers.makeAddressKey(LIMIT_4626_DEPOSIT, morphoVault)) - { - proxy.doCall( - morphoVault, - abi.encodeCall(IMetaMorpho(morphoVault).reallocate, (allocations)) - ); - } - /**********************************************************************************************/ /*** Spark Vault functions ***/ /**********************************************************************************************/ diff --git a/test/base-fork/MorphoAllocations.t.sol b/test/base-fork/MorphoAllocations.t.sol deleted file mode 100644 index 0ff945b5..00000000 --- a/test/base-fork/MorphoAllocations.t.sol +++ /dev/null @@ -1,297 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -pragma solidity >=0.8.0; - -import { IERC4626 } from "forge-std/interfaces/IERC4626.sol"; - -import { IMetaMorpho, Id, MarketAllocation } from "metamorpho/interfaces/IMetaMorpho.sol"; - -import { MarketParamsLib } from "morpho-blue/src/libraries/MarketParamsLib.sol"; -import { IMorpho, MarketParams } from "morpho-blue/src/interfaces/IMorpho.sol"; - -import { ReentrancyGuard } from "../../lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol"; - -import { RateLimitHelpers } from "../../src/RateLimitHelpers.sol"; - -import "./ForkTestBase.t.sol"; - -contract MorphoTestBase is ForkTestBase { - - address constant CBBTC = 0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf; - address constant CBBTC_USDC_ORACLE = 0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9; - address constant MORPHO_DEFAULT_IRM = 0x46415998764C29aB2a25CbeA6254146D50D22687; - - IMetaMorpho morphoVault = IMetaMorpho(Base.MORPHO_VAULT_SUSDC); - IMorpho morpho = IMorpho(Base.MORPHO); - - MarketParams usdcIdle = MarketParams({ - loanToken : Base.USDC, - collateralToken : address(0), - oracle : address(0), - irm : address(0), - lltv : 0 - }); - MarketParams usdcCBBTC = MarketParams({ - loanToken : Base.USDC, - collateralToken : CBBTC, - oracle : CBBTC_USDC_ORACLE, - irm : MORPHO_DEFAULT_IRM, - lltv : 0.86e18 - }); - - function setUp() public override { - super.setUp(); - - // Spell onboarding - vm.startPrank(Base.SPARK_EXECUTOR); - morphoVault.setIsAllocator(address(almProxy), true); - morphoVault.setIsAllocator(address(relayer), false); - rateLimits.setRateLimitData( - RateLimitHelpers.makeAddressKey( - foreignController.LIMIT_4626_DEPOSIT(), - address(morphoVault) - ), - 1_000_000e6, - uint256(1_000_000e6) / 1 days - ); - vm.stopPrank(); - } - - function _getBlock() internal pure override returns (uint256) { - return 25340000; // Jan 21, 2024 - } - - function positionShares(MarketParams memory marketParams) internal view returns (uint256) { - return morpho.position(MarketParamsLib.id(marketParams), address(morphoVault)).supplyShares; - } - - function positionAssets(MarketParams memory marketParams) internal view returns (uint256) { - return positionShares(marketParams) - * marketAssets(marketParams) - / morpho.market(MarketParamsLib.id(marketParams)).totalSupplyShares; - } - - function marketAssets(MarketParams memory marketParams) internal view returns (uint256) { - return morpho.market(MarketParamsLib.id(marketParams)).totalSupplyAssets; - } - -} - -contract MorphoSetSupplyQueueMorphoFailureTests is MorphoTestBase { - - function test_setSupplyQueueMorpho_reentrancy() external { - _setControllerEntered(); - vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); - foreignController.setSupplyQueueMorpho(address(morphoVault), new Id[](0)); - } - - function test_setSupplyQueueMorpho_notRelayer() external { - vm.expectRevert(abi.encodeWithSignature( - "AccessControlUnauthorizedAccount(address,bytes32)", - address(this), - RELAYER - )); - foreignController.setSupplyQueueMorpho(address(morphoVault), new Id[](0)); - } - - function test_setSupplyQueueMorpho_invalidVault() external { - vm.prank(relayer); - vm.expectRevert("FC/invalid-action"); - foreignController.setSupplyQueueMorpho(makeAddr("fake-vault"), new Id[](0)); - } - -} - -contract MorphoSetSupplyQueueMorphoSuccessTests is MorphoTestBase { - - function test_setSupplyQueueMorpho() external { - // Switch order of existing markets - Id[] memory supplyQueueUSDC = new Id[](2); - supplyQueueUSDC[0] = MarketParamsLib.id(usdcIdle); - supplyQueueUSDC[1] = MarketParamsLib.id(usdcCBBTC); - - assertEq(morphoVault.supplyQueueLength(), 2); - - assertEq(Id.unwrap(morphoVault.supplyQueue(0)), Id.unwrap(MarketParamsLib.id(usdcCBBTC))); - assertEq(Id.unwrap(morphoVault.supplyQueue(1)), Id.unwrap(MarketParamsLib.id(usdcIdle))); - - vm.record(); - - vm.prank(relayer); - foreignController.setSupplyQueueMorpho(address(morphoVault), supplyQueueUSDC); - - _assertReentrancyGuardWrittenToTwice(); - - assertEq(morphoVault.supplyQueueLength(), 2); - - assertEq(Id.unwrap(morphoVault.supplyQueue(0)), Id.unwrap(MarketParamsLib.id(usdcIdle))); - assertEq(Id.unwrap(morphoVault.supplyQueue(1)), Id.unwrap(MarketParamsLib.id(usdcCBBTC))); - } - -} - -contract MorphoUpdateWithdrawQueueMorphoFailureTests is MorphoTestBase { - - function test_updateWithdrawQueueMorpho_reentrancy() external { - _setControllerEntered(); - vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); - foreignController.updateWithdrawQueueMorpho(address(morphoVault), new uint256[](0)); - } - - function test_updateWithdrawQueueMorpho_notRelayer() external { - vm.expectRevert(abi.encodeWithSignature( - "AccessControlUnauthorizedAccount(address,bytes32)", - address(this), - RELAYER - )); - foreignController.updateWithdrawQueueMorpho(address(morphoVault), new uint256[](0)); - } - - function test_updateWithdrawQueueMorpho_invalidVault() external { - vm.prank(relayer); - vm.expectRevert("FC/invalid-action"); - foreignController.updateWithdrawQueueMorpho(makeAddr("fake-vault"), new uint256[](0)); - } - -} - -contract MorphoUpdateWithdrawQueueMorphoSuccessTests is MorphoTestBase { - - function test_updateWithdrawQueueMorpho() external { - // Switch order of existing markets - uint256[] memory withdrawQueueUsdc = new uint256[](2); - withdrawQueueUsdc[0] = 1; - withdrawQueueUsdc[1] = 0; - - assertEq(morphoVault.withdrawQueueLength(), 2); - - assertEq(Id.unwrap(morphoVault.withdrawQueue(0)), Id.unwrap(MarketParamsLib.id(usdcIdle))); - assertEq(Id.unwrap(morphoVault.withdrawQueue(1)), Id.unwrap(MarketParamsLib.id(usdcCBBTC))); - - vm.record(); - - vm.prank(relayer); - foreignController.updateWithdrawQueueMorpho(address(morphoVault), withdrawQueueUsdc); - - _assertReentrancyGuardWrittenToTwice(); - - assertEq(morphoVault.withdrawQueueLength(), 2); - - assertEq(Id.unwrap(morphoVault.withdrawQueue(0)), Id.unwrap(MarketParamsLib.id(usdcCBBTC))); - assertEq(Id.unwrap(morphoVault.withdrawQueue(1)), Id.unwrap(MarketParamsLib.id(usdcIdle))); - } - -} - -contract MorphoReallocateMorphoFailureTests is MorphoTestBase { - - function test_reallocateMorpho_reentrancy() external { - _setControllerEntered(); - vm.expectRevert(ReentrancyGuard.ReentrancyGuardReentrantCall.selector); - foreignController.reallocateMorpho(address(morphoVault), new MarketAllocation[](0)); - } - - function test_reallocateMorpho_notRelayer() external { - vm.expectRevert(abi.encodeWithSignature( - "AccessControlUnauthorizedAccount(address,bytes32)", - address(this), - RELAYER - )); - foreignController.reallocateMorpho(address(morphoVault), new MarketAllocation[](0)); - } - - function test_reallocateMorpho_invalidVault() external { - vm.prank(relayer); - vm.expectRevert("FC/invalid-action"); - foreignController.reallocateMorpho(makeAddr("fake-vault"), new MarketAllocation[](0)); - } - -} - -contract MorphoReallocateMorphoSuccessTests is MorphoTestBase { - - function test_reallocateMorpho() external { - vm.startPrank(Base.SPARK_EXECUTOR); - rateLimits.setRateLimitData( - RateLimitHelpers.makeAddressKey( - foreignController.LIMIT_4626_DEPOSIT(), - address(morphoVault) - ), - 25_000_000e6, - uint256(5_000_000e6) / 1 days - ); - foreignController.setMaxExchangeRate(address(morphoVault), morphoVault.convertToShares(1_000_000e6), 1_100_000e6); - vm.stopPrank(); - - // Refresh markets so calculations don't include interest - vm.prank(relayer); - foreignController.depositERC4626(address(morphoVault), 0); - - uint256 positionCBBTC = positionAssets(usdcCBBTC); - uint256 positionIdle = positionAssets(usdcIdle); - - uint256 marketAssetsCBBTC = marketAssets(usdcCBBTC); - uint256 marketAssetsIdle = marketAssets(usdcIdle); - - assertEq(positionCBBTC, 12_128_319.737383e6); - assertEq(positionIdle, 0); - - assertEq(marketAssetsCBBTC, 56_494_357.047568e6); - assertEq(marketAssetsIdle, 5.205521e6); - - deal(Base.USDC, address(almProxy), 1_000_000e6); - vm.prank(relayer); - foreignController.depositERC4626(address(morphoVault), 1_000_000e6); - - assertEq(positionAssets(usdcCBBTC), positionCBBTC + 1_000_000e6); - assertEq(positionAssets(usdcIdle), 0); - - assertEq(marketAssets(usdcCBBTC), marketAssetsCBBTC + 1_000_000e6); - assertEq(marketAssets(usdcIdle), marketAssetsIdle); - - // Move new allocation into idle market - MarketAllocation[] memory reallocations = new MarketAllocation[](2); - reallocations[0] = MarketAllocation({ - marketParams : usdcCBBTC, - assets : positionCBBTC - }); - reallocations[1] = MarketAllocation({ - marketParams : usdcIdle, - assets : 1_000_000e6 - }); - - vm.record(); - - vm.prank(relayer); - foreignController.reallocateMorpho(address(morphoVault), reallocations); - - _assertReentrancyGuardWrittenToTwice(); - - // NOTE: No interest is accrued because deposit coverered all markets and is atomic - assertEq(positionAssets(usdcCBBTC), positionCBBTC); - assertEq(positionAssets(usdcIdle), 1_000_000e6); - - assertEq(marketAssets(usdcCBBTC), marketAssetsCBBTC); - assertEq(marketAssets(usdcIdle), marketAssetsIdle + 1_000_000e6); - - // Move 400k back into CBBTC, note order has changed because of pulling from idle market - reallocations = new MarketAllocation[](2); - reallocations[0] = MarketAllocation({ - marketParams : usdcIdle, - assets : 600_000e6 - }); - reallocations[1] = MarketAllocation({ - marketParams : usdcCBBTC, - assets : positionCBBTC + 400_000e6 - }); - - vm.prank(relayer); - foreignController.reallocateMorpho(address(morphoVault), reallocations); - - assertEq(positionAssets(usdcCBBTC), positionCBBTC + 400_000e6); - assertEq(positionAssets(usdcIdle), 600_000e6); - - assertEq(marketAssets(usdcCBBTC), marketAssetsCBBTC + 400_000e6); - assertEq(marketAssets(usdcIdle), marketAssetsIdle + 600_000e6); - } - -} From 61cbc575e475338081bcf5be93bc59e51d526a8d Mon Sep 17 00:00:00 2001 From: supercontracts Date: Fri, 19 Dec 2025 02:06:29 +0530 Subject: [PATCH 14/21] fix: Inconsistent Uniswap v4 PositionManager action usage in increasePosition (#204) Co-authored-by: Lucas Manuel --- src/libraries/UniswapV4Lib.sol | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index 645a3c3b..4635e550 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -453,11 +453,10 @@ library UniswapV4Lib { { bytes memory actions = abi.encodePacked( uint8(Actions.INCREASE_LIQUIDITY), - uint8(Actions.CLOSE_CURRENCY), - uint8(Actions.CLOSE_CURRENCY) + uint8(Actions.SETTLE_PAIR) ); - bytes[] memory params = new bytes[](3); + bytes[] memory params = new bytes[](2); params[0] = abi.encode( tokenId, // Position to increase @@ -467,8 +466,10 @@ library UniswapV4Lib { "" // No hook data needed ); - params[1] = abi.encode(poolKey.currency0); - params[2] = abi.encode(poolKey.currency1); + params[1] = abi.encode( + poolKey.currency0, // First token to settle + poolKey.currency1 // Second token to settle + ); return _getModifyLiquiditiesCallData(actions, params); } From 7b59cf5e2080c93ffa9e64b7cb9c33a0108d160e Mon Sep 17 00:00:00 2001 From: supercontracts Date: Fri, 19 Dec 2025 23:49:12 +0530 Subject: [PATCH 15/21] fix: Remove unused `amount0Min`/`amount1Min` from `_decreaseLiquidity` C12 (#205) --- src/libraries/UniswapV4Lib.sol | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index 4635e550..8b3627e6 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -157,8 +157,6 @@ library UniswapV4Lib { poolId : poolId, token0 : Currency.unwrap(poolKey.currency0), token1 : Currency.unwrap(poolKey.currency1), - amount0Min : amount0Min, - amount1Min : amount1Min, callData : callData }); } @@ -349,8 +347,6 @@ library UniswapV4Lib { bytes32 poolId, address token0, address token1, - uint256 amount0Min, - uint256 amount1Min, bytes memory callData ) internal From 3fe30725198203c8f8665600d2edbe0acae7d8e5 Mon Sep 17 00:00:00 2001 From: supercontracts Date: Fri, 19 Dec 2025 23:53:15 +0530 Subject: [PATCH 16/21] fix: Minor issues, Typos & Documentation C11 (#206) Co-authored-by: Lucas Manuel --- src/libraries/UniswapV4Lib.sol | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index 8b3627e6..bc40fa25 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -100,8 +100,8 @@ library UniswapV4Lib { _requirePoolIdMatch(poolId, poolKey); // Since funds are being added to the position, the ticks of the position need to be checked - // since it's possible the position was transferred to the proxy, and its tick range may not - // adhere to the constraints that would have been applied if it were minted by the proxy. + // against the current constraints, since it's possible the position was minted under + // outdated tick limits, or was transferred to the proxy. _checkTickLimits(tickLimits[poolId], info.tickLower(), info.tickUpper()); bytes memory callData = _getIncreaseLiquidityCallData({ @@ -183,6 +183,7 @@ library UniswapV4Lib { ); // Perform rate limit decrease. + // NOTE: Rate limit decrease does not account for the net amount of tokenIn actually taken. IRateLimits(rateLimits).triggerRateLimitDecrease( RateLimitHelpers.makeBytes32Key(LIMIT_SWAP, poolId), _getNormalizedBalance(tokenIn, amountIn) @@ -280,7 +281,7 @@ library UniswapV4Lib { ); } - // Finally, approve the Position Manager contract to spend the token via Permit2. + // Finally, approve the spender to spend the token via Permit2. IALMProxy(proxy).doCall( _PERMIT2, abi.encodeCall( @@ -319,7 +320,7 @@ library UniswapV4Lib { // Account for the theoretical possibility of receiving tokens when adding liquidity by // using a clamped subtraction. // NOTE: The limitation of this integration is the assumption that the tokens are valued - // equally (i.e. 1.00000 USDC = 1.000000000000000000 USDS). + // equally (i.e. 1.000000 USDC = 1.000000000000000000 USDS). uint256 rateLimitDecrease = _clampedSub( _getNormalizedBalance(token0, startingBalance0) + _getNormalizedBalance(token1, startingBalance1), @@ -328,15 +329,13 @@ library UniswapV4Lib { ); // Perform rate limit decrease. + // NOTE: Rate limit decrease is net of any token0 or token1 received due to fees. IRateLimits(rateLimits).triggerRateLimitDecrease( RateLimitHelpers.makeBytes32Key(LIMIT_DEPOSIT, poolId), rateLimitDecrease ); - // Reset approval of Permit2 in token0 and token1 - // NOTE: It's not necessary to reset the Position Manager approval in Permit2 (as it - // doesn't have allowance in the token at this point), but prudent so there isn't a - // hanging unused approval. + // Reset approvals for token0 and token1. _approveWithPermit2(proxy, token0, _POSITION_MANAGER, 0); _approveWithPermit2(proxy, token1, _POSITION_MANAGER, 0); } @@ -363,12 +362,13 @@ library UniswapV4Lib { uint256 endingBalance1 = _getBalance(token1, proxy); // NOTE: The limitation of this integration is the assumption that the tokens are valued - // equally (i.e. 1.00000 USDC = 1.000000000000000000 USDS). + // equally (i.e. 1.000000 USDC = 1.000000000000000000 USDS). uint256 rateLimitDecrease = _getNormalizedBalance(token0, endingBalance0 - startingBalance0) + _getNormalizedBalance(token1, endingBalance1 - startingBalance1); // Perform rate limit decrease. + // NOTE: Rate limit decrease includes any token0 or token1 received due to fees. IRateLimits(rateLimits).triggerRateLimitDecrease( RateLimitHelpers.makeBytes32Key(LIMIT_WITHDRAW, poolId), rateLimitDecrease From f8e16e42cbfe356c6e2ae282e9870d42e68360ed Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Fri, 19 Dec 2025 14:42:56 -0500 Subject: [PATCH 17/21] fix: Reuse `_rateLimited` to save space (#209) --- src/MainnetController.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MainnetController.sol b/src/MainnetController.sol index 4c4530da..af97c73e 100644 --- a/src/MainnetController.sol +++ b/src/MainnetController.sol @@ -790,7 +790,7 @@ contract MainnetController is ReentrancyGuard, AccessControlEnumerable { (uint256) ); - rateLimits.triggerRateLimitDecrease(LIMIT_SUSDE_COOLDOWN, cooldownAmount); + _rateLimited(LIMIT_SUSDE_COOLDOWN, cooldownAmount); } function unstakeSUSDe() external nonReentrant { From 3d2d0ddeb78a81219df9538dc86c1c4c018a1367 Mon Sep 17 00:00:00 2001 From: Michael De Luca Date: Fri, 19 Dec 2025 14:50:14 -0500 Subject: [PATCH 18/21] fix: _requirePoolIdMatch in mint and swap C10 (#211) Co-authored-by: supercontracts --- src/libraries/UniswapV4Lib.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index bc40fa25..ada439aa 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -55,6 +55,8 @@ library UniswapV4Lib { PoolKey memory poolKey = _getPoolKeyFromPoolId(poolId); + _requirePoolIdMatch(poolId, poolKey); + bytes memory callData = _getMintCalldata({ poolKey : poolKey, tickLower : tickLower, @@ -176,6 +178,8 @@ library UniswapV4Lib { PoolKey memory poolKey = _getPoolKeyFromPoolId(poolId); + _requirePoolIdMatch(poolId, poolKey); + require( tokenIn == Currency.unwrap(poolKey.currency0) || tokenIn == Currency.unwrap(poolKey.currency1), From d54b80d8b5ec92bdad12aa9002f3364fe92a6ad7 Mon Sep 17 00:00:00 2001 From: supercontracts Date: Sat, 20 Dec 2025 01:32:08 +0530 Subject: [PATCH 19/21] fix: Add an explicit bounds check to prevent silent truncation in `_approveWithPermit2 ` (#207) * fix: check amount for permit2 C13 * fix: Pr Review * fix --------- Co-authored-by: Michael De Luca --- src/libraries/UniswapV4Lib.sol | 2 + test/mainnet-fork/Uniswapv4.t.sol | 210 +++++++++++++++++++----------- 2 files changed, 134 insertions(+), 78 deletions(-) diff --git a/src/libraries/UniswapV4Lib.sol b/src/libraries/UniswapV4Lib.sol index ada439aa..1b91b8b8 100644 --- a/src/libraries/UniswapV4Lib.sol +++ b/src/libraries/UniswapV4Lib.sol @@ -258,6 +258,8 @@ library UniswapV4Lib { ) internal { + require(amount <= type(uint160).max, "MC/amount-too-large-for-permit2"); + // Approve the Permit2 contract to spend none of the token (success is optional). // NOTE: We don't care about the success of this call, since the only outcomes are: // - the allowance is 0 (it was reset or was already 0) diff --git a/test/mainnet-fork/Uniswapv4.t.sol b/test/mainnet-fork/Uniswapv4.t.sol index f5a3bf64..09867a6b 100644 --- a/test/mainnet-fork/Uniswapv4.t.sol +++ b/test/mainnet-fork/Uniswapv4.t.sol @@ -1017,33 +1017,35 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { }); } - function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + function test_mintPositionUniswapV4_revertsWhenMaxAmountsTooLargeForPermit2Boundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, -10, 0, 1_000_000e6); - - amount0Forecasted += 1; // Quote is off by 1 - amount1Forecasted += 1; // Quote is off by 1 - - deal(address(usdc), address(almProxy), amount0Forecasted); - deal(address(usdt), address(almProxy), amount1Forecasted); + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : uint256(type(uint160).max) + 1, + amount1Max : uint256(type(uint160).max) + }); - vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) - ); - + vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); mainnetController.mintPositionUniswapV4({ poolId : _POOL_ID, tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted - 1, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) + 1 }); vm.prank(relayer); @@ -1052,12 +1054,12 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { tickLower : -10, tickUpper : 0, liquidity : 1_000_000e6, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) }); } - function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + function test_mintPositionUniswapV4_revertsWhenMaxAmountsSurpassedBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, -60, 60, 20); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -1073,6 +1075,21 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { vm.prank(relayer); + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : -10, + tickUpper : 0, + liquidity : 1_000_000e6, + amount0Max : amount0Forecasted - 1, + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + vm.expectRevert( abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) ); @@ -1300,7 +1317,7 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + function test_increaseLiquidityUniswapV4_revertsWhenAmountsTooLargeForPermit2Boundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.startPrank(SPARK_PROXY); @@ -1308,31 +1325,27 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( - _POOL_ID, - minted.tickLower, - minted.tickUpper, - 1_000_000e6 - ); - - amount0Forecasted += 1; // Quote is off by 1 - amount1Forecasted += 1; // Quote is off by 1 - - deal(address(usdc), address(almProxy), amount0Forecasted); - deal(address(usdt), address(almProxy), amount1Forecasted); + deal(address(usdc), address(almProxy), 1_000_000e6); + deal(address(usdt), address(almProxy), 1_000_000e6); vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : uint256(type(uint160).max) + 1, + amount1Max : uint256(type(uint160).max) + }); - vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) - ); - + vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); mainnetController.increaseLiquidityUniswapV4({ poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted - 1, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) + 1 }); vm.prank(relayer); @@ -1340,12 +1353,12 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e6, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + function test_increaseLiquidityUniswapV4_revertsWhenMaxAmountsSurpassedBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, -10, 0, 1_000_000e6); vm.startPrank(SPARK_PROXY); @@ -1368,6 +1381,20 @@ contract MainnetController_UniswapV4_USDC_USDT_Tests is UniswapV4TestBase { vm.prank(relayer); + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) + ); + + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e6, + amount0Max : amount0Forecasted - 1, + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + vm.expectRevert( abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) ); @@ -2840,33 +2867,35 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { }); } - function test_mintPositionUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + function test_mintPositionUniswapV4_revertsWhenMaxAmountsTooLargeForPermit2Boundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity(_POOL_ID, 276_300, 276_400, 1_000_000e12); - - amount0Forecasted += 1; // Quote is off by 1 - amount1Forecasted += 1; // Quote is off by 1 - - deal(address(usdt), address(almProxy), amount0Forecasted); - deal(address(usds), address(almProxy), amount1Forecasted); + deal(address(usdt), address(almProxy), 1_000_000e6); + deal(address(usds), address(almProxy), 1_000_000e18); vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_400, + liquidity : 1_000_000e12, + amount0Max : uint256(type(uint160).max) + 1, + amount1Max : uint256(type(uint160).max) + }); - vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) - ); - + vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); mainnetController.mintPositionUniswapV4({ poolId : _POOL_ID, tickLower : 276_300, tickUpper : 276_400, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted - 1, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) + 1 }); vm.prank(relayer); @@ -2875,12 +2904,12 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { tickLower : 276_300, tickUpper : 276_400, liquidity : 1_000_000e12, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) }); } - function test_mintPositionUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + function test_mintPositionUniswapV4_revertsWhenMaxAmountsSurpassedBoundary() external { vm.startPrank(SPARK_PROXY); mainnetController.setUniswapV4TickLimits(_POOL_ID, 270_000, 280_000, 1_000); rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); @@ -2896,6 +2925,21 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { vm.prank(relayer); + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) + ); + + mainnetController.mintPositionUniswapV4({ + poolId : _POOL_ID, + tickLower : 276_300, + tickUpper : 276_400, + liquidity : 1_000_000e12, + amount0Max : amount0Forecasted - 1, + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + vm.expectRevert( abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) ); @@ -3153,7 +3197,7 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount0MaxSurpassedBoundary() external { + function test_increaseLiquidityUniswapV4_revertsWhenMaxAmountsTooLargeForPermit2Boundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); vm.startPrank(SPARK_PROXY); @@ -3161,31 +3205,27 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { rateLimits.setRateLimitData(_DEPOSIT_LIMIT_KEY, 2_000_000e18, 0); vm.stopPrank(); - ( uint256 amount0Forecasted, uint256 amount1Forecasted ) = _quoteLiquidity( - _POOL_ID, - minted.tickLower, - minted.tickUpper, - 1_000_000e12 - ); - - amount0Forecasted += 1; // Quote is off by 1 - amount1Forecasted += 1; // Quote is off by 1 - - deal(address(usdt), address(almProxy), amount0Forecasted); - deal(address(usds), address(almProxy), amount1Forecasted); + deal(address(usdt), address(almProxy), 1_000_000e6); + deal(address(usds), address(almProxy), 1_000_000e18); vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : uint256(type(uint160).max) + 1, + amount1Max : uint256(type(uint160).max) + }); - vm.expectRevert( - abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) - ); - + vm.prank(relayer); + vm.expectRevert("MC/amount-too-large-for-permit2"); mainnetController.increaseLiquidityUniswapV4({ poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, - amount0Max : amount0Forecasted - 1, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) + 1 }); vm.prank(relayer); @@ -3193,12 +3233,12 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { poolId : _POOL_ID, tokenId : minted.tokenId, liquidityIncrease : 1_000_000e12, - amount0Max : amount0Forecasted, - amount1Max : amount1Forecasted + amount0Max : uint256(type(uint160).max), + amount1Max : uint256(type(uint160).max) }); } - function test_increaseLiquidityUniswapV4_revertsWhenAmount1MaxSurpassedBoundary() external { + function test_increaseLiquidityUniswapV4_revertsWhenMaxAmountsMaxSurpassedBoundary() external { IncreasePositionResult memory minted = _setupLiquidity(_POOL_ID, 276_000, 276_600, 1_000_000e12); vm.startPrank(SPARK_PROXY); @@ -3221,6 +3261,20 @@ contract MainnetController_UniswapV4_USDT_USDS_Tests is UniswapV4TestBase { vm.prank(relayer); + vm.expectRevert( + abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount0Forecasted - 1, amount0Forecasted) + ); + + mainnetController.increaseLiquidityUniswapV4({ + poolId : _POOL_ID, + tokenId : minted.tokenId, + liquidityIncrease : 1_000_000e12, + amount0Max : amount0Forecasted - 1, + amount1Max : amount1Forecasted + }); + + vm.prank(relayer); + vm.expectRevert( abi.encodeWithSelector(SlippageCheck.MaximumAmountExceeded.selector, amount1Forecasted - 1, amount1Forecasted) ); From 3dbc7cb01739e91dad61a75cda8d7c84b4474e0b Mon Sep 17 00:00:00 2001 From: Lucas Manuel Date: Mon, 22 Dec 2025 11:36:41 -0500 Subject: [PATCH 20/21] feat: Add additional requirements/assumptions (C-22) (#212) * feat: add additional requirements/assumptions * fix: typo --------- Co-authored-by: Tabish Shaikh --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9c17caba..b60160ef 100644 --- a/README.md +++ b/README.md @@ -140,12 +140,14 @@ Below are all stated trust assumptions for using this contract in production: - Assume that the funds return to the OTC Buffer contract via transfer. This is to accommodate most exchanges/OTC desks that only have the ability to complete the swap by sending token to an address (i.e. not being able to make any arbitrary contracts calls outside of the ERC20 spec). - The maximum loss by the protocol is limited to the single outstanding OTC swap amount for a given exchange. - The recharge rate is configured to be low enough that the system will not practically allow for multiple swaps in a row without receiving material funds from the exchange. +- Ethena's delegated signer role can be set by the RELAYER. The delegated signer role can technically be set by a malicious relayer to be a malicious actor. Ethena's API's [Order Validity Checks](https://docs.ethena.fi/solution-design/minting-usde/order-validity-checks) is trusted to prevent attacks in this scenario. ## Operational Requirements - All ERC-4626 vaults that are onboarded MUST have an initial burned shares amount that prevents rounding-based frontrunning attacks. These shares have to be unrecoverable so that they cannot be removed at a later date. - All ERC-20 tokens are to be non-rebasing with sufficiently high decimal precision. - Rate limits must be configured for specific ERC-4626 vaults and AAVE aTokens (vaults without rate limits set will revert). Unlimited rate limits can be used as an onboarding tool. +- All Uniswap V4 pool onboardings are to be done with 1:1 assets. - Rate limits must take into account: - Risk tolerance for a given protocol - Griefing attacks (e.g., repetitive transactions with high slippage by malicious relayer). From 16525ad503a5f9a80a30f71a5d7de6570d8fed2e Mon Sep 17 00:00:00 2001 From: Lucas Manuel Date: Tue, 6 Jan 2026 14:44:44 -0600 Subject: [PATCH 21/21] feat: Add 1.9.0 audits (#213) --- audits/v190-cantina-audit.pdf | Bin 0 -> 519314 bytes audits/v190-certora-audit.pdf | Bin 0 -> 473013 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/v190-cantina-audit.pdf create mode 100644 audits/v190-certora-audit.pdf diff --git a/audits/v190-cantina-audit.pdf b/audits/v190-cantina-audit.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2fc59c019881aa41acf000ed5fbcd445ca1aa520 GIT binary patch literal 519314 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

pON5F-cfZ#ws!qK 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

Vx|L|#d-48hi5AG5OolANT@_NTR3;5LFtk|` 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π$K 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

&?462u7BtY@y@Fi=-`JRN#f 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%0D29AviRvRw9ruP1+{lRLnWe15vYf$F8_iREQ) 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%0AT=nIv;?kx=nmtYM zj3(8K(iL>(F%yXSRLJDe>1;iqLrNyB+(6byfGv6c-ICgmaF4dZ$Fr~}sE(w2YY@o# zwxBTHV>n1W{FFGat^en+`w5ee`4JXuX{d0338|D5u>}^<-U1Kr%DZKC@!-cnCezC| z?9!$Ms{Q0K{&7GV9gXao@$ktmF88LOc=_HuQfXG31ka@!+J33l{ITTWNMtoEDg=W4 zhY(Y{5IE3@fphrOmV+{}6V|cXjw#oI?B&j{=vF6o`BBp+;)5d7gMh;L@5aOH75-->czr5ZY9 znGG#*Z9`b?(op`R)8URo&?X44I9vbbcw-wR{WG2kPWA{RPda$xeIsNAmhPbt$%TdU zaDlLsgVnYTZyMv$awL{FE^vz8os}xq7dMkgo196Z zrk7r(S*j8@%y;+P-o-$ZB)P(?c&IPgbfzGTJPD`^8Q_e zLFOC~!d+mdM^Jt|49>OjS?rtrxlBkGYcW9fSnlmXc6KR>!tX*`v+?G@oVrE?fkU+K zmu8|_oza+)S)I`m*FU1STMps_s^r337EZo7sf4)g1+tC$QbUfhDyi7PW@$4#qAlOD zeok_z+QqcUB;`ddPV`=%;lM9fw-O#vGdETwN`l@$Cu41bbr;&VRW;m@>b;>H`KE5} zs7{v{GRTPn+ z=wia+ux0OWWB=|sdN}NKPH^!NMA)0U@DYcJ{!e(ewKlCs;fS-FbeGQo-SgHhS3mg2 zUSau)WeBUo!-4GR67d49jOxo9%)rC&MU3eI0edxM{-jBwv7s`)!r zO+n35p1$H*c#|)vO zofyK^iK#NDJaKGZcKz$Mc?XLt^dlwJkEzXTPF;Gi!_oO>@dA&I37#Gt7c=VN1Hp!} z&pdNUh(p6b@(GFaFT9O^vLihU3boB!;sct-Q!jiigA#?_Iqn}syZ z4Ar8bL7N{uxLa^M5);? zIT_aF*1z~*R#i)|>tJBBk+Cb1MX1kDp7oq}w|EQjE@?Kf<0cU47EJRq%gWU=!j|9# zesrvPcwlDCyB|}IJB-~oO4p8KsW`pyUM<6ZxCLLd$yZ>LLpF!yY%^%~0xOAfyC*Mb zCs(#6R=V6q+i<>4Zs$-01H*Ns8$N4VjEf!)9gv!{$sVH}!K!j5ah8{rO+LZ#BAgEf zNjtx-;;e+P_qf;*$a$)^W<2y}(I&ZR-L_OqE^pqN2rW!X)2saho`(5siynm7Q8RchSIQ`fJ6C+5(wWZDyt`Fk{ zviDhtJqH|?YFrV9>XK}MT9BWdnTL*atb#_%jE0S0{;<(QEI_@&@=3`E9^XZVK?{L5 z>FzXI*BRU4Z4t}M32Bg+o$)3UavAGB#^I&C{&T#5fsRgxN;Rm5esL`6jQ@& zBUxA+6|&H)<)9Jlyo-3g#!+0Tr@86xw-!VVL{S}jQWsA@<0Hu7Y(Jay`c z$%uE*BjJHz;C_{4{!E@#o#x@SIl8WX886>mm@Ro0S7tVH^57pE(f|5EsYE#G1xQ*< z!qI1Wa1I-c8CVmG0ehnaY_1U&%i9bvVBT(hOz#elsf=8c5@$t&1TlPM6oeEt@s$N> zp!SsAoi2>4k;B^hu?JFWN-jp-PoJUtnP?Rk!e$oPLAjs}gfT1GoSQcy(BmAmF9g5R zMgM-8%50NP;yp+s8OYp9&eMrsXU!}*1HzQOjwp1AQ!?%U>uphv-Ui)O!?UQP+qaI2 zyPBYzyWhsTyegz$4ru;;nmsy5I;g9%#Qu`DSwf!r#erDPvguz#aFaDahX|j(YLe2E zJD9BgfI2Cybjrp$Z%VDveEp`Gsy}jbFHC+9r_H&&_U?4`)YtBiH->*qBdMT*)(}WO zCFMo^?o&jN{BWz7pclsAk2Q}dIBJf&iXTnAo)ONMW2V=IOy!AXedGE*&?56=orrOV z|3yc6E;G8ll8!h~sk=O26WjH=7KIdq)82dF3Q?1?w0mM_OZ1%AIfz96%kLlPI*%F? z64ckTQSplLGW1*X*g^@ka6qeKvK390_NzS=#+lHHq8rze5SdZjnv|WY2*VU@-JD-Q^2N7O)2~q9#P3Ea>6ebxmCRR_F-tb*;T@O zm0%`4PM%zH9m4$A-x5rg)D4su58Z9RWTV(%xVKTZrG$$rR2TA++|>;9*Oo4)kh5Z?G5Q1ap=^3?(|-Zy2f7Ot6KTU7^oMdI z>ntL4xL?80a?@dh)H}~#OJMz^A{>%GYBf`ltE^FGua^IV=7`E)k(%MS2mtFEddsMRv zLrw9Nqvxz0OF?9+u$z&ZQu$B}H7*3UkWE$>xSkcZc1#p4ywGjU?t2|o!Wi7H81>JN zVa2!R_?2wKCE#;bMafg78ycdDwV)T*;`p04rV;l#PWTMF1=MZxCv=Rz|JlkO_UnE& z*5++wcCEJ-gtp6-0v2XMW6Aw!^(;IMM6Ac^VR!zQHq+(f?AX?dgO~S4)pe{|`gEwf zu1F0GSjB6!W$GfrYI20aVUnzSUJYh$E^b$2>tb9p#Yt{jcoc(S;M|v%pM8?0@6*5! z)AmCNR@nFl88^8+yz(_t^CzUYcB*~NwylJCC6}wPZNN0iKOduR6YeQDoJ8H+n%8b4 zVe3P!QZ(CywAewT91Z_N|+6>52i`?F?iY^m3WA?Qz!~I(Syz%X^GYVwJx`c1+cDC?7I`CPXGi%hP5bMssDo z67p13WB(Aji{;@QO3mE(8$yXoEFmYA&n*9?v8Z@WxP1Ca*Hmmi$VQv5iGUK5(x>DivHY!53=D zuIKPbM%%R+pcX2qFRi5YCnQ^3+w)_Xw;h@7XOg-5UODk-Bu@JvZdZGMNLrRs#S|yb zY!xZ{Xxlq(iRYk6emq^|Jc4vj*uae=k4$EE9XSqn_gG9#3MRMa5V4wZymdL)hY@;u zCU*aZK_BqEuqnE&|Ecku6s1WDn5NO_Quh}tG_wb;!LXCZiy6d&GpQ)3WFyY8K9nbV z*Qqk0cn`P)6=k$Ilb+t=MhV6^$uku*(o2D} ze1#|%PF z+hOvk)MLFNxP4ip-KVGh!Ze@ecH7a2%!Zp$cyT+d8D(5T>>!2pNoLWddAgbssg|V+ znn!z>(TE^!98#Y=T~#eK!|J;Go~)>)`hirQf$%#gC27*~nr(3M;s&QKRIb#ig9tBf zEpZPI9JXSY1=FQv0fX#DGhVOihF2&l8zg$G zjGu7_#XzkK=R%^urDer+SZmh0+$&}Z+DV@&W^k`}C%L>;*WS6t3OEGcq^3-&Q+um@ zg^1hQQ-PlLbNaCIm9=a2csnG>6+6L<%aFMXucULnHX+=s+<1Jw!Y78eF}f!80aa2} zUd@_*_qemA8~`PcfVIIPB;%As4SC1vUK193G7D=WAC7RjpM8_ZbH?(uT+;G+oQ}3q zB);rI%(TonJ>CMSEd_b(l%6x?hEMlnV3~0?ozGj|8?Ro#-x%-f5@+52cZbMJx z2-wPB*}SfseMM|h7^og84q3E~({2in%H^^xrH5~tnEQO;r9+55R$orqyEl?xbt;;j zI7AhtViQBz$ELR>>L4-SR`;$8OZ>^e)|2~~2X$6Mbi# z6JlG5qakU5lNVCS*DuRr?O!EN$2Zg*3@9ck-Bpah+&3s_pP0JAa`FR2YBz=KzAQQU z<42RQ>x-x|uB^wiDUdC_3cRitFGCT!8~@Lh>5h%^q}pg#&z6F)T<`mxZj{q0z)&(Q$-Y{}N_ubD7lAx?=1`TXZov z2IDIN3OOyg;seIAQ=%WLOT0*4cgo-6_bqeM?2;mJW5^;yAguL{`Ks{U`rf(r(+l=Q z%=r_ZHq0ZNiLNu?4z`(0w}9K<@42MN&fU6;HCZOb11-N!KW7}+bmmu%2s;CM7Kc3q zRxggJ&yAIOBp;APV5tU{TH#$Tuz~qms!4{oDvyRC({WXS{M?U+m;lfYyf*Gwx1aJqQ>Ucx|A#56I6`U6MZtKFebZ6qY70H z-EY+#92(uOUeBAZKTp>8SBD2z?{X-Q_6Xfef+tFc(Ehe#Wg%;1G=3PuH$P|0JLdo` z)Jirc!vxY29gxp2?j;M))gn4vO}L<$z`jVezJn`f3m{+S^kPKiV_eR2D&%*o`Z?YW z<~aBi?H)vMe2Vr0hVGnO&a5qf23E%f4j$kU%jU$R`>DUms~`RVznvOB|2G=P`oGaQ zerG2$TL&_7S|xKQE92j@qO*a8v7yuNm7s&MzSHkLDSahlHGEfdCo_CAcROPT2V)a* zT1jJfS6c@oM>2AJS~&+>BWFWn2YfOq=l|GJ)6>wi(a`Sj`+Wy-#Um1{MLdBU&YwL@wagN|52S^i{EBQnY$R{|5k&Eocxy{{^!@R zHL!qUVE*5|3zdFbiBBtQV4>(_jZZ6s&&d8Cu}%j^Cw#{LI2ekUTRHs}NGoFX+bSVr zLtCR?>;J(q@#$IF|EpJFwVI{vCJXXcj&6VKIGE_ZCQty7dzEzuPXmW$BkD-rngzvD zJ&^eIhHtN5|P7Do=-1S~Oh8!aB2+`}yRQWhC)6tyCVNCAZS}vc1dFKECbmY79^();_9B z(ofMiIW!ZSpJBqb6~a0wm7FeZ_TEDAJX}-{o{xZ!hmbtrcxn2tiXqc#5h=;^NB8JM zir!fvHyD8?cxf%4=mKQkQ{=EqEFl{s2L5+J$LNMu+DxYEWzL4u)k5Yh?&tBE&2%K265l+0RJ zh=kVNnX~>SG0#9YGe>AnfYh7gl{!Wv$D3ShLNB){)*TtO3@kPgJtdxR)nxdIxGrH54ycCX57` zQV9p(k{%C~vlupJ2izc+Ui8jf)8BtiKVA;gZW@RP*Q8=dtDCqoEBaiotG}Vl(Pu(j za$uvedDnHCQgKwDD5We#&NPOexZA%#YA0z6!I@80htp(QsZYtOx=v!V%_DFAgHJ(6 z-40^LH1&6UZc;PAgIZi?b`Run^0}2$QDP z`K~lWnWmH4TMGqnLO0JpItho7?N*TpoHM zq(OwEnI;*`$ma?@TvVY+21c7^oo|PEi8>Kw z_^P3xpQriIvn+dO>(hhTc}c{9ge{D`OFwx4Bm4d*FpVYl&!(yI!B5k;yX(#6(!q7e zyiY0@bwvlk4-8RZs(R@|joL3W+hRY2XWK1L*S>L?<-GAY!MXYT=)Ng(Uj5y&iw)B{ zQ@+T7_Ayi2(Ai}orqLckYw%)OpC?HFB)-qUmAo2lDVw4>8$^nmRO+KOv^U`hrkKKfj`b)t7Jx@B^yR_RKD zr)L3-UH3#6s{{XLa0m5LJI&v$%3S}Dkgf~(kHE!X80=IDT!&tva{~8v~)Xw(MyxrpnWqM1FnT_ z!ew8pMP<)M!=x;%oI-V<1aCtFWgRYpS~CzO4;*195WL7D6x9`elrB4dofT-xAkfF0 zC(vX~Uq@>@sReisirOP6YD*@czUOO4WUc3GK`iYC6T}yUk89_cKT{YBY(Xv8Y2vx5 z=Zh)8VlqW9&{9ZHNK=i8B^13O&r`N46a`!0l87LexJ|Q-y1$1xSI9eN+*v}5cb)%N z%U)C_OfDW$C;r})k`G5Dj zY6`|C__X3SM#gUVn!h6zhF?E@ZG2iqbC2JS`}dkw^*5UypYiwj%~r6r{ar+2{g3>% z!hgPHV*8u=&j9B?DWP9WE_yZ=c41ZlK^9gaAqG|9e|7sTY%Kq4KN9}`lIzAv;*?e9M-Dc{OK0x_+4~y-HKyoJsmkXCxDSkijKI&= zhQGFsRaG9fGHa&{`6(Q^ABD|1&eYmrkA zTS~}{G{0y@ews)ofrA1NGEJCMrWyXw-@QqL0vuQFePpJyyzSrNrg02gB}hMo#& z*v!~W6yqA4*zCwm6g?#X*bJkIBE&ckyBg?^60_5d6M=M@g=up~C!}@Bg-Pb$)!#OPE8)h%b>fx6r+j;lT>#8^u=&g83_ivU z1Wem&S-(UxLo*j*>O7RD_SelnKZfJsk~(R&+xuF;UKysVT-Pl34e&>sC8^YF5OPx?Xa5MliI?J!^hDgR-j1G4r}(?N{@%s-@bRK4=< zUV)?xVJ{QYfz$+C{3B_Do$({D10fmy(Qbvk_BXe~oBF@j$etj0hgI9A`J~sTsVS>n zOCp_q-I7v?KDk*aVe9M~jhA2SUkin8-SDVA%B3)%vtP_(Mb`GpX_qS#GPlnV)Z1Dh zsJYc6GEPf1Wp%FP&P$RGR#R83aBXc^!P*j$!M2*esn{9M8*=@PftwvTSM znSN@RUh;Sz0iA5z9 Vz~(-esiB3jnJJg5s;j>n7Xa#jSM~q^ literal 0 HcmV?d00001 diff --git a/audits/v190-certora-audit.pdf b/audits/v190-certora-audit.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33b1615c3c72f5ecdbe2b4c3734459c83b173275 GIT binary patch literal 473013 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

k=@gm# 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%0D-fG!J9>ayf$z@F)fJT*x9z|7d89KT901bB%J z<|MJ8&VYv$7j%`2XYjgU(E@H5vPQWs&4bW?5xVVE7|p-~i*@9V{_J2|0TWeCN6%fR zELKw}flm2|#7Oa`Jf@o25+2%6~wm?28d9j0@9$uV?|Wt|Pct&=3w)H4_Pu<6tB%k2 zC-MyD?ShAupW4r}Lwspav0eKJ=qtnv9?q6gkjMR-C-=&QSqyvm2gy*Hcpvsj#mggU z_`yDyE$(3x`_>wj^5>BD=F0BM=`!!KZ~o_-r-$h$NU-50_>c{_p8C+&?PZ zJaGT!xBj#4OX>2jdaj&rhi}0zzK`ep4>;rI>*s$-9R3d`*8eYY$i~d}pKRxU@Pl}^ zVvXAz?w(M8Ft9ObCk{~&(AINu9AJk1QR()(p&E@z>QTiK0R4O`*UP%*N-8}#%ton& zQ`I(ab_q2`Dh+q0vYCIM%Q+&du4lH7%8clF=xKL)``0`0pB z(x~V4TLNGaF-(LO?Y|=63%m{Di?kQXtZlJBhKX^fDQ-rd2X9)G$`!tLAco-`6*<80 zmz=TA=8y!c+Jmn@x;tei2>{iV$iGPwP5B%&sHnv~T?H5)X}t&*4q*j4X;x;0(Bi|q z>+1u22+LUwBiTjEwr!H)JD+af)B;RYfu=}MC;wE-R5O3g8e{hr+tq0xBglayi$F`V z0u92+sv{=zlLc90_wCvod-tmYpGLvdk}4nqS3$tEZNpbDyf%DS#^iSX7G^G0LsJ@?O$Jpqun`CEKgm#Y(Obx9>lklMOsR&%)|@514IX0X<=MW6Ns%Z9dyQu1tL!1s;CZ?5i~pk)+?C`+ zc)QzfuB7K%HwPCVBw<6li%n?G8ly{y_d@TrR!vQUhCw~VCVl10Uo~bl<&r;W-v


>h{o;+i_se|gs`v}Z)$H17j0E1#8eA+ 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

mJ|U# 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