From 9f099cc56527f758212112549bbd3610880f3a79 Mon Sep 17 00:00:00 2001 From: fourlen Date: Wed, 5 Jun 2024 18:14:10 +0300 Subject: [PATCH 01/17] [Periphery] custom pool support --- .../test/__snapshots__/BitMath.spec.ts.snap | 9 - .../__snapshots__/LiquidityMath.spec.ts.snap | 5 - .../__snapshots__/PriceMovement.spec.ts.snap | 17 -- .../test/__snapshots__/TickMath.spec.ts.snap | 165 ------------------ .../test/__snapshots__/TickTree.spec.ts.snap | 17 -- .../__snapshots__/TokenDeltaMath.spec.ts.snap | 17 -- .../contracts/NonfungiblePositionManager.sol | 6 +- .../NonfungibleTokenPositionDescriptor.sol | 4 +- src/periphery/contracts/SwapRouter.sol | 25 ++- src/periphery/contracts/V3Migrator.sol | 1 + .../contracts/base/LiquidityManagement.sol | 3 +- .../contracts/base/PoolInitializer.sol | 7 +- .../INonfungiblePositionManager.sol | 3 + .../contracts/interfaces/IPoolInitializer.sol | 1 + .../contracts/interfaces/IQuoter.sol | 2 + .../contracts/interfaces/IQuoterV2.sol | 2 + .../contracts/interfaces/ISwapRouter.sol | 1 + .../contracts/interfaces/IV3Migrator.sol | 1 + src/periphery/contracts/lens/Quoter.sol | 24 +-- src/periphery/contracts/lens/QuoterV2.sol | 20 ++- .../libraries/CallbackValidation.sol | 5 +- src/periphery/contracts/libraries/Path.sol | 12 +- .../contracts/libraries/PoolAddress.sol | 44 +++-- .../contracts/libraries/PositionValue.sol | 7 +- src/periphery/contracts/test/PathTest.sol | 2 +- .../contracts/test/PoolAddressTest.sol | 6 +- .../contracts/test/TestCallbackValidation.sol | 4 +- src/periphery/test/CallbackValidation.spec.ts | 4 +- .../test/NonfungiblePositionManager.spec.ts | 69 ++++++-- src/periphery/test/Path.spec.ts | 3 + .../NonfungiblePositionManager.spec.ts.snap | 34 ++-- 31 files changed, 199 insertions(+), 321 deletions(-) delete mode 100644 src/core/test/__snapshots__/BitMath.spec.ts.snap delete mode 100644 src/core/test/__snapshots__/LiquidityMath.spec.ts.snap delete mode 100644 src/core/test/__snapshots__/PriceMovement.spec.ts.snap delete mode 100644 src/core/test/__snapshots__/TickMath.spec.ts.snap delete mode 100644 src/core/test/__snapshots__/TickTree.spec.ts.snap delete mode 100644 src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap diff --git a/src/core/test/__snapshots__/BitMath.spec.ts.snap b/src/core/test/__snapshots__/BitMath.spec.ts.snap deleted file mode 100644 index 45162c300..000000000 --- a/src/core/test/__snapshots__/BitMath.spec.ts.snap +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`BitMath #leastSignificantBit gas cost of max uint128 [ @skip-on-coverage ] 1`] = `216`; - -exports[`BitMath #leastSignificantBit gas cost of max uint256 [ @skip-on-coverage ] 1`] = `216`; - -exports[`BitMath #leastSignificantBit gas cost of min number [ @skip-on-coverage ] 1`] = `216`; - -exports[`BitMath #leastSignificantBit gas cost of smaller number [ @skip-on-coverage ] 1`] = `216`; diff --git a/src/core/test/__snapshots__/LiquidityMath.spec.ts.snap b/src/core/test/__snapshots__/LiquidityMath.spec.ts.snap deleted file mode 100644 index cf985a7f2..000000000 --- a/src/core/test/__snapshots__/LiquidityMath.spec.ts.snap +++ /dev/null @@ -1,5 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`LiquidityMath #addDelta gas add [ @skip-on-coverage ] 1`] = `162`; - -exports[`LiquidityMath #addDelta gas sub [ @skip-on-coverage ] 1`] = `158`; diff --git a/src/core/test/__snapshots__/PriceMovement.spec.ts.snap b/src/core/test/__snapshots__/PriceMovement.spec.ts.snap deleted file mode 100644 index 1310265c7..000000000 --- a/src/core/test/__snapshots__/PriceMovement.spec.ts.snap +++ /dev/null @@ -1,17 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact in capped 1`] = `1665`; - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact in partial 1`] = `2503`; - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact out capped 1`] = `1489`; - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact out partial 1`] = `2503`; - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact in capped 1`] = `1666`; - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact in partial 1`] = `2645`; - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact out capped 1`] = `1490`; - -exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact out partial 1`] = `2645`; diff --git a/src/core/test/__snapshots__/TickMath.spec.ts.snap b/src/core/test/__snapshots__/TickMath.spec.ts.snap deleted file mode 100644 index b46b72b64..000000000 --- a/src/core/test/__snapshots__/TickMath.spec.ts.snap +++ /dev/null @@ -1,165 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`TickMath #getSqrtRatioAtTick tick -50 gas [ @skip-on-coverage ] 1`] = `702`; - -exports[`TickMath #getSqrtRatioAtTick tick -50 result 1`] = `"79030349367926598376800521322"`; - -exports[`TickMath #getSqrtRatioAtTick tick -100 gas [ @skip-on-coverage ] 1`] = `702`; - -exports[`TickMath #getSqrtRatioAtTick tick -100 result 1`] = `"78833030112140176575862854579"`; - -exports[`TickMath #getSqrtRatioAtTick tick -250 gas [ @skip-on-coverage ] 1`] = `744`; - -exports[`TickMath #getSqrtRatioAtTick tick -250 result 1`] = `"78244023372248365697264290337"`; - -exports[`TickMath #getSqrtRatioAtTick tick -500 gas [ @skip-on-coverage ] 1`] = `744`; - -exports[`TickMath #getSqrtRatioAtTick tick -500 result 1`] = `"77272108795590369356373805297"`; - -exports[`TickMath #getSqrtRatioAtTick tick -1000 gas [ @skip-on-coverage ] 1`] = `744`; - -exports[`TickMath #getSqrtRatioAtTick tick -1000 result 1`] = `"75364347830767020784054125655"`; - -exports[`TickMath #getSqrtRatioAtTick tick -2500 gas [ @skip-on-coverage ] 1`] = `730`; - -exports[`TickMath #getSqrtRatioAtTick tick -2500 result 1`] = `"69919044979842180277688105136"`; - -exports[`TickMath #getSqrtRatioAtTick tick -3000 gas [ @skip-on-coverage ] 1`] = `758`; - -exports[`TickMath #getSqrtRatioAtTick tick -3000 result 1`] = `"68192822843687888778582228483"`; - -exports[`TickMath #getSqrtRatioAtTick tick -4000 gas [ @skip-on-coverage ] 1`] = `744`; - -exports[`TickMath #getSqrtRatioAtTick tick -4000 result 1`] = `"64867181785621769311890333195"`; - -exports[`TickMath #getSqrtRatioAtTick tick -5000 gas [ @skip-on-coverage ] 1`] = `730`; - -exports[`TickMath #getSqrtRatioAtTick tick -5000 result 1`] = `"61703726247759831737814779831"`; - -exports[`TickMath #getSqrtRatioAtTick tick -50000 gas [ @skip-on-coverage ] 1`] = `744`; - -exports[`TickMath #getSqrtRatioAtTick tick -50000 result 1`] = `"6504256538020985011912221507"`; - -exports[`TickMath #getSqrtRatioAtTick tick -150000 gas [ @skip-on-coverage ] 1`] = `772`; - -exports[`TickMath #getSqrtRatioAtTick tick -150000 result 1`] = `"43836292794701720435367485"`; - -exports[`TickMath #getSqrtRatioAtTick tick -250000 gas [ @skip-on-coverage ] 1`] = `758`; - -exports[`TickMath #getSqrtRatioAtTick tick -250000 result 1`] = `"295440463448801648376846"`; - -exports[`TickMath #getSqrtRatioAtTick tick -500000 gas [ @skip-on-coverage ] 1`] = `809`; - -exports[`TickMath #getSqrtRatioAtTick tick -500000 result 1`] = `"1101692437043807371"`; - -exports[`TickMath #getSqrtRatioAtTick tick -738203 gas [ @skip-on-coverage ] 1`] = `856`; - -exports[`TickMath #getSqrtRatioAtTick tick -738203 result 1`] = `"7409801140451"`; - -exports[`TickMath #getSqrtRatioAtTick tick 50 gas [ @skip-on-coverage ] 1`] = `713`; - -exports[`TickMath #getSqrtRatioAtTick tick 50 result 1`] = `"79426470787362580746886972461"`; - -exports[`TickMath #getSqrtRatioAtTick tick 100 gas [ @skip-on-coverage ] 1`] = `713`; - -exports[`TickMath #getSqrtRatioAtTick tick 100 result 1`] = `"79625275426524748796330556128"`; - -exports[`TickMath #getSqrtRatioAtTick tick 250 gas [ @skip-on-coverage ] 1`] = `755`; - -exports[`TickMath #getSqrtRatioAtTick tick 250 result 1`] = `"80224679980005306637834519095"`; - -exports[`TickMath #getSqrtRatioAtTick tick 500 gas [ @skip-on-coverage ] 1`] = `755`; - -exports[`TickMath #getSqrtRatioAtTick tick 500 result 1`] = `"81233731461783161732293370115"`; - -exports[`TickMath #getSqrtRatioAtTick tick 1000 gas [ @skip-on-coverage ] 1`] = `755`; - -exports[`TickMath #getSqrtRatioAtTick tick 1000 result 1`] = `"83290069058676223003182343270"`; - -exports[`TickMath #getSqrtRatioAtTick tick 2500 gas [ @skip-on-coverage ] 1`] = `741`; - -exports[`TickMath #getSqrtRatioAtTick tick 2500 result 1`] = `"89776708723587163891445672585"`; - -exports[`TickMath #getSqrtRatioAtTick tick 3000 gas [ @skip-on-coverage ] 1`] = `769`; - -exports[`TickMath #getSqrtRatioAtTick tick 3000 result 1`] = `"92049301871182272007977902845"`; - -exports[`TickMath #getSqrtRatioAtTick tick 4000 gas [ @skip-on-coverage ] 1`] = `755`; - -exports[`TickMath #getSqrtRatioAtTick tick 4000 result 1`] = `"96768528593268422080558758223"`; - -exports[`TickMath #getSqrtRatioAtTick tick 5000 gas [ @skip-on-coverage ] 1`] = `741`; - -exports[`TickMath #getSqrtRatioAtTick tick 5000 result 1`] = `"101729702841318637793976746270"`; - -exports[`TickMath #getSqrtRatioAtTick tick 50000 gas [ @skip-on-coverage ] 1`] = `755`; - -exports[`TickMath #getSqrtRatioAtTick tick 50000 result 1`] = `"965075977353221155028623082916"`; - -exports[`TickMath #getSqrtRatioAtTick tick 150000 gas [ @skip-on-coverage ] 1`] = `783`; - -exports[`TickMath #getSqrtRatioAtTick tick 150000 result 1`] = `"143194173941309278083010301478497"`; - -exports[`TickMath #getSqrtRatioAtTick tick 250000 gas [ @skip-on-coverage ] 1`] = `769`; - -exports[`TickMath #getSqrtRatioAtTick tick 250000 result 1`] = `"21246587762933397357449903968194344"`; - -exports[`TickMath #getSqrtRatioAtTick tick 500000 gas [ @skip-on-coverage ] 1`] = `820`; - -exports[`TickMath #getSqrtRatioAtTick tick 500000 result 1`] = `"5697689776495288729098254600827762987878"`; - -exports[`TickMath #getSqrtRatioAtTick tick 738203 gas [ @skip-on-coverage ] 1`] = `867`; - -exports[`TickMath #getSqrtRatioAtTick tick 738203 result 1`] = `"847134979253254120489401328389043031315994541"`; - -exports[`TickMath #getTickAtSqrtRatio ratio 4295128739 gas [ @skip-on-coverage ] 1`] = `2289`; - -exports[`TickMath #getTickAtSqrtRatio ratio 4295128739 result 1`] = `-887272`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543 gas [ @skip-on-coverage ] 1`] = `2274`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543 result 1`] = `-276325`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950 gas [ @skip-on-coverage ] 1`] = `2223`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950 result 1`] = `-138163`; - -exports[`TickMath #getTickAtSqrtRatio ratio 9903520314283042199192993792 gas [ @skip-on-coverage ] 1`] = `1378`; - -exports[`TickMath #getTickAtSqrtRatio ratio 9903520314283042199192993792 result 1`] = `-41591`; - -exports[`TickMath #getTickAtSqrtRatio ratio 28011385487393069959365969113 gas [ @skip-on-coverage ] 1`] = `2196`; - -exports[`TickMath #getTickAtSqrtRatio ratio 28011385487393069959365969113 result 1`] = `-20796`; - -exports[`TickMath #getTickAtSqrtRatio ratio 56022770974786139918731938227 gas [ @skip-on-coverage ] 1`] = `2182`; - -exports[`TickMath #getTickAtSqrtRatio ratio 56022770974786139918731938227 result 1`] = `-6932`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336 gas [ @skip-on-coverage ] 1`] = `2108`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336 result 1`] = `0`; - -exports[`TickMath #getTickAtSqrtRatio ratio 112045541949572279837463876454 gas [ @skip-on-coverage ] 1`] = `2208`; - -exports[`TickMath #getTickAtSqrtRatio ratio 112045541949572279837463876454 result 1`] = `6931`; - -exports[`TickMath #getTickAtSqrtRatio ratio 224091083899144559674927752909 gas [ @skip-on-coverage ] 1`] = `2222`; - -exports[`TickMath #getTickAtSqrtRatio ratio 224091083899144559674927752909 result 1`] = `20795`; - -exports[`TickMath #getTickAtSqrtRatio ratio 633825300114114700748351602688 gas [ @skip-on-coverage ] 1`] = `2235`; - -exports[`TickMath #getTickAtSqrtRatio ratio 633825300114114700748351602688 result 1`] = `41590`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000 gas [ @skip-on-coverage ] 1`] = `2245`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000 result 1`] = `138162`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000000 gas [ @skip-on-coverage ] 1`] = `2296`; - -exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000000 result 1`] = `276324`; - -exports[`TickMath #getTickAtSqrtRatio ratio 1461446703485210103287273052203988822378723970341 gas [ @skip-on-coverage ] 1`] = `2309`; - -exports[`TickMath #getTickAtSqrtRatio ratio 1461446703485210103287273052203988822378723970341 result 1`] = `887271`; diff --git a/src/core/test/__snapshots__/TickTree.spec.ts.snap b/src/core/test/__snapshots__/TickTree.spec.ts.snap deleted file mode 100644 index 8c06e29c8..000000000 --- a/src/core/test/__snapshots__/TickTree.spec.ts.snap +++ /dev/null @@ -1,17 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost for all possible range 1`] = `7785`; - -exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost for entire word 1`] = `9889`; - -exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost for next subtree 1`] = `7785`; - -exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost just below boundary 1`] = `12619`; - -exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost on boundary 1`] = `12619`; - -exports[`TickTree #toggleTick gas cost of flipping a tick that results in deleting a word [ @skip-on-coverage ] 1`] = `29765`; - -exports[`TickTree #toggleTick gas cost of flipping first tick in word to initialized [ @skip-on-coverage ] 1`] = `88518`; - -exports[`TickTree #toggleTick gas cost of flipping second tick in word to initialized [ @skip-on-coverage ] 1`] = `29199`; diff --git a/src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap b/src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap deleted file mode 100644 index 6f388238b..000000000 --- a/src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap +++ /dev/null @@ -1,17 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`TokenDeltaMath #getNewPriceAfterInput zeroToOne = false gas [ @skip-on-coverage ] 1`] = `561`; - -exports[`TokenDeltaMath #getNewPriceAfterInput zeroToOne = true gas [ @skip-on-coverage ] 1`] = `654`; - -exports[`TokenDeltaMath #getNewPriceAfterOutput zeroToOne = false gas [ @skip-on-coverage ] 1`] = `728`; - -exports[`TokenDeltaMath #getNewPriceAfterOutput zeroToOne = true gas [ @skip-on-coverage ] 1`] = `474`; - -exports[`TokenDeltaMath #getToken0Delta gas cost for amount0 where roundUp = false [ @skip-on-coverage ] 1`] = `419`; - -exports[`TokenDeltaMath #getToken0Delta gas cost for amount0 where roundUp = true [ @skip-on-coverage ] 1`] = `449`; - -exports[`TokenDeltaMath #getToken1Delta gas cost for amount0 where roundUp = false [ @skip-on-coverage ] 1`] = `419`; - -exports[`TokenDeltaMath #getToken1Delta gas cost for amount0 where roundUp = true [ @skip-on-coverage ] 1`] = `449`; diff --git a/src/periphery/contracts/NonfungiblePositionManager.sol b/src/periphery/contracts/NonfungiblePositionManager.sol index 56656373d..089f3005b 100644 --- a/src/periphery/contracts/NonfungiblePositionManager.sol +++ b/src/periphery/contracts/NonfungiblePositionManager.sol @@ -108,6 +108,7 @@ contract NonfungiblePositionManager is address operator, address token0, address token1, + address deployer, int24 tickLower, int24 tickUpper, uint128 liquidity, @@ -130,6 +131,7 @@ contract NonfungiblePositionManager is position.operator, poolKey.token0, poolKey.token1, + poolKey.deployer, tickLower, tickUpper, liquidity, @@ -156,6 +158,7 @@ contract NonfungiblePositionManager is AddLiquidityParams({ token0: params.token0, token1: params.token1, + deployer: params.deployer, recipient: address(this), tickLower: params.tickLower, tickUpper: params.tickUpper, @@ -178,7 +181,7 @@ contract NonfungiblePositionManager is // idempotent set uint80 poolId = _cachePoolKey( address(pool), - PoolAddress.PoolKey({token0: params.token0, token1: params.token1}) + PoolAddress.PoolKey({token0: params.token0, token1: params.token1, deployer: params.deployer}) ); _positions[tokenId] = Position({ @@ -268,6 +271,7 @@ contract NonfungiblePositionManager is AddLiquidityParams({ token0: poolKey.token0, token1: poolKey.token1, + deployer: poolKey.deployer, tickLower: tickLower, tickUpper: tickUpper, amount0Desired: params.amount0Desired, diff --git a/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol b/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol index 4dc6c887b..0e87e92ea 100644 --- a/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol +++ b/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol @@ -66,14 +66,14 @@ contract NonfungibleTokenPositionDescriptor is INonfungibleTokenPositionDescript INonfungiblePositionManager positionManager, uint256 tokenId ) external view override returns (string memory) { - (, , address token0, address token1, int24 tickLower, int24 tickUpper, , , , , ) = positionManager.positions( + (, , address token0, address token1, address deployer, int24 tickLower, int24 tickUpper, , , , , ) = positionManager.positions( tokenId ); IAlgebraPool pool = IAlgebraPool( PoolAddress.computeAddress( positionManager.poolDeployer(), - PoolAddress.PoolKey({token0: token0, token1: token1}) + PoolAddress.PoolKey({token0: token0, token1: token1, deployer: deployer}) ) ); diff --git a/src/periphery/contracts/SwapRouter.sol b/src/periphery/contracts/SwapRouter.sol index 623945317..4e286ca75 100644 --- a/src/periphery/contracts/SwapRouter.sol +++ b/src/periphery/contracts/SwapRouter.sol @@ -15,6 +15,8 @@ import './libraries/Path.sol'; import './libraries/PoolAddress.sol'; import './libraries/CallbackValidation.sol'; +import 'hardhat/console.sol'; + /// @title Algebra Integral 1.1 Swap Router /// @notice Router for stateless execution of swaps against Algebra /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: @@ -44,8 +46,8 @@ contract SwapRouter is ) PeripheryImmutableState(_factory, _WNativeToken, _poolDeployer) {} /// @dev Returns the pool for the given token pair. The pool contract may or may not exist. - function getPool(address tokenA, address tokenB) private view returns (IAlgebraPool) { - return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB))); + function getPool(address tokenA, address tokenB, address deployer) private view returns (IAlgebraPool) { + return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer))); } struct SwapCallbackData { @@ -57,8 +59,8 @@ contract SwapRouter is function algebraSwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata _data) external override { require(amount0Delta > 0 || amount1Delta > 0, 'Zero liquidity swap'); // swaps entirely within 0-liquidity regions are not supported SwapCallbackData memory data = abi.decode(_data, (SwapCallbackData)); - (address tokenIn, address tokenOut) = data.path.decodeFirstPool(); - CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut); + (address tokenIn, address deployer, address tokenOut) = data.path.decodeFirstPool(); + CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut, deployer); (bool isExactInput, uint256 amountToPay) = amount0Delta > 0 ? (tokenIn < tokenOut, uint256(amount0Delta)) @@ -87,11 +89,13 @@ contract SwapRouter is ) private returns (uint256 amountOut) { if (recipient == address(0)) recipient = address(this); // allow swapping to the router address with address 0 - (address tokenIn, address tokenOut) = data.path.decodeFirstPool(); + (address tokenIn, address deployer, address tokenOut) = data.path.decodeFirstPool(); bool zeroToOne = tokenIn < tokenOut; - (int256 amount0, int256 amount1) = getPool(tokenIn, tokenOut).swap( + console.log('deployer: ', deployer); + + (int256 amount0, int256 amount1) = getPool(tokenIn, tokenOut, deployer).swap( recipient, zeroToOne, amountIn.toInt256(), @@ -123,6 +127,9 @@ contract SwapRouter is ) external payable override checkDeadline(params.deadline) returns (uint256 amountOut) { address payer = msg.sender; // msg.sender pays for the first hop + // console.log('path'); + // console.logBytes(params.path); + while (true) { bool hasMultiplePools = params.path.hasMultiplePools(); @@ -162,7 +169,7 @@ contract SwapRouter is bool zeroToOne = params.tokenIn < params.tokenOut; - (int256 amount0, int256 amount1) = getPool(params.tokenIn, params.tokenOut).swapWithPaymentInAdvance( + (int256 amount0, int256 amount1) = getPool(params.tokenIn, params.tokenOut, params.deployer).swapWithPaymentInAdvance( msg.sender, recipient, zeroToOne, @@ -187,11 +194,11 @@ contract SwapRouter is ) private returns (uint256 amountIn) { if (recipient == address(0)) recipient = address(this); // allow swapping to the router address with address 0 - (address tokenOut, address tokenIn) = data.path.decodeFirstPool(); + (address tokenOut, address deployer, address tokenIn) = data.path.decodeFirstPool(); bool zeroToOne = tokenIn < tokenOut; - (int256 amount0Delta, int256 amount1Delta) = getPool(tokenIn, tokenOut).swap( + (int256 amount0Delta, int256 amount1Delta) = getPool(tokenIn, tokenOut, deployer).swap( recipient, zeroToOne, -amountOut.toInt256(), diff --git a/src/periphery/contracts/V3Migrator.sol b/src/periphery/contracts/V3Migrator.sol index 248acef4f..8089e46d2 100644 --- a/src/periphery/contracts/V3Migrator.sol +++ b/src/periphery/contracts/V3Migrator.sol @@ -57,6 +57,7 @@ contract V3Migrator is IV3Migrator, PeripheryImmutableState, PoolInitializer, Mu INonfungiblePositionManager.MintParams({ token0: params.token0, token1: params.token1, + deployer: params.deployer, tickLower: params.tickLower, tickUpper: params.tickUpper, amount0Desired: amount0V2ToMigrate, diff --git a/src/periphery/contracts/base/LiquidityManagement.sol b/src/periphery/contracts/base/LiquidityManagement.sol index 683255dde..67309a3b0 100644 --- a/src/periphery/contracts/base/LiquidityManagement.sol +++ b/src/periphery/contracts/base/LiquidityManagement.sol @@ -37,6 +37,7 @@ abstract contract LiquidityManagement is IAlgebraMintCallback, PeripheryImmutabl struct AddLiquidityParams { address token0; address token1; + address deployer; address recipient; int24 tickLower; int24 tickUpper; @@ -53,7 +54,7 @@ abstract contract LiquidityManagement is IAlgebraMintCallback, PeripheryImmutabl internal returns (uint128 liquidity, uint128 actualLiquidity, uint256 amount0, uint256 amount1, IAlgebraPool pool) { - PoolAddress.PoolKey memory poolKey = PoolAddress.PoolKey({token0: params.token0, token1: params.token1}); + PoolAddress.PoolKey memory poolKey = PoolAddress.PoolKey({token0: params.token0, token1: params.token1, deployer: params.deployer}); pool = IAlgebraPool(PoolAddress.computeAddress(poolDeployer, poolKey)); diff --git a/src/periphery/contracts/base/PoolInitializer.sol b/src/periphery/contracts/base/PoolInitializer.sol index 19eb0b161..55390acd8 100644 --- a/src/periphery/contracts/base/PoolInitializer.sol +++ b/src/periphery/contracts/base/PoolInitializer.sol @@ -18,6 +18,7 @@ abstract contract PoolInitializer is IPoolInitializer, PeripheryImmutableState { function createAndInitializePoolIfNecessary( address token0, address token1, + address deployer, uint160 sqrtPriceX96 ) external payable override returns (address pool) { require(token0 < token1, 'Invalid order of tokens'); @@ -25,7 +26,11 @@ abstract contract PoolInitializer is IPoolInitializer, PeripheryImmutableState { pool = IAlgebraFactory(factory).poolByPair(token0, token1); if (pool == address(0)) { - pool = IAlgebraFactory(factory).createPool(token0, token1); + if (deployer == address(0)) { + pool = IAlgebraFactory(factory).createPool(token0, token1); + } else { + pool = IAlgebraFactory(factory).createCustomPool(deployer, msg.sender, token0, token1, ''); + } _initializePool(pool, sqrtPriceX96); } else { diff --git a/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol b/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol index 7f962b696..ef13c7778 100644 --- a/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol +++ b/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol @@ -71,6 +71,7 @@ interface INonfungiblePositionManager is /// @return operator The address that is approved for spending /// @return token0 The address of the token0 for a specific pool /// @return token1 The address of the token1 for a specific pool + /// @return deployer The address of the custom pool deployer /// @return tickLower The lower end of the tick range for the position /// @return tickUpper The higher end of the tick range for the position /// @return liquidity The liquidity of the position @@ -88,6 +89,7 @@ interface INonfungiblePositionManager is address operator, address token0, address token1, + address deployer, int24 tickLower, int24 tickUpper, uint128 liquidity, @@ -100,6 +102,7 @@ interface INonfungiblePositionManager is struct MintParams { address token0; address token1; + address deployer; int24 tickLower; int24 tickUpper; uint256 amount0Desired; diff --git a/src/periphery/contracts/interfaces/IPoolInitializer.sol b/src/periphery/contracts/interfaces/IPoolInitializer.sol index eb438c457..a8f8aac5b 100644 --- a/src/periphery/contracts/interfaces/IPoolInitializer.sol +++ b/src/periphery/contracts/interfaces/IPoolInitializer.sol @@ -17,6 +17,7 @@ interface IPoolInitializer { function createAndInitializePoolIfNecessary( address token0, address token1, + address deployer, uint160 sqrtPriceX96 ) external payable returns (address pool); } diff --git a/src/periphery/contracts/interfaces/IQuoter.sol b/src/periphery/contracts/interfaces/IQuoter.sol index 3002e54e3..0cdb99e2c 100644 --- a/src/periphery/contracts/interfaces/IQuoter.sol +++ b/src/periphery/contracts/interfaces/IQuoter.sol @@ -26,6 +26,7 @@ interface IQuoter { function quoteExactInputSingle( address tokenIn, address tokenOut, + address deployer, uint256 amountIn, uint160 limitSqrtPrice ) external returns (uint256 amountOut, uint16 fee); @@ -47,6 +48,7 @@ interface IQuoter { function quoteExactOutputSingle( address tokenIn, address tokenOut, + address deployer, uint256 amountOut, uint160 limitSqrtPrice ) external returns (uint256 amountIn, uint16 fee); diff --git a/src/periphery/contracts/interfaces/IQuoterV2.sol b/src/periphery/contracts/interfaces/IQuoterV2.sol index fc0d48c8a..4782649ab 100644 --- a/src/periphery/contracts/interfaces/IQuoterV2.sol +++ b/src/periphery/contracts/interfaces/IQuoterV2.sol @@ -36,6 +36,7 @@ interface IQuoterV2 { struct QuoteExactInputSingleParams { address tokenIn; address tokenOut; + address deployer; uint256 amountIn; uint160 limitSqrtPrice; } @@ -91,6 +92,7 @@ interface IQuoterV2 { struct QuoteExactOutputSingleParams { address tokenIn; address tokenOut; + address deployer; uint256 amount; uint160 limitSqrtPrice; } diff --git a/src/periphery/contracts/interfaces/ISwapRouter.sol b/src/periphery/contracts/interfaces/ISwapRouter.sol index 17307cb24..4662d00f4 100644 --- a/src/periphery/contracts/interfaces/ISwapRouter.sol +++ b/src/periphery/contracts/interfaces/ISwapRouter.sol @@ -12,6 +12,7 @@ interface ISwapRouter is IAlgebraSwapCallback { struct ExactInputSingleParams { address tokenIn; address tokenOut; + address deployer; address recipient; uint256 deadline; uint256 amountIn; diff --git a/src/periphery/contracts/interfaces/IV3Migrator.sol b/src/periphery/contracts/interfaces/IV3Migrator.sol index d7be09881..665de349c 100644 --- a/src/periphery/contracts/interfaces/IV3Migrator.sol +++ b/src/periphery/contracts/interfaces/IV3Migrator.sol @@ -17,6 +17,7 @@ interface IV3Migrator is IMulticall, ISelfPermit, IPoolInitializer { uint8 percentageToMigrate; // represented as a numerator over 100 address token0; address token1; + address deployer; int24 tickLower; int24 tickUpper; uint256 amount0Min; // must be discounted by percentageToMigrate diff --git a/src/periphery/contracts/lens/Quoter.sol b/src/periphery/contracts/lens/Quoter.sol index 44fe4efeb..b1ff46eab 100644 --- a/src/periphery/contracts/lens/Quoter.sol +++ b/src/periphery/contracts/lens/Quoter.sol @@ -33,21 +33,21 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { address _poolDeployer ) PeripheryImmutableState(_factory, _WNativeToken, _poolDeployer) {} - function getPool(address tokenA, address tokenB) private view returns (IAlgebraPool) { - return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB))); + function getPool(address tokenA, address tokenB, address deployer) private view returns (IAlgebraPool) { + return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer))); } /// @inheritdoc IAlgebraSwapCallback function algebraSwapCallback(int256 amount0Delta, int256 amount1Delta, bytes memory path) external view override { require(amount0Delta > 0 || amount1Delta > 0, 'Zero liquidity swap'); // swaps entirely within 0-liquidity regions are not supported - (address tokenIn, address tokenOut) = path.decodeFirstPool(); - CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut); + (address tokenIn, address deployer, address tokenOut) = path.decodeFirstPool(); + CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut, deployer); (bool isExactInput, uint256 amountToPay, uint256 amountReceived) = amount0Delta > 0 ? (tokenIn < tokenOut, uint256(amount0Delta), uint256(-amount1Delta)) : (tokenOut < tokenIn, uint256(amount1Delta), uint256(-amount0Delta)); - IAlgebraPool pool = getPool(tokenIn, tokenOut); + IAlgebraPool pool = getPool(tokenIn, tokenOut, deployer); (, , uint16 fee, , , ) = pool.globalState(); if (isExactInput) { @@ -84,13 +84,14 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { function quoteExactInputSingle( address tokenIn, address tokenOut, + address deployer, uint256 amountIn, uint160 limitSqrtPrice ) public override returns (uint256 amountOut, uint16 fee) { bool zeroToOne = tokenIn < tokenOut; try - getPool(tokenIn, tokenOut).swap( + getPool(tokenIn, tokenOut, deployer).swap( address(this), // address(0) might cause issues with some tokens zeroToOne, amountIn.toInt256(), @@ -114,10 +115,10 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { while (true) { bool hasMultiplePools = path.hasMultiplePools(); - (address tokenIn, address tokenOut) = path.decodeFirstPool(); + (address tokenIn, address deployer, address tokenOut) = path.decodeFirstPool(); // the outputs of prior swaps become the inputs to subsequent ones - (amountIn, fees[i]) = quoteExactInputSingle(tokenIn, tokenOut, amountIn, 0); + (amountIn, fees[i]) = quoteExactInputSingle(tokenIn, tokenOut, deployer, amountIn, 0); // decide whether to continue or terminate if (hasMultiplePools) { @@ -133,6 +134,7 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { function quoteExactOutputSingle( address tokenIn, address tokenOut, + address deployer, uint256 amountOut, uint160 limitSqrtPrice ) public override returns (uint256 amountIn, uint16 fee) { @@ -141,7 +143,7 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { // if no price limit has been specified, cache the output amount for comparison in the swap callback if (limitSqrtPrice == 0) amountOutCached = amountOut; try - getPool(tokenIn, tokenOut).swap( + getPool(tokenIn, tokenOut, deployer).swap( address(this), // address(0) might cause issues with some tokens zeroToOne, -amountOut.toInt256(), @@ -166,10 +168,10 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { while (true) { bool hasMultiplePools = path.hasMultiplePools(); - (address tokenOut, address tokenIn) = path.decodeFirstPool(); + (address tokenOut, address deployer, address tokenIn) = path.decodeFirstPool(); // the inputs of prior swaps become the outputs of subsequent ones - (amountOut, fees[i]) = quoteExactOutputSingle(tokenIn, tokenOut, amountOut, 0); + (amountOut, fees[i]) = quoteExactOutputSingle(tokenIn, tokenOut, deployer, amountOut, 0); // decide whether to continue or terminate if (hasMultiplePools) { diff --git a/src/periphery/contracts/lens/QuoterV2.sol b/src/periphery/contracts/lens/QuoterV2.sol index bf0a29f5b..0aff9fc2a 100644 --- a/src/periphery/contracts/lens/QuoterV2.sol +++ b/src/periphery/contracts/lens/QuoterV2.sol @@ -33,21 +33,21 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { address _poolDeployer ) PeripheryImmutableState(_factory, _WNativeToken, _poolDeployer) {} - function getPool(address tokenA, address tokenB) private view returns (IAlgebraPool) { - return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB))); + function getPool(address tokenA, address tokenB, address deployer) private view returns (IAlgebraPool) { + return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer))); } /// @inheritdoc IAlgebraSwapCallback function algebraSwapCallback(int256 amount0Delta, int256 amount1Delta, bytes memory path) external view override { require(amount0Delta > 0 || amount1Delta > 0, 'Zero liquidity swap'); // swaps entirely within 0-liquidity regions are not supported - (address tokenIn, address tokenOut) = path.decodeFirstPool(); - CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut); + (address tokenIn, address deployer, address tokenOut) = path.decodeFirstPool(); + CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut, deployer); (bool isExactInput, uint256 amountToPay, uint256 amountReceived) = amount0Delta > 0 ? (tokenIn < tokenOut, uint256(amount0Delta), uint256(-amount1Delta)) : (tokenOut < tokenIn, uint256(amount1Delta), uint256(-amount0Delta)); - IAlgebraPool pool = getPool(tokenIn, tokenOut); + IAlgebraPool pool = getPool(tokenIn, tokenOut, deployer); (uint160 sqrtPriceX96After, int24 tickAfter, uint16 fee, , , ) = pool.globalState(); if (isExactInput) { @@ -133,7 +133,7 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { ) { bool zeroToOne = params.tokenIn < params.tokenOut; - IAlgebraPool pool = getPool(params.tokenIn, params.tokenOut); + IAlgebraPool pool = getPool(params.tokenIn, params.tokenOut, params.deployer); uint256 gasBefore = gasleft(); bytes memory data = abi.encodePacked(params.tokenIn, params.tokenOut); @@ -176,9 +176,10 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { while (true) { QuoteExactInputSingleParams memory params; { - (address tokenIn, address tokenOut) = path.decodeFirstPool(); + (address tokenIn, address deployer, address tokenOut) = path.decodeFirstPool(); params.tokenIn = tokenIn; + params.deployer = deployer; params.tokenOut = tokenOut; params.amountIn = amountInRequired; } @@ -233,7 +234,7 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { ) { bool zeroToOne = params.tokenIn < params.tokenOut; - IAlgebraPool pool = getPool(params.tokenIn, params.tokenOut); + IAlgebraPool pool = getPool(params.tokenIn, params.tokenOut, params.deployer); // if no price limit has been specified, cache the output amount for comparison in the swap callback if (params.limitSqrtPrice == 0) amountOutCached = params.amount; @@ -279,9 +280,10 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { while (true) { QuoteExactOutputSingleParams memory params; { - (address tokenOut, address tokenIn) = path.decodeFirstPool(); + (address tokenOut, address deployer, address tokenIn) = path.decodeFirstPool(); params.tokenIn = tokenIn; + params.deployer = deployer; params.tokenOut = tokenOut; params.amount = amountOutRequired; } diff --git a/src/periphery/contracts/libraries/CallbackValidation.sol b/src/periphery/contracts/libraries/CallbackValidation.sol index 8d239dc63..c2a535dd8 100644 --- a/src/periphery/contracts/libraries/CallbackValidation.sol +++ b/src/periphery/contracts/libraries/CallbackValidation.sol @@ -16,9 +16,10 @@ library CallbackValidation { function verifyCallback( address poolDeployer, address tokenA, - address tokenB + address tokenB, + address deployer ) internal view returns (IAlgebraPool pool) { - return verifyCallback(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB)); + return verifyCallback(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer)); } /// @notice Returns the address of a valid Algebra Pool diff --git a/src/periphery/contracts/libraries/Path.sol b/src/periphery/contracts/libraries/Path.sol index 3855441c8..f697931d6 100644 --- a/src/periphery/contracts/libraries/Path.sol +++ b/src/periphery/contracts/libraries/Path.sol @@ -3,6 +3,8 @@ pragma solidity >=0.6.0; import './BytesLib.sol'; +import 'hardhat/console.sol'; + /// @title Functions for manipulating path data for multihop swaps /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: /// https://github.com/Uniswap/v3-periphery @@ -12,8 +14,10 @@ library Path { /// @dev The length of the bytes encoded address uint256 private constant ADDR_SIZE = 20; - /// @dev The offset of a single token address - uint256 private constant NEXT_OFFSET = ADDR_SIZE; + /// @dev The offset of a custom pool deployer address + uint256 private constant DEPLOYER_OFFSET = ADDR_SIZE; + /// @dev The offset of a single token address + deployer address + uint256 private constant NEXT_OFFSET = ADDR_SIZE + DEPLOYER_OFFSET; /// @dev The offset of an encoded pool key uint256 private constant POP_OFFSET = NEXT_OFFSET + ADDR_SIZE; /// @dev The minimum length of an encoding that contains 2 or more pools @@ -37,9 +41,11 @@ library Path { /// @notice Decodes the first pool in path /// @param path The bytes encoded swap path /// @return tokenA The first token of the given pool + /// @return deployer The address of the custom pool deployer /// @return tokenB The second token of the given pool - function decodeFirstPool(bytes memory path) internal pure returns (address tokenA, address tokenB) { + function decodeFirstPool(bytes memory path) internal pure returns (address tokenA, address deployer, address tokenB) { tokenA = path.toAddress(0); + deployer = path.toAddress(DEPLOYER_OFFSET); tokenB = path.toAddress(NEXT_OFFSET); } diff --git a/src/periphery/contracts/libraries/PoolAddress.sol b/src/periphery/contracts/libraries/PoolAddress.sol index 9eec95ec1..3d95b54bf 100644 --- a/src/periphery/contracts/libraries/PoolAddress.sol +++ b/src/periphery/contracts/libraries/PoolAddress.sol @@ -11,15 +11,16 @@ library PoolAddress { struct PoolKey { address token0; address token1; + address deployer; } /// @notice Returns PoolKey: the ordered tokens /// @param tokenA The first token of a pool, unsorted /// @param tokenB The second token of a pool, unsorted /// @return Poolkey The pool details with ordered token0 and token1 assignments - function getPoolKey(address tokenA, address tokenB) internal pure returns (PoolKey memory) { + function getPoolKey(address tokenA, address tokenB, address deployer) internal pure returns (PoolKey memory) { if (tokenA > tokenB) (tokenA, tokenB) = (tokenB, tokenA); - return PoolKey({token0: tokenA, token1: tokenB}); + return PoolKey({token0: tokenA, token1: tokenB, deployer: deployer}); } /// @notice Deterministically computes the pool address given the poolDeployer and PoolKey @@ -28,19 +29,36 @@ library PoolAddress { /// @return pool The contract address of the Algebra pool function computeAddress(address poolDeployer, PoolKey memory key) internal pure returns (address pool) { require(key.token0 < key.token1, 'Invalid order of tokens'); - pool = address( - uint160( - uint256( - keccak256( - abi.encodePacked( - hex'ff', - poolDeployer, - keccak256(abi.encode(key.token0, key.token1)), - POOL_INIT_CODE_HASH + if (key.deployer == address(0)) { + pool = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + hex'ff', + poolDeployer, + keccak256(abi.encode(key.token0, key.token1)), + POOL_INIT_CODE_HASH + ) ) ) ) - ) - ); + ); + } else { + pool = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + hex'ff', + poolDeployer, + keccak256(abi.encode(key.token0, key.token1, key.deployer)), + POOL_INIT_CODE_HASH + ) + ) + ) + ) + ); + } } } diff --git a/src/periphery/contracts/libraries/PositionValue.sol b/src/periphery/contracts/libraries/PositionValue.sol index 3866b779c..c96db32da 100644 --- a/src/periphery/contracts/libraries/PositionValue.sol +++ b/src/periphery/contracts/libraries/PositionValue.sol @@ -15,6 +15,7 @@ library PositionValue { struct PositionCache { address token0; address token1; + address deployer; int24 tickLower; int24 tickUpper; uint128 liquidity; @@ -59,7 +60,7 @@ library PositionValue { uint256 tokenId, uint160 sqrtRatioX96 ) internal view returns (uint256 amount0, uint256 amount1) { - (, , , , int24 tickLower, int24 tickUpper, uint128 liquidity, , , , ) = positionManager.positions(tokenId); + (, , , , , int24 tickLower, int24 tickUpper, uint128 liquidity, , , , ) = positionManager.positions(tokenId); return _principal(sqrtRatioX96, tickLower, tickUpper, liquidity); } @@ -100,7 +101,7 @@ library PositionValue { IAlgebraPool( PoolAddress.computeAddress( positionManager.poolDeployer(), - PoolAddress.PoolKey({token0: position.token0, token1: position.token1}) + PoolAddress.PoolKey({token0: position.token0, token1: position.token1, deployer: position.deployer}) ) ), position.tickLower, @@ -134,6 +135,7 @@ library PositionValue { , address token0, address token1, + address deployer, int24 tickLower, int24 tickUpper, uint128 liquidity, @@ -147,6 +149,7 @@ library PositionValue { PositionCache( token0, token1, + deployer, tickLower, tickUpper, liquidity, diff --git a/src/periphery/contracts/test/PathTest.sol b/src/periphery/contracts/test/PathTest.sol index c6243b9bb..435418148 100644 --- a/src/periphery/contracts/test/PathTest.sol +++ b/src/periphery/contracts/test/PathTest.sol @@ -8,7 +8,7 @@ contract PathTest { return Path.hasMultiplePools(path); } - function decodeFirstPool(bytes memory path) public pure returns (address tokenA, address tokenB) { + function decodeFirstPool(bytes memory path) public pure returns (address tokenA, address deployer, address tokenB) { return Path.decodeFirstPool(path); } diff --git a/src/periphery/contracts/test/PoolAddressTest.sol b/src/periphery/contracts/test/PoolAddressTest.sol index 0da477616..c4bb81617 100644 --- a/src/periphery/contracts/test/PoolAddressTest.sol +++ b/src/periphery/contracts/test/PoolAddressTest.sol @@ -12,21 +12,23 @@ contract PoolAddressTest { address factory, address token0, address token1, + address deployer, uint24 fee ) external pure returns (address) { fee; - return PoolAddress.computeAddress(factory, PoolAddress.PoolKey({token0: token0, token1: token1})); + return PoolAddress.computeAddress(factory, PoolAddress.PoolKey({token0: token0, token1: token1, deployer: deployer})); } function getGasCostOfComputeAddress( address factory, address token0, address token1, + address deployer, uint24 fee ) external view returns (uint256) { fee; uint256 gasBefore = gasleft(); - PoolAddress.computeAddress(factory, PoolAddress.PoolKey({token0: token0, token1: token1})); + PoolAddress.computeAddress(factory, PoolAddress.PoolKey({token0: token0, token1: token1, deployer: deployer})); return gasBefore - gasleft(); } } diff --git a/src/periphery/contracts/test/TestCallbackValidation.sol b/src/periphery/contracts/test/TestCallbackValidation.sol index 28632daee..03a4b5469 100644 --- a/src/periphery/contracts/test/TestCallbackValidation.sol +++ b/src/periphery/contracts/test/TestCallbackValidation.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.20; import '../libraries/CallbackValidation.sol'; contract TestCallbackValidation { - function verifyCallback(address factory, address tokenA, address tokenB) external view returns (IAlgebraPool pool) { - return CallbackValidation.verifyCallback(factory, tokenA, tokenB); + function verifyCallback(address factory, address tokenA, address tokenB, address deployer) external view returns (IAlgebraPool pool) { + return CallbackValidation.verifyCallback(factory, tokenA, tokenB, deployer); } } diff --git a/src/periphery/test/CallbackValidation.spec.ts b/src/periphery/test/CallbackValidation.spec.ts index 739d2cc40..fba45a7f9 100644 --- a/src/periphery/test/CallbackValidation.spec.ts +++ b/src/periphery/test/CallbackValidation.spec.ts @@ -5,6 +5,8 @@ import completeFixture from './shared/completeFixture'; import { expect } from './shared/expect'; import { TestERC20, TestCallbackValidation } from '../typechain'; +export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + describe('CallbackValidation', () => { let nonpairAddr: Wallet; @@ -46,7 +48,7 @@ describe('CallbackValidation', () => { await expect( callbackValidation .connect(nonpairAddr) - .verifyCallback(await factory.poolDeployer(), await tokens[0].getAddress(), await tokens[1].getAddress()) + .verifyCallback(await factory.poolDeployer(), await tokens[0].getAddress(), await tokens[1].getAddress(), ZERO_ADDRESS) ).to.be.revertedWith('Invalid caller of callback'); }); }); diff --git a/src/periphery/test/NonfungiblePositionManager.spec.ts b/src/periphery/test/NonfungiblePositionManager.spec.ts index 5bae18bfa..4df62e04b 100644 --- a/src/periphery/test/NonfungiblePositionManager.spec.ts +++ b/src/periphery/test/NonfungiblePositionManager.spec.ts @@ -25,6 +25,7 @@ import { sortedTokens } from './shared/tokenSort'; import { extractJSONFromURI } from './shared/extractJSONFromURI'; import { abi as IAlgebraPoolABI } from '@cryptoalgebra/integral-core/artifacts/contracts/interfaces/IAlgebraPool.sol/IAlgebraPool.json'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; describe('NonfungiblePositionManager', () => { let wallets: Wallet[]; @@ -85,13 +86,13 @@ describe('NonfungiblePositionManager', () => { ]); const code = await wallet.provider.getCode(expectedAddress); expect(code).to.eq('0x'); - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1)); const codeAfter = await wallet.provider.getCode(expectedAddress); expect(codeAfter).to.not.eq('0x'); }); it('is payable', async () => { - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1), { value: 1 }); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1), { value: 1 }); }); it('works if pool is created but not initialized', async () => { @@ -104,7 +105,7 @@ describe('NonfungiblePositionManager', () => { await factory.createPool(tokens[0], tokens[1]); const code = await wallet.provider.getCode(expectedAddress); expect(code).to.not.eq('0x'); - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(2, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(2, 1)); }); it('works if pool is created and initialized', async () => { @@ -120,7 +121,7 @@ describe('NonfungiblePositionManager', () => { if (!wallet.provider) throw new Error('No provider'); const code = await wallet.provider.getCode(expectedAddress); expect(code).to.not.eq('0x'); - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(4, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(4, 1)); }); it('could theoretically use eth via multicall', async () => { @@ -128,14 +129,14 @@ describe('NonfungiblePositionManager', () => { const createAndInitializePoolIfNecessaryData = nft.interface.encodeFunctionData( 'createAndInitializePoolIfNecessary', - [await token0.getAddress(), await token1.getAddress(), encodePriceSqrt(1, 1)] + [await token0.getAddress(), await token1.getAddress(), ZERO_ADDRESS, encodePriceSqrt(1, 1)] ); await nft.multicall([createAndInitializePoolIfNecessaryData], { value: expandTo18Decimals(1) }); }); it('gas [ @skip-on-coverage ]', async () => { - await snapshotGasCost(nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1))); + await snapshotGasCost(nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1))); }); }); @@ -145,6 +146,7 @@ describe('NonfungiblePositionManager', () => { nft.mint({ token0: tokens[0], token1: tokens[1], + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), amount0Desired: 100, @@ -158,12 +160,13 @@ describe('NonfungiblePositionManager', () => { }); it('fails if cannot transfer', async () => { - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1)); await tokens[0].approve(nft, 0); await expect( nft.mint({ token0: tokens[0], token1: tokens[1], + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), amount0Desired: 100, @@ -177,12 +180,13 @@ describe('NonfungiblePositionManager', () => { }); it('fails if deadline passed', async () => { - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1)); await nft.setTime(2); await expect( nft.mint({ token0: tokens[0], token1: tokens[1], + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), amount0Desired: 100, @@ -199,11 +203,13 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -246,6 +252,7 @@ describe('NonfungiblePositionManager', () => { const createAndInitializeData = nft.interface.encodeFunctionData('createAndInitializePoolIfNecessary', [ await token0.getAddress(), await token1.getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1), ]); @@ -253,6 +260,7 @@ describe('NonfungiblePositionManager', () => { { token0: await token0.getAddress(), token1: await token1.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.address, @@ -284,6 +292,7 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); @@ -291,6 +300,7 @@ describe('NonfungiblePositionManager', () => { nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, @@ -305,7 +315,7 @@ describe('NonfungiblePositionManager', () => { it('gas first mint for pool using eth with zero refund [ @skip-on-coverage ]', async () => { const [token0, token1] = await sortedTokens(wnative, tokens[0]); - await nft.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); await snapshotGasCost( nft.multicall( @@ -314,6 +324,7 @@ describe('NonfungiblePositionManager', () => { { token0: await token0.getAddress(), token1: await token1.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, @@ -333,7 +344,7 @@ describe('NonfungiblePositionManager', () => { it('gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ]', async () => { const [token0, token1] = await sortedTokens(wnative, tokens[0]); - await nft.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); await snapshotGasCost( nft.multicall( @@ -342,6 +353,7 @@ describe('NonfungiblePositionManager', () => { { token0: await token0.getAddress(), token1: await token1.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, @@ -360,11 +372,12 @@ describe('NonfungiblePositionManager', () => { }); it('gas mint on same ticks [ @skip-on-coverage ]', async () => { - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1)); await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -379,6 +392,7 @@ describe('NonfungiblePositionManager', () => { nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, @@ -395,12 +409,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -415,6 +431,7 @@ describe('NonfungiblePositionManager', () => { nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]) + TICK_SPACINGS[FeeAmount.MEDIUM], tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]) - TICK_SPACINGS[FeeAmount.MEDIUM], recipient: wallet.address, @@ -434,12 +451,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -504,12 +523,13 @@ describe('NonfungiblePositionManager', () => { const tokenId = 1; - await nft.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); const mintData = nft.interface.encodeFunctionData('mint', [ { token0: await token0.getAddress(), token1: await token1.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.address, @@ -556,12 +576,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -644,6 +666,7 @@ describe('NonfungiblePositionManager', () => { await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -677,12 +700,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -823,12 +848,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -902,12 +929,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -956,12 +985,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -1019,12 +1050,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: testPositionNFTOwner.getAddress(), @@ -1077,12 +1110,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -1164,12 +1199,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), @@ -1202,12 +1239,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); // nft 1 earns 25% of fees await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), amount0Desired: 100, @@ -1221,9 +1260,9 @@ describe('NonfungiblePositionManager', () => { await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), - amount0Desired: 300, amount1Desired: 300, amount0Min: 0, @@ -1240,7 +1279,7 @@ describe('NonfungiblePositionManager', () => { await router.exactInput({ recipient: wallet.address, deadline: 1, - path: encodePath([await tokens[0].getAddress(), await tokens[1].getAddress()]), + path: encodePath([await tokens[0].getAddress(), ZERO_ADDRESS, await tokens[1].getAddress()]), amountIn: swapAmount, amountOutMinimum: 0, }); @@ -1303,12 +1342,14 @@ describe('NonfungiblePositionManager', () => { await nft.createAndInitializePoolIfNecessary( tokens[0].getAddress(), tokens[1].getAddress(), + ZERO_ADDRESS, encodePriceSqrt(1, 1) ); await nft.mint({ token0: tokens[0].getAddress(), token1: tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: other.getAddress(), diff --git a/src/periphery/test/Path.spec.ts b/src/periphery/test/Path.spec.ts index 4669138c6..8841b0520 100644 --- a/src/periphery/test/Path.spec.ts +++ b/src/periphery/test/Path.spec.ts @@ -8,13 +8,16 @@ import { PathTest } from '../typechain'; import { decodePath, encodePath } from './shared/path'; import snapshotGasCost from './shared/snapshotGasCost'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; describe('Path', () => { let path: PathTest; let tokenAddresses = [ '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707', + ZERO_ADDRESS, '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', + ZERO_ADDRESS, '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9', ]; let fees = [FeeAmount.MEDIUM, FeeAmount.MEDIUM]; diff --git a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index 762129543..2403ce534 100644 --- a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -2,38 +2,38 @@ exports[`NonfungiblePositionManager #burn gas [ @skip-on-coverage ] 1`] = `61849`; -exports[`NonfungiblePositionManager #collect gas transfers both [ @skip-on-coverage ] 1`] = `120459`; +exports[`NonfungiblePositionManager #collect gas transfers both [ @skip-on-coverage ] 1`] = `122628`; -exports[`NonfungiblePositionManager #collect gas transfers token0 only [ @skip-on-coverage ] 1`] = `116803`; +exports[`NonfungiblePositionManager #collect gas transfers token0 only [ @skip-on-coverage ] 1`] = `118972`; -exports[`NonfungiblePositionManager #collect gas transfers token1 only [ @skip-on-coverage ] 1`] = `116994`; +exports[`NonfungiblePositionManager #collect gas transfers token1 only [ @skip-on-coverage ] 1`] = `119163`; -exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `4812858`; +exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `4813289`; -exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @skip-on-coverage ] 1`] = `167586`; +exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @skip-on-coverage ] 1`] = `169339`; -exports[`NonfungiblePositionManager #decreaseLiquidity gas partial decrease [ @skip-on-coverage ] 1`] = `171677`; +exports[`NonfungiblePositionManager #decreaseLiquidity gas partial decrease [ @skip-on-coverage ] 1`] = `173868`; -exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] 1`] = `177403`; +exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] 1`] = `179882`; -exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `627918`; +exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `631111`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `641291`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `644527`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `634124`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `637360`; -exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `435931`; +exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `436868`; -exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `325789`; +exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `326726`; -exports[`NonfungiblePositionManager #permit owned by eoa gas [ @skip-on-coverage ] 1`] = `59310`; +exports[`NonfungiblePositionManager #permit owned by eoa gas [ @skip-on-coverage ] 1`] = `59288`; -exports[`NonfungiblePositionManager #permit owned by verifying contract gas [ @skip-on-coverage ] 1`] = `63128`; +exports[`NonfungiblePositionManager #permit owned by verifying contract gas [ @skip-on-coverage ] 1`] = `63106`; exports[`NonfungiblePositionManager #transferFrom gas [ @skip-on-coverage ] 1`] = `86049`; -exports[`NonfungiblePositionManager #transferFrom gas comes from approved [ @skip-on-coverage ] 1`] = `86832`; +exports[`NonfungiblePositionManager #transferFrom gas comes from approved [ @skip-on-coverage ] 1`] = `86831`; -exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `24267`; +exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `25065`; -exports[`NonfungiblePositionManager multicall exit gas [ @skip-on-coverage ] 1`] = `241184`; +exports[`NonfungiblePositionManager multicall exit gas [ @skip-on-coverage ] 1`] = `243107`; From af7c93abaff1b7c2b9ea1f8d7209f7e24377508e Mon Sep 17 00:00:00 2001 From: fourlen Date: Fri, 7 Jun 2024 16:17:54 +0300 Subject: [PATCH 02/17] +some tests --- src/periphery/contracts/SwapRouter.sol | 6 +- .../contracts/interfaces/ISwapRouter.sol | 1 + src/periphery/contracts/lens/Quoter.sol | 4 +- src/periphery/contracts/lens/QuoterV2.sol | 4 +- src/periphery/contracts/libraries/Path.sol | 1 + ...NonfungibleTokenPositionDescriptor.spec.ts | 7 +- src/periphery/test/Path.spec.ts | 14 ++-- src/periphery/test/PoolAddress.spec.ts | 5 +- src/periphery/test/PositionValue.spec.ts | 32 +++++--- src/periphery/test/Quoter.spec.ts | 40 ++++++---- src/periphery/test/QuoterV2.spec.ts | 74 +++++++++++-------- src/periphery/test/SwapRouter.spec.ts | 56 ++++++++------ src/periphery/test/TickLens.spec.ts | 5 +- src/periphery/test/V3Migrator.spec.ts | 23 ++++-- .../NonfungiblePositionManager.spec.ts.snap | 4 +- .../test/__snapshots__/Path.spec.ts.snap | 2 +- .../__snapshots__/PoolAddress.spec.ts.snap | 2 +- .../__snapshots__/PositionValue.spec.ts.snap | 10 +-- .../test/__snapshots__/QuoterV2.spec.ts.snap | 28 +++---- .../__snapshots__/SwapRouter.spec.ts.snap | 2 +- .../__snapshots__/V3Migrator.spec.ts.snap | 2 +- src/periphery/test/shared/completeFixture.ts | 11 +++ src/periphery/test/shared/path.ts | 16 ++-- src/periphery/test/shared/quoter.ts | 14 +++- 24 files changed, 228 insertions(+), 135 deletions(-) diff --git a/src/periphery/contracts/SwapRouter.sol b/src/periphery/contracts/SwapRouter.sol index 4e286ca75..18a0338b8 100644 --- a/src/periphery/contracts/SwapRouter.sol +++ b/src/periphery/contracts/SwapRouter.sol @@ -116,7 +116,7 @@ contract SwapRouter is params.amountIn, params.recipient, params.limitSqrtPrice, - SwapCallbackData({path: abi.encodePacked(params.tokenIn, params.tokenOut), payer: msg.sender}) + SwapCallbackData({path: abi.encodePacked(params.tokenIn, params.deployer, params.tokenOut), payer: msg.sender}) ); require(amountOut >= params.amountOutMinimum, 'Too little received'); } @@ -162,7 +162,7 @@ contract SwapRouter is ExactInputSingleParams calldata params ) external payable override checkDeadline(params.deadline) returns (uint256 amountOut) { SwapCallbackData memory data = SwapCallbackData({ - path: abi.encodePacked(params.tokenIn, params.tokenOut), + path: abi.encodePacked(params.tokenIn, params.deployer, params.tokenOut), payer: msg.sender }); address recipient = params.recipient == address(0) ? address(this) : params.recipient; @@ -226,7 +226,7 @@ contract SwapRouter is params.amountOut, params.recipient, params.limitSqrtPrice, - SwapCallbackData({path: abi.encodePacked(params.tokenOut, params.tokenIn), payer: msg.sender}) + SwapCallbackData({path: abi.encodePacked(params.tokenOut, params.deployer, params.tokenIn), payer: msg.sender}) ); require(amountIn <= params.amountInMaximum, 'Too much requested'); diff --git a/src/periphery/contracts/interfaces/ISwapRouter.sol b/src/periphery/contracts/interfaces/ISwapRouter.sol index 4662d00f4..8bc91702d 100644 --- a/src/periphery/contracts/interfaces/ISwapRouter.sol +++ b/src/periphery/contracts/interfaces/ISwapRouter.sol @@ -41,6 +41,7 @@ interface ISwapRouter is IAlgebraSwapCallback { struct ExactOutputSingleParams { address tokenIn; address tokenOut; + address deployer; address recipient; uint256 deadline; uint256 amountOut; diff --git a/src/periphery/contracts/lens/Quoter.sol b/src/periphery/contracts/lens/Quoter.sol index b1ff46eab..310b0d29a 100644 --- a/src/periphery/contracts/lens/Quoter.sol +++ b/src/periphery/contracts/lens/Quoter.sol @@ -98,7 +98,7 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { limitSqrtPrice == 0 ? (zeroToOne ? TickMath.MIN_SQRT_RATIO + 1 : TickMath.MAX_SQRT_RATIO - 1) : limitSqrtPrice, - abi.encodePacked(tokenIn, tokenOut) + abi.encodePacked(tokenIn, deployer, tokenOut) ) {} catch (bytes memory reason) { (amountOut, fee) = parseRevertReason(reason); @@ -150,7 +150,7 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { limitSqrtPrice == 0 ? (zeroToOne ? TickMath.MIN_SQRT_RATIO + 1 : TickMath.MAX_SQRT_RATIO - 1) : limitSqrtPrice, - abi.encodePacked(tokenOut, tokenIn) + abi.encodePacked(tokenOut, deployer, tokenIn) ) {} catch (bytes memory reason) { if (limitSqrtPrice == 0) delete amountOutCached; // clear cache diff --git a/src/periphery/contracts/lens/QuoterV2.sol b/src/periphery/contracts/lens/QuoterV2.sol index 0aff9fc2a..bbc549cf4 100644 --- a/src/periphery/contracts/lens/QuoterV2.sol +++ b/src/periphery/contracts/lens/QuoterV2.sol @@ -136,7 +136,7 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { IAlgebraPool pool = getPool(params.tokenIn, params.tokenOut, params.deployer); uint256 gasBefore = gasleft(); - bytes memory data = abi.encodePacked(params.tokenIn, params.tokenOut); + bytes memory data = abi.encodePacked(params.tokenIn, params.deployer, params.tokenOut); try pool.swap( address(this), // address(0) might cause issues with some tokens @@ -239,7 +239,7 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { // if no price limit has been specified, cache the output amount for comparison in the swap callback if (params.limitSqrtPrice == 0) amountOutCached = params.amount; uint256 gasBefore = gasleft(); - bytes memory data = abi.encodePacked(params.tokenOut, params.tokenIn); + bytes memory data = abi.encodePacked(params.tokenOut, params.deployer, params.tokenIn); try pool.swap( address(this), // address(0) might cause issues with some tokens diff --git a/src/periphery/contracts/libraries/Path.sol b/src/periphery/contracts/libraries/Path.sol index f697931d6..6864500ef 100644 --- a/src/periphery/contracts/libraries/Path.sol +++ b/src/periphery/contracts/libraries/Path.sol @@ -44,6 +44,7 @@ library Path { /// @return deployer The address of the custom pool deployer /// @return tokenB The second token of the given pool function decodeFirstPool(bytes memory path) internal pure returns (address tokenA, address deployer, address tokenB) { + console.logBytes(path); tokenA = path.toAddress(0); deployer = path.toAddress(DEPLOYER_OFFSET); tokenB = path.toAddress(NEXT_OFFSET); diff --git a/src/periphery/test/NonfungibleTokenPositionDescriptor.spec.ts b/src/periphery/test/NonfungibleTokenPositionDescriptor.spec.ts index ec91b333f..53a7b3093 100644 --- a/src/periphery/test/NonfungibleTokenPositionDescriptor.spec.ts +++ b/src/periphery/test/NonfungibleTokenPositionDescriptor.spec.ts @@ -9,6 +9,7 @@ import { FeeAmount, TICK_SPACINGS, tokenAddresses } from './shared/constants'; import { getMaxTick, getMinTick } from './shared/ticks'; import { sortedTokens } from './shared/tokenSort'; import { extractJSONFromURI } from './shared/extractJSONFromURI'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address: string | undefined }; @@ -114,12 +115,13 @@ describe('NonfungibleTokenPositionDescriptor', () => { describe('#tokenURI', () => { it('displays Native as token symbol for WNativeToken token', async () => { const [token0, token1] = await sortedTokens(wnative, tokens[1]); - await nft.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); await wnative.approve(nft, 100); await tokens[1].approve(nft, 100); await nft.mint({ token0: token0, token1: token1, + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, @@ -138,12 +140,13 @@ describe('NonfungibleTokenPositionDescriptor', () => { it('displays returned token symbols when neither token is WNativeToken ', async () => { const [token0, token1] = await sortedTokens(tokens[2], tokens[1]); - await nft.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); await tokens[1].approve(nft, 100); await tokens[2].approve(nft, 100); await nft.mint({ token0: token0, token1: token1, + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, diff --git a/src/periphery/test/Path.spec.ts b/src/periphery/test/Path.spec.ts index 8841b0520..e6ca2ddd5 100644 --- a/src/periphery/test/Path.spec.ts +++ b/src/periphery/test/Path.spec.ts @@ -58,7 +58,8 @@ describe('Path', () => { const firstPool = await path.decodeFirstPool(encodedPath); expect(firstPool.tokenA).to.be.eq(tokenAddresses[0]); - expect(firstPool.tokenB).to.be.eq(tokenAddresses[1]); + expect(firstPool.deployer).to.be.eq(tokenAddresses[1]); + expect(firstPool.tokenB).to.be.eq(tokenAddresses[2]); expect(await path.decodeFirstPool(await path.getFirstPool(encodedPath))).to.deep.eq(firstPool); }); @@ -67,17 +68,18 @@ describe('Path', () => { it('skips 1 item', async () => { const skipped = await path.skipToken(encodedPath); - expect(skipped).to.be.eq('0x' + encodedPath.slice(2 + offset * 2)); + expect(skipped).to.be.eq('0x' + encodedPath.slice(2 + offset * 4)); expect(await path.hasMultiplePools(skipped)).to.be.false; - const { tokenA, tokenB } = await path.decodeFirstPool(skipped); - expect(tokenA).to.be.eq(tokenAddresses[1]); - expect(tokenB).to.be.eq(tokenAddresses[2]); + const { tokenA, deployer, tokenB } = await path.decodeFirstPool(skipped); + expect(tokenA).to.be.eq(tokenAddresses[2]); + expect(deployer).to.be.eq(tokenAddresses[3]); + expect(tokenB).to.be.eq(tokenAddresses[4]); }); }); it('gas cost [ @skip-on-coverage ]', async () => { - await snapshotGasCost(path.getGasCostOfDecodeFirstPool(encodePath([tokenAddresses[0], tokenAddresses[1]]))); + await snapshotGasCost(path.getGasCostOfDecodeFirstPool(encodePath([tokenAddresses[0], tokenAddresses[1], tokenAddresses[2]]))); }); }); diff --git a/src/periphery/test/PoolAddress.spec.ts b/src/periphery/test/PoolAddress.spec.ts index f5aab87ef..47ebc43e6 100644 --- a/src/periphery/test/PoolAddress.spec.ts +++ b/src/periphery/test/PoolAddress.spec.ts @@ -27,7 +27,7 @@ describe('PoolAddress', () => { describe('#computeAddress', () => { it('all arguments equal zero', async () => { - await expect(poolAddress.computeAddress(ZeroAddress, ZeroAddress, ZeroAddress, 0)).to.be.reverted; + await expect(poolAddress.computeAddress(ZeroAddress, ZeroAddress, ZeroAddress, ZeroAddress, 0)).to.be.reverted; }); it('matches example from core repo', async () => { @@ -36,6 +36,7 @@ describe('PoolAddress', () => { '0x5FbDB2315678afecb367f032d93F642f64180aa3', '0x1000000000000000000000000000000000000000', '0x2000000000000000000000000000000000000000', + ZeroAddress, 250 ) ).to.matchSnapshot(); @@ -47,6 +48,7 @@ describe('PoolAddress', () => { '0x5FbDB2315678afecb367f032d93F642f64180aa3', '0x2000000000000000000000000000000000000000', '0x1000000000000000000000000000000000000000', + ZeroAddress, 3000 ) ).to.be.reverted; @@ -58,6 +60,7 @@ describe('PoolAddress', () => { '0x5FbDB2315678afecb367f032d93F642f64180aa3', '0x1000000000000000000000000000000000000000', '0x2000000000000000000000000000000000000000', + ZeroAddress, 3000 ) ); diff --git a/src/periphery/test/PositionValue.spec.ts b/src/periphery/test/PositionValue.spec.ts index b6ba1dfaa..b7a01f6fe 100644 --- a/src/periphery/test/PositionValue.spec.ts +++ b/src/periphery/test/PositionValue.spec.ts @@ -18,6 +18,7 @@ import completeFixture from './shared/completeFixture'; import snapshotGasCost from './shared/snapshotGasCost'; import { expect } from './shared/expect'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; describe('PositionValue', async () => { let wallets: any; @@ -39,7 +40,7 @@ describe('PositionValue', async () => { await token.transfer(wallets[0].address, expandTo18Decimals(1_000_000)); } - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1)); return { positionValue, @@ -80,6 +81,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: tokens[0], token1: tokens[1], + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, @@ -98,7 +100,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[0].getAddress(), await tokens[1].getAddress()]), + path: encodePath([await tokens[0].getAddress(), ZERO_ADDRESS, await tokens[1].getAddress()]), amountIn: swapAmount, amountOutMinimum: 0, }); @@ -107,7 +109,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[1].getAddress(), await tokens[0].getAddress()]), + path: encodePath([await tokens[1].getAddress(), ZERO_ADDRESS, await tokens[0].getAddress()]), amountIn: swapAmount, amountOutMinimum: 0, }); @@ -141,6 +143,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, @@ -160,6 +163,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: -60, recipient: wallets[0].address, @@ -179,6 +183,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: 60, tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, @@ -198,6 +203,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: -6_000, tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, @@ -217,6 +223,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: 6_000, recipient: wallets[0].address, @@ -236,6 +243,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, @@ -260,6 +268,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, @@ -276,6 +285,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: TICK_SPACINGS[FeeAmount.MEDIUM] * -1_000, tickUpper: TICK_SPACINGS[FeeAmount.MEDIUM] * 1_000, recipient: wallets[0].address, @@ -294,7 +304,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[0].getAddress(), await tokens[1].getAddress()]), + path: encodePath([await tokens[0].getAddress(), ZERO_ADDRESS, await tokens[1].getAddress()]), amountIn: swapAmount, amountOutMinimum: 0, }); @@ -303,7 +313,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[1].getAddress(), await tokens[0].getAddress()]), + path: encodePath([await tokens[1].getAddress(), ZERO_ADDRESS, await tokens[0].getAddress()]), amountIn: swapAmount, amountOutMinimum: 0, }); @@ -339,7 +349,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[0].getAddress(), await tokens[1].getAddress()]), + path: encodePath([await tokens[0].getAddress(), ZERO_ADDRESS, await tokens[1].getAddress()]), amountIn: swapAmount, amountOutMinimum: 0, }); @@ -365,6 +375,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: TICK_SPACINGS[FeeAmount.MEDIUM] * -10, tickUpper: TICK_SPACINGS[FeeAmount.MEDIUM] * 10, recipient: wallets[0].address, @@ -382,7 +393,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[1].getAddress(), await tokens[0].getAddress()]), + path: encodePath([await tokens[1].getAddress(), ZERO_ADDRESS, await tokens[0].getAddress()]), amountIn: expandTo18Decimals(1_000), amountOutMinimum: 0, }); @@ -391,7 +402,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[0].getAddress(), await tokens[1].getAddress()]), + path: encodePath([await tokens[0].getAddress(), ZERO_ADDRESS, await tokens[1].getAddress()]), amountIn: expandTo18Decimals(50_000), amountOutMinimum: 0, }); @@ -420,6 +431,7 @@ describe('PositionValue', async () => { await nft.mint({ token0: await tokens[0].getAddress(), token1: await tokens[1].getAddress(), + deployer: ZERO_ADDRESS, tickLower: TICK_SPACINGS[FeeAmount.MEDIUM] * -10, tickUpper: TICK_SPACINGS[FeeAmount.MEDIUM] * 10, @@ -438,7 +450,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[0].getAddress(), await tokens[1].getAddress()]), + path: encodePath([await tokens[0].getAddress(), ZERO_ADDRESS, await tokens[1].getAddress()]), amountIn: expandTo18Decimals(1_000), amountOutMinimum: 0, }); @@ -447,7 +459,7 @@ describe('PositionValue', async () => { await router.exactInput({ recipient: wallets[0].address, deadline: 1, - path: encodePath([await tokens[1].getAddress(), await tokens[0].getAddress()]), + path: encodePath([await tokens[1].getAddress(), ZERO_ADDRESS, await tokens[0].getAddress()]), amountIn: expandTo18Decimals(50_000), amountOutMinimum: 0, }); diff --git a/src/periphery/test/Quoter.spec.ts b/src/periphery/test/Quoter.spec.ts index b2137d160..69d34efbe 100644 --- a/src/periphery/test/Quoter.spec.ts +++ b/src/periphery/test/Quoter.spec.ts @@ -17,6 +17,7 @@ import { expandTo18Decimals } from './shared/expandTo18Decimals'; import { expect } from './shared/expect'; import { encodePath } from './shared/path'; import { createPool } from './shared/quoter'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address: string }; @@ -27,13 +28,14 @@ describe('Quoter', () => { const swapRouterFixture: () => Promise<{ nft: MockTimeNonfungiblePositionManager; tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + path: [string, string, string, string, string]; quoter: Quoter; router: MockTimeSwapRouter; wnative: IWNativeToken; factory: IAlgebraFactory; }> = async () => { let _tokens; - const { wnative, factory, router, tokens, nft } = await loadFixture(completeFixture); + const { wnative, factory, router, tokens, path, nft } = await loadFixture(completeFixture); _tokens = tokens as [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; // approve & fund wallets @@ -50,6 +52,7 @@ describe('Quoter', () => { return { tokens: _tokens, + path: path, nft, quoter, router, @@ -60,6 +63,7 @@ describe('Quoter', () => { let nft: MockTimeNonfungiblePositionManager; let tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + let path: [string, string, string, string, string]; let quoter: Quoter; let router: MockTimeSwapRouter; let wnative: IWNativeToken; @@ -72,20 +76,20 @@ describe('Quoter', () => { describe('quotes', () => { const subFixture = async () => { - const { tokens, nft, quoter, router, wnative, factory } = await swapRouterFixture(); + const { tokens, path, nft, quoter, router, wnative, factory } = await swapRouterFixture(); const pool0 = await createPool(nft, wallet, await tokens[0].getAddress(), await tokens[1].getAddress()); await createPool(nft, wallet, await tokens[1].getAddress(), await tokens[2].getAddress()); - return { tokens, nft, quoter, router, wnative, factory }; + return { tokens, path, nft, quoter, router, wnative, factory }; }; beforeEach(async () => { - ({ tokens, nft, quoter, router, wnative, factory } = await loadFixture(subFixture)); + ({ tokens, path, nft, quoter, router, wnative, factory } = await loadFixture(subFixture)); }); describe('#quoteExactInput', () => { it('0 -> 1', async () => { const { amountOut, fees } = await quoter.quoteExactInput.staticCall( - encodePath([tokens[0].address, tokens[1].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[1].address]), 3 ); @@ -123,20 +127,20 @@ describe('Quoter', () => { } const { amountOut, fees } = await quoter.quoteExactInput.staticCall( - encodePath([tokens[0].address, tokens[1].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[1].address]), expandTo18Decimals(300000) ); expect(fees[0]).to.eq(500); - await exactInput([tokens[0].address, tokens[1].address], 300000); + await exactInput([tokens[0].address, ZERO_ADDRESS, tokens[1].address], 300000); await ethers.provider.send('evm_mine', []); await ethers.provider.send('evm_increaseTime', [60 * 60 * 3]); await ethers.provider.send('evm_mine', []); const { amountOut: amountOut2, fees: fees2 } = await quoter.quoteExactInput.staticCall( - encodePath([tokens[0].address, tokens[1].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[1].address]), expandTo18Decimals(300000) ); @@ -144,8 +148,9 @@ describe('Quoter', () => { }); it('1 -> 0', async () => { + console.log(encodePath([tokens[1].address, ZERO_ADDRESS, tokens[0].address])) const { amountOut, fees } = await quoter.quoteExactInput.staticCall( - encodePath([tokens[1].address, tokens[0].address]), + encodePath([tokens[1].address, ZERO_ADDRESS, tokens[0].address]), 3 ); @@ -155,7 +160,7 @@ describe('Quoter', () => { it('0 -> 1 -> 2', async () => { const { amountOut, fees } = await quoter.quoteExactInput.staticCall( - encodePath(tokens.map((token) => token.address)), + encodePath(path), 5 ); @@ -165,7 +170,7 @@ describe('Quoter', () => { it('2 -> 1 -> 0', async () => { const { amountOut, fees } = await quoter.quoteExactInput.staticCall( - encodePath(tokens.map((token) => token.address).reverse()), + encodePath(path.reverse()), 5 ); @@ -179,6 +184,7 @@ describe('Quoter', () => { const { amountOut, fee } = await quoter.quoteExactInputSingle.staticCall( tokens[0].address, tokens[1].address, + ZERO_ADDRESS, MaxUint128, // -2% encodePriceSqrt(100, 102) @@ -198,6 +204,7 @@ describe('Quoter', () => { quoter.quoteExactInputSingle.staticCall( tokens[1].address, tokens[0].address, + ZERO_ADDRESS, MaxUint128, // -2%, invalid direction encodePriceSqrt(98, 100) @@ -209,6 +216,7 @@ describe('Quoter', () => { const { amountOut, fee } = await quoter.quoteExactInputSingle.staticCall( tokens[1].address, tokens[0].address, + ZERO_ADDRESS, MaxUint128, // +2% encodePriceSqrt(102, 100) @@ -222,7 +230,7 @@ describe('Quoter', () => { describe('#quoteExactOutput', () => { it('0 -> 1', async () => { const { amountIn, fees } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[1].address, tokens[0].address]), + encodePath([tokens[1].address, ZERO_ADDRESS, tokens[0].address]), 1 ); @@ -232,7 +240,7 @@ describe('Quoter', () => { it('1 -> 0', async () => { const { amountIn, fees } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, tokens[1].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[1].address]), 1 ); @@ -242,7 +250,7 @@ describe('Quoter', () => { it('0 -> 1 -> 2', async () => { const { amountIn, fees } = await quoter.quoteExactOutput.staticCall( - encodePath(tokens.map((token) => token.address).reverse()), + encodePath(path), 1 ); @@ -252,7 +260,7 @@ describe('Quoter', () => { it('2 -> 1 -> 0', async () => { const { amountIn, fees } = await quoter.quoteExactOutput.staticCall( - encodePath(tokens.map((token) => token.address)), + encodePath(path), 1 ); @@ -266,6 +274,7 @@ describe('Quoter', () => { const { amountIn, fee } = await quoter.quoteExactOutputSingle.staticCall( tokens[0].address, tokens[1].address, + ZERO_ADDRESS, MaxUint128, encodePriceSqrt(100, 102) ); @@ -278,6 +287,7 @@ describe('Quoter', () => { const { amountIn, fee } = await quoter.quoteExactOutputSingle.staticCall( tokens[1].address, tokens[0].address, + ZERO_ADDRESS, MaxUint128, encodePriceSqrt(102, 100) ); diff --git a/src/periphery/test/QuoterV2.spec.ts b/src/periphery/test/QuoterV2.spec.ts index 82fccdee4..77342e91e 100644 --- a/src/periphery/test/QuoterV2.spec.ts +++ b/src/periphery/test/QuoterV2.spec.ts @@ -10,6 +10,7 @@ import { expect } from './shared/expect'; import { encodePath } from './shared/path'; import { createPool, createPoolWithMultiplePositions, createPoolWithZeroTickInitialized } from './shared/quoter'; import snapshotGasCost from './shared/snapshotGasCost'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address: string }; @@ -76,8 +77,9 @@ describe('QuoterV2', function () { describe('#quoteExactInput', () => { it('0 -> 2 cross 2 tick', async () => { + console.log(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address])); const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 10000); + await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 10000); ////await snapshotGasCost(gasEstimate) expect(sqrtPriceX96AfterList.length).to.eq(1); @@ -91,7 +93,7 @@ describe('QuoterV2', function () { // The swap amount is set such that the active tick after the swap is -120. // -120 is an initialized tick for this pool. We check that we don't count it. const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 6200); + await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 6200); ////await snapshotGasCost(gasEstimate) expect(sqrtPriceX96AfterList.length).to.eq(1); @@ -104,7 +106,7 @@ describe('QuoterV2', function () { it('0 -> 2 cross 1 tick', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 4000); + await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 4000); ////await snapshotGasCost(gasEstimate) expect(initializedTicksCrossedList[0]).to.eq(1); @@ -117,7 +119,7 @@ describe('QuoterV2', function () { it('0 -> 2 cross 0 tick, starting tick not initialized', async () => { // Tick before 0, tick after -1. const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 10); + await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 10); ////await snapshotGasCost(gasEstimate) expect(initializedTicksCrossedList[0]).to.eq(0); @@ -132,7 +134,7 @@ describe('QuoterV2', function () { await createPoolWithZeroTickInitialized(nft, wallet, tokens[0].address, tokens[2].address); const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 10); + await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 10); ////await snapshotGasCost(gasEstimate) expect(initializedTicksCrossedList[0]).to.eq(1); @@ -144,7 +146,7 @@ describe('QuoterV2', function () { it('2 -> 0 cross 2', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 10000); + await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 10000); ////await snapshotGasCost(gasEstimate) expect(initializedTicksCrossedList[0]).to.eq(2); @@ -160,7 +162,7 @@ describe('QuoterV2', function () { // 120 is an initialized tick for this pool. We check we don't count it. const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 6250); + await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 6250); ////await snapshotGasCost(gasEstimate) console.log(sqrtPriceX96AfterList[0].toString()); @@ -177,7 +179,7 @@ describe('QuoterV2', function () { await createPoolWithZeroTickInitialized(nft, wallet, tokens[0].address, tokens[2].address); const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 200); + await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 200); ////await snapshotGasCost(gasEstimate) expect(initializedTicksCrossedList[0]).to.eq(0); @@ -191,7 +193,7 @@ describe('QuoterV2', function () { it('2 -> 0 cross 0 tick, starting tick not initialized', async () => { // Tick 0 initialized. Tick after = 1 const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 103); + await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 103); ////await snapshotGasCost(gasEstimate) expect(initializedTicksCrossedList[0]).to.eq(0); @@ -204,7 +206,7 @@ describe('QuoterV2', function () { it('2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, tokens[1].address]), 10000); + await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[1].address]), 10000); ////await snapshotGasCost(gasEstimate) expect(sqrtPriceX96AfterList.length).to.eq(1); @@ -217,7 +219,7 @@ describe('QuoterV2', function () { it('0 -> 2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = await quoter.quoteExactInput.staticCall( - encodePath([tokens[0].address, tokens[2].address, tokens[1].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address, ZERO_ADDRESS, tokens[1].address]), 10000 ); @@ -243,6 +245,7 @@ describe('QuoterV2', function () { } = await quoter.quoteExactInputSingle.staticCall({ tokenIn: tokens[0].address, tokenOut: tokens[2].address, + deployer: ZERO_ADDRESS, amountIn: MaxUint128, // -2% limitSqrtPrice: encodePriceSqrt(100, 102), @@ -265,6 +268,7 @@ describe('QuoterV2', function () { quoter.quoteExactInputSingle.staticCall({ tokenIn: tokens[0].address, tokenOut: tokens[2].address, + deployer: ZERO_ADDRESS, amountIn: MaxUint128, // +2% limitSqrtPrice: encodePriceSqrt(104, 102), @@ -282,6 +286,8 @@ describe('QuoterV2', function () { } = await quoter.quoteExactInputSingle.staticCall({ tokenIn: tokens[2].address, tokenOut: tokens[0].address, + deployer: ZERO_ADDRESS, + amountIn: MaxUint128, // +2% limitSqrtPrice: encodePriceSqrt(102, 100), @@ -299,6 +305,7 @@ describe('QuoterV2', function () { const { gasEstimate } = await quoter.quoteExactInputSingle.staticCall({ tokenIn: tokens[0].address, tokenOut: tokens[2].address, + deployer: ZERO_ADDRESS, amountIn: 10000, // -2% limitSqrtPrice: encodePriceSqrt(100, 102), @@ -311,6 +318,7 @@ describe('QuoterV2', function () { const { gasEstimate } = await quoter.quoteExactInputSingle.staticCall({ tokenIn: tokens[2].address, tokenOut: tokens[0].address, + deployer: ZERO_ADDRESS, amountIn: 10000, // +2% limitSqrtPrice: encodePriceSqrt(102, 100), @@ -324,7 +332,7 @@ describe('QuoterV2', function () { describe('#quoteExactOutput', () => { it('0 -> 2 cross 2 tick', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 15000); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 15000); expect(initializedTicksCrossedList.length).to.eq(1); expect(initializedTicksCrossedList[0]).to.eq(2); @@ -339,7 +347,7 @@ describe('QuoterV2', function () { // The swap amount is set such that the active tick after the swap is -120. // -120 is an initialized tick for this pool. We check that we count it. const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 6158); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 6158); expect(sqrtPriceX96AfterList.length).to.eq(1); expect(sqrtPriceX96AfterList[0]).to.eq('78756056567076985409608047254'); @@ -351,7 +359,7 @@ describe('QuoterV2', function () { it('0 -> 2 cross 1 tick', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 4000); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 4000); expect(initializedTicksCrossedList.length).to.eq(1); expect(initializedTicksCrossedList[0]).to.eq(1); @@ -366,7 +374,7 @@ describe('QuoterV2', function () { // Tick before 0, tick after 1. Tick 0 initialized. await createPoolWithZeroTickInitialized(nft, wallet, tokens[0].address, tokens[2].address); const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 100); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 100); expect(initializedTicksCrossedList.length).to.eq(1); expect(initializedTicksCrossedList[0]).to.eq(1); @@ -379,7 +387,7 @@ describe('QuoterV2', function () { it('0 -> 2 cross 0 tick starting tick not initialized', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, tokens[0].address]), 10); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 10); expect(initializedTicksCrossedList.length).to.eq(1); expect(initializedTicksCrossedList[0]).to.eq(0); @@ -392,7 +400,7 @@ describe('QuoterV2', function () { it('2 -> 0 cross 2 ticks', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 15000); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 15000); expect(initializedTicksCrossedList.length).to.eq(1); expect(initializedTicksCrossedList[0]).to.eq(2); @@ -406,7 +414,7 @@ describe('QuoterV2', function () { // The swap amount is set such that the active tick after the swap is 120. // 120 is an initialized tick for this pool. We check that we don't count it. const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 6223); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 6223); expect(initializedTicksCrossedList[0]).to.eq(2); expect(sqrtPriceX96AfterList.length).to.eq(1); @@ -418,7 +426,7 @@ describe('QuoterV2', function () { it('2 -> 0 cross 1 tick', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[0].address, tokens[2].address]), 6000); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 6000); expect(initializedTicksCrossedList[0]).to.eq(1); expect(sqrtPriceX96AfterList.length).to.eq(1); @@ -430,7 +438,7 @@ describe('QuoterV2', function () { it('2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[1].address, tokens[2].address]), 9897); + await quoter.quoteExactOutput.staticCall(encodePath([tokens[1].address, ZERO_ADDRESS, tokens[2].address]), 9897); expect(sqrtPriceX96AfterList.length).to.eq(1); expect(sqrtPriceX96AfterList[0]).to.eq('80020121658316697953186638498'); @@ -442,7 +450,7 @@ describe('QuoterV2', function () { it('0 -> 2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, tokens[2].address, tokens[1].address].reverse()), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address, ZERO_ADDRESS, tokens[1].address].reverse()), 9795 ); @@ -458,7 +466,7 @@ describe('QuoterV2', function () { describe('gas [ @skip-on-coverage ]', () => { it('0 -> 2 cross 2 tick', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[2].address, tokens[0].address]), + encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 15000 ); @@ -469,7 +477,7 @@ describe('QuoterV2', function () { // The swap amount is set such that the active tick after the swap is -120. // -120 is an initialized tick for this pool. We check that we count it. const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[2].address, tokens[0].address]), + encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 6158 ); @@ -478,7 +486,7 @@ describe('QuoterV2', function () { it('0 -> 2 cross 1 tick', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[2].address, tokens[0].address]), + encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 4000 ); @@ -489,7 +497,7 @@ describe('QuoterV2', function () { // Tick before 0, tick after 1. Tick 0 initialized. await createPoolWithZeroTickInitialized(nft, wallet, tokens[0].address, tokens[2].address); const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[2].address, tokens[0].address]), + encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 100 ); @@ -498,7 +506,7 @@ describe('QuoterV2', function () { it('0 -> 2 cross 0 tick starting tick not initialized', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[2].address, tokens[0].address]), + encodePath([tokens[2].address, ZERO_ADDRESS, tokens[0].address]), 10 ); @@ -507,7 +515,7 @@ describe('QuoterV2', function () { it('2 -> 0 cross 2 ticks', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, tokens[2].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 15000 ); @@ -518,7 +526,7 @@ describe('QuoterV2', function () { // The swap amount is set such that the active tick after the swap is 120. // 120 is an initialized tick for this pool. We check that we don't count it. const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, tokens[2].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 6223 ); @@ -527,7 +535,7 @@ describe('QuoterV2', function () { it('2 -> 0 cross 1 tick', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, tokens[2].address]), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 6000 ); @@ -536,7 +544,7 @@ describe('QuoterV2', function () { it('2 -> 1', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[1].address, tokens[2].address]), + encodePath([tokens[1].address, ZERO_ADDRESS, tokens[2].address]), 9897 ); @@ -545,7 +553,7 @@ describe('QuoterV2', function () { it('0 -> 2 -> 1', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, tokens[2].address, tokens[1].address].reverse()), + encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address, ZERO_ADDRESS, tokens[1].address].reverse()), 9795 ); @@ -560,6 +568,7 @@ describe('QuoterV2', function () { await quoter.quoteExactOutputSingle.staticCall({ tokenIn: tokens[0].address, tokenOut: tokens[1].address, + deployer: ZERO_ADDRESS, amount: MaxUint128, limitSqrtPrice: encodePriceSqrt(100, 102), }); @@ -575,6 +584,7 @@ describe('QuoterV2', function () { await quoter.quoteExactOutputSingle.staticCall({ tokenIn: tokens[1].address, tokenOut: tokens[0].address, + deployer: ZERO_ADDRESS, amount: MaxUint128, limitSqrtPrice: encodePriceSqrt(102, 100), }); @@ -590,6 +600,7 @@ describe('QuoterV2', function () { const { gasEstimate } = await quoter.quoteExactOutputSingle.staticCall({ tokenIn: tokens[0].address, tokenOut: tokens[1].address, + deployer: ZERO_ADDRESS, amount: MaxUint128, limitSqrtPrice: encodePriceSqrt(100, 102), }); @@ -601,6 +612,7 @@ describe('QuoterV2', function () { const { gasEstimate } = await quoter.quoteExactOutputSingle.staticCall({ tokenIn: tokens[1].address, tokenOut: tokens[0].address, + deployer: ZERO_ADDRESS, amount: MaxUint128, limitSqrtPrice: encodePriceSqrt(102, 100), }); diff --git a/src/periphery/test/SwapRouter.spec.ts b/src/periphery/test/SwapRouter.spec.ts index 388f6de63..ff4f520dc 100644 --- a/src/periphery/test/SwapRouter.spec.ts +++ b/src/periphery/test/SwapRouter.spec.ts @@ -10,6 +10,7 @@ import { expect } from './shared/expect'; import { encodePath } from './shared/path'; import { getMaxTick, getMinTick } from './shared/ticks'; import { computePoolAddress } from './shared/computePoolAddress'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address: string }; @@ -23,6 +24,8 @@ describe('SwapRouter', function () { let router: MockTimeSwapRouter; let nft: MockTimeNonfungiblePositionManager; let tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + let path: [string, string, string, string, string]; + let getBalances: (who: string | MockTimeSwapRouter) => Promise<{ wnative: bigint; token0: bigint; @@ -41,11 +44,12 @@ describe('SwapRouter', function () { if (tokenAddressA.toLowerCase() > tokenAddressB.toLowerCase()) [tokenAddressA, tokenAddressB] = [tokenAddressB, tokenAddressA]; - await _nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, encodePriceSqrt(1, 1)); + await _nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, ZERO_ADDRESS, encodePriceSqrt(1, 1)); const liquidityParams = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, fee: FeeAmount.MEDIUM, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), @@ -66,8 +70,9 @@ describe('SwapRouter', function () { router: MockTimeSwapRouter; nft: MockTimeNonfungiblePositionManager; tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + path: [string, string, string, string, string]; }> = async () => { - const { wnative, factory, router, tokens, nft } = await loadFixture(completeFixture); + const { wnative, factory, router, tokens, path, nft } = await loadFixture(completeFixture); let _tokens = tokens as [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; // approve & fund wallets for (const token of _tokens) { @@ -86,6 +91,7 @@ describe('SwapRouter', function () { factory: factory as any as Contract, router, tokens: _tokens, + path: path, nft, }; }; @@ -102,7 +108,7 @@ describe('SwapRouter', function () { // helper for getting wnative and token balances beforeEach('load fixture', async () => { - ({ router, wnative, factory, tokens, nft } = await loadFixture(swapRouterFixture)); + ({ router, wnative, factory, tokens, path, nft } = await loadFixture(swapRouterFixture)); getBalances = async (who: string | MockTimeSwapRouter) => { let addr; @@ -153,6 +159,7 @@ describe('SwapRouter', function () { router.exactInputSingle({ tokenIn: tokens[0].address, tokenOut: tokens[1].address, + deployer: ZERO_ADDRESS, limitSqrtPrice: 0, amountOutMinimum: 0, deadline: 1, @@ -201,7 +208,7 @@ describe('SwapRouter', function () { it('reverts if deadline passed', async () => { await expect( exactInput( - tokens.slice(0, 2).map((token) => token.address), + path.slice(0, 3), 3, 1, 2 @@ -216,8 +223,8 @@ describe('SwapRouter', function () { // get balances before const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - - await exactInput(tokens.slice(0, 2).map((token) => token.address)); + console.log(path.slice(0, 3)); + await exactInput(path.slice(0, 3)); // get balances after const poolAfter = await getBalances(pool); @@ -237,10 +244,9 @@ describe('SwapRouter', function () { const traderBefore = await getBalances(trader.address); await exactInput( - tokens - .slice(0, 2) + path + .slice(0, 3) .reverse() - .map((token) => token.address) ); // get balances after @@ -259,7 +265,7 @@ describe('SwapRouter', function () { const traderBefore = await getBalances(trader.address); await exactInput( - tokens.map((token) => token.address), + path, 5, 1 ); @@ -284,7 +290,7 @@ describe('SwapRouter', function () { it('events', async () => { await expect( exactInput( - tokens.map((token) => token.address), + path, 5, 1 ) @@ -329,7 +335,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await expect(exactInput([await wnative.getAddress(), tokens[0].address])) + await expect(exactInput([await wnative.getAddress(), ZERO_ADDRESS, tokens[0].address])) .to.emit(wnative, 'Deposit') .withArgs(await router.getAddress(), 3); @@ -404,6 +410,7 @@ describe('SwapRouter', function () { async function exactInputSingle( tokenIn: string, tokenOut: string, + deployer: string, amountIn: number = 3, amountOutMinimum: number = 1, limitSqrtPrice?: bigint, @@ -417,6 +424,7 @@ describe('SwapRouter', function () { const params = { tokenIn, tokenOut, + deployer: deployer, fee: FeeAmount.MEDIUM, limitSqrtPrice: limitSqrtPrice ?? tokenIn.toLowerCase() < tokenOut.toLowerCase() @@ -434,6 +442,7 @@ describe('SwapRouter', function () { // ensure that the swap fails if the limit is any tighter params.amountOutMinimum += 1; + // await router.connect(trader).exactInputSingle(params, { value }) await expect(router.connect(trader).exactInputSingle(params, { value })).to.be.revertedWith( 'Too little received' ); @@ -447,7 +456,7 @@ describe('SwapRouter', function () { } it('reverts if deadline passed', async () => { - await expect(exactInputSingle(tokens[0].address, tokens[1].address, 3, 1, undefined, 2)).to.be.revertedWith( + await expect(exactInputSingle(tokens[0].address, tokens[1].address, ZERO_ADDRESS, 3, 1, undefined, 2)).to.be.revertedWith( 'Transaction too old' ); }); @@ -459,7 +468,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await exactInputSingle(tokens[0].address, tokens[1].address); + await exactInputSingle(tokens[0].address, tokens[1].address, ZERO_ADDRESS); // get balances after const poolAfter = await getBalances(pool); @@ -478,7 +487,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await exactInputSingle(tokens[1].address, tokens[0].address); + await exactInputSingle(tokens[1].address, tokens[0].address, ZERO_ADDRESS); // get balances after const poolAfter = await getBalances(pool); @@ -503,7 +512,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await expect(exactInputSingle(await wnative.getAddress(), tokens[0].address)) + await expect(exactInputSingle(await wnative.getAddress(), tokens[0].address, ZERO_ADDRESS)) .to.emit(wnative, 'Deposit') .withArgs(await router.getAddress(), 3); @@ -532,7 +541,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await expect(exactInputSingle(tokens[0].address, await wnative.getAddress())) + await expect(exactInputSingle(tokens[0].address, await wnative.getAddress(), ZERO_ADDRESS)) .to.emit(wnative, 'Withdrawal') .withArgs(await router.getAddress(), 1); @@ -552,6 +561,7 @@ describe('SwapRouter', function () { async function exactInputSingleSupportingFeeOnTransferTokens( tokenIn: string, tokenOut: string, + deployer: string, amountIn: number = 300000, amountOutMinimum: number = 100000, limitSqrtPrice?: bigint, @@ -565,6 +575,7 @@ describe('SwapRouter', function () { const params = { tokenIn, tokenOut, + deployer: deployer, limitSqrtPrice: limitSqrtPrice ?? tokenIn.toLowerCase() < tokenOut.toLowerCase() ? BigInt('4295128740') @@ -581,6 +592,7 @@ describe('SwapRouter', function () { // ensure that the swap fails if the limit is tighter params.amountOutMinimum *= 5; + // await router.connect(trader).exactInputSingleSupportingFeeOnTransferTokens(params) await expect(router.connect(trader).exactInputSingleSupportingFeeOnTransferTokens(params)).to.be.revertedWith( 'Too little received' ); @@ -600,8 +612,9 @@ describe('SwapRouter', function () { }); it('reverts if deadline passed', async () => { + // await exactInputSingleSupportingFeeOnTransferTokens(tokens[0].address, tokens[1].address, ZERO_ADDRESS, 3, 1, undefined, 2) await expect( - exactInputSingleSupportingFeeOnTransferTokens(tokens[0].address, tokens[1].address, 3, 1, undefined, 2) + exactInputSingleSupportingFeeOnTransferTokens(tokens[0].address, tokens[1].address, ZERO_ADDRESS, 3, 1, undefined, 2) ).to.be.revertedWith('Transaction too old'); }); @@ -612,7 +625,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await exactInputSingleSupportingFeeOnTransferTokens(tokens[0].address, tokens[1].address); + await exactInputSingleSupportingFeeOnTransferTokens(tokens[0].address, tokens[1].address, ZERO_ADDRESS); // get balances after const poolAfter = await getBalances(pool); @@ -631,7 +644,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await exactInputSingleSupportingFeeOnTransferTokens(tokens[1].address, tokens[0].address); + await exactInputSingleSupportingFeeOnTransferTokens(tokens[1].address, tokens[0].address, ZERO_ADDRESS); // get balances after const poolAfter = await getBalances(pool); @@ -657,7 +670,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await expect(exactInputSingleSupportingFeeOnTransferTokens(tokens[0].address, await wnative.getAddress())) + await expect(exactInputSingleSupportingFeeOnTransferTokens(tokens[0].address, await wnative.getAddress(), ZERO_ADDRESS)) .to.emit(wnative, 'Withdrawal') .withArgs(await router.getAddress(), 219146); @@ -921,6 +934,7 @@ describe('SwapRouter', function () { const params = { tokenIn, tokenOut, + deployer: ZERO_ADDRESS, fee: FeeAmount.MEDIUM, recipient: outputIsWNativeToken ? ZeroAddress : trader.address, deadline: 1, diff --git a/src/periphery/test/TickLens.spec.ts b/src/periphery/test/TickLens.spec.ts index 97011eef8..d9a62ca9a 100644 --- a/src/periphery/test/TickLens.spec.ts +++ b/src/periphery/test/TickLens.spec.ts @@ -9,6 +9,7 @@ import { expect } from './shared/expect'; import { getMaxTick, getMinTick } from './shared/ticks'; import { computePoolAddress } from './shared/computePoolAddress'; import snapshotGasCost from './shared/snapshotGasCost'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address: string }; @@ -53,6 +54,7 @@ describe('TickLens', () => { const mintParams = { token0: tokens[0].address, token1: tokens[1].address, + deployer: ZERO_ADDRESS, tickLower, tickUpper, amount0Desired: amountBothDesired, @@ -76,12 +78,13 @@ describe('TickLens', () => { if (BigInt(tokenAddressA) > BigInt(tokenAddressB)) [tokenAddressA, tokenAddressB] = [tokenAddressB, tokenAddressA]; - const tx = await _nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, encodePriceSqrt(1, 1)); + const tx = await _nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, ZERO_ADDRESS, encodePriceSqrt(1, 1)); await tx.wait(); const liquidityParams = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallets[0].address, diff --git a/src/periphery/test/V3Migrator.spec.ts b/src/periphery/test/V3Migrator.spec.ts index e3457ea67..ea60a44bf 100644 --- a/src/periphery/test/V3Migrator.spec.ts +++ b/src/periphery/test/V3Migrator.spec.ts @@ -18,6 +18,7 @@ import { encodePriceSqrt } from './shared/encodePriceSqrt'; import snapshotGasCost from './shared/snapshotGasCost'; import { sortedTokens } from './shared/tokenSort'; import { getMaxTick, getMinTick } from './shared/ticks'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address: string | undefined }; @@ -128,6 +129,7 @@ describe('V3Migrator', () => { percentageToMigrate: 100, token0: tokenLower ? await token.getAddress() : await wnative.getAddress(), token1: tokenLower ? await wnative.getAddress() : await token.getAddress(), + deployer: ZERO_ADDRESS, tickLower: -1, tickUpper: 1, amount0Min: 9000, @@ -141,7 +143,7 @@ describe('V3Migrator', () => { it('works once v3 pool is initialized', async () => { const [token0, token1] = await sortedTokens(wnative, token); - await migrator.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await migrator.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); await pair.approve(migrator, expectedLiquidity); await migrator.migrate({ @@ -150,6 +152,7 @@ describe('V3Migrator', () => { percentageToMigrate: 100, token0: tokenLower ? await token.getAddress() : await wnative.getAddress(), token1: tokenLower ? await wnative.getAddress() : await token.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(60), tickUpper: getMaxTick(60), amount0Min: 9000, @@ -169,7 +172,7 @@ describe('V3Migrator', () => { it('works for partial', async () => { const [token0, token1] = await sortedTokens(wnative, token); - await migrator.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await migrator.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); const tokenBalanceBefore = await token.balanceOf(wallet.address); const wnativeBalanceBefore = await wnative.balanceOf(wallet.address); @@ -181,6 +184,7 @@ describe('V3Migrator', () => { percentageToMigrate: 50, token0: tokenLower ? await token.getAddress() : await wnative.getAddress(), token1: tokenLower ? await wnative.getAddress() : await token.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(60), tickUpper: getMaxTick(60), amount0Min: 4500, @@ -206,7 +210,7 @@ describe('V3Migrator', () => { it('double the price', async () => { const [token0, token1] = await sortedTokens(wnative, token); - await migrator.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(2, 1)); + await migrator.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(2, 1)); const tokenBalanceBefore = await token.balanceOf(wallet.address); const wnativeBalanceBefore = await wnative.balanceOf(wallet.address); @@ -218,6 +222,7 @@ describe('V3Migrator', () => { percentageToMigrate: 100, token0: tokenLower ? await token.getAddress() : await wnative.getAddress(), token1: tokenLower ? await wnative.getAddress() : await token.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(60), tickUpper: getMaxTick(60), amount0Min: 4500, @@ -249,7 +254,7 @@ describe('V3Migrator', () => { it('half the price', async () => { const [token0, token1] = await sortedTokens(wnative, token); - await migrator.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 2)); + await migrator.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 2)); const tokenBalanceBefore = await token.balanceOf(wallet.address); const wnativeBalanceBefore = await wnative.balanceOf(wallet.address); @@ -261,6 +266,7 @@ describe('V3Migrator', () => { percentageToMigrate: 100, token0: tokenLower ? token : wnative, token1: tokenLower ? wnative : token, + deployer: ZERO_ADDRESS, tickLower: getMinTick(60), tickUpper: getMaxTick(60), amount0Min: 8999, @@ -292,7 +298,7 @@ describe('V3Migrator', () => { it('double the price - as Native', async () => { const [token0, token1] = await sortedTokens(wnative, token); - await migrator.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(2, 1)); + await migrator.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(2, 1)); const tokenBalanceBefore = await token.balanceOf(wallet.address); @@ -304,6 +310,7 @@ describe('V3Migrator', () => { percentageToMigrate: 100, token0: tokenLower ? token : wnative, token1: tokenLower ? wnative : token, + deployer: ZERO_ADDRESS, tickLower: getMinTick(60), tickUpper: getMaxTick(60), amount0Min: 4500, @@ -335,7 +342,7 @@ describe('V3Migrator', () => { it('half the price - as Native', async () => { const [token0, token1] = await sortedTokens(wnative, token); - await migrator.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 2)); + await migrator.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 2)); const tokenBalanceBefore = await token.balanceOf(wallet.address); @@ -347,6 +354,7 @@ describe('V3Migrator', () => { percentageToMigrate: 100, token0: tokenLower ? token : wnative, token1: tokenLower ? wnative : token, + deployer: ZERO_ADDRESS, tickLower: getMinTick(60), tickUpper: getMaxTick(60), amount0Min: 8999, @@ -378,7 +386,7 @@ describe('V3Migrator', () => { it('gas [ @skip-on-coverage ]', async () => { const [token0, token1] = await sortedTokens(wnative, token); - await migrator.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await migrator.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); await pair.approve(migrator, expectedLiquidity); await snapshotGasCost( @@ -388,6 +396,7 @@ describe('V3Migrator', () => { percentageToMigrate: 100, token0: tokenLower ? await token.getAddress() : await wnative.getAddress(), token1: tokenLower ? await wnative.getAddress() : await token.getAddress(), + deployer: ZERO_ADDRESS, tickLower: getMinTick(60), tickUpper: getMaxTick(60), amount0Min: 9000, diff --git a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index 2403ce534..d28f11c42 100644 --- a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -18,9 +18,9 @@ exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `631111`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `644527`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `644530`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `637360`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `637363`; exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `436868`; diff --git a/src/periphery/test/__snapshots__/Path.spec.ts.snap b/src/periphery/test/__snapshots__/Path.spec.ts.snap index 12dec0f48..c1b58f53a 100644 --- a/src/periphery/test/__snapshots__/Path.spec.ts.snap +++ b/src/periphery/test/__snapshots__/Path.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Path gas cost [ @skip-on-coverage ] 1`] = `254`; +exports[`Path gas cost [ @skip-on-coverage ] 1`] = `438`; diff --git a/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap b/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap index 4e6653378..f8f02b2da 100644 --- a/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap +++ b/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PoolAddress #computeAddress gas cost [ @skip-on-coverage ] 1`] = `625`; +exports[`PoolAddress #computeAddress gas cost [ @skip-on-coverage ] 1`] = `695`; exports[`PoolAddress #computeAddress matches example from core repo 1`] = `"0xB01C0Cd9dD6dFf3f23939358D431299fdFFA82C8"`; diff --git a/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap b/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap index e6ed3443f..aa1dc260c 100644 --- a/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap +++ b/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap @@ -1,11 +1,11 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PositionValue #fees when price is above the position range gas 1`] = `48350`; +exports[`PositionValue #fees when price is above the position range gas 1`] = `50962`; -exports[`PositionValue #fees when price is below the position range gas 1`] = `48416`; +exports[`PositionValue #fees when price is below the position range gas 1`] = `51028`; -exports[`PositionValue #fees when price is within the position range gas 1`] = `53875`; +exports[`PositionValue #fees when price is within the position range gas 1`] = `56487`; -exports[`PositionValue #principal gas 1`] = `23152`; +exports[`PositionValue #principal gas 1`] = `25630`; -exports[`PositionValue #total gas 1`] = `56966`; +exports[`PositionValue #total gas 1`] = `59578`; diff --git a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap index f70c3ac2e..9c68f49e3 100644 --- a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap +++ b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap @@ -1,29 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `155741`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `156211`; -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `155683`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156153`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `246532`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `247441`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105383`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105838`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90115`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90570`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125479`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125934`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `155648`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `156103`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125488`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125943`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `125816`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `126271`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156259`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156714`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156263`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156718`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `90903`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `91358`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91102`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91557`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91119`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91574`; diff --git a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap index 249d0d811..30c61f4f7 100644 --- a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap +++ b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12378`; +exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `13181`; diff --git a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap index d20b26114..4f8984eec 100644 --- a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap +++ b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `746809`; +exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `750201`; diff --git a/src/periphery/test/shared/completeFixture.ts b/src/periphery/test/shared/completeFixture.ts index 937e2c71e..d5ceae224 100644 --- a/src/periphery/test/shared/completeFixture.ts +++ b/src/periphery/test/shared/completeFixture.ts @@ -10,6 +10,7 @@ import { TestERC20, IAlgebraFactory, } from '../../typechain'; +import { ZERO_ADDRESS } from '../CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address_: string | undefined }; @@ -48,6 +49,7 @@ const completeFixture: () => Promise<{ nft: MockTimeNonfungiblePositionManager; nftDescriptor: NonfungibleTokenPositionDescriptor; tokens: [TestERC20, TestERC20, TestERC20]; + path: [string, string, string, string, string]; }> = async () => { const { wnative, factory, router } = await v3RouterFixture(); const tokenFactory = await ethers.getContractFactory('TestERC20'); @@ -62,6 +64,14 @@ const completeFixture: () => Promise<{ tokens[1].address_ = await tokens[1].getAddress(); tokens[2].address_ = await tokens[2].getAddress(); + const path: [string, string, string, string, string] = [ + tokens[0].address_, + ZERO_ADDRESS, // deployer + tokens[1].address_, + ZERO_ADDRESS, // deployer, + tokens[2].address_ + ] + tokens.sort((tokenA: TestERC20WithAddress, tokenB: TestERC20WithAddress) => { if (!tokenA.address_ || !tokenB.address_) return 0; return tokenA.address_.toLowerCase() < tokenB.address_.toLowerCase() ? -1 : 1; @@ -97,6 +107,7 @@ const completeFixture: () => Promise<{ factory, router, tokens, + path, nft, nftDescriptor: nftDescriptorProxied, }; diff --git a/src/periphery/test/shared/path.ts b/src/periphery/test/shared/path.ts index 2b5b7404b..5759d58ac 100644 --- a/src/periphery/test/shared/path.ts +++ b/src/periphery/test/shared/path.ts @@ -15,16 +15,20 @@ export function encodePath(path: string[]): string { return encoded.toLowerCase(); } -function decodeOne(tokenFeeToken: Buffer): [[string, string]] { +function decodeOne(tokenFeeToken: Buffer): [[string, string, string]] { // reads the first 20 bytes for the token address const tokenABuf = tokenFeeToken.slice(0, ADDR_SIZE); const tokenA = getAddress('0x' + tokenABuf.toString('hex')); + // reads the first 20 bytes for the deployer address + const deployerBuf = tokenFeeToken.slice(OFFSET, DATA_SIZE); + const deployer = getAddress('0x' + deployerBuf.toString('hex')); + // reads the next 20 bytes for the token address - const tokenBBuf = tokenFeeToken.slice(OFFSET, DATA_SIZE); + const tokenBBuf = tokenFeeToken.slice(DATA_SIZE, DATA_SIZE + ADDR_SIZE); const tokenB = getAddress('0x' + tokenBBuf.toString('hex')); - return [[tokenA, tokenB]]; + return [[tokenA, deployer, tokenB]]; } export function decodePath(path: string): [string[]] { @@ -34,10 +38,10 @@ export function decodePath(path: string): [string[]] { let i = 0; let finalToken: string = ''; while (data.length >= DATA_SIZE) { - const [[tokenA, tokenB]] = decodeOne(data); + const [[tokenA, deployer, tokenB]] = decodeOne(data); finalToken = tokenB; - tokens = [...tokens, tokenA]; - data = data.slice((i + 1) * OFFSET); + tokens = [...tokens, tokenA, deployer]; + data = data.slice((i + 1) * DATA_SIZE); i += 1; } tokens = [...tokens, finalToken]; diff --git a/src/periphery/test/shared/quoter.ts b/src/periphery/test/shared/quoter.ts index 0fd3ef205..091f401b9 100644 --- a/src/periphery/test/shared/quoter.ts +++ b/src/periphery/test/shared/quoter.ts @@ -3,6 +3,7 @@ import { MockTimeNonfungiblePositionManager } from '../../typechain'; import { FeeAmount, TICK_SPACINGS } from './constants'; import { encodePriceSqrt } from './encodePriceSqrt'; import { getMaxTick, getMinTick } from './ticks'; +import { ZERO_ADDRESS } from '../CallbackValidation.spec'; export async function createPool( nft: MockTimeNonfungiblePositionManager, @@ -13,11 +14,12 @@ export async function createPool( if (tokenAddressA.toLowerCase() > tokenAddressB.toLowerCase()) [tokenAddressA, tokenAddressB] = [tokenAddressB, tokenAddressA]; - await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, ZERO_ADDRESS, encodePriceSqrt(1, 1)); const liquidityParams = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, @@ -40,11 +42,12 @@ export async function createPoolWithMultiplePositions( if (tokenAddressA.toLowerCase() > tokenAddressB.toLowerCase()) [tokenAddressA, tokenAddressB] = [tokenAddressB, tokenAddressA]; - await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, ZERO_ADDRESS, encodePriceSqrt(1, 1)); const liquidityParams = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, @@ -60,6 +63,7 @@ export async function createPoolWithMultiplePositions( const liquidityParams2 = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: -60, tickUpper: 60, recipient: wallet.address, @@ -75,6 +79,7 @@ export async function createPoolWithMultiplePositions( const liquidityParams3 = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: -120, tickUpper: 120, recipient: wallet.address, @@ -97,11 +102,12 @@ export async function createPoolWithZeroTickInitialized( if (tokenAddressA.toLowerCase() > tokenAddressB.toLowerCase()) [tokenAddressA, tokenAddressB] = [tokenAddressB, tokenAddressA]; - await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, ZERO_ADDRESS, encodePriceSqrt(1, 1)); const liquidityParams = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, @@ -117,6 +123,7 @@ export async function createPoolWithZeroTickInitialized( const liquidityParams2 = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: 0, tickUpper: 60, recipient: wallet.address, @@ -132,6 +139,7 @@ export async function createPoolWithZeroTickInitialized( const liquidityParams3 = { token0: tokenAddressA, token1: tokenAddressB, + deployer: ZERO_ADDRESS, tickLower: -120, tickUpper: 0, recipient: wallet.address, From b6b48cc2703299ca14ac37585507e3f49ef1a2ef Mon Sep 17 00:00:00 2001 From: fourlen Date: Fri, 7 Jun 2024 19:09:56 +0300 Subject: [PATCH 03/17] other tests --- src/periphery/contracts/SwapRouter.sol | 7 +-- src/periphery/contracts/libraries/Path.sol | 1 - src/periphery/test/Quoter.spec.ts | 2 +- src/periphery/test/SwapRouter.spec.ts | 43 ++++++++++--------- .../__snapshots__/SwapRouter.spec.ts.snap | 2 +- .../__snapshots__/V3Migrator.spec.ts.snap | 2 +- src/periphery/test/shared/completeFixture.ts | 10 ++--- 7 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/periphery/contracts/SwapRouter.sol b/src/periphery/contracts/SwapRouter.sol index 18a0338b8..d58bb2eb8 100644 --- a/src/periphery/contracts/SwapRouter.sol +++ b/src/periphery/contracts/SwapRouter.sol @@ -127,9 +127,6 @@ contract SwapRouter is ) external payable override checkDeadline(params.deadline) returns (uint256 amountOut) { address payer = msg.sender; // msg.sender pays for the first hop - // console.log('path'); - // console.logBytes(params.path); - while (true) { bool hasMultiplePools = params.path.hasMultiplePools(); @@ -239,6 +236,10 @@ contract SwapRouter is ) external payable override checkDeadline(params.deadline) returns (uint256 amountIn) { // it's okay that the payer is fixed to msg.sender here, as they're only paying for the "final" exact output // swap, which happens first, and subsequent swaps are paid for within nested callback frames + + console.log('path'); + console.logBytes(params.path); + exactOutputInternal( params.amountOut, params.recipient, diff --git a/src/periphery/contracts/libraries/Path.sol b/src/periphery/contracts/libraries/Path.sol index 6864500ef..f697931d6 100644 --- a/src/periphery/contracts/libraries/Path.sol +++ b/src/periphery/contracts/libraries/Path.sol @@ -44,7 +44,6 @@ library Path { /// @return deployer The address of the custom pool deployer /// @return tokenB The second token of the given pool function decodeFirstPool(bytes memory path) internal pure returns (address tokenA, address deployer, address tokenB) { - console.logBytes(path); tokenA = path.toAddress(0); deployer = path.toAddress(DEPLOYER_OFFSET); tokenB = path.toAddress(NEXT_OFFSET); diff --git a/src/periphery/test/Quoter.spec.ts b/src/periphery/test/Quoter.spec.ts index 69d34efbe..37f4f02e0 100644 --- a/src/periphery/test/Quoter.spec.ts +++ b/src/periphery/test/Quoter.spec.ts @@ -170,7 +170,7 @@ describe('Quoter', () => { it('2 -> 1 -> 0', async () => { const { amountOut, fees } = await quoter.quoteExactInput.staticCall( - encodePath(path.reverse()), + encodePath(path.slice().reverse()), 5 ); diff --git a/src/periphery/test/SwapRouter.spec.ts b/src/periphery/test/SwapRouter.spec.ts index ff4f520dc..9b870fe71 100644 --- a/src/periphery/test/SwapRouter.spec.ts +++ b/src/periphery/test/SwapRouter.spec.ts @@ -74,6 +74,7 @@ describe('SwapRouter', function () { }> = async () => { const { wnative, factory, router, tokens, path, nft } = await loadFixture(completeFixture); let _tokens = tokens as [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + // approve & fund wallets for (const token of _tokens) { await token.approve(router, MaxUint256); @@ -223,7 +224,7 @@ describe('SwapRouter', function () { // get balances before const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - console.log(path.slice(0, 3)); + await exactInput(path.slice(0, 3)); // get balances after @@ -279,7 +280,7 @@ describe('SwapRouter', function () { it('2 -> 1 -> 0', async () => { const traderBefore = await getBalances(trader.address); - await exactInput(tokens.map((token) => token.address).reverse(), 5, 1); + await exactInput(path.slice().reverse(), 5, 1); const traderAfter = await getBalances(trader.address); @@ -351,7 +352,7 @@ describe('SwapRouter', function () { it('WNativeToken -> 0 -> 1', async () => { const traderBefore = await getBalances(trader.address); - await expect(exactInput([await wnative.getAddress(), tokens[0].address, tokens[1].address], 5)) + await expect(exactInput([await wnative.getAddress(), ZERO_ADDRESS, tokens[0].address, ZERO_ADDRESS, tokens[1].address], 5)) .to.emit(wnative, 'Deposit') .withArgs(await router.getAddress(), 5); @@ -376,7 +377,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await expect(exactInput([tokens[0].address, await wnative.getAddress()])) + await expect(exactInput([tokens[0].address, ZERO_ADDRESS, await wnative.getAddress()])) .to.emit(wnative, 'Withdrawal') .withArgs(await router.getAddress(), 1); @@ -393,7 +394,7 @@ describe('SwapRouter', function () { // get balances before const traderBefore = await getBalances(trader.address); - await expect(exactInput([tokens[0].address, tokens[1].address, await wnative.getAddress()], 5)) + await expect(exactInput([tokens[0].address, ZERO_ADDRESS, tokens[1].address, ZERO_ADDRESS, await wnative.getAddress()], 5)) .to.emit(wnative, 'Withdrawal') .withArgs(await router.getAddress(), 1); @@ -714,6 +715,7 @@ describe('SwapRouter', function () { // ensure that the swap fails if the limit is any tighter params.amountInMaximum -= 1; + // router.connect(trader).exactOutput(params, { value }) await expect(router.connect(trader).exactOutput(params, { value })).to.be.revertedWith('Too much requested'); params.amountInMaximum += 1; @@ -724,7 +726,7 @@ describe('SwapRouter', function () { it('reverts if deadline passed', async () => { await expect( exactOutput( - tokens.slice(0, 2).map((token) => token.address), + path.slice(0, 3), 1, 3, 2 @@ -739,8 +741,10 @@ describe('SwapRouter', function () { // get balances before const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - - await exactOutput(tokens.slice(0, 2).map((token) => token.address)); + + console.log('path: ', path); + + await exactOutput(path.slice(0, 3)); // get balances after const poolAfter = await getBalances(pool); @@ -760,10 +764,9 @@ describe('SwapRouter', function () { const traderBefore = await getBalances(trader.address); await exactOutput( - tokens - .slice(0, 2) + path + .slice(0, 3) .reverse() - .map((token) => token.address) ); // get balances after @@ -782,7 +785,7 @@ describe('SwapRouter', function () { const traderBefore = await getBalances(trader.address); await exactOutput( - tokens.map((token) => token.address), + path, 1, 5 ); @@ -796,7 +799,7 @@ describe('SwapRouter', function () { it('2 -> 1 -> 0', async () => { const traderBefore = await getBalances(trader.address); - await exactOutput(tokens.map((token) => token.address).reverse(), 1, 5); + await exactOutput(path.slice().reverse(), 1, 5); const traderAfter = await getBalances(trader.address); @@ -807,7 +810,7 @@ describe('SwapRouter', function () { it('events', async () => { await expect( exactOutput( - tokens.map((token) => token.address), + path, 1, 5 ) @@ -846,7 +849,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await expect(exactOutput([await wnative.getAddress(), tokens[0].address])) + await expect(exactOutput([await wnative.getAddress(), ZERO_ADDRESS, tokens[0].address])) .to.emit(wnative, 'Deposit') .withArgs(await router.getAddress(), 3); @@ -862,7 +865,7 @@ describe('SwapRouter', function () { it('WNativeToken -> 0 -> 1', async () => { const traderBefore = await getBalances(trader.address); - await expect(exactOutput([await wnative.getAddress(), tokens[0].address, tokens[1].address], 1, 5)) + await expect(exactOutput([await wnative.getAddress(), ZERO_ADDRESS, tokens[0].address, ZERO_ADDRESS, tokens[1].address], 1, 5)) .to.emit(wnative, 'Deposit') .withArgs(await router.getAddress(), 5); @@ -887,7 +890,7 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - await expect(exactOutput([tokens[0].address, await wnative.getAddress()])) + await expect(exactOutput([tokens[0].address, ZERO_ADDRESS, await wnative.getAddress()])) .to.emit(wnative, 'Withdrawal') .withArgs(await router.getAddress(), 1); @@ -904,7 +907,7 @@ describe('SwapRouter', function () { // get balances before const traderBefore = await getBalances(trader.address); - await expect(exactOutput([tokens[0].address, tokens[1].address, await wnative.getAddress()], 1, 5)) + await expect(exactOutput([tokens[0].address, ZERO_ADDRESS, tokens[1].address, ZERO_ADDRESS, await wnative.getAddress()], 1, 5)) .to.emit(wnative, 'Withdrawal') .withArgs(await router.getAddress(), 1); @@ -1071,7 +1074,7 @@ describe('SwapRouter', function () { it('#sweepTokenWithFee', async () => { const amountOutMinimum = 100; const params = { - path: encodePath([tokens[0].address, tokens[1].address]), + path: encodePath([tokens[0].address, ZERO_ADDRESS, tokens[1].address]), recipient: await router.getAddress(), deadline: 1, amountIn: 102, @@ -1101,7 +1104,7 @@ describe('SwapRouter', function () { const amountOutMinimum = 100; const params = { - path: encodePath([tokens[0].address, await wnative.getAddress()]), + path: encodePath([tokens[0].address, ZERO_ADDRESS, await wnative.getAddress()]), recipient: await router.getAddress(), deadline: 1, amountIn: 102, diff --git a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap index 30c61f4f7..503f20852 100644 --- a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap +++ b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `13181`; +exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `13667`; diff --git a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap index 4f8984eec..d0899762a 100644 --- a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap +++ b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `750201`; +exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `750213`; diff --git a/src/periphery/test/shared/completeFixture.ts b/src/periphery/test/shared/completeFixture.ts index d5ceae224..5aebb5327 100644 --- a/src/periphery/test/shared/completeFixture.ts +++ b/src/periphery/test/shared/completeFixture.ts @@ -64,6 +64,11 @@ const completeFixture: () => Promise<{ tokens[1].address_ = await tokens[1].getAddress(); tokens[2].address_ = await tokens[2].getAddress(); + tokens.sort((tokenA: TestERC20WithAddress, tokenB: TestERC20WithAddress) => { + if (!tokenA.address_ || !tokenB.address_) return 0; + return tokenA.address_.toLowerCase() < tokenB.address_.toLowerCase() ? -1 : 1; + }); + const path: [string, string, string, string, string] = [ tokens[0].address_, ZERO_ADDRESS, // deployer @@ -72,11 +77,6 @@ const completeFixture: () => Promise<{ tokens[2].address_ ] - tokens.sort((tokenA: TestERC20WithAddress, tokenB: TestERC20WithAddress) => { - if (!tokenA.address_ || !tokenB.address_) return 0; - return tokenA.address_.toLowerCase() < tokenB.address_.toLowerCase() ? -1 : 1; - }); - const nftDescriptorLibraryFactory = await ethers.getContractFactory('NFTDescriptor'); const nftDescriptorLibrary = await nftDescriptorLibraryFactory.deploy(); const positionDescriptorFactory = await ethers.getContractFactory('NonfungibleTokenPositionDescriptor', { From 78d47e2909ec3f8c8502f0ed3a2f85a88767453f Mon Sep 17 00:00:00 2001 From: fourlen Date: Fri, 7 Jun 2024 20:10:13 +0300 Subject: [PATCH 04/17] snapshots --- src/farming/contracts/FarmingCenter.sol | 4 +- .../contracts/libraries/NFTPositionInfo.sol | 5 +- src/farming/package-lock.json | 50 +++++++++++++++++++ src/farming/test/helpers/index.ts | 5 +- src/farming/test/shared/fixtures.ts | 7 +-- .../__snapshots__/EternalFarms.spec.ts.snap | 4 +- src/periphery/contracts/SwapRouter.sol | 7 --- .../NonfungiblePositionManager.spec.ts.snap | 2 +- .../__snapshots__/SwapRouter.spec.ts.snap | 2 +- 9 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/farming/contracts/FarmingCenter.sol b/src/farming/contracts/FarmingCenter.sol index 722fee30c..b0c408f2e 100644 --- a/src/farming/contracts/FarmingCenter.sol +++ b/src/farming/contracts/FarmingCenter.sol @@ -84,7 +84,7 @@ contract FarmingCenter is IFarmingCenter, IPositionFollower, Multicall { bytes32 _eternalIncentiveId = deposits[tokenId]; if (_eternalIncentiveId != bytes32(0)) { address tokenOwner = nonfungiblePositionManager.ownerOf(tokenId); - (, , , , , , uint128 liquidity, , , , ) = nonfungiblePositionManager.positions(tokenId); + (, , , , , , , uint128 liquidity, , , , ) = nonfungiblePositionManager.positions(tokenId); IncentiveKey memory key = incentiveKeys[_eternalIncentiveId]; @@ -140,6 +140,6 @@ contract FarmingCenter is IFarmingCenter, IPositionFollower, Multicall { require(msg.sender == address(eternalFarming), 'Only farming can call this'); require(virtualPool != address(0), 'Zero address as virtual pool'); pool = IAlgebraPool(plugin.pool()); - require(address(pool) == PoolAddress.computeAddress(algebraPoolDeployer, PoolAddress.PoolKey(pool.token0(), pool.token1())), 'Invalid pool'); + require(address(pool) == PoolAddress.computeAddress(algebraPoolDeployer, PoolAddress.PoolKey(pool.token0(), pool.token1(), address(0))), 'Invalid pool'); } } diff --git a/src/farming/contracts/libraries/NFTPositionInfo.sol b/src/farming/contracts/libraries/NFTPositionInfo.sol index fd339c547..11e26f109 100644 --- a/src/farming/contracts/libraries/NFTPositionInfo.sol +++ b/src/farming/contracts/libraries/NFTPositionInfo.sol @@ -22,8 +22,9 @@ library NFTPositionInfo { ) internal view returns (IAlgebraPool pool, int24 tickLower, int24 tickUpper, uint128 liquidity) { address token0; address token1; - (, , token0, token1, tickLower, tickUpper, liquidity, , , , ) = nonfungiblePositionManager.positions(tokenId); + address pluginDeployer; + (, , token0, token1, pluginDeployer, tickLower, tickUpper, liquidity, , , , ) = nonfungiblePositionManager.positions(tokenId); - pool = IAlgebraPool(PoolAddress.computeAddress(address(deployer), PoolAddress.PoolKey({token0: token0, token1: token1}))); + pool = IAlgebraPool(PoolAddress.computeAddress(address(deployer), PoolAddress.PoolKey({token0: token0, token1: token1, deployer: pluginDeployer}))); } } diff --git a/src/farming/package-lock.json b/src/farming/package-lock.json index 961969a1e..70589eed9 100644 --- a/src/farming/package-lock.json +++ b/src/farming/package-lock.json @@ -9,6 +9,9 @@ "version": "1.1.0", "license": "GPL-3.0-or-later", "dependencies": { + "@cryptoalgebra/integral-base-plugin": "1.1.0", + "@cryptoalgebra/integral-core": "1.1.0", + "@cryptoalgebra/integral-periphery": "1.1.0", "@openzeppelin/contracts": "4.9.3" }, "devDependencies": { @@ -20,6 +23,45 @@ "npm": ">=8.0.0" } }, + "node_modules/@cryptoalgebra/integral-base-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@cryptoalgebra/integral-base-plugin/-/integral-base-plugin-1.1.0.tgz", + "integrity": "sha512-fWpdTjIf1VFLB+qQSU9TP7BdgWrRjlxIBVYEN4I8BtfIIwr8Ay3QrYYsUvI2FFdN2I5HroZLanmgYS0+IjXLDg==", + "dependencies": { + "@cryptoalgebra/integral-core": "1.1.0", + "@cryptoalgebra/integral-periphery": "1.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + } + }, + "node_modules/@cryptoalgebra/integral-core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@cryptoalgebra/integral-core/-/integral-core-1.1.0.tgz", + "integrity": "sha512-SESM8dIrNd2vkLsiYDBZxewmsz4ZyhfuVIe2SNTCCayl14W2dUbZ1y4qWRqSZ6JPKIFOHdrdLoNk+fFIC7Ukvg==", + "dependencies": { + "@openzeppelin/contracts": "4.9.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + } + }, + "node_modules/@cryptoalgebra/integral-periphery": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@cryptoalgebra/integral-periphery/-/integral-periphery-1.1.0.tgz", + "integrity": "sha512-Z+/FVtucH2GeoNuMcf+3Z859fNIOBNJTHSynu+UVV9NtMia9c7olEzcaPpyFkE7kynQgUcc+KffgE7KFDS0H+Q==", + "dependencies": { + "@cryptoalgebra/integral-core": "1.1.0", + "@openzeppelin/contracts": "4.9.3", + "@uniswap/v2-core": "1.0.1" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + } + }, "node_modules/@openzeppelin/contracts": { "version": "4.9.3", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", @@ -31,6 +73,14 @@ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, + "node_modules/@uniswap/v2-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", + "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "engines": { + "node": ">=10" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", diff --git a/src/farming/test/helpers/index.ts b/src/farming/test/helpers/index.ts index 91c408424..4e2cb9c6b 100644 --- a/src/farming/test/helpers/index.ts +++ b/src/farming/test/helpers/index.ts @@ -1,5 +1,5 @@ import { Wallet, MaxUint256, Interface } from 'ethers'; -import { blockTimestamp, BNe18, FeeAmount, getCurrentTick, maxGas, encodePath, arrayWrap, getMinTick, getMaxTick } from '../shared/index'; +import { blockTimestamp, BNe18, FeeAmount, getCurrentTick, maxGas, encodePath, arrayWrap, getMinTick, getMaxTick, ZERO_ADDRESS } from '../shared/index'; import _ from 'lodash'; import { TestERC20, INonfungiblePositionManager, AlgebraEternalFarming, IAlgebraPool, TestIncentiveId, FarmingCenter } from '../../typechain'; import abi from '../../artifacts/contracts/farmings/EternalVirtualPool.sol/EternalVirtualPool.json'; @@ -343,7 +343,7 @@ export class HelperCommands { const erc20Helper = new ERC20Helper(); await erc20Helper.ensureBalancesAndApprovals(actor, [tok0, tok1], amountIn, await this.router.getAddress()); - const path = encodePath(MAKE_TICK_GO_UP ? [tok1Address, tok0Address] : [tok0Address, tok1Address]); + const path = encodePath(MAKE_TICK_GO_UP ? [tok1Address, ZERO_ADDRESS, tok0Address] : [tok0Address, ZERO_ADDRESS, tok1Address]); await this.router.connect(actor).exactInput( { @@ -410,6 +410,7 @@ export class HelperCommands { deadline: MaxUint256, tokenIn: zto ? tok0Address : tok1Address, tokenOut: zto ? tok1Address : tok0Address, + deployer: ZERO_ADDRESS, amountIn: 2n ** 128n - 1n, amountOutMinimum: 0, limitSqrtPrice: priceAtTarget, diff --git a/src/farming/test/shared/fixtures.ts b/src/farming/test/shared/fixtures.ts index 09d476ba8..008bd967a 100644 --- a/src/farming/test/shared/fixtures.ts +++ b/src/farming/test/shared/fixtures.ts @@ -31,7 +31,7 @@ import { TestIncentiveId, FarmingCenter, } from '../../typechain'; -import { FeeAmount, encodePriceSqrt, MAX_GAS_LIMIT } from '../shared'; +import { FeeAmount, encodePriceSqrt, MAX_GAS_LIMIT, ZERO_ADDRESS } from '../shared'; import { ActorFixture } from './actors'; import { IBasePluginV1Factory, IAlgebraBasePluginV1 } from '@cryptoalgebra/integral-base-plugin/typechain'; @@ -182,6 +182,7 @@ export const mintPosition = async ( { token0: mintParams.token0, token1: mintParams.token1, + deployer: ZERO_ADDRESS, tickLower: mintParams.tickLower, tickUpper: mintParams.tickUpper, recipient: mintParams.recipient, @@ -272,9 +273,9 @@ export const algebraFixture: () => Promise = async () => { const fee = FeeAmount.MEDIUM; - await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[0], tokens[1], ZERO_ADDRESS, encodePriceSqrt(1, 1)); - await nft.createAndInitializePoolIfNecessary(tokens[1], tokens[2], encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokens[1], tokens[2], ZERO_ADDRESS, encodePriceSqrt(1, 1)); const pool01 = await factory.poolByPair(tokens[0], tokens[1]); diff --git a/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap b/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap index 51f80a875..65b55717d 100644 --- a/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap +++ b/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap @@ -2,6 +2,6 @@ exports[`unit/EternalFarms #claimReward when requesting the full amount has gas cost [ @skip-on-coverage ] 1`] = `60772`; -exports[`unit/EternalFarms #enterFarming works and has gas cost [ @skip-on-coverage ] 1`] = `494839`; +exports[`unit/EternalFarms #enterFarming works and has gas cost [ @skip-on-coverage ] 1`] = `497382`; -exports[`unit/EternalFarms #exitFarming after end time works and has gas cost [ @skip-on-coverage ] 1`] = `169695`; +exports[`unit/EternalFarms #exitFarming after end time works and has gas cost [ @skip-on-coverage ] 1`] = `169629`; diff --git a/src/periphery/contracts/SwapRouter.sol b/src/periphery/contracts/SwapRouter.sol index d58bb2eb8..f74590aa5 100644 --- a/src/periphery/contracts/SwapRouter.sol +++ b/src/periphery/contracts/SwapRouter.sol @@ -15,8 +15,6 @@ import './libraries/Path.sol'; import './libraries/PoolAddress.sol'; import './libraries/CallbackValidation.sol'; -import 'hardhat/console.sol'; - /// @title Algebra Integral 1.1 Swap Router /// @notice Router for stateless execution of swaps against Algebra /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: @@ -93,8 +91,6 @@ contract SwapRouter is bool zeroToOne = tokenIn < tokenOut; - console.log('deployer: ', deployer); - (int256 amount0, int256 amount1) = getPool(tokenIn, tokenOut, deployer).swap( recipient, zeroToOne, @@ -237,9 +233,6 @@ contract SwapRouter is // it's okay that the payer is fixed to msg.sender here, as they're only paying for the "final" exact output // swap, which happens first, and subsequent swaps are paid for within nested callback frames - console.log('path'); - console.logBytes(params.path); - exactOutputInternal( params.amountOut, params.recipient, diff --git a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index d28f11c42..a1de1e472 100644 --- a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -8,7 +8,7 @@ exports[`NonfungiblePositionManager #collect gas transfers token0 only [ @skip-o exports[`NonfungiblePositionManager #collect gas transfers token1 only [ @skip-on-coverage ] 1`] = `119163`; -exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `4813289`; +exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `4813126`; exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @skip-on-coverage ] 1`] = `169339`; diff --git a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap index 503f20852..d057d3c5b 100644 --- a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap +++ b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `13667`; +exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12902`; From a20a9fefcda3dcaf0a5778620de44fbbbffe90a5 Mon Sep 17 00:00:00 2001 From: fourlen Date: Fri, 7 Jun 2024 20:18:01 +0300 Subject: [PATCH 05/17] farming tests --- src/farming/test/unit/EternalFarms.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/farming/test/unit/EternalFarms.spec.ts b/src/farming/test/unit/EternalFarms.spec.ts index d04202957..6f337cdf6 100644 --- a/src/farming/test/unit/EternalFarms.spec.ts +++ b/src/farming/test/unit/EternalFarms.spec.ts @@ -1898,7 +1898,7 @@ describe('unit/EternalFarms', () => { await erc20Helper.ensureBalancesAndApprovals(lpUser0, [token0, token1], amountDesired, await context.nft.getAddress()); - await context.nft.createAndInitializePoolIfNecessary(token0, token1, encodePriceSqrt(1, 1)); + await context.nft.createAndInitializePoolIfNecessary(token0, token1, ZERO_ADDRESS, encodePriceSqrt(1, 1)); const poolAddress = await context.factory.poolByPair(token0, token1); @@ -1958,6 +1958,7 @@ describe('unit/EternalFarms', () => { const swapData = { tokenIn: tokenReentrant, tokenOut: context.token1, + deployer: ZERO_ADDRESS, amountIn: 10, amountOutMinimum: 0, recipient: lpUser0.address, From 0ca8d962d0c68642a3d64e4d87e7b5807dd08839 Mon Sep 17 00:00:00 2001 From: fourlen Date: Tue, 11 Jun 2024 13:57:03 +0300 Subject: [PATCH 06/17] tests --- .../contracts/base/PoolInitializer.sol | 10 ++- src/periphery/contracts/lens/Quoter.sol | 13 +++ .../contracts/libraries/PoolAddress.sol | 7 +- src/periphery/contracts/test/MockPlugin.sol | 86 +++++++++++++++++++ .../contracts/test/MockPluginFactory.sol | 41 +++++++++ src/periphery/test/CallbackValidation.spec.ts | 1 + src/periphery/test/Path.spec.ts | 4 +- src/periphery/test/Quoter.spec.ts | 17 +++- src/periphery/test/QuoterV2.spec.ts | 33 ++++--- src/periphery/test/SwapRouter.spec.ts | 27 +++--- .../__snapshots__/NFTDescriptor.spec.ts.snap | 2 +- .../NonfungiblePositionManager.spec.ts.snap | 10 +-- .../test/__snapshots__/QuoterV2.spec.ts.snap | 28 +++--- .../__snapshots__/SwapRouter.spec.ts.snap | 2 +- src/periphery/test/shared/completeFixture.ts | 39 +++++++-- .../test/shared/computePoolAddress.ts | 15 ++++ src/periphery/test/shared/quoter.ts | 7 +- 17 files changed, 278 insertions(+), 64 deletions(-) create mode 100644 src/periphery/contracts/test/MockPlugin.sol create mode 100644 src/periphery/contracts/test/MockPluginFactory.sol diff --git a/src/periphery/contracts/base/PoolInitializer.sol b/src/periphery/contracts/base/PoolInitializer.sol index 55390acd8..1c72e3ab4 100644 --- a/src/periphery/contracts/base/PoolInitializer.sol +++ b/src/periphery/contracts/base/PoolInitializer.sol @@ -8,6 +8,8 @@ import '../interfaces/IPoolInitializer.sol'; import '../libraries/PoolInteraction.sol'; +import 'hardhat/console.sol'; + /// @title Creates and initializes Algebra Pools /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: /// https://github.com/Uniswap/v3-periphery @@ -23,16 +25,20 @@ abstract contract PoolInitializer is IPoolInitializer, PeripheryImmutableState { ) external payable override returns (address pool) { require(token0 < token1, 'Invalid order of tokens'); - pool = IAlgebraFactory(factory).poolByPair(token0, token1); + pool = deployer == address(0) ? IAlgebraFactory(factory).poolByPair(token0, token1) : IAlgebraFactory(factory).customPoolByPair(deployer, token0, token1); if (pool == address(0)) { if (deployer == address(0)) { pool = IAlgebraFactory(factory).createPool(token0, token1); } else { + console.log(1); + console.log('factory: ', factory); pool = IAlgebraFactory(factory).createCustomPool(deployer, msg.sender, token0, token1, ''); + console.log(2); } - + console.log(3); _initializePool(pool, sqrtPriceX96); + console.log(4); } else { uint160 sqrtPriceX96Existing = IAlgebraPool(pool)._getSqrtPrice(); if (sqrtPriceX96Existing == 0) { diff --git a/src/periphery/contracts/lens/Quoter.sol b/src/periphery/contracts/lens/Quoter.sol index 310b0d29a..e333b5911 100644 --- a/src/periphery/contracts/lens/Quoter.sol +++ b/src/periphery/contracts/lens/Quoter.sol @@ -14,6 +14,8 @@ import '../libraries/Path.sol'; import '../libraries/PoolAddress.sol'; import '../libraries/CallbackValidation.sol'; +import 'hardhat/console.sol'; + /// @title Algebra Integral 1.1 Quoter /// @notice Allows getting the expected amount out or amount in for a given swap without executing the swap /// @dev These functions are not gas efficient and should _not_ be called on chain. Instead, optimistically execute @@ -90,6 +92,17 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { ) public override returns (uint256 amountOut, uint16 fee) { bool zeroToOne = tokenIn < tokenOut; + { + address pooladdress = address(getPool(tokenIn, tokenOut, deployer)); + console.log('pool in quoter: ', pooladdress); + console.log('deployer in quter: ', deployer); + uint256 cs; + assembly { + cs := extcodesize(pooladdress) + } + console.log('pool codesize: ', cs); + } + try getPool(tokenIn, tokenOut, deployer).swap( address(this), // address(0) might cause issues with some tokens diff --git a/src/periphery/contracts/libraries/PoolAddress.sol b/src/periphery/contracts/libraries/PoolAddress.sol index 3d95b54bf..f6958f965 100644 --- a/src/periphery/contracts/libraries/PoolAddress.sol +++ b/src/periphery/contracts/libraries/PoolAddress.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; +import 'hardhat/console.sol'; + /// @title Provides functions for deriving a pool address from the poolDeployer and tokens /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: /// https://github.com/Uniswap/v3-periphery @@ -45,6 +47,9 @@ library PoolAddress { ) ); } else { + console.log('token0: ', key.token0); + console.log('token1: ', key.token1); + console.log('deployer: ', key.deployer); pool = address( uint160( uint256( @@ -52,7 +57,7 @@ library PoolAddress { abi.encodePacked( hex'ff', poolDeployer, - keccak256(abi.encode(key.token0, key.token1, key.deployer)), + keccak256(abi.encode(key.deployer, key.token0, key.token1)), POOL_INIT_CODE_HASH ) ) diff --git a/src/periphery/contracts/test/MockPlugin.sol b/src/periphery/contracts/test/MockPlugin.sol new file mode 100644 index 000000000..25f5672d9 --- /dev/null +++ b/src/periphery/contracts/test/MockPlugin.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.20; + +import '@cryptoalgebra/integral-core/contracts/interfaces/plugin/IAlgebraPlugin.sol'; + +/// @title Algebra Integral 1.1 default plugin factory +/// @notice This contract creates Algebra default plugins for Algebra liquidity pools +/// @dev This plugin factory can only be used for Algebra base pools +contract MockPlugin is IAlgebraPlugin { + function defaultPluginConfig() external view returns (uint8) { + return 0; + } + + function beforeInitialize(address sender, uint160 sqrtPriceX96) external returns (bytes4) { + return IAlgebraPlugin.beforeInitialize.selector; + } + + function afterInitialize(address sender, uint160 sqrtPriceX96, int24 tick) external returns (bytes4) { + return IAlgebraPlugin.afterInitialize.selector; + } + + function beforeModifyPosition( + address sender, + address recipient, + int24 bottomTick, + int24 topTick, + int128 desiredLiquidityDelta, + bytes calldata data + ) external returns (bytes4) { + return IAlgebraPlugin.beforeModifyPosition.selector; + } + + function afterModifyPosition( + address sender, + address recipient, + int24 bottomTick, + int24 topTick, + int128 desiredLiquidityDelta, + uint256 amount0, + uint256 amount1, + bytes calldata data + ) external returns (bytes4) { + return IAlgebraPlugin.afterModifyPosition.selector; + } + + function beforeSwap( + address sender, + address recipient, + bool zeroToOne, + int256 amountRequired, + uint160 limitSqrtPrice, + bool withPaymentInAdvance, + bytes calldata data + ) external returns (bytes4) { + return IAlgebraPlugin.beforeSwap.selector; + } + + function afterSwap( + address sender, + address recipient, + bool zeroToOne, + int256 amountRequired, + uint160 limitSqrtPrice, + int256 amount0, + int256 amount1, + bytes calldata data + ) external returns (bytes4) { + return IAlgebraPlugin.afterSwap.selector; + } + + function beforeFlash(address sender, address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external returns (bytes4) { + return IAlgebraPlugin.beforeFlash.selector; + } + + function afterFlash( + address sender, + address recipient, + uint256 amount0, + uint256 amount1, + uint256 paid0, + uint256 paid1, + bytes calldata data + ) external returns (bytes4) { + return IAlgebraPlugin.afterFlash.selector; + } +} diff --git a/src/periphery/contracts/test/MockPluginFactory.sol b/src/periphery/contracts/test/MockPluginFactory.sol new file mode 100644 index 000000000..d6bd54492 --- /dev/null +++ b/src/periphery/contracts/test/MockPluginFactory.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.20; + +import './MockPlugin.sol'; + +import '@cryptoalgebra/integral-core/contracts/interfaces/plugin/IAlgebraPluginFactory.sol'; +import '@cryptoalgebra/integral-core/contracts/interfaces/IAlgebraFactory.sol'; + +contract MockPluginFactory is IAlgebraPluginFactory { + + address public immutable algebraFactory; + + mapping(address poolAddress => address pluginAddress) public pluginByPool; + + constructor(address _algebraFactory) { + algebraFactory = _algebraFactory; + } + + /// @inheritdoc IAlgebraPluginFactory + function beforeCreatePoolHook(address pool, address, address, address, address, bytes calldata) external override returns (address) { + require(msg.sender == algebraFactory); + return _createPlugin(pool); + } + +// function createPluginForExistingPool(address token0, address token1) external override returns (address) { +// IAlgebraFactory factory = IAlgebraFactory(algebraFactory); +// require(factory.hasRoleOrOwner(factory.POOLS_ADMINISTRATOR_ROLE(), msg.sender)); + +// address pool = factory.poolByPair(token0, token1); +// require(pool != address(0), 'Pool not exist'); + +// return _createPlugin(pool); +// } + + function _createPlugin(address pool) internal returns (address) { + require(pluginByPool[pool] == address(0), 'Already created'); + MockPlugin mockPlugin = new MockPlugin(); + pluginByPool[pool] = address(mockPlugin); + return address(mockPlugin); + } +} diff --git a/src/periphery/test/CallbackValidation.spec.ts b/src/periphery/test/CallbackValidation.spec.ts index fba45a7f9..165d1734a 100644 --- a/src/periphery/test/CallbackValidation.spec.ts +++ b/src/periphery/test/CallbackValidation.spec.ts @@ -6,6 +6,7 @@ import { expect } from './shared/expect'; import { TestERC20, TestCallbackValidation } from '../typechain'; export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' +export const PLUGIN_DEPLOYER_ADDRESS = '0x4d55ce59980Fb4e5C4C1c450F478587e9F52a18B'; describe('CallbackValidation', () => { let nonpairAddr: Wallet; diff --git a/src/periphery/test/Path.spec.ts b/src/periphery/test/Path.spec.ts index e6ca2ddd5..1876bfc3f 100644 --- a/src/periphery/test/Path.spec.ts +++ b/src/periphery/test/Path.spec.ts @@ -8,7 +8,7 @@ import { PathTest } from '../typechain'; import { decodePath, encodePath } from './shared/path'; import snapshotGasCost from './shared/snapshotGasCost'; -import { ZERO_ADDRESS } from './CallbackValidation.spec'; +import { ZERO_ADDRESS, PLUGIN_DEPLOYER_ADDRESS } from './CallbackValidation.spec'; describe('Path', () => { let path: PathTest; @@ -17,7 +17,7 @@ describe('Path', () => { '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707', ZERO_ADDRESS, '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', - ZERO_ADDRESS, + PLUGIN_DEPLOYER_ADDRESS, '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9', ]; let fees = [FeeAmount.MEDIUM, FeeAmount.MEDIUM]; diff --git a/src/periphery/test/Quoter.spec.ts b/src/periphery/test/Quoter.spec.ts index 37f4f02e0..e889bc4e5 100644 --- a/src/periphery/test/Quoter.spec.ts +++ b/src/periphery/test/Quoter.spec.ts @@ -2,11 +2,15 @@ import { Wallet, ContractTransactionResponse, MaxUint256, ZeroAddress } from 'et import { ethers } from 'hardhat'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { + AlgebraCustomPoolEntryPoint, + CustomPoolDeployerTest, IAlgebraFactory, IAlgebraPool, IWNativeToken, + MockPluginFactory, MockTimeNonfungiblePositionManager, MockTimeSwapRouter, + PoolAddressTest, Quoter, TestERC20, } from '../typechain'; @@ -28,6 +32,7 @@ describe('Quoter', () => { const swapRouterFixture: () => Promise<{ nft: MockTimeNonfungiblePositionManager; tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + customPoolDeployer: CustomPoolDeployerTest; path: [string, string, string, string, string]; quoter: Quoter; router: MockTimeSwapRouter; @@ -35,7 +40,7 @@ describe('Quoter', () => { factory: IAlgebraFactory; }> = async () => { let _tokens; - const { wnative, factory, router, tokens, path, nft } = await loadFixture(completeFixture); + const { wnative, factory, router, tokens, customPoolDeployer, path, nft } = await loadFixture(completeFixture); _tokens = tokens as [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; // approve & fund wallets @@ -53,6 +58,7 @@ describe('Quoter', () => { return { tokens: _tokens, path: path, + customPoolDeployer: customPoolDeployer, nft, quoter, router, @@ -76,9 +82,12 @@ describe('Quoter', () => { describe('quotes', () => { const subFixture = async () => { - const { tokens, path, nft, quoter, router, wnative, factory } = await swapRouterFixture(); - const pool0 = await createPool(nft, wallet, await tokens[0].getAddress(), await tokens[1].getAddress()); - await createPool(nft, wallet, await tokens[1].getAddress(), await tokens[2].getAddress()); + const { tokens, customPoolDeployer, path, nft, quoter, router, wnative, factory } = await swapRouterFixture(); + const pool0 = await createPool(nft, wallet, await tokens[0].getAddress(), await tokens[1].getAddress(), ZERO_ADDRESS); + + await customPoolDeployer.createCustomPool(customPoolDeployer, wallet.address, await tokens[1].getAddress(), await tokens[2].getAddress(), '0x'); + await createPool(nft, wallet, await tokens[1].getAddress(), await tokens[2].getAddress(), await customPoolDeployer.getAddress()); + return { tokens, path, nft, quoter, router, wnative, factory }; }; diff --git a/src/periphery/test/QuoterV2.spec.ts b/src/periphery/test/QuoterV2.spec.ts index 77342e91e..df2b35784 100644 --- a/src/periphery/test/QuoterV2.spec.ts +++ b/src/periphery/test/QuoterV2.spec.ts @@ -1,7 +1,7 @@ import { MaxUint256, Wallet } from 'ethers'; import { ethers } from 'hardhat'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { IAlgebraFactory, MockTimeNonfungiblePositionManager, QuoterV2, TestERC20 } from '../typechain'; +import { CustomPoolDeployerTest, IAlgebraFactory, MockTimeNonfungiblePositionManager, QuoterV2, TestERC20 } from '../typechain'; import completeFixture from './shared/completeFixture'; import { MaxUint128 } from './shared/constants'; import { encodePriceSqrt } from './shared/encodePriceSqrt'; @@ -22,10 +22,12 @@ describe('QuoterV2', function () { const swapRouterFixture: () => Promise<{ nft: MockTimeNonfungiblePositionManager; tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + customPoolDeployer: CustomPoolDeployerTest; + path: [string, string, string, string, string]; quoter: QuoterV2; factory: IAlgebraFactory; }> = async () => { - const { wnative, factory, router, tokens, nft } = await loadFixture(completeFixture); + const { wnative, factory, router, tokens, customPoolDeployer, path, nft } = await loadFixture(completeFixture); let _tokens = tokens as [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; // approve & fund wallets for (const token of _tokens) { @@ -41,6 +43,8 @@ describe('QuoterV2', function () { return { tokens: _tokens, + customPoolDeployer: customPoolDeployer, + path: path, nft, quoter, factory, @@ -49,6 +53,7 @@ describe('QuoterV2', function () { let nft: MockTimeNonfungiblePositionManager; let tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; + let path: [string, string, string, string, string]; let quoter: QuoterV2; let factory: IAlgebraFactory; @@ -59,12 +64,15 @@ describe('QuoterV2', function () { describe('quotes', () => { const subFixture = async () => { - const { tokens, nft, quoter, factory } = await swapRouterFixture(); - await createPool(nft, wallet, tokens[0].address, tokens[1].address); - await createPool(nft, wallet, tokens[1].address, tokens[2].address); + const { tokens, customPoolDeployer, path, nft, quoter, factory } = await swapRouterFixture(); + await createPool(nft, wallet, tokens[0].address, tokens[1].address, ZERO_ADDRESS); + + await customPoolDeployer.createCustomPool(customPoolDeployer, wallet.address, await tokens[1].getAddress(), await tokens[2].getAddress(), '0x'); + await createPool(nft, wallet, tokens[1].address, tokens[2].address, await customPoolDeployer.getAddress()); await createPoolWithMultiplePositions(nft, wallet, tokens[0].address, tokens[2].address); return { tokens, + path, nft, quoter, factory, @@ -72,7 +80,7 @@ describe('QuoterV2', function () { }; beforeEach(async () => { - ({ tokens, nft, quoter, factory } = await loadFixture(subFixture)); + ({ tokens, path, nft, quoter, factory } = await loadFixture(subFixture)); }); describe('#quoteExactInput', () => { @@ -206,7 +214,8 @@ describe('QuoterV2', function () { it('2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactInput.staticCall(encodePath([tokens[2].address, ZERO_ADDRESS, tokens[1].address]), 10000); + + await quoter.quoteExactInput.staticCall(encodePath([path[4], path[3], path[2]]), 10000); ////await snapshotGasCost(gasEstimate) expect(sqrtPriceX96AfterList.length).to.eq(1); @@ -219,7 +228,7 @@ describe('QuoterV2', function () { it('0 -> 2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = await quoter.quoteExactInput.staticCall( - encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address, ZERO_ADDRESS, tokens[1].address]), + encodePath([path[0], ZERO_ADDRESS, path[4], path[3], path[2]]), 10000 ); @@ -438,7 +447,7 @@ describe('QuoterV2', function () { it('2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = - await quoter.quoteExactOutput.staticCall(encodePath([tokens[1].address, ZERO_ADDRESS, tokens[2].address]), 9897); + await quoter.quoteExactOutput.staticCall(encodePath([path[2], path[3], path[4]]), 9897); expect(sqrtPriceX96AfterList.length).to.eq(1); expect(sqrtPriceX96AfterList[0]).to.eq('80020121658316697953186638498'); @@ -450,7 +459,7 @@ describe('QuoterV2', function () { it('0 -> 2 -> 1', async () => { const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address, ZERO_ADDRESS, tokens[1].address].reverse()), + encodePath([path[0], ZERO_ADDRESS, path[4], path[3], path[2]].reverse()), 9795 ); @@ -544,7 +553,7 @@ describe('QuoterV2', function () { it('2 -> 1', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[1].address, ZERO_ADDRESS, tokens[2].address]), + encodePath([path[2], path[3], path[4]]), 9897 ); @@ -553,7 +562,7 @@ describe('QuoterV2', function () { it('0 -> 2 -> 1', async () => { const { gasEstimate } = await quoter.quoteExactOutput.staticCall( - encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address, ZERO_ADDRESS, tokens[1].address].reverse()), + encodePath([path[0], ZERO_ADDRESS, path[4], path[3], path[2]].reverse()), 9795 ); diff --git a/src/periphery/test/SwapRouter.spec.ts b/src/periphery/test/SwapRouter.spec.ts index 9b870fe71..c6ffc337a 100644 --- a/src/periphery/test/SwapRouter.spec.ts +++ b/src/periphery/test/SwapRouter.spec.ts @@ -9,7 +9,7 @@ import { expandTo18Decimals } from './shared/expandTo18Decimals'; import { expect } from './shared/expect'; import { encodePath } from './shared/path'; import { getMaxTick, getMinTick } from './shared/ticks'; -import { computePoolAddress } from './shared/computePoolAddress'; +import { computePoolAddress, computeCustomPoolAddress } from './shared/computePoolAddress'; import { ZERO_ADDRESS } from './CallbackValidation.spec'; type TestERC20WithAddress = TestERC20 & { address: string }; @@ -39,17 +39,18 @@ describe('SwapRouter', function () { _nft: MockTimeNonfungiblePositionManager, _wallet: Wallet, tokenAddressA: string, - tokenAddressB: string + tokenAddressB: string, + deployer: string ) { if (tokenAddressA.toLowerCase() > tokenAddressB.toLowerCase()) [tokenAddressA, tokenAddressB] = [tokenAddressB, tokenAddressA]; - await _nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, ZERO_ADDRESS, encodePriceSqrt(1, 1)); + await _nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, deployer, encodePriceSqrt(1, 1)); const liquidityParams = { token0: tokenAddressA, token1: tokenAddressB, - deployer: ZERO_ADDRESS, + deployer: deployer, fee: FeeAmount.MEDIUM, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), @@ -72,7 +73,7 @@ describe('SwapRouter', function () { tokens: [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; path: [string, string, string, string, string]; }> = async () => { - const { wnative, factory, router, tokens, path, nft } = await loadFixture(completeFixture); + const { wnative, factory, router, tokens, customPoolDeployer, path, nft } = await loadFixture(completeFixture); let _tokens = tokens as [TestERC20WithAddress, TestERC20WithAddress, TestERC20WithAddress]; // approve & fund wallets @@ -84,9 +85,11 @@ describe('SwapRouter', function () { token.address = await token.getAddress(); } - await createPool(nft, wallet, _tokens[0].address, _tokens[1].address); - await createPool(nft, wallet, _tokens[1].address, _tokens[2].address); + await createPool(nft, wallet, _tokens[0].address, _tokens[1].address, ZERO_ADDRESS); + await customPoolDeployer.createCustomPool(customPoolDeployer, wallet.address, _tokens[1].getAddress(), _tokens[2].getAddress(), '0x'); + await createPool(nft, wallet, _tokens[1].address, _tokens[2].address, await customPoolDeployer.getAddress()); + return { wnative, factory: factory as any as Contract, @@ -100,7 +103,7 @@ describe('SwapRouter', function () { async function createPoolWNativeToken(tokenAddress: string) { await wnative.deposit({ value: liquidity }); await wnative.approve(nft, MaxUint256); - return createPool(nft, wallet, await wnative.getAddress(), tokenAddress); + return createPool(nft, wallet, await wnative.getAddress(), tokenAddress, ZERO_ADDRESS); } before('create fixture loader', async () => { @@ -311,12 +314,12 @@ describe('SwapRouter', function () { .to.emit(tokens[1], 'Transfer') .withArgs( await router.getAddress(), - computePoolAddress(await factory.poolDeployer(), [tokens[1].address, tokens[2].address]), + computeCustomPoolAddress(await factory.poolDeployer(), [path[2], path[3], path[4]]), 3 ) .to.emit(tokens[2], 'Transfer') .withArgs( - computePoolAddress(await factory.poolDeployer(), [tokens[1].address, tokens[2].address]), + computeCustomPoolAddress(await factory.poolDeployer(), [path[2], path[3], path[4]]), trader.address, 1 ); @@ -817,14 +820,14 @@ describe('SwapRouter', function () { ) .to.emit(tokens[2], 'Transfer') .withArgs( - computePoolAddress(await factory.poolDeployer(), [tokens[2].address, tokens[1].address]), + computeCustomPoolAddress(await factory.poolDeployer(), [path[4], path[3], path[2]]), trader.address, 1 ) .to.emit(tokens[1], 'Transfer') .withArgs( computePoolAddress(await factory.poolDeployer(), [tokens[1].address, tokens[0].address]), - computePoolAddress(await factory.poolDeployer(), [tokens[2].address, tokens[1].address]), + computeCustomPoolAddress(await factory.poolDeployer(), [path[4], path[3], path[2]]), 3 ) .to.emit(tokens[0], 'Transfer') diff --git a/src/periphery/test/__snapshots__/NFTDescriptor.spec.ts.snap b/src/periphery/test/__snapshots__/NFTDescriptor.spec.ts.snap index bf5e38ffd..220eae991 100644 --- a/src/periphery/test/__snapshots__/NFTDescriptor.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NFTDescriptor.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`NFTDescriptor #constructTokenURI gas [ @skip-on-coverage ] 1`] = `1615600`; +exports[`NFTDescriptor #constructTokenURI gas [ @skip-on-coverage ] 1`] = `1617761`; exports[`NFTDescriptor #constructTokenURI snapshot matches 1`] = `"data:application/json;base64,eyJuYW1lIjoiQWxnZWJyYSAtIFVOSS9XTmF0aXZlVG9rZW4gLSAxLjAwMDA8PjEuMTA1MiIsICJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYSBsaXF1aWRpdHkgcG9zaXRpb24gaW4gYSBBbGdlYnJhIFVOSS1XTmF0aXZlVG9rZW4gcG9vbC4gVGhlIG93bmVyIG9mIHRoaXMgTkZUIGNhbiBtb2RpZnkgb3IgcmVkZWVtIHRoZSBwb3NpdGlvbi5cblxuUG9vbCBBZGRyZXNzOiAweGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJcblVOSSBBZGRyZXNzOiAweGFiY2RlYWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZGVmYWJjZGZcbldOYXRpdmVUb2tlbiBBZGRyZXNzOiAweDEyMzQ1Njc4OTAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Nzg5MDFcblRva2VuIElEOiAxXG5cbuKaoO+4jyBESVNDTEFJTUVSOiBEdWUgZGlsaWdlbmNlIGlzIGltcGVyYXRpdmUgd2hlbiBhc3Nlc3NpbmcgdGhpcyBORlQuIE1ha2Ugc3VyZSB0b2tlbiBhZGRyZXNzZXMgbWF0Y2ggdGhlIGV4cGVjdGVkIHRva2VucywgYXMgdG9rZW4gc3ltYm9scyBtYXkgYmUgaW1pdGF0ZWQuIiwgImltYWdlIjogImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1qa3dJaUJvWldsbmFIUTlJalV3TUNJZ2RtbGxkMEp2ZUQwaU1DQXdJREk1TUNBMU1EQWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdlRzFzYm5NNmVHeHBibXM5SjJoMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZlR3hwYm1zblBqeGtaV1p6UGp4bWFXeDBaWElnYVdROUltWXhJajQ4Wm1WSmJXRm5aU0J5WlhOMWJIUTlJbkF3SWlCNGJHbHVhenBvY21WbVBTSmtZWFJoT21sdFlXZGxMM04yWnl0NGJXdzdZbUZ6WlRZMExGQklUakphZVVJellWZFNNR0ZFTUc1TmFtdDNTbmxDYjFwWGJHNWhTRkU1U25wVmQwMURZMmRrYld4c1pEQktkbVZFTUc1TlEwRjNTVVJKTlUxRFFURk5SRUZ1U1Vob2RHSkhOWHBRVTJSdlpFaFNkMDlwT0haa00yUXpURzVqZWt4dE9YbGFlVGg1VFVSQmQwd3pUakphZVdNclVFaEtiRmt6VVdka01teHJaRWRuT1VwNlNUVk5TRUkwU25sQ2IxcFhiRzVoU0ZFNVNucFZkMDFJUWpSS2VVSnRZVmQ0YzFCVFkycFpWMHBxV2tkV2FFcDVPQ3RRUXpsNlpHMWpLeUl2UGp4bVpVbHRZV2RsSUhKbGMzVnNkRDBpY0RFaUlIaHNhVzVyT21oeVpXWTlJbVJoZEdFNmFXMWhaMlV2YzNabkszaHRiRHRpWVhObE5qUXNVRWhPTWxwNVFqTmhWMUl3WVVRd2JrMXFhM2RLZVVKdldsZHNibUZJVVRsS2VsVjNUVU5qWjJSdGJHeGtNRXAyWlVRd2JrMURRWGRKUkVrMVRVTkJNVTFFUVc1SlNHaDBZa2MxZWxCVFpHOWtTRkozVDJrNGRtUXpaRE5NYm1ONlRHMDVlVnA1T0hsTlJFRjNURE5PTWxwNVl5dFFSMDV3WTIxT2MxcFRRbXBsUkRCdVRXcFpORXA1UW1wbFZEQnVUV3BWTVVwNVFubFFVMk40VFdwQ2QyVkRZMmRhYld4ellrUXdia2w2UlhsTmVsRXhUbWxqZGxCcWQzWmpNMXB1VUdjOVBTSXZQanhtWlVsdFlXZGxJSEpsYzNWc2REMGljRElpSUhoc2FXNXJPbWh5WldZOUltUmhkR0U2YVcxaFoyVXZjM1puSzNodGJEdGlZWE5sTmpRc1VFaE9NbHA1UWpOaFYxSXdZVVF3YmsxcWEzZEtlVUp2V2xkc2JtRklVVGxLZWxWM1RVTmpaMlJ0Ykd4a01FcDJaVVF3YmsxRFFYZEpSRWsxVFVOQk1VMUVRVzVKU0doMFlrYzFlbEJUWkc5a1NGSjNUMms0ZG1RelpETk1ibU42VEcwNWVWcDVPSGxOUkVGM1RETk9NbHA1WXl0UVIwNXdZMjFPYzFwVFFtcGxSREJ1VFdwQk1rcDVRbXBsVkRCdVRWUlZlVXA1UW5sUVUyTjRUV3BDZDJWRFkyZGFiV3h6WWtRd2Jra3lXbWhaYlU1cldtbGpkbEJxZDNaak0xcHVVR2M5UFNJZ0x6NDhabVZKYldGblpTQnlaWE4xYkhROUluQXpJaUI0YkdsdWF6cG9jbVZtUFNKa1lYUmhPbWx0WVdkbEwzTjJaeXQ0Yld3N1ltRnpaVFkwTEZCSVRqSmFlVUl6WVZkU01HRkVNRzVOYW10M1NubENiMXBYYkc1aFNGRTVTbnBWZDAxRFkyZGtiV3hzWkRCS2RtVkVNRzVOUTBGM1NVUkpOVTFEUVRGTlJFRnVTVWhvZEdKSE5YcFFVMlJ2WkVoU2QwOXBPSFprTTJRelRHNWpla3h0T1hsYWVUaDVUVVJCZDB3elRqSmFlV01yVUVkT2NHTnRUbk5hVTBKcVpVUXdiazFxVVhkS2VVSnFaVlF3YmsxNlFUSktlVUo1VUZOamVFMUVRbmRsUTJObldtMXNjMkpFTUc1SmVsa3pUMFJyZDAxVFkzWlFhbmQyWXpOYWJsQm5QVDBpSUM4K1BHWmxRbXhsYm1RZ2JXOWtaVDBpYjNabGNteGhlU0lnYVc0OUluQXdJaUJwYmpJOUluQXhJaUF2UGp4bVpVSnNaVzVrSUcxdlpHVTlJbVY0WTJ4MWMybHZiaUlnYVc0eVBTSndNaUlnTHo0OFptVkNiR1Z1WkNCdGIyUmxQU0p2ZG1WeWJHRjVJaUJwYmpJOUluQXpJaUJ5WlhOMWJIUTlJbUpzWlc1a1QzVjBJaUF2UGp4bVpVZGhkWE56YVdGdVFteDFjaUJwYmowaVlteGxibVJQZFhRaUlITjBaRVJsZG1saGRHbHZiajBpTkRJaUlDOCtQQzltYVd4MFpYSStJRHhqYkdsd1VHRjBhQ0JwWkQwaVkyOXlibVZ5Y3lJK1BISmxZM1FnZDJsa2RHZzlJakk1TUNJZ2FHVnBaMmgwUFNJMU1EQWlJSEo0UFNJME1pSWdjbms5SWpReUlpQXZQand2WTJ4cGNGQmhkR2crUEhCaGRHZ2dhV1E5SW5SbGVIUXRjR0YwYUMxaElpQmtQU0pOTkRBZ01USWdTREkxTUNCQk1qZ2dNamdnTUNBd0lERWdNamM0SURRd0lGWTBOakFnUVRJNElESTRJREFnTUNBeElESTFNQ0EwT0RnZ1NEUXdJRUV5T0NBeU9DQXdJREFnTVNBeE1pQTBOakFnVmpRd0lFRXlPQ0F5T0NBd0lEQWdNU0EwTUNBeE1pQjZJaUF2UGp4d1lYUm9JR2xrUFNKdGFXNXBiV0Z3SWlCa1BTSk5Nak0wSURRME5FTXlNelFnTkRVM0xqazBPU0F5TkRJdU1qRWdORFl6SURJMU15QTBOak1pSUM4K1BHWnBiSFJsY2lCcFpEMGlkRzl3TFhKbFoybHZiaTFpYkhWeUlqNDhabVZIWVhWemMybGhia0pzZFhJZ2FXNDlJbE52ZFhKalpVZHlZWEJvYVdNaUlITjBaRVJsZG1saGRHbHZiajBpTWpRaUlDOCtQQzltYVd4MFpYSStQR3hwYm1WaGNrZHlZV1JwWlc1MElHbGtQU0puY21Ga0xYVndJaUI0TVQwaU1TSWdlREk5SWpBaUlIa3hQU0l4SWlCNU1qMGlNQ0krUEhOMGIzQWdiMlptYzJWMFBTSXdMakFpSUhOMGIzQXRZMjlzYjNJOUluZG9hWFJsSWlCemRHOXdMVzl3WVdOcGRIazlJakVpSUM4K1BITjBiM0FnYjJabWMyVjBQU0l1T1NJZ2MzUnZjQzFqYjJ4dmNqMGlkMmhwZEdVaUlITjBiM0F0YjNCaFkybDBlVDBpTUNJZ0x6NDhMMnhwYm1WaGNrZHlZV1JwWlc1MFBqeHNhVzVsWVhKSGNtRmthV1Z1ZENCcFpEMGlaM0poWkMxa2IzZHVJaUI0TVQwaU1DSWdlREk5SWpFaUlIa3hQU0l3SWlCNU1qMGlNU0krUEhOMGIzQWdiMlptYzJWMFBTSXdMakFpSUhOMGIzQXRZMjlzYjNJOUluZG9hWFJsSWlCemRHOXdMVzl3WVdOcGRIazlJakVpSUM4K1BITjBiM0FnYjJabWMyVjBQU0l3TGpraUlITjBiM0F0WTI5c2IzSTlJbmRvYVhSbElpQnpkRzl3TFc5d1lXTnBkSGs5SWpBaUlDOCtQQzlzYVc1bFlYSkhjbUZrYVdWdWRENDhiV0Z6YXlCcFpEMGlabUZrWlMxMWNDSWdiV0Z6YTBOdmJuUmxiblJWYm1sMGN6MGliMkpxWldOMFFtOTFibVJwYm1kQ2IzZ2lQanh5WldOMElIZHBaSFJvUFNJeElpQm9aV2xuYUhROUlqRWlJR1pwYkd3OUluVnliQ2dqWjNKaFpDMTFjQ2tpSUM4K1BDOXRZWE5yUGp4dFlYTnJJR2xrUFNKbVlXUmxMV1J2ZDI0aUlHMWhjMnREYjI1MFpXNTBWVzVwZEhNOUltOWlhbVZqZEVKdmRXNWthVzVuUW05NElqNDhjbVZqZENCM2FXUjBhRDBpTVNJZ2FHVnBaMmgwUFNJeElpQm1hV3hzUFNKMWNtd29JMmR5WVdRdFpHOTNiaWtpSUM4K1BDOXRZWE5yUGp4dFlYTnJJR2xrUFNKdWIyNWxJaUJ0WVhOclEyOXVkR1Z1ZEZWdWFYUnpQU0p2WW1wbFkzUkNiM1Z1WkdsdVowSnZlQ0krUEhKbFkzUWdkMmxrZEdnOUlqRWlJR2hsYVdkb2REMGlNU0lnWm1sc2JEMGlkMmhwZEdVaUlDOCtQQzl0WVhOclBqeHNhVzVsWVhKSGNtRmthV1Z1ZENCcFpEMGlaM0poWkMxemVXMWliMndpUGp4emRHOXdJRzltWm5ObGREMGlNQzQzSWlCemRHOXdMV052Ykc5eVBTSjNhR2wwWlNJZ2MzUnZjQzF2Y0dGamFYUjVQU0l4SWlBdlBqeHpkRzl3SUc5bVpuTmxkRDBpTGprMUlpQnpkRzl3TFdOdmJHOXlQU0ozYUdsMFpTSWdjM1J2Y0MxdmNHRmphWFI1UFNJd0lpQXZQand2YkdsdVpXRnlSM0poWkdsbGJuUStQRzFoYzJzZ2FXUTlJbVpoWkdVdGMzbHRZbTlzSWlCdFlYTnJRMjl1ZEdWdWRGVnVhWFJ6UFNKMWMyVnlVM0JoWTJWUGJsVnpaU0krUEhKbFkzUWdkMmxrZEdnOUlqSTVNSEI0SWlCb1pXbG5hSFE5SWpJd01IQjRJaUJtYVd4c1BTSjFjbXdvSTJkeVlXUXRjM2x0WW05c0tTSWdMejQ4TDIxaGMycytQQzlrWldaelBqeG5JR05zYVhBdGNHRjBhRDBpZFhKc0tDTmpiM0p1WlhKektTSStQSEpsWTNRZ1ptbHNiRDBpWVdKalpHVmhJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSWdkMmxrZEdnOUlqSTVNSEI0SWlCb1pXbG5hSFE5SWpVd01IQjRJaUF2UGp4eVpXTjBJSE4wZVd4bFBTSm1hV3gwWlhJNklIVnliQ2dqWmpFcElpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJZ2QybGtkR2c5SWpJNU1IQjRJaUJvWldsbmFIUTlJalV3TUhCNElpQXZQaUE4WnlCemRIbHNaVDBpWm1sc2RHVnlPblZ5YkNnamRHOXdMWEpsWjJsdmJpMWliSFZ5S1RzZ2RISmhibk5tYjNKdE9uTmpZV3hsS0RFdU5TazdJSFJ5WVc1elptOXliUzF2Y21sbmFXNDZZMlZ1ZEdWeUlIUnZjRHNpUGp4eVpXTjBJR1pwYkd3OUltNXZibVVpSUhnOUlqQndlQ0lnZVQwaU1IQjRJaUIzYVdSMGFEMGlNamt3Y0hnaUlHaGxhV2RvZEQwaU5UQXdjSGdpSUM4K1BHVnNiR2x3YzJVZ1kzZzlJalV3SlNJZ1kzazlJakJ3ZUNJZ2NuZzlJakU0TUhCNElpQnllVDBpTVRJd2NIZ2lJR1pwYkd3OUlpTXdNREFpSUc5d1lXTnBkSGs5SWpBdU9EVWlJQzgrUEM5blBqeHlaV04wSUhnOUlqQWlJSGs5SWpBaUlIZHBaSFJvUFNJeU9UQWlJR2hsYVdkb2REMGlOVEF3SWlCeWVEMGlORElpSUhKNVBTSTBNaUlnWm1sc2JEMGljbWRpWVNnd0xEQXNNQ3d3S1NJZ2MzUnliMnRsUFNKeVoySmhLREkxTlN3eU5UVXNNalUxTERBdU1pa2lJQzgrUEM5blBqeDBaWGgwSUhSbGVIUXRjbVZ1WkdWeWFXNW5QU0p2Y0hScGJXbDZaVk53WldWa0lqNDhkR1Y0ZEZCaGRHZ2djM1JoY25SUFptWnpaWFE5SWkweE1EQWxJaUJtYVd4c1BTSjNhR2wwWlNJZ1ptOXVkQzFtWVcxcGJIazlJaWREYjNWeWFXVnlJRTVsZHljc0lHMXZibTl6Y0dGalpTSWdabTl1ZEMxemFYcGxQU0l4TUhCNElpQjRiR2x1YXpwb2NtVm1QU0lqZEdWNGRDMXdZWFJvTFdFaVBqQjRNVEl6TkRVMk56ZzVNREV5TXpRMU5qYzRPVEV5TXpRMU5qYzRPVEF4TWpNME5UWTNPRGt3TVNEaWdLSWdWMDVoZEdsMlpWUnZhMlZ1SUR4aGJtbHRZWFJsSUdGa1pHbDBhWFpsUFNKemRXMGlJR0YwZEhKcFluVjBaVTVoYldVOUluTjBZWEowVDJabWMyVjBJaUJtY205dFBTSXdKU0lnZEc4OUlqRXdNQ1VpSUdKbFoybHVQU0l3Y3lJZ1pIVnlQU0l6TUhNaUlISmxjR1ZoZEVOdmRXNTBQU0pwYm1SbFptbHVhWFJsSWlBdlBqd3ZkR1Y0ZEZCaGRHZytJRHgwWlhoMFVHRjBhQ0J6ZEdGeWRFOW1abk5sZEQwaU1DVWlJR1pwYkd3OUluZG9hWFJsSWlCbWIyNTBMV1poYldsc2VUMGlKME52ZFhKcFpYSWdUbVYzSnl3Z2JXOXViM053WVdObElpQm1iMjUwTFhOcGVtVTlJakV3Y0hnaUlIaHNhVzVyT21oeVpXWTlJaU4wWlhoMExYQmhkR2d0WVNJK01IZ3hNak0wTlRZM09Ea3dNVEl6TkRVMk56ZzVNVEl6TkRVMk56ZzVNREV5TXpRMU5qYzRPVEF4SU9LQW9pQlhUbUYwYVhabFZHOXJaVzRnUEdGdWFXMWhkR1VnWVdSa2FYUnBkbVU5SW5OMWJTSWdZWFIwY21saWRYUmxUbUZ0WlQwaWMzUmhjblJQWm1aelpYUWlJR1p5YjIwOUlqQWxJaUIwYnowaU1UQXdKU0lnWW1WbmFXNDlJakJ6SWlCa2RYSTlJak13Y3lJZ2NtVndaV0YwUTI5MWJuUTlJbWx1WkdWbWFXNXBkR1VpSUM4K0lEd3ZkR1Y0ZEZCaGRHZytQSFJsZUhSUVlYUm9JSE4wWVhKMFQyWm1jMlYwUFNJMU1DVWlJR1pwYkd3OUluZG9hWFJsSWlCbWIyNTBMV1poYldsc2VUMGlKME52ZFhKcFpYSWdUbVYzSnl3Z2JXOXViM053WVdObElpQm1iMjUwTFhOcGVtVTlJakV3Y0hnaUlIaHNhVzVyT21oeVpXWTlJaU4wWlhoMExYQmhkR2d0WVNJK01IaGhZbU5rWldGaVkyUmxabUZpWTJSbFptRmlZMlJsWm1GaVkyUmxabUZpWTJSbFptRmlZMlJtSU9LQW9pQlZUa2tnUEdGdWFXMWhkR1VnWVdSa2FYUnBkbVU5SW5OMWJTSWdZWFIwY21saWRYUmxUbUZ0WlQwaWMzUmhjblJQWm1aelpYUWlJR1p5YjIwOUlqQWxJaUIwYnowaU1UQXdKU0lnWW1WbmFXNDlJakJ6SWlCa2RYSTlJak13Y3lJZ2NtVndaV0YwUTI5MWJuUTlJbWx1WkdWbWFXNXBkR1VpSUM4K1BDOTBaWGgwVUdGMGFENDhkR1Y0ZEZCaGRHZ2djM1JoY25SUFptWnpaWFE5SWkwMU1DVWlJR1pwYkd3OUluZG9hWFJsSWlCbWIyNTBMV1poYldsc2VUMGlKME52ZFhKcFpYSWdUbVYzSnl3Z2JXOXViM053WVdObElpQm1iMjUwTFhOcGVtVTlJakV3Y0hnaUlIaHNhVzVyT21oeVpXWTlJaU4wWlhoMExYQmhkR2d0WVNJK01IaGhZbU5rWldGaVkyUmxabUZpWTJSbFptRmlZMlJsWm1GaVkyUmxabUZpWTJSbFptRmlZMlJtSU9LQW9pQlZUa2tnUEdGdWFXMWhkR1VnWVdSa2FYUnBkbVU5SW5OMWJTSWdZWFIwY21saWRYUmxUbUZ0WlQwaWMzUmhjblJQWm1aelpYUWlJR1p5YjIwOUlqQWxJaUIwYnowaU1UQXdKU0lnWW1WbmFXNDlJakJ6SWlCa2RYSTlJak13Y3lJZ2NtVndaV0YwUTI5MWJuUTlJbWx1WkdWbWFXNXBkR1VpSUM4K1BDOTBaWGgwVUdGMGFENDhMM1JsZUhRK1BHY2diV0Z6YXowaWRYSnNLQ05tWVdSbExYTjViV0p2YkNraVBqeHlaV04wSUdacGJHdzlJbTV2Ym1VaUlIZzlJakJ3ZUNJZ2VUMGlNSEI0SWlCM2FXUjBhRDBpTWprd2NIZ2lJR2hsYVdkb2REMGlNakF3Y0hnaUlDOCtJRHgwWlhoMElIazlJamN3Y0hnaUlIZzlJak15Y0hnaUlHWnBiR3c5SW5kb2FYUmxJaUJtYjI1MExXWmhiV2xzZVQwaUowTnZkWEpwWlhJZ1RtVjNKeXdnYlc5dWIzTndZV05sSWlCbWIyNTBMWGRsYVdkb2REMGlNakF3SWlCbWIyNTBMWE5wZW1VOUlqTTJjSGdpUGxWT1NTOVhUbUYwYVhabFZHOXJaVzQ4TDNSbGVIUStQQzluUGp4eVpXTjBJSGc5SWpFMklpQjVQU0l4TmlJZ2QybGtkR2c5SWpJMU9DSWdhR1ZwWjJoMFBTSTBOamdpSUhKNFBTSXlOaUlnY25rOUlqSTJJaUJtYVd4c1BTSnlaMkpoS0RBc01Dd3dMREFwSWlCemRISnZhMlU5SW5KblltRW9NalUxTERJMU5Td3lOVFVzTUM0eUtTSWdMejQ4WnlCdFlYTnJQU0oxY213b0kyWmhaR1V0Wkc5M2Jpa2lJSE4wZVd4bFBTSjBjbUZ1YzJadmNtMDZkSEpoYm5Oc1lYUmxLRGN5Y0hnc01UZzVjSGdwSWo0OGNtVmpkQ0I0UFNJdE1UWndlQ0lnZVQwaUxURTJjSGdpSUhkcFpIUm9QU0l4T0RCd2VDSWdhR1ZwWjJoMFBTSXhPREJ3ZUNJZ1ptbHNiRDBpYm05dVpTSWdMejQ4Y0dGMGFDQmtQU0pOTVNBeFF6TXpJRFUzSURnNUlERXhNeUF4TkRVZ01UUTFJaUJ6ZEhKdmEyVTlJbkpuWW1Fb01Dd3dMREFzTUM0ektTSWdjM1J5YjJ0bExYZHBaSFJvUFNJek1uQjRJaUJtYVd4c1BTSnViMjVsSWlCemRISnZhMlV0YkdsdVpXTmhjRDBpY205MWJtUWlJQzgrUEM5blBqeG5JRzFoYzJzOUluVnliQ2dqWm1Ga1pTMWtiM2R1S1NJZ2MzUjViR1U5SW5SeVlXNXpabTl5YlRwMGNtRnVjMnhoZEdVb056SndlQ3d4T0Rsd2VDa2lQanh5WldOMElIZzlJaTB4Tm5CNElpQjVQU0l0TVRad2VDSWdkMmxrZEdnOUlqRTRNSEI0SWlCb1pXbG5hSFE5SWpFNE1IQjRJaUJtYVd4c1BTSnViMjVsSWlBdlBqeHdZWFJvSUdROUlrMHhJREZETXpNZ05UY2dPRGtnTVRFeklERTBOU0F4TkRVaUlITjBjbTlyWlQwaWNtZGlZU2d5TlRVc01qVTFMREkxTlN3eEtTSWdabWxzYkQwaWJtOXVaU0lnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQXZQand2Wno0OFkybHlZMnhsSUdONFBTSTNNM0I0SWlCamVUMGlNVGt3Y0hnaUlISTlJalJ3ZUNJZ1ptbHNiRDBpZDJocGRHVWlJQzgrUEdOcGNtTnNaU0JqZUQwaU56TndlQ0lnWTNrOUlqRTVNSEI0SWlCeVBTSXlOSEI0SWlCbWFXeHNQU0p1YjI1bElpQnpkSEp2YTJVOUluZG9hWFJsSWlBdlBpQThaeUJ6ZEhsc1pUMGlkSEpoYm5ObWIzSnRPblJ5WVc1emJHRjBaU2d5T1hCNExDQXpPRFJ3ZUNraVBqeHlaV04wSUhkcFpIUm9QU0kyTTNCNElpQm9aV2xuYUhROUlqSTJjSGdpSUhKNFBTSTRjSGdpSUhKNVBTSTRjSGdpSUdacGJHdzlJbkpuWW1Fb01Dd3dMREFzTUM0MktTSWdMejQ4ZEdWNGRDQjRQU0l4TW5CNElpQjVQU0l4TjNCNElpQm1iMjUwTFdaaGJXbHNlVDBpSjBOdmRYSnBaWElnVG1WM0p5d2diVzl1YjNOd1lXTmxJaUJtYjI1MExYTnBlbVU5SWpFeWNIZ2lJR1pwYkd3OUluZG9hWFJsSWo0OGRITndZVzRnWm1sc2JEMGljbWRpWVNneU5UVXNNalUxTERJMU5Td3dMallwSWo1SlJEb2dQQzkwYzNCaGJqNHhQQzkwWlhoMFBqd3ZaejRnUEdjZ2MzUjViR1U5SW5SeVlXNXpabTl5YlRwMGNtRnVjMnhoZEdVb01qbHdlQ3dnTkRFMGNIZ3BJajQ4Y21WamRDQjNhV1IwYUQwaU1UQTFjSGdpSUdobGFXZG9kRDBpTWpad2VDSWdjbmc5SWpod2VDSWdjbms5SWpod2VDSWdabWxzYkQwaWNtZGlZU2d3TERBc01Dd3dMallwSWlBdlBqeDBaWGgwSUhnOUlqRXljSGdpSUhrOUlqRTNjSGdpSUdadmJuUXRabUZ0YVd4NVBTSW5RMjkxY21sbGNpQk9aWGNuTENCdGIyNXZjM0JoWTJVaUlHWnZiblF0YzJsNlpUMGlNVEp3ZUNJZ1ptbHNiRDBpZDJocGRHVWlQangwYzNCaGJpQm1hV3hzUFNKeVoySmhLREkxTlN3eU5UVXNNalUxTERBdU5pa2lQazFwYmlCVWFXTnJPaUE4TDNSemNHRnVQakE4TDNSbGVIUStQQzluUGlBOFp5QnpkSGxzWlQwaWRISmhibk5tYjNKdE9uUnlZVzV6YkdGMFpTZ3lPWEI0TENBME5EUndlQ2tpUGp4eVpXTjBJSGRwWkhSb1BTSXhNalp3ZUNJZ2FHVnBaMmgwUFNJeU5uQjRJaUJ5ZUQwaU9IQjRJaUJ5ZVQwaU9IQjRJaUJtYVd4c1BTSnlaMkpoS0RBc01Dd3dMREF1TmlraUlDOCtQSFJsZUhRZ2VEMGlNVEp3ZUNJZ2VUMGlNVGR3ZUNJZ1ptOXVkQzFtWVcxcGJIazlJaWREYjNWeWFXVnlJRTVsZHljc0lHMXZibTl6Y0dGalpTSWdabTl1ZEMxemFYcGxQU0l4TW5CNElpQm1hV3hzUFNKM2FHbDBaU0krUEhSemNHRnVJR1pwYkd3OUluSm5ZbUVvTWpVMUxESTFOU3d5TlRVc01DNDJLU0krVFdGNElGUnBZMnM2SUR3dmRITndZVzQrTVRBd01Ed3ZkR1Y0ZEQ0OEwyYytQR2NnYzNSNWJHVTlJblJ5WVc1elptOXliVHAwY21GdWMyeGhkR1VvTWpJMmNIZ3NJRFF6TTNCNEtTSStQSEpsWTNRZ2QybGtkR2c5SWpNMmNIZ2lJR2hsYVdkb2REMGlNelp3ZUNJZ2NuZzlJamh3ZUNJZ2NuazlJamh3ZUNJZ1ptbHNiRDBpYm05dVpTSWdjM1J5YjJ0bFBTSnlaMkpoS0RJMU5Td3lOVFVzTWpVMUxEQXVNaWtpSUM4K1BIQmhkR2dnYzNSeWIydGxMV3hwYm1WallYQTlJbkp2ZFc1a0lpQmtQU0pOT0NBNVF6Z3VNREF3TURRZ01qSXVPVFE1TkNBeE5pNHlNRGs1SURJNElESTNJREk0SWlCbWFXeHNQU0p1YjI1bElpQnpkSEp2YTJVOUluZG9hWFJsSWlBdlBqeGphWEpqYkdVZ2MzUjViR1U5SW5SeVlXNXpabTl5YlRwMGNtRnVjMnhoZEdVelpDZ3hNM0I0TENBeU0zQjRMQ0F3Y0hncElpQmplRDBpTUhCNElpQmplVDBpTUhCNElpQnlQU0kwY0hnaUlHWnBiR3c5SW5kb2FYUmxJaTgrUEM5blBqeG5JSE4wZVd4bFBTSjBjbUZ1YzJadmNtMDZkSEpoYm5Oc1lYUmxLREl5Tm5CNExDQXpPVEp3ZUNraVBqeHlaV04wSUhkcFpIUm9QU0l6Tm5CNElpQm9aV2xuYUhROUlqTTJjSGdpSUhKNFBTSTRjSGdpSUhKNVBTSTRjSGdpSUdacGJHdzlJbTV2Ym1VaUlITjBjbTlyWlQwaWNtZGlZU2d5TlRVc01qVTFMREkxTlN3d0xqSXBJaUF2UGp4blBqeHdZWFJvSUhOMGVXeGxQU0owY21GdWMyWnZjbTA2ZEhKaGJuTnNZWFJsS0Rad2VDdzJjSGdwSWlCa1BTSk5NVElnTUV3eE1pNDJOVEl5SURrdU5UWTFPRGRNTVRnZ01TNDJNRGMzVERFekxqYzRNVGtnTVRBdU1qRTRNVXd5TWk0ek9USXpJRFpNTVRRdU5ETTBNU0F4TVM0ek5EYzRUREkwSURFeVRERTBMalF6TkRFZ01USXVOalV5TWt3eU1pNHpPVEl6SURFNFRERXpMamM0TVRrZ01UTXVOemd4T1V3eE9DQXlNaTR6T1RJelRERXlMalkxTWpJZ01UUXVORE0wTVV3eE1pQXlORXd4TVM0ek5EYzRJREUwTGpRek5ERk1OaUF5TWk0ek9USXpUREV3TGpJeE9ERWdNVE11TnpneE9Vd3hMall3TnpjZ01UaE1PUzQxTmpVNE55QXhNaTQyTlRJeVREQWdNVEpNT1M0MU5qVTROeUF4TVM0ek5EYzRUREV1TmpBM055QTJUREV3TGpJeE9ERWdNVEF1TWpFNE1VdzJJREV1TmpBM04wd3hNUzR6TkRjNElEa3VOVFkxT0RkTU1USWdNRm9pSUdacGJHdzlJbmRvYVhSbElpQXZQanhoYm1sdFlYUmxWSEpoYm5ObWIzSnRJR0YwZEhKcFluVjBaVTVoYldVOUluUnlZVzV6Wm05eWJTSWdkSGx3WlQwaWNtOTBZWFJsSWlCbWNtOXRQU0l3SURFNElERTRJaUIwYnowaU16WXdJREU0SURFNElpQmtkWEk5SWpFd2N5SWdjbVZ3WldGMFEyOTFiblE5SW1sdVpHVm1hVzVwZEdVaUx6NDhMMmMrUEM5blBqd3ZjM1puUGc9PSJ9"`; diff --git a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index a1de1e472..fe3cd4acd 100644 --- a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -8,7 +8,7 @@ exports[`NonfungiblePositionManager #collect gas transfers token0 only [ @skip-o exports[`NonfungiblePositionManager #collect gas transfers token1 only [ @skip-on-coverage ] 1`] = `119163`; -exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `4813126`; +exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `5265887`; exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @skip-on-coverage ] 1`] = `169339`; @@ -16,15 +16,15 @@ exports[`NonfungiblePositionManager #decreaseLiquidity gas partial decrease [ @s exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] 1`] = `179882`; -exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `631111`; +exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `631099`; exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `644530`; exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `637363`; -exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `436868`; +exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `436856`; -exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `326726`; +exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `326714`; exports[`NonfungiblePositionManager #permit owned by eoa gas [ @skip-on-coverage ] 1`] = `59288`; @@ -34,6 +34,6 @@ exports[`NonfungiblePositionManager #transferFrom gas [ @skip-on-coverage ] 1`] exports[`NonfungiblePositionManager #transferFrom gas comes from approved [ @skip-on-coverage ] 1`] = `86831`; -exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `25065`; +exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `25914`; exports[`NonfungiblePositionManager multicall exit gas [ @skip-on-coverage ] 1`] = `243107`; diff --git a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap index 9c68f49e3..bdd58b2e0 100644 --- a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap +++ b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap @@ -1,29 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `156211`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `156248`; -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156153`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156190`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `247441`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `251857`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105838`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105875`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90570`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90607`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125934`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125971`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `156103`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `156140`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125943`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125980`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `126271`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `126308`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156714`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156751`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156718`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156755`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `91358`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `95736`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91557`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91594`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91574`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91611`; diff --git a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap index d057d3c5b..a4b26b9ec 100644 --- a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap +++ b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12902`; +exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `13345`; diff --git a/src/periphery/test/shared/completeFixture.ts b/src/periphery/test/shared/completeFixture.ts index 5aebb5327..b430f3145 100644 --- a/src/periphery/test/shared/completeFixture.ts +++ b/src/periphery/test/shared/completeFixture.ts @@ -9,6 +9,9 @@ import { NonfungibleTokenPositionDescriptor, TestERC20, IAlgebraFactory, + MockPluginFactory, + AlgebraCustomPoolEntryPoint, + CustomPoolDeployerTest, } from '../../typechain'; import { ZERO_ADDRESS } from '../CallbackValidation.spec'; @@ -49,6 +52,7 @@ const completeFixture: () => Promise<{ nft: MockTimeNonfungiblePositionManager; nftDescriptor: NonfungibleTokenPositionDescriptor; tokens: [TestERC20, TestERC20, TestERC20]; + customPoolDeployer: CustomPoolDeployerTest; path: [string, string, string, string, string]; }> = async () => { const { wnative, factory, router } = await v3RouterFixture(); @@ -69,13 +73,10 @@ const completeFixture: () => Promise<{ return tokenA.address_.toLowerCase() < tokenB.address_.toLowerCase() ? -1 : 1; }); - const path: [string, string, string, string, string] = [ - tokens[0].address_, - ZERO_ADDRESS, // deployer - tokens[1].address_, - ZERO_ADDRESS, // deployer, - tokens[2].address_ - ] + const pluginFactoryFactory = await ethers.getContractFactory('MockPluginFactory'); + const pluginFactory = await pluginFactoryFactory.deploy(factory) as any as MockPluginFactory; + + factory.setDefaultPluginFactory(pluginFactory); const nftDescriptorLibraryFactory = await ethers.getContractFactory('NFTDescriptor'); const nftDescriptorLibrary = await nftDescriptorLibraryFactory.deploy(); @@ -102,11 +103,35 @@ const completeFixture: () => Promise<{ await factory.poolDeployer() )) as any as MockTimeNonfungiblePositionManager; + const entryPointFactory = await ethers.getContractFactory("AlgebraCustomPoolEntryPoint"); + const entryPoint = await entryPointFactory.deploy(factory) as any as AlgebraCustomPoolEntryPoint; + + const customPoolDeployerFactory = await ethers.getContractFactory("CustomPoolDeployerTest"); + const customPoolDeployer = await customPoolDeployerFactory.deploy(entryPoint) as any as CustomPoolDeployerTest; + + let customPoolDeployerRole = await factory.CUSTOM_POOL_DEPLOYER() + let poolAdministratorRole = await factory.POOLS_ADMINISTRATOR_ROLE() + await factory.grantRole(customPoolDeployerRole, await entryPoint.getAddress()); + await factory.grantRole(poolAdministratorRole, await entryPoint.getAddress()); + + const path: [string, string, string, string, string] = [ + tokens[0].address_, + ZERO_ADDRESS, // deployer + tokens[1].address_, + await customPoolDeployer.getAddress(), // deployer + tokens[2].address_ + ] + + console.log('factory address: ', factory.target); + + console.log('deployer address in js: ', await customPoolDeployer.getAddress()); + return { wnative, factory, router, tokens, + customPoolDeployer, path, nft, nftDescriptor: nftDescriptorProxied, diff --git a/src/periphery/test/shared/computePoolAddress.ts b/src/periphery/test/shared/computePoolAddress.ts index ad900cfc7..8390621b8 100644 --- a/src/periphery/test/shared/computePoolAddress.ts +++ b/src/periphery/test/shared/computePoolAddress.ts @@ -17,3 +17,18 @@ export function computePoolAddress(factoryAddress: string, [tokenA, tokenB]: [st const sanitizedInputs = `0x${create2Inputs.map((i) => i.slice(2)).join('')}`; return getAddress(`0x${keccak256(sanitizedInputs).slice(-40)}`); } + +export function computeCustomPoolAddress(factoryAddress: string, [tokenA, deployer, tokenB]: [string, string, string]): string { + const [token0, token1] = tokenA.toLowerCase() < tokenB.toLowerCase() ? [tokenA, tokenB] : [tokenB, tokenA]; + const constructorArgumentsEncoded = AbiCoder.defaultAbiCoder().encode(['address', 'address', 'address'], [deployer, token0, token1]); + const create2Inputs = [ + '0xff', + factoryAddress, + // salt + keccak256(constructorArgumentsEncoded), + // init code hash + POOL_BYTECODE_HASH, + ]; + const sanitizedInputs = `0x${create2Inputs.map((i) => i.slice(2)).join('')}`; + return getAddress(`0x${keccak256(sanitizedInputs).slice(-40)}`); +} diff --git a/src/periphery/test/shared/quoter.ts b/src/periphery/test/shared/quoter.ts index 091f401b9..267284406 100644 --- a/src/periphery/test/shared/quoter.ts +++ b/src/periphery/test/shared/quoter.ts @@ -9,17 +9,18 @@ export async function createPool( nft: MockTimeNonfungiblePositionManager, wallet: Wallet, tokenAddressA: string, - tokenAddressB: string + tokenAddressB: string, + deployer: string ) { if (tokenAddressA.toLowerCase() > tokenAddressB.toLowerCase()) [tokenAddressA, tokenAddressB] = [tokenAddressB, tokenAddressA]; - await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, ZERO_ADDRESS, encodePriceSqrt(1, 1)); + await nft.createAndInitializePoolIfNecessary(tokenAddressA, tokenAddressB, deployer, encodePriceSqrt(1, 1)); const liquidityParams = { token0: tokenAddressA, token1: tokenAddressB, - deployer: ZERO_ADDRESS, + deployer: deployer, tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), recipient: wallet.address, From 3b8950cb6cdad737c68cc2afe83380d3a19b2582 Mon Sep 17 00:00:00 2001 From: fourlen Date: Tue, 11 Jun 2024 14:03:50 +0300 Subject: [PATCH 07/17] -logs --- .../contracts/base/PoolInitializer.sol | 7 ----- src/periphery/contracts/lens/Quoter.sol | 13 --------- .../contracts/libraries/PoolAddress.sol | 5 ---- .../NonfungiblePositionManager.spec.ts.snap | 4 +-- .../test/__snapshots__/QuoterV2.spec.ts.snap | 28 +++++++++---------- .../__snapshots__/SwapRouter.spec.ts.snap | 2 +- 6 files changed, 17 insertions(+), 42 deletions(-) diff --git a/src/periphery/contracts/base/PoolInitializer.sol b/src/periphery/contracts/base/PoolInitializer.sol index 1c72e3ab4..e51a94c0e 100644 --- a/src/periphery/contracts/base/PoolInitializer.sol +++ b/src/periphery/contracts/base/PoolInitializer.sol @@ -8,8 +8,6 @@ import '../interfaces/IPoolInitializer.sol'; import '../libraries/PoolInteraction.sol'; -import 'hardhat/console.sol'; - /// @title Creates and initializes Algebra Pools /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: /// https://github.com/Uniswap/v3-periphery @@ -31,14 +29,9 @@ abstract contract PoolInitializer is IPoolInitializer, PeripheryImmutableState { if (deployer == address(0)) { pool = IAlgebraFactory(factory).createPool(token0, token1); } else { - console.log(1); - console.log('factory: ', factory); pool = IAlgebraFactory(factory).createCustomPool(deployer, msg.sender, token0, token1, ''); - console.log(2); } - console.log(3); _initializePool(pool, sqrtPriceX96); - console.log(4); } else { uint160 sqrtPriceX96Existing = IAlgebraPool(pool)._getSqrtPrice(); if (sqrtPriceX96Existing == 0) { diff --git a/src/periphery/contracts/lens/Quoter.sol b/src/periphery/contracts/lens/Quoter.sol index e333b5911..310b0d29a 100644 --- a/src/periphery/contracts/lens/Quoter.sol +++ b/src/periphery/contracts/lens/Quoter.sol @@ -14,8 +14,6 @@ import '../libraries/Path.sol'; import '../libraries/PoolAddress.sol'; import '../libraries/CallbackValidation.sol'; -import 'hardhat/console.sol'; - /// @title Algebra Integral 1.1 Quoter /// @notice Allows getting the expected amount out or amount in for a given swap without executing the swap /// @dev These functions are not gas efficient and should _not_ be called on chain. Instead, optimistically execute @@ -92,17 +90,6 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { ) public override returns (uint256 amountOut, uint16 fee) { bool zeroToOne = tokenIn < tokenOut; - { - address pooladdress = address(getPool(tokenIn, tokenOut, deployer)); - console.log('pool in quoter: ', pooladdress); - console.log('deployer in quter: ', deployer); - uint256 cs; - assembly { - cs := extcodesize(pooladdress) - } - console.log('pool codesize: ', cs); - } - try getPool(tokenIn, tokenOut, deployer).swap( address(this), // address(0) might cause issues with some tokens diff --git a/src/periphery/contracts/libraries/PoolAddress.sol b/src/periphery/contracts/libraries/PoolAddress.sol index f6958f965..e35b10dc0 100644 --- a/src/periphery/contracts/libraries/PoolAddress.sol +++ b/src/periphery/contracts/libraries/PoolAddress.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; -import 'hardhat/console.sol'; - /// @title Provides functions for deriving a pool address from the poolDeployer and tokens /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: /// https://github.com/Uniswap/v3-periphery @@ -47,9 +45,6 @@ library PoolAddress { ) ); } else { - console.log('token0: ', key.token0); - console.log('token1: ', key.token1); - console.log('deployer: ', key.deployer); pool = address( uint160( uint256( diff --git a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index fe3cd4acd..3dcd2976e 100644 --- a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -8,7 +8,7 @@ exports[`NonfungiblePositionManager #collect gas transfers token0 only [ @skip-o exports[`NonfungiblePositionManager #collect gas transfers token1 only [ @skip-on-coverage ] 1`] = `119163`; -exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `5265887`; +exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `5262001`; exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @skip-on-coverage ] 1`] = `169339`; @@ -34,6 +34,6 @@ exports[`NonfungiblePositionManager #transferFrom gas [ @skip-on-coverage ] 1`] exports[`NonfungiblePositionManager #transferFrom gas comes from approved [ @skip-on-coverage ] 1`] = `86831`; -exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `25914`; +exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `25264`; exports[`NonfungiblePositionManager multicall exit gas [ @skip-on-coverage ] 1`] = `243107`; diff --git a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap index bdd58b2e0..c72dffeee 100644 --- a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap +++ b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap @@ -1,29 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `156248`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `156211`; -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156190`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156153`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `251857`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `247509`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105875`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105838`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90607`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90570`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125971`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125934`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `156140`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `156103`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125980`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125943`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `126308`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `126271`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156751`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156714`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156755`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156718`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `95736`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `91425`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91594`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91557`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91611`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91574`; diff --git a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap index a4b26b9ec..d057d3c5b 100644 --- a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap +++ b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `13345`; +exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12902`; From a6288a05c7701fcfb43686d2f413f68aca47f992 Mon Sep 17 00:00:00 2001 From: fourlen Date: Tue, 11 Jun 2024 14:12:49 +0300 Subject: [PATCH 08/17] core snapshots --- .../test/__snapshots__/BitMath.spec.ts.snap | 9 + .../__snapshots__/LiquidityMath.spec.ts.snap | 5 + .../__snapshots__/PriceMovement.spec.ts.snap | 17 ++ .../test/__snapshots__/TickMath.spec.ts.snap | 165 ++++++++++++++++++ .../test/__snapshots__/TickTree.spec.ts.snap | 17 ++ .../__snapshots__/TokenDeltaMath.spec.ts.snap | 17 ++ 6 files changed, 230 insertions(+) create mode 100644 src/core/test/__snapshots__/BitMath.spec.ts.snap create mode 100644 src/core/test/__snapshots__/LiquidityMath.spec.ts.snap create mode 100644 src/core/test/__snapshots__/PriceMovement.spec.ts.snap create mode 100644 src/core/test/__snapshots__/TickMath.spec.ts.snap create mode 100644 src/core/test/__snapshots__/TickTree.spec.ts.snap create mode 100644 src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap diff --git a/src/core/test/__snapshots__/BitMath.spec.ts.snap b/src/core/test/__snapshots__/BitMath.spec.ts.snap new file mode 100644 index 000000000..45162c300 --- /dev/null +++ b/src/core/test/__snapshots__/BitMath.spec.ts.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`BitMath #leastSignificantBit gas cost of max uint128 [ @skip-on-coverage ] 1`] = `216`; + +exports[`BitMath #leastSignificantBit gas cost of max uint256 [ @skip-on-coverage ] 1`] = `216`; + +exports[`BitMath #leastSignificantBit gas cost of min number [ @skip-on-coverage ] 1`] = `216`; + +exports[`BitMath #leastSignificantBit gas cost of smaller number [ @skip-on-coverage ] 1`] = `216`; diff --git a/src/core/test/__snapshots__/LiquidityMath.spec.ts.snap b/src/core/test/__snapshots__/LiquidityMath.spec.ts.snap new file mode 100644 index 000000000..cf985a7f2 --- /dev/null +++ b/src/core/test/__snapshots__/LiquidityMath.spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`LiquidityMath #addDelta gas add [ @skip-on-coverage ] 1`] = `162`; + +exports[`LiquidityMath #addDelta gas sub [ @skip-on-coverage ] 1`] = `158`; diff --git a/src/core/test/__snapshots__/PriceMovement.spec.ts.snap b/src/core/test/__snapshots__/PriceMovement.spec.ts.snap new file mode 100644 index 000000000..1310265c7 --- /dev/null +++ b/src/core/test/__snapshots__/PriceMovement.spec.ts.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact in capped 1`] = `1665`; + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact in partial 1`] = `2503`; + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact out capped 1`] = `1489`; + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap one for zero exact out partial 1`] = `2503`; + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact in capped 1`] = `1666`; + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact in partial 1`] = `2645`; + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact out capped 1`] = `1490`; + +exports[`PriceMovementMath #movePriceTowardsTarget gas [ @skip-on-coverage ] swap zero for one exact out partial 1`] = `2645`; diff --git a/src/core/test/__snapshots__/TickMath.spec.ts.snap b/src/core/test/__snapshots__/TickMath.spec.ts.snap new file mode 100644 index 000000000..b46b72b64 --- /dev/null +++ b/src/core/test/__snapshots__/TickMath.spec.ts.snap @@ -0,0 +1,165 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TickMath #getSqrtRatioAtTick tick -50 gas [ @skip-on-coverage ] 1`] = `702`; + +exports[`TickMath #getSqrtRatioAtTick tick -50 result 1`] = `"79030349367926598376800521322"`; + +exports[`TickMath #getSqrtRatioAtTick tick -100 gas [ @skip-on-coverage ] 1`] = `702`; + +exports[`TickMath #getSqrtRatioAtTick tick -100 result 1`] = `"78833030112140176575862854579"`; + +exports[`TickMath #getSqrtRatioAtTick tick -250 gas [ @skip-on-coverage ] 1`] = `744`; + +exports[`TickMath #getSqrtRatioAtTick tick -250 result 1`] = `"78244023372248365697264290337"`; + +exports[`TickMath #getSqrtRatioAtTick tick -500 gas [ @skip-on-coverage ] 1`] = `744`; + +exports[`TickMath #getSqrtRatioAtTick tick -500 result 1`] = `"77272108795590369356373805297"`; + +exports[`TickMath #getSqrtRatioAtTick tick -1000 gas [ @skip-on-coverage ] 1`] = `744`; + +exports[`TickMath #getSqrtRatioAtTick tick -1000 result 1`] = `"75364347830767020784054125655"`; + +exports[`TickMath #getSqrtRatioAtTick tick -2500 gas [ @skip-on-coverage ] 1`] = `730`; + +exports[`TickMath #getSqrtRatioAtTick tick -2500 result 1`] = `"69919044979842180277688105136"`; + +exports[`TickMath #getSqrtRatioAtTick tick -3000 gas [ @skip-on-coverage ] 1`] = `758`; + +exports[`TickMath #getSqrtRatioAtTick tick -3000 result 1`] = `"68192822843687888778582228483"`; + +exports[`TickMath #getSqrtRatioAtTick tick -4000 gas [ @skip-on-coverage ] 1`] = `744`; + +exports[`TickMath #getSqrtRatioAtTick tick -4000 result 1`] = `"64867181785621769311890333195"`; + +exports[`TickMath #getSqrtRatioAtTick tick -5000 gas [ @skip-on-coverage ] 1`] = `730`; + +exports[`TickMath #getSqrtRatioAtTick tick -5000 result 1`] = `"61703726247759831737814779831"`; + +exports[`TickMath #getSqrtRatioAtTick tick -50000 gas [ @skip-on-coverage ] 1`] = `744`; + +exports[`TickMath #getSqrtRatioAtTick tick -50000 result 1`] = `"6504256538020985011912221507"`; + +exports[`TickMath #getSqrtRatioAtTick tick -150000 gas [ @skip-on-coverage ] 1`] = `772`; + +exports[`TickMath #getSqrtRatioAtTick tick -150000 result 1`] = `"43836292794701720435367485"`; + +exports[`TickMath #getSqrtRatioAtTick tick -250000 gas [ @skip-on-coverage ] 1`] = `758`; + +exports[`TickMath #getSqrtRatioAtTick tick -250000 result 1`] = `"295440463448801648376846"`; + +exports[`TickMath #getSqrtRatioAtTick tick -500000 gas [ @skip-on-coverage ] 1`] = `809`; + +exports[`TickMath #getSqrtRatioAtTick tick -500000 result 1`] = `"1101692437043807371"`; + +exports[`TickMath #getSqrtRatioAtTick tick -738203 gas [ @skip-on-coverage ] 1`] = `856`; + +exports[`TickMath #getSqrtRatioAtTick tick -738203 result 1`] = `"7409801140451"`; + +exports[`TickMath #getSqrtRatioAtTick tick 50 gas [ @skip-on-coverage ] 1`] = `713`; + +exports[`TickMath #getSqrtRatioAtTick tick 50 result 1`] = `"79426470787362580746886972461"`; + +exports[`TickMath #getSqrtRatioAtTick tick 100 gas [ @skip-on-coverage ] 1`] = `713`; + +exports[`TickMath #getSqrtRatioAtTick tick 100 result 1`] = `"79625275426524748796330556128"`; + +exports[`TickMath #getSqrtRatioAtTick tick 250 gas [ @skip-on-coverage ] 1`] = `755`; + +exports[`TickMath #getSqrtRatioAtTick tick 250 result 1`] = `"80224679980005306637834519095"`; + +exports[`TickMath #getSqrtRatioAtTick tick 500 gas [ @skip-on-coverage ] 1`] = `755`; + +exports[`TickMath #getSqrtRatioAtTick tick 500 result 1`] = `"81233731461783161732293370115"`; + +exports[`TickMath #getSqrtRatioAtTick tick 1000 gas [ @skip-on-coverage ] 1`] = `755`; + +exports[`TickMath #getSqrtRatioAtTick tick 1000 result 1`] = `"83290069058676223003182343270"`; + +exports[`TickMath #getSqrtRatioAtTick tick 2500 gas [ @skip-on-coverage ] 1`] = `741`; + +exports[`TickMath #getSqrtRatioAtTick tick 2500 result 1`] = `"89776708723587163891445672585"`; + +exports[`TickMath #getSqrtRatioAtTick tick 3000 gas [ @skip-on-coverage ] 1`] = `769`; + +exports[`TickMath #getSqrtRatioAtTick tick 3000 result 1`] = `"92049301871182272007977902845"`; + +exports[`TickMath #getSqrtRatioAtTick tick 4000 gas [ @skip-on-coverage ] 1`] = `755`; + +exports[`TickMath #getSqrtRatioAtTick tick 4000 result 1`] = `"96768528593268422080558758223"`; + +exports[`TickMath #getSqrtRatioAtTick tick 5000 gas [ @skip-on-coverage ] 1`] = `741`; + +exports[`TickMath #getSqrtRatioAtTick tick 5000 result 1`] = `"101729702841318637793976746270"`; + +exports[`TickMath #getSqrtRatioAtTick tick 50000 gas [ @skip-on-coverage ] 1`] = `755`; + +exports[`TickMath #getSqrtRatioAtTick tick 50000 result 1`] = `"965075977353221155028623082916"`; + +exports[`TickMath #getSqrtRatioAtTick tick 150000 gas [ @skip-on-coverage ] 1`] = `783`; + +exports[`TickMath #getSqrtRatioAtTick tick 150000 result 1`] = `"143194173941309278083010301478497"`; + +exports[`TickMath #getSqrtRatioAtTick tick 250000 gas [ @skip-on-coverage ] 1`] = `769`; + +exports[`TickMath #getSqrtRatioAtTick tick 250000 result 1`] = `"21246587762933397357449903968194344"`; + +exports[`TickMath #getSqrtRatioAtTick tick 500000 gas [ @skip-on-coverage ] 1`] = `820`; + +exports[`TickMath #getSqrtRatioAtTick tick 500000 result 1`] = `"5697689776495288729098254600827762987878"`; + +exports[`TickMath #getSqrtRatioAtTick tick 738203 gas [ @skip-on-coverage ] 1`] = `867`; + +exports[`TickMath #getSqrtRatioAtTick tick 738203 result 1`] = `"847134979253254120489401328389043031315994541"`; + +exports[`TickMath #getTickAtSqrtRatio ratio 4295128739 gas [ @skip-on-coverage ] 1`] = `2289`; + +exports[`TickMath #getTickAtSqrtRatio ratio 4295128739 result 1`] = `-887272`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543 gas [ @skip-on-coverage ] 1`] = `2274`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543 result 1`] = `-276325`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950 gas [ @skip-on-coverage ] 1`] = `2223`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950 result 1`] = `-138163`; + +exports[`TickMath #getTickAtSqrtRatio ratio 9903520314283042199192993792 gas [ @skip-on-coverage ] 1`] = `1378`; + +exports[`TickMath #getTickAtSqrtRatio ratio 9903520314283042199192993792 result 1`] = `-41591`; + +exports[`TickMath #getTickAtSqrtRatio ratio 28011385487393069959365969113 gas [ @skip-on-coverage ] 1`] = `2196`; + +exports[`TickMath #getTickAtSqrtRatio ratio 28011385487393069959365969113 result 1`] = `-20796`; + +exports[`TickMath #getTickAtSqrtRatio ratio 56022770974786139918731938227 gas [ @skip-on-coverage ] 1`] = `2182`; + +exports[`TickMath #getTickAtSqrtRatio ratio 56022770974786139918731938227 result 1`] = `-6932`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336 gas [ @skip-on-coverage ] 1`] = `2108`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336 result 1`] = `0`; + +exports[`TickMath #getTickAtSqrtRatio ratio 112045541949572279837463876454 gas [ @skip-on-coverage ] 1`] = `2208`; + +exports[`TickMath #getTickAtSqrtRatio ratio 112045541949572279837463876454 result 1`] = `6931`; + +exports[`TickMath #getTickAtSqrtRatio ratio 224091083899144559674927752909 gas [ @skip-on-coverage ] 1`] = `2222`; + +exports[`TickMath #getTickAtSqrtRatio ratio 224091083899144559674927752909 result 1`] = `20795`; + +exports[`TickMath #getTickAtSqrtRatio ratio 633825300114114700748351602688 gas [ @skip-on-coverage ] 1`] = `2235`; + +exports[`TickMath #getTickAtSqrtRatio ratio 633825300114114700748351602688 result 1`] = `41590`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000 gas [ @skip-on-coverage ] 1`] = `2245`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000 result 1`] = `138162`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000000 gas [ @skip-on-coverage ] 1`] = `2296`; + +exports[`TickMath #getTickAtSqrtRatio ratio 79228162514264337593543950336000000 result 1`] = `276324`; + +exports[`TickMath #getTickAtSqrtRatio ratio 1461446703485210103287273052203988822378723970341 gas [ @skip-on-coverage ] 1`] = `2309`; + +exports[`TickMath #getTickAtSqrtRatio ratio 1461446703485210103287273052203988822378723970341 result 1`] = `887271`; diff --git a/src/core/test/__snapshots__/TickTree.spec.ts.snap b/src/core/test/__snapshots__/TickTree.spec.ts.snap new file mode 100644 index 000000000..8c06e29c8 --- /dev/null +++ b/src/core/test/__snapshots__/TickTree.spec.ts.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost for all possible range 1`] = `7785`; + +exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost for entire word 1`] = `9889`; + +exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost for next subtree 1`] = `7785`; + +exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost just below boundary 1`] = `12619`; + +exports[`TickTree #nextTick gas [ @skip-on-coverage ] gas cost on boundary 1`] = `12619`; + +exports[`TickTree #toggleTick gas cost of flipping a tick that results in deleting a word [ @skip-on-coverage ] 1`] = `29765`; + +exports[`TickTree #toggleTick gas cost of flipping first tick in word to initialized [ @skip-on-coverage ] 1`] = `88518`; + +exports[`TickTree #toggleTick gas cost of flipping second tick in word to initialized [ @skip-on-coverage ] 1`] = `29199`; diff --git a/src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap b/src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap new file mode 100644 index 000000000..6f388238b --- /dev/null +++ b/src/core/test/__snapshots__/TokenDeltaMath.spec.ts.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TokenDeltaMath #getNewPriceAfterInput zeroToOne = false gas [ @skip-on-coverage ] 1`] = `561`; + +exports[`TokenDeltaMath #getNewPriceAfterInput zeroToOne = true gas [ @skip-on-coverage ] 1`] = `654`; + +exports[`TokenDeltaMath #getNewPriceAfterOutput zeroToOne = false gas [ @skip-on-coverage ] 1`] = `728`; + +exports[`TokenDeltaMath #getNewPriceAfterOutput zeroToOne = true gas [ @skip-on-coverage ] 1`] = `474`; + +exports[`TokenDeltaMath #getToken0Delta gas cost for amount0 where roundUp = false [ @skip-on-coverage ] 1`] = `419`; + +exports[`TokenDeltaMath #getToken0Delta gas cost for amount0 where roundUp = true [ @skip-on-coverage ] 1`] = `449`; + +exports[`TokenDeltaMath #getToken1Delta gas cost for amount0 where roundUp = false [ @skip-on-coverage ] 1`] = `419`; + +exports[`TokenDeltaMath #getToken1Delta gas cost for amount0 where roundUp = true [ @skip-on-coverage ] 1`] = `449`; From ed45f636a1e49c801b65b0bebc539d30f1e82282 Mon Sep 17 00:00:00 2001 From: fourlen Date: Fri, 14 Jun 2024 15:25:48 +0300 Subject: [PATCH 09/17] fixes --- src/periphery/contracts/libraries/Path.sol | 2 -- src/periphery/contracts/test/MockPlugin.sol | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/periphery/contracts/libraries/Path.sol b/src/periphery/contracts/libraries/Path.sol index f697931d6..b37f733a8 100644 --- a/src/periphery/contracts/libraries/Path.sol +++ b/src/periphery/contracts/libraries/Path.sol @@ -3,8 +3,6 @@ pragma solidity >=0.6.0; import './BytesLib.sol'; -import 'hardhat/console.sol'; - /// @title Functions for manipulating path data for multihop swaps /// @dev Credit to Uniswap Labs under GPL-2.0-or-later license: /// https://github.com/Uniswap/v3-periphery diff --git a/src/periphery/contracts/test/MockPlugin.sol b/src/periphery/contracts/test/MockPlugin.sol index 25f5672d9..f10e8f69b 100644 --- a/src/periphery/contracts/test/MockPlugin.sol +++ b/src/periphery/contracts/test/MockPlugin.sol @@ -3,9 +3,6 @@ pragma solidity =0.8.20; import '@cryptoalgebra/integral-core/contracts/interfaces/plugin/IAlgebraPlugin.sol'; -/// @title Algebra Integral 1.1 default plugin factory -/// @notice This contract creates Algebra default plugins for Algebra liquidity pools -/// @dev This plugin factory can only be used for Algebra base pools contract MockPlugin is IAlgebraPlugin { function defaultPluginConfig() external view returns (uint8) { return 0; From f73654493bc2edcfe2527a357d834f6e3df431ff Mon Sep 17 00:00:00 2001 From: IliaAzhel Date: Mon, 17 Jun 2024 23:49:39 +0300 Subject: [PATCH 10/17] [Periphery] reduce posmanager bytecode size --- .../contracts/NonfungiblePositionManager.sol | 5 +-- src/periphery/contracts/base/ERC721Permit.sol | 2 +- .../contracts/base/PoolInitializer.sol | 14 +++--- .../INonfungiblePositionManager.sol | 4 -- src/periphery/contracts/libraries/Path.sol | 4 +- .../contracts/libraries/PoolAddress.sol | 43 +++++++------------ .../contracts/libraries/PoolInteraction.sol | 3 +- src/periphery/hardhat.config.ts | 18 +++++++- 8 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/periphery/contracts/NonfungiblePositionManager.sol b/src/periphery/contracts/NonfungiblePositionManager.sol index 089f3005b..48f119421 100644 --- a/src/periphery/contracts/NonfungiblePositionManager.sol +++ b/src/periphery/contracts/NonfungiblePositionManager.sol @@ -413,7 +413,7 @@ contract NonfungiblePositionManager is /// @inheritdoc INonfungiblePositionManager function burn(uint256 tokenId) external payable override isAuthorizedForToken(tokenId) { Position storage position = _positions[tokenId]; - require(position.liquidity | position.tokensOwed0 | position.tokensOwed1 == 0, 'Not cleared'); + require(position.liquidity | position.tokensOwed0 | position.tokensOwed1 == 0); delete _positions[tokenId]; delete tokenFarmedIn[tokenId]; @@ -428,7 +428,7 @@ contract NonfungiblePositionManager is ) external payable override isAuthorizedForToken(tokenId) { address newValue; if (approve) { - require(farmingAddress == farmingCenter, 'Invalid farming address'); + require(farmingAddress == farmingCenter); newValue = farmingAddress; } farmingApprovals[tokenId] = newValue; @@ -454,7 +454,6 @@ contract NonfungiblePositionManager is function setFarmingCenter(address newFarmingCenter) external override { require(IAlgebraFactory(factory).hasRoleOrOwner(NONFUNGIBLE_POSITION_MANAGER_ADMINISTRATOR_ROLE, msg.sender)); farmingCenter = newFarmingCenter; - emit FarmingCenter(newFarmingCenter); } /// @inheritdoc IERC721Metadata diff --git a/src/periphery/contracts/base/ERC721Permit.sol b/src/periphery/contracts/base/ERC721Permit.sol index 8467f882b..9d61fac67 100644 --- a/src/periphery/contracts/base/ERC721Permit.sol +++ b/src/periphery/contracts/base/ERC721Permit.sol @@ -73,7 +73,7 @@ abstract contract ERC721Permit is BlockTimestamp, ERC721Enumerable, IERC721Permi ) ); address owner = ownerOf(tokenId); - require(spender != owner, 'ERC721Permit: approval to current owner'); + require(spender != owner, 'Approval to current owner'); if (Address.isContract(owner)) { _checkAuthorization(IERC1271(owner).isValidSignature(digest, abi.encodePacked(r, s, v)) == 0x1626ba7e); diff --git a/src/periphery/contracts/base/PoolInitializer.sol b/src/periphery/contracts/base/PoolInitializer.sol index e51a94c0e..377f4928b 100644 --- a/src/periphery/contracts/base/PoolInitializer.sol +++ b/src/periphery/contracts/base/PoolInitializer.sol @@ -23,15 +23,19 @@ abstract contract PoolInitializer is IPoolInitializer, PeripheryImmutableState { ) external payable override returns (address pool) { require(token0 < token1, 'Invalid order of tokens'); - pool = deployer == address(0) ? IAlgebraFactory(factory).poolByPair(token0, token1) : IAlgebraFactory(factory).customPoolByPair(deployer, token0, token1); + IAlgebraFactory _factory = IAlgebraFactory(factory); + + if (deployer == address(0)) pool = _factory.poolByPair(token0, token1); + else { + pool = _factory.customPoolByPair(deployer, token0, token1); + } if (pool == address(0)) { if (deployer == address(0)) { - pool = IAlgebraFactory(factory).createPool(token0, token1); - } else { - pool = IAlgebraFactory(factory).createCustomPool(deployer, msg.sender, token0, token1, ''); + pool = _factory.createPool(token0, token1); + + _initializePool(pool, sqrtPriceX96); } - _initializePool(pool, sqrtPriceX96); } else { uint160 sqrtPriceX96Existing = IAlgebraPool(pool)._getSqrtPrice(); if (sqrtPriceX96Existing == 0) { diff --git a/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol b/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol index ef13c7778..43d01cbed 100644 --- a/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol +++ b/src/periphery/contracts/interfaces/INonfungiblePositionManager.sol @@ -60,10 +60,6 @@ interface INonfungiblePositionManager is /// @param tokenId The ID of corresponding token event FarmingFailed(uint256 indexed tokenId); - /// @notice Emitted after farming center address change - /// @param farmingCenterAddress The new address of connected farming center - event FarmingCenter(address farmingCenterAddress); - /// @notice Returns the position information associated with a given token ID. /// @dev Throws if the token ID is not valid. /// @param tokenId The ID of the token that represents the position diff --git a/src/periphery/contracts/libraries/Path.sol b/src/periphery/contracts/libraries/Path.sol index b37f733a8..df5b59ca5 100644 --- a/src/periphery/contracts/libraries/Path.sol +++ b/src/periphery/contracts/libraries/Path.sol @@ -41,7 +41,9 @@ library Path { /// @return tokenA The first token of the given pool /// @return deployer The address of the custom pool deployer /// @return tokenB The second token of the given pool - function decodeFirstPool(bytes memory path) internal pure returns (address tokenA, address deployer, address tokenB) { + function decodeFirstPool( + bytes memory path + ) internal pure returns (address tokenA, address deployer, address tokenB) { tokenA = path.toAddress(0); deployer = path.toAddress(DEPLOYER_OFFSET); tokenB = path.toAddress(NEXT_OFFSET); diff --git a/src/periphery/contracts/libraries/PoolAddress.sol b/src/periphery/contracts/libraries/PoolAddress.sol index e35b10dc0..af3402a0b 100644 --- a/src/periphery/contracts/libraries/PoolAddress.sol +++ b/src/periphery/contracts/libraries/PoolAddress.sol @@ -29,36 +29,23 @@ library PoolAddress { /// @return pool The contract address of the Algebra pool function computeAddress(address poolDeployer, PoolKey memory key) internal pure returns (address pool) { require(key.token0 < key.token1, 'Invalid order of tokens'); - if (key.deployer == address(0)) { - pool = address( - uint160( - uint256( - keccak256( - abi.encodePacked( - hex'ff', - poolDeployer, - keccak256(abi.encode(key.token0, key.token1)), - POOL_INIT_CODE_HASH - ) + pool = address( + uint160( + uint256( + keccak256( + abi.encodePacked( + hex'ff', + poolDeployer, + keccak256( + key.deployer == address(0) + ? abi.encode(key.token0, key.token1) + : abi.encode(key.deployer, key.token0, key.token1) + ), + POOL_INIT_CODE_HASH ) ) ) - ); - } else { - pool = address( - uint160( - uint256( - keccak256( - abi.encodePacked( - hex'ff', - poolDeployer, - keccak256(abi.encode(key.deployer, key.token0, key.token1)), - POOL_INIT_CODE_HASH - ) - ) - ) - ) - ); - } + ) + ); } } diff --git a/src/periphery/contracts/libraries/PoolInteraction.sol b/src/periphery/contracts/libraries/PoolInteraction.sol index e9b9e2b7d..7d18f1e70 100644 --- a/src/periphery/contracts/libraries/PoolInteraction.sol +++ b/src/periphery/contracts/libraries/PoolInteraction.sol @@ -23,8 +23,7 @@ library PoolInteraction { uint128 fees1 ) { - bytes32 positionKey = PositionKey.compute(owner, tickLower, tickUpper); - return pool.positions(positionKey); + return pool.positions(PositionKey.compute(owner, tickLower, tickUpper)); } function _getSqrtPrice(IAlgebraPool pool) internal view returns (uint160 sqrtPriceX96) { diff --git a/src/periphery/hardhat.config.ts b/src/periphery/hardhat.config.ts index f02552f23..bab1d6711 100644 --- a/src/periphery/hardhat.config.ts +++ b/src/periphery/hardhat.config.ts @@ -19,6 +19,20 @@ const LOW_OPTIMIZER_COMPILER_SETTINGS = { }, }; +const ZERO_RUNS_OPTIMIZER_COMPILER_SETTINGS = { + version: '0.8.20', + settings: { + evmVersion: 'paris', + optimizer: { + enabled: true, + runs: 0, + }, + metadata: { + bytecodeHash: 'none', + }, + }, +}; + const LOWEST_OPTIMIZER_COMPILER_SETTINGS = { version: '0.8.20', settings: { @@ -69,8 +83,8 @@ export default { solidity: { compilers: [DEFAULT_COMPILER_SETTINGS], overrides: { - 'contracts/NonfungiblePositionManager.sol': LOW_OPTIMIZER_COMPILER_SETTINGS, - 'contracts/test/MockTimeNonfungiblePositionManager.sol': LOW_OPTIMIZER_COMPILER_SETTINGS, + 'contracts/NonfungiblePositionManager.sol': ZERO_RUNS_OPTIMIZER_COMPILER_SETTINGS, + 'contracts/test/MockTimeNonfungiblePositionManager.sol': ZERO_RUNS_OPTIMIZER_COMPILER_SETTINGS, 'contracts/test/NFTDescriptorTest.sol': LOWEST_OPTIMIZER_COMPILER_SETTINGS, 'contracts/NonfungibleTokenPositionDescriptor.sol': LOWEST_OPTIMIZER_COMPILER_SETTINGS, 'contracts/libraries/NFTDescriptor.sol': LOWEST_OPTIMIZER_COMPILER_SETTINGS, From 3f79165f75a5685aec441258b6e681fb6ef537b6 Mon Sep 17 00:00:00 2001 From: IliaAzhel Date: Tue, 18 Jun 2024 00:13:44 +0300 Subject: [PATCH 11/17] [Periphery] add test custom pool deployer contract & adapt tests --- src/periphery/contracts/test/CustomPlugin.sol | 120 ++++++++++++++++++ .../contracts/test/CustomPoolDeployerTest.sol | 12 +- src/periphery/contracts/test/MockPlugin.sol | 84 ++++++------ src/periphery/scripts/deployTest.js | 34 +++++ src/periphery/test/EntryPoint.spec.ts | 3 +- .../test/NonfungiblePositionManager.spec.ts | 10 +- src/periphery/test/Quoter.spec.ts | 1 - src/periphery/test/QuoterV2.spec.ts | 1 - src/periphery/test/SwapRouter.spec.ts | 2 - src/periphery/test/shared/completeFixture.ts | 12 +- src/periphery/test/shared/externalFixtures.ts | 2 +- 11 files changed, 210 insertions(+), 71 deletions(-) create mode 100644 src/periphery/contracts/test/CustomPlugin.sol create mode 100644 src/periphery/scripts/deployTest.js diff --git a/src/periphery/contracts/test/CustomPlugin.sol b/src/periphery/contracts/test/CustomPlugin.sol new file mode 100644 index 000000000..0b97b6921 --- /dev/null +++ b/src/periphery/contracts/test/CustomPlugin.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity =0.8.20; + +import '@cryptoalgebra/integral-core/contracts/base/common/Timestamp.sol'; +import '@cryptoalgebra/integral-core/contracts/libraries/Plugins.sol'; + +import '@cryptoalgebra/integral-core/contracts/interfaces/IAlgebraFactory.sol'; +import '@cryptoalgebra/integral-core/contracts/interfaces/plugin/IAlgebraPlugin.sol'; +import '@cryptoalgebra/integral-core/contracts/interfaces/pool/IAlgebraPoolState.sol'; +import '@cryptoalgebra/integral-core/contracts/interfaces/IAlgebraPool.sol'; + +contract CustomPlugin is Timestamp, IAlgebraPlugin { + using Plugins for uint8; + + address public pool; + bytes32 public constant ALGEBRA_BASE_PLUGIN_MANAGER = keccak256('ALGEBRA_BASE_PLUGIN_MANAGER'); + + function _getPoolState() internal view returns (uint160 price, int24 tick, uint16 fee, uint8 pluginConfig) { + (price, tick, fee, pluginConfig, , ) = IAlgebraPoolState(pool).globalState(); + } + + /// @inheritdoc IAlgebraPlugin + uint8 public constant override defaultPluginConfig = + uint8(Plugins.BEFORE_SWAP_FLAG | Plugins.AFTER_SWAP_FLAG | Plugins.DYNAMIC_FEE); + + function beforeInitialize(address, uint160) external override returns (bytes4) { + pool = msg.sender; + _updatePluginConfigInPool(); + return IAlgebraPlugin.beforeInitialize.selector; + } + + function afterInitialize(address, uint160, int24) external override returns (bytes4) { + _updatePluginConfigInPool(); + return IAlgebraPlugin.afterInitialize.selector; + } + + /// @dev unused + function beforeModifyPosition( + address, + address, + int24, + int24, + int128, + bytes calldata + ) external override returns (bytes4) { + _updatePluginConfigInPool(); // should not be called, reset config + return IAlgebraPlugin.beforeModifyPosition.selector; + } + + /// @dev unused + function afterModifyPosition( + address, + address, + int24, + int24, + int128, + uint256, + uint256, + bytes calldata + ) external override returns (bytes4) { + _updatePluginConfigInPool(); // should not be called, reset config + return IAlgebraPlugin.afterModifyPosition.selector; + } + + function beforeSwap( + address, + address, + bool, + int256, + uint160, + bool, + bytes calldata + ) external override returns (bytes4) { + IAlgebraPool(pool).setFee(10000); + return IAlgebraPlugin.beforeSwap.selector; + } + + function afterSwap( + address, + address, + bool, + int256, + uint160, + int256, + int256, + bytes calldata + ) external override returns (bytes4) { + IAlgebraPool(pool).setFee(100); + return IAlgebraPlugin.afterSwap.selector; + } + + /// @dev unused + function beforeFlash(address, address, uint256, uint256, bytes calldata) external override returns (bytes4) { + _updatePluginConfigInPool(); // should not be called, reset config + return IAlgebraPlugin.beforeFlash.selector; + } + + /// @dev unused + function afterFlash( + address, + address, + uint256, + uint256, + uint256, + uint256, + bytes calldata + ) external override returns (bytes4) { + _updatePluginConfigInPool(); // should not be called, reset config + return IAlgebraPlugin.afterFlash.selector; + } + + function _updatePluginConfigInPool() internal { + uint8 newPluginConfig = defaultPluginConfig; + + (, , , uint8 currentPluginConfig) = _getPoolState(); + if (currentPluginConfig != newPluginConfig) { + IAlgebraPool(pool).setPluginConfig(newPluginConfig); + } + } +} diff --git a/src/periphery/contracts/test/CustomPoolDeployerTest.sol b/src/periphery/contracts/test/CustomPoolDeployerTest.sol index 844ffcec9..3515d2ab8 100644 --- a/src/periphery/contracts/test/CustomPoolDeployerTest.sol +++ b/src/periphery/contracts/test/CustomPoolDeployerTest.sol @@ -5,11 +5,13 @@ import {IAlgebraCustomPoolEntryPoint} from '../interfaces/IAlgebraCustomPoolEntr contract CustomPoolDeployerTest { address public immutable entryPoint; + address public immutable plugin; mapping(address => address) public poolToPlugin; - constructor(address _entryPoint) { + constructor(address _entryPoint, address _plugin) { entryPoint = _entryPoint; + plugin = _plugin; } function createCustomPool( @@ -23,7 +25,7 @@ contract CustomPoolDeployerTest { } function beforeCreatePoolHook( - address pool, + address, address, address, address, @@ -32,11 +34,11 @@ contract CustomPoolDeployerTest { ) external view returns (address) { require(msg.sender == entryPoint, 'Only entryPoint'); - return poolToPlugin[pool]; + return plugin; } - function setPluginForPool(address pool, address plugin) external { - poolToPlugin[pool] = plugin; + function setPluginForPool(address pool, address _plugin) external { + poolToPlugin[pool] = _plugin; } function setTickSpacing(address pool, int24 newTickSpacing) external { diff --git a/src/periphery/contracts/test/MockPlugin.sol b/src/periphery/contracts/test/MockPlugin.sol index f10e8f69b..48e1a1621 100644 --- a/src/periphery/contracts/test/MockPlugin.sol +++ b/src/periphery/contracts/test/MockPlugin.sol @@ -4,80 +4,72 @@ pragma solidity =0.8.20; import '@cryptoalgebra/integral-core/contracts/interfaces/plugin/IAlgebraPlugin.sol'; contract MockPlugin is IAlgebraPlugin { - function defaultPluginConfig() external view returns (uint8) { + function defaultPluginConfig() external pure returns (uint8) { return 0; } - function beforeInitialize(address sender, uint160 sqrtPriceX96) external returns (bytes4) { + function beforeInitialize(address, uint160) external pure returns (bytes4) { return IAlgebraPlugin.beforeInitialize.selector; } - function afterInitialize(address sender, uint160 sqrtPriceX96, int24 tick) external returns (bytes4) { + function afterInitialize(address, uint160, int24) external pure returns (bytes4) { return IAlgebraPlugin.afterInitialize.selector; } function beforeModifyPosition( - address sender, - address recipient, - int24 bottomTick, - int24 topTick, - int128 desiredLiquidityDelta, - bytes calldata data - ) external returns (bytes4) { + address, + address, + int24, + int24, + int128, + bytes calldata + ) external pure returns (bytes4) { return IAlgebraPlugin.beforeModifyPosition.selector; } function afterModifyPosition( - address sender, - address recipient, - int24 bottomTick, - int24 topTick, - int128 desiredLiquidityDelta, - uint256 amount0, - uint256 amount1, - bytes calldata data - ) external returns (bytes4) { + address, + address, + int24, + int24, + int128, + uint256, + uint256, + bytes calldata + ) external pure returns (bytes4) { return IAlgebraPlugin.afterModifyPosition.selector; } - function beforeSwap( - address sender, - address recipient, - bool zeroToOne, - int256 amountRequired, - uint160 limitSqrtPrice, - bool withPaymentInAdvance, - bytes calldata data - ) external returns (bytes4) { + function beforeSwap(address, address, bool, int256, uint160, bool, bytes calldata) external pure returns (bytes4) { return IAlgebraPlugin.beforeSwap.selector; } function afterSwap( - address sender, - address recipient, - bool zeroToOne, - int256 amountRequired, - uint160 limitSqrtPrice, - int256 amount0, - int256 amount1, - bytes calldata data - ) external returns (bytes4) { + address, + address, + bool, + int256, + uint160, + int256, + int256, + bytes calldata + ) external pure returns (bytes4) { return IAlgebraPlugin.afterSwap.selector; } - function beforeFlash(address sender, address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external returns (bytes4) { + function beforeFlash(address, address, uint256, uint256, bytes calldata) external pure returns (bytes4) { return IAlgebraPlugin.beforeFlash.selector; } function afterFlash( - address sender, - address recipient, - uint256 amount0, - uint256 amount1, - uint256 paid0, - uint256 paid1, - bytes calldata data - ) external returns (bytes4) { + address, + address, + uint256, + uint256, + uint256, + uint256, + bytes calldata + ) external pure returns (bytes4) { return IAlgebraPlugin.afterFlash.selector; } } diff --git a/src/periphery/scripts/deployTest.js b/src/periphery/scripts/deployTest.js new file mode 100644 index 000000000..bdd5f35e9 --- /dev/null +++ b/src/periphery/scripts/deployTest.js @@ -0,0 +1,34 @@ +const hre = require('hardhat'); +const fs = require('fs'); +const path = require('path'); +const { ethers } = require('ethers'); + +async function main() { + + const deployDataPath = path.resolve(__dirname, '../../../deploys.json'); + let deploysData = JSON.parse(fs.readFileSync(deployDataPath, 'utf8')); + + const cpFactory = await hre.ethers.getContractFactory('CustomPlugin') + const cp = await cpFactory.deploy() + + await cp.waitForDeployment() + console.log("CustomPlugin:",cp.target) + + const cpdFactory = await hre.ethers.getContractFactory('CustomPoolDeployerTest') + const cpd1 = await cpdFactory.deploy(deploysData.entryPoint, await cp.getAddress()) + + await cpd1.waitForDeployment() + console.log("Custom pool deployer with plugin:", cpd1.target) + + const cpd2 = await cpdFactory.deploy(deploysData.entryPoint,"0x0000000000000000000000000000000000000000") + + await cpd2.waitForDeployment() + console.log("Custom pool deployer without plugin",cpd2.target) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/src/periphery/test/EntryPoint.spec.ts b/src/periphery/test/EntryPoint.spec.ts index 810bf0be7..b8b10013f 100644 --- a/src/periphery/test/EntryPoint.spec.ts +++ b/src/periphery/test/EntryPoint.spec.ts @@ -18,6 +18,7 @@ import { expect } from './shared/expect'; import { encodePriceSqrt } from './shared/encodePriceSqrt'; import { abi as IAlgebraPoolABI } from '@cryptoalgebra/integral-core/artifacts/contracts/interfaces/IAlgebraPool.sol/IAlgebraPool.json'; +import { ZERO_ADDRESS } from './CallbackValidation.spec'; describe('CustomPoolEntryPoint', () => { let wallets: Wallet[]; @@ -67,7 +68,7 @@ describe('CustomPoolEntryPoint', () => { entryPoint = (await entryPointFactory.deploy(factory)) as any as AlgebraCustomPoolEntryPoint; const customPoolDeployerFactory = await ethers.getContractFactory('CustomPoolDeployerTest'); - customPoolDeployer = (await customPoolDeployerFactory.deploy(await entryPoint.getAddress())) as any as CustomPoolDeployerTest; + customPoolDeployer = (await customPoolDeployerFactory.deploy(await entryPoint.getAddress(), ZERO_ADDRESS)) as any as CustomPoolDeployerTest; let customPoolDeployerRole = await factory.CUSTOM_POOL_DEPLOYER() let poolAdministratorRole = await factory.POOLS_ADMINISTRATOR_ROLE() diff --git a/src/periphery/test/NonfungiblePositionManager.spec.ts b/src/periphery/test/NonfungiblePositionManager.spec.ts index 4df62e04b..31d3d0dd2 100644 --- a/src/periphery/test/NonfungiblePositionManager.spec.ts +++ b/src/periphery/test/NonfungiblePositionManager.spec.ts @@ -874,19 +874,19 @@ describe('NonfungiblePositionManager', () => { }); it('cannot be called while there is still liquidity', async () => { - await expect(nft.connect(other).burn(tokenId)).to.be.revertedWith('Not cleared'); + await expect(nft.connect(other).burn(tokenId)).to.be.reverted; }); it('cannot be called while there is still partial liquidity', async () => { await nft.connect(other).decreaseLiquidity({ tokenId, liquidity: 50, amount0Min: 0, amount1Min: 0, deadline: 1 }); - await expect(nft.connect(other).burn(tokenId)).to.be.revertedWith('Not cleared'); + await expect(nft.connect(other).burn(tokenId)).to.be.reverted; }); it('cannot be called while there is still tokens owed', async () => { await nft .connect(other) .decreaseLiquidity({ tokenId, liquidity: 100, amount0Min: 0, amount1Min: 0, deadline: 1 }); - await expect(nft.connect(other).burn(tokenId)).to.be.revertedWith('Not cleared'); + await expect(nft.connect(other).burn(tokenId)).to.be.reverted; }); it('deletes the token', async () => { @@ -1390,9 +1390,7 @@ describe('NonfungiblePositionManager', () => { it('can not approve for invalid farming', async () => { await nft.setFarmingCenter(wallet.address); - await expect(nft.connect(other).approveForFarming(tokenId, true, nft)).to.be.revertedWith( - 'Invalid farming address' - ); + await expect(nft.connect(other).approveForFarming(tokenId, true, nft)).to.be.reverted; }); it('can revoke approval for farming', async () => { diff --git a/src/periphery/test/Quoter.spec.ts b/src/periphery/test/Quoter.spec.ts index e889bc4e5..08ea4bf8b 100644 --- a/src/periphery/test/Quoter.spec.ts +++ b/src/periphery/test/Quoter.spec.ts @@ -157,7 +157,6 @@ describe('Quoter', () => { }); it('1 -> 0', async () => { - console.log(encodePath([tokens[1].address, ZERO_ADDRESS, tokens[0].address])) const { amountOut, fees } = await quoter.quoteExactInput.staticCall( encodePath([tokens[1].address, ZERO_ADDRESS, tokens[0].address]), 3 diff --git a/src/periphery/test/QuoterV2.spec.ts b/src/periphery/test/QuoterV2.spec.ts index df2b35784..c478d6877 100644 --- a/src/periphery/test/QuoterV2.spec.ts +++ b/src/periphery/test/QuoterV2.spec.ts @@ -85,7 +85,6 @@ describe('QuoterV2', function () { describe('#quoteExactInput', () => { it('0 -> 2 cross 2 tick', async () => { - console.log(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address])); const { amountOut, amountIn, sqrtPriceX96AfterList, initializedTicksCrossedList } = await quoter.quoteExactInput.staticCall(encodePath([tokens[0].address, ZERO_ADDRESS, tokens[2].address]), 10000); diff --git a/src/periphery/test/SwapRouter.spec.ts b/src/periphery/test/SwapRouter.spec.ts index c6ffc337a..2e358112e 100644 --- a/src/periphery/test/SwapRouter.spec.ts +++ b/src/periphery/test/SwapRouter.spec.ts @@ -745,8 +745,6 @@ describe('SwapRouter', function () { const poolBefore = await getBalances(pool); const traderBefore = await getBalances(trader.address); - console.log('path: ', path); - await exactOutput(path.slice(0, 3)); // get balances after diff --git a/src/periphery/test/shared/completeFixture.ts b/src/periphery/test/shared/completeFixture.ts index b430f3145..bf7da8c1b 100644 --- a/src/periphery/test/shared/completeFixture.ts +++ b/src/periphery/test/shared/completeFixture.ts @@ -8,7 +8,7 @@ import { MockTimeSwapRouter, NonfungibleTokenPositionDescriptor, TestERC20, - IAlgebraFactory, + AlgebraFactory, MockPluginFactory, AlgebraCustomPoolEntryPoint, CustomPoolDeployerTest, @@ -47,7 +47,7 @@ const DEFAULT_TOKENS_RATIONS_DATA: TokenRatioSortData[] = [ const completeFixture: () => Promise<{ wnative: IWNativeToken; - factory: IAlgebraFactory; + factory: AlgebraFactory; router: MockTimeSwapRouter; nft: MockTimeNonfungiblePositionManager; nftDescriptor: NonfungibleTokenPositionDescriptor; @@ -76,7 +76,7 @@ const completeFixture: () => Promise<{ const pluginFactoryFactory = await ethers.getContractFactory('MockPluginFactory'); const pluginFactory = await pluginFactoryFactory.deploy(factory) as any as MockPluginFactory; - factory.setDefaultPluginFactory(pluginFactory); + await factory.setDefaultPluginFactory(await pluginFactory.getAddress()); const nftDescriptorLibraryFactory = await ethers.getContractFactory('NFTDescriptor'); const nftDescriptorLibrary = await nftDescriptorLibraryFactory.deploy(); @@ -107,7 +107,7 @@ const completeFixture: () => Promise<{ const entryPoint = await entryPointFactory.deploy(factory) as any as AlgebraCustomPoolEntryPoint; const customPoolDeployerFactory = await ethers.getContractFactory("CustomPoolDeployerTest"); - const customPoolDeployer = await customPoolDeployerFactory.deploy(entryPoint) as any as CustomPoolDeployerTest; + const customPoolDeployer = await customPoolDeployerFactory.deploy(entryPoint, ZERO_ADDRESS) as any as CustomPoolDeployerTest; let customPoolDeployerRole = await factory.CUSTOM_POOL_DEPLOYER() let poolAdministratorRole = await factory.POOLS_ADMINISTRATOR_ROLE() @@ -122,10 +122,6 @@ const completeFixture: () => Promise<{ tokens[2].address_ ] - console.log('factory address: ', factory.target); - - console.log('deployer address in js: ', await customPoolDeployer.getAddress()); - return { wnative, factory, diff --git a/src/periphery/test/shared/externalFixtures.ts b/src/periphery/test/shared/externalFixtures.ts index 07141a72b..eaedd7e3b 100644 --- a/src/periphery/test/shared/externalFixtures.ts +++ b/src/periphery/test/shared/externalFixtures.ts @@ -9,7 +9,7 @@ import { import { abi as FACTORY_V2_ABI, bytecode as FACTORY_V2_BYTECODE } from '@uniswap/v2-core/build/UniswapV2Factory.json'; import { ethers } from 'hardhat'; -import { IAlgebraFactory, IWNativeToken, MockTimeSwapRouter } from '../../typechain'; +import { AlgebraFactory, IWNativeToken, MockTimeSwapRouter } from '../../typechain'; import WNativeToken from '../contracts/WNativeToken.json'; import { getCreateAddress, ZeroAddress } from 'ethers'; From c450a2b660f0a272557c99b9aba0a76cc35a3f38 Mon Sep 17 00:00:00 2001 From: IliaAzhel Date: Tue, 18 Jun 2024 00:14:59 +0300 Subject: [PATCH 12/17] [Periphery] update test snapshots --- .../NonfungiblePositionManager.spec.ts.snap | 38 +++++++++---------- .../__snapshots__/PoolAddress.spec.ts.snap | 2 +- .../__snapshots__/PositionValue.spec.ts.snap | 10 ++--- .../test/__snapshots__/QuoterV2.spec.ts.snap | 28 +++++++------- .../__snapshots__/SwapRouter.spec.ts.snap | 2 +- .../__snapshots__/V3Migrator.spec.ts.snap | 2 +- 6 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index 3dcd2976e..44f0a5ce3 100644 --- a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -1,39 +1,39 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`NonfungiblePositionManager #burn gas [ @skip-on-coverage ] 1`] = `61849`; +exports[`NonfungiblePositionManager #burn gas [ @skip-on-coverage ] 1`] = `62302`; -exports[`NonfungiblePositionManager #collect gas transfers both [ @skip-on-coverage ] 1`] = `122628`; +exports[`NonfungiblePositionManager #collect gas transfers both [ @skip-on-coverage ] 1`] = `123658`; -exports[`NonfungiblePositionManager #collect gas transfers token0 only [ @skip-on-coverage ] 1`] = `118972`; +exports[`NonfungiblePositionManager #collect gas transfers token0 only [ @skip-on-coverage ] 1`] = `120002`; -exports[`NonfungiblePositionManager #collect gas transfers token1 only [ @skip-on-coverage ] 1`] = `119163`; +exports[`NonfungiblePositionManager #collect gas transfers token1 only [ @skip-on-coverage ] 1`] = `120193`; -exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `5262001`; +exports[`NonfungiblePositionManager #createAndInitializePoolIfNecessary gas [ @skip-on-coverage ] 1`] = `5262688`; -exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @skip-on-coverage ] 1`] = `169339`; +exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @skip-on-coverage ] 1`] = `169445`; -exports[`NonfungiblePositionManager #decreaseLiquidity gas partial decrease [ @skip-on-coverage ] 1`] = `173868`; +exports[`NonfungiblePositionManager #decreaseLiquidity gas partial decrease [ @skip-on-coverage ] 1`] = `174001`; -exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] 1`] = `179882`; +exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] 1`] = `180333`; -exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `631099`; +exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `632767`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `644530`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `647130`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `637363`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `639963`; -exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `436856`; +exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `438467`; -exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `326714`; +exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `328325`; -exports[`NonfungiblePositionManager #permit owned by eoa gas [ @skip-on-coverage ] 1`] = `59288`; +exports[`NonfungiblePositionManager #permit owned by eoa gas [ @skip-on-coverage ] 1`] = `60014`; -exports[`NonfungiblePositionManager #permit owned by verifying contract gas [ @skip-on-coverage ] 1`] = `63106`; +exports[`NonfungiblePositionManager #permit owned by verifying contract gas [ @skip-on-coverage ] 1`] = `63880`; -exports[`NonfungiblePositionManager #transferFrom gas [ @skip-on-coverage ] 1`] = `86049`; +exports[`NonfungiblePositionManager #transferFrom gas [ @skip-on-coverage ] 1`] = `86323`; -exports[`NonfungiblePositionManager #transferFrom gas comes from approved [ @skip-on-coverage ] 1`] = `86831`; +exports[`NonfungiblePositionManager #transferFrom gas comes from approved [ @skip-on-coverage ] 1`] = `87247`; -exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `25264`; +exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `21882`; -exports[`NonfungiblePositionManager multicall exit gas [ @skip-on-coverage ] 1`] = `243107`; +exports[`NonfungiblePositionManager multicall exit gas [ @skip-on-coverage ] 1`] = `245031`; diff --git a/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap b/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap index f8f02b2da..8ba29e906 100644 --- a/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap +++ b/src/periphery/test/__snapshots__/PoolAddress.spec.ts.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PoolAddress #computeAddress gas cost [ @skip-on-coverage ] 1`] = `695`; +exports[`PoolAddress #computeAddress gas cost [ @skip-on-coverage ] 1`] = `673`; exports[`PoolAddress #computeAddress matches example from core repo 1`] = `"0xB01C0Cd9dD6dFf3f23939358D431299fdFFA82C8"`; diff --git a/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap b/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap index aa1dc260c..a2107a0d0 100644 --- a/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap +++ b/src/periphery/test/__snapshots__/PositionValue.spec.ts.snap @@ -1,11 +1,11 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PositionValue #fees when price is above the position range gas 1`] = `50962`; +exports[`PositionValue #fees when price is above the position range gas 1`] = `51801`; -exports[`PositionValue #fees when price is below the position range gas 1`] = `51028`; +exports[`PositionValue #fees when price is below the position range gas 1`] = `51867`; -exports[`PositionValue #fees when price is within the position range gas 1`] = `56487`; +exports[`PositionValue #fees when price is within the position range gas 1`] = `57326`; -exports[`PositionValue #principal gas 1`] = `25630`; +exports[`PositionValue #principal gas 1`] = `26316`; -exports[`PositionValue #total gas 1`] = `59578`; +exports[`PositionValue #total gas 1`] = `60417`; diff --git a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap index c72dffeee..68d30116c 100644 --- a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap +++ b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap @@ -1,29 +1,29 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `156211`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 1`] = `156167`; -exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156153`; +exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156109`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `247509`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `247469`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105838`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105794`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90570`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick not initialized 1`] = `90526`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125934`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 1 tick 1`] = `125890`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `156103`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 tick 1`] = `156059`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125943`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 2 where tick after is initialized 1`] = `125899`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `126271`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 1 tick 1`] = `126227`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156714`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 ticks 1`] = `156670`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156718`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156674`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `91425`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `91429`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91557`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91513`; -exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91574`; +exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 1 -> 0 1`] = `91530`; diff --git a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap index d057d3c5b..0efbf4802 100644 --- a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap +++ b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12902`; +exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12654`; diff --git a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap index d0899762a..13c61c890 100644 --- a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap +++ b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `750213`; +exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `751881`; From ff8f5c8149287e276acb72112e474c545772b428 Mon Sep 17 00:00:00 2001 From: IliaAzhel Date: Tue, 18 Jun 2024 00:16:32 +0300 Subject: [PATCH 13/17] [Common] fix deployment scripts --- src/farming/scripts/deploy.js | 10 +++++++--- src/periphery/scripts/deploy.js | 8 +++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/farming/scripts/deploy.js b/src/farming/scripts/deploy.js index edba9db14..09f832ab7 100644 --- a/src/farming/scripts/deploy.js +++ b/src/farming/scripts/deploy.js @@ -23,19 +23,23 @@ async function main() { await FarmingCenter.waitForDeployment() console.log('FarmingCenter deployed to:', FarmingCenter.target) - await AlgebraEternalFarming.setFarmingCenterAddress(FarmingCenter.target) + const txEternalFarming = await AlgebraEternalFarming.setFarmingCenterAddress(FarmingCenter.target) + await txEternalFarming.wait() console.log('Updated farming center address in eternal(incentive) farming') const pluginFactory = await hre.ethers.getContractAt(BasePluginV1FactoryComplied.abi, deploysData.BasePluginV1Factory) - await pluginFactory.setFarmingAddress(FarmingCenter.target) + const txFarmingAddress = await pluginFactory.setFarmingAddress(FarmingCenter.target) + await txFarmingAddress.wait() console.log('Updated farming center address in plugin factory') const posManager = await hre.ethers.getContractAt( 'INonfungiblePositionManager', deploysData.nonfungiblePositionManager ) - await posManager.setFarmingCenter(FarmingCenter.target) + + const txPosManager = await posManager.setFarmingCenter(FarmingCenter.target) + await txPosManager.wait() fs.writeFileSync(deployDataPath, JSON.stringify(deploysData), 'utf-8'); } diff --git a/src/periphery/scripts/deploy.js b/src/periphery/scripts/deploy.js index 2a3ed9fc4..8560c63a4 100644 --- a/src/periphery/scripts/deploy.js +++ b/src/periphery/scripts/deploy.js @@ -24,9 +24,11 @@ async function main() { console.log('EntryPoint deployed to:', entryPoint.target) const factory = await hre.ethers.getContractAt(AlgebraFactoryComplied.abi, deploysData.factory) - - await factory.grantRole("0xc9cf812513d9983585eb40fcfe6fd49fbb6a45815663ec33b30a6c6c7de3683b", entryPoint.target); - await factory.grantRole("0xb73ce166ead2f8e9add217713a7989e4edfba9625f71dfd2516204bb67ad3442", entryPoint.target); + + const deployerRole = await factory.grantRole("0xc9cf812513d9983585eb40fcfe6fd49fbb6a45815663ec33b30a6c6c7de3683b", entryPoint.target); + await deployerRole.wait() + const administratorRole = await factory.grantRole("0xb73ce166ead2f8e9add217713a7989e4edfba9625f71dfd2516204bb67ad3442", entryPoint.target); + await administratorRole.wait() const TickLensFactory = await hre.ethers.getContractFactory('TickLens'); const TickLens = await TickLensFactory.deploy(); From 70f15b0acb7cc8158b2426ace2872b97d58e5187 Mon Sep 17 00:00:00 2001 From: IliaAzhel Date: Tue, 18 Jun 2024 01:27:46 +0300 Subject: [PATCH 14/17] [Common] move deployer address of PoolKey struct --- src/farming/contracts/FarmingCenter.sol | 5 ++- .../contracts/libraries/NFTPositionInfo.sol | 4 +- .../__snapshots__/EternalFarms.spec.ts.snap | 4 +- .../contracts/NonfungiblePositionManager.sol | 2 +- .../NonfungibleTokenPositionDescriptor.sol | 19 +++++++-- src/periphery/contracts/SwapRouter.sol | 41 +++++++++++-------- .../contracts/base/LiquidityManagement.sol | 6 ++- src/periphery/contracts/lens/Quoter.sol | 12 +++--- src/periphery/contracts/lens/QuoterV2.sol | 12 +++--- .../libraries/CallbackValidation.sol | 7 ++-- .../contracts/libraries/PoolAddress.sol | 7 ++-- .../contracts/libraries/PositionValue.sol | 6 ++- .../contracts/test/PoolAddressTest.sol | 8 +++- .../NonfungiblePositionManager.spec.ts.snap | 14 +++---- .../test/__snapshots__/QuoterV2.spec.ts.snap | 4 +- .../__snapshots__/SwapRouter.spec.ts.snap | 2 +- .../__snapshots__/V3Migrator.spec.ts.snap | 2 +- 17 files changed, 96 insertions(+), 59 deletions(-) diff --git a/src/farming/contracts/FarmingCenter.sol b/src/farming/contracts/FarmingCenter.sol index b0c408f2e..b704a964e 100644 --- a/src/farming/contracts/FarmingCenter.sol +++ b/src/farming/contracts/FarmingCenter.sol @@ -140,6 +140,9 @@ contract FarmingCenter is IFarmingCenter, IPositionFollower, Multicall { require(msg.sender == address(eternalFarming), 'Only farming can call this'); require(virtualPool != address(0), 'Zero address as virtual pool'); pool = IAlgebraPool(plugin.pool()); - require(address(pool) == PoolAddress.computeAddress(algebraPoolDeployer, PoolAddress.PoolKey(pool.token0(), pool.token1(), address(0))), 'Invalid pool'); + require( + address(pool) == PoolAddress.computeAddress(algebraPoolDeployer, PoolAddress.PoolKey(address(0), pool.token0(), pool.token1())), + 'Invalid pool' + ); } } diff --git a/src/farming/contracts/libraries/NFTPositionInfo.sol b/src/farming/contracts/libraries/NFTPositionInfo.sol index 11e26f109..363916b2b 100644 --- a/src/farming/contracts/libraries/NFTPositionInfo.sol +++ b/src/farming/contracts/libraries/NFTPositionInfo.sol @@ -25,6 +25,8 @@ library NFTPositionInfo { address pluginDeployer; (, , token0, token1, pluginDeployer, tickLower, tickUpper, liquidity, , , , ) = nonfungiblePositionManager.positions(tokenId); - pool = IAlgebraPool(PoolAddress.computeAddress(address(deployer), PoolAddress.PoolKey({token0: token0, token1: token1, deployer: pluginDeployer}))); + pool = IAlgebraPool( + PoolAddress.computeAddress(address(deployer), PoolAddress.PoolKey({deployer: pluginDeployer, token0: token0, token1: token1})) + ); } } diff --git a/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap b/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap index 65b55717d..50df3ca84 100644 --- a/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap +++ b/src/farming/test/unit/__snapshots__/EternalFarms.spec.ts.snap @@ -2,6 +2,6 @@ exports[`unit/EternalFarms #claimReward when requesting the full amount has gas cost [ @skip-on-coverage ] 1`] = `60772`; -exports[`unit/EternalFarms #enterFarming works and has gas cost [ @skip-on-coverage ] 1`] = `497382`; +exports[`unit/EternalFarms #enterFarming works and has gas cost [ @skip-on-coverage ] 1`] = `498891`; -exports[`unit/EternalFarms #exitFarming after end time works and has gas cost [ @skip-on-coverage ] 1`] = `169629`; +exports[`unit/EternalFarms #exitFarming after end time works and has gas cost [ @skip-on-coverage ] 1`] = `171745`; diff --git a/src/periphery/contracts/NonfungiblePositionManager.sol b/src/periphery/contracts/NonfungiblePositionManager.sol index 48f119421..7e1de9349 100644 --- a/src/periphery/contracts/NonfungiblePositionManager.sol +++ b/src/periphery/contracts/NonfungiblePositionManager.sol @@ -181,7 +181,7 @@ contract NonfungiblePositionManager is // idempotent set uint80 poolId = _cachePoolKey( address(pool), - PoolAddress.PoolKey({token0: params.token0, token1: params.token1, deployer: params.deployer}) + PoolAddress.PoolKey({deployer: params.deployer, token0: params.token0, token1: params.token1}) ); _positions[tokenId] = Position({ diff --git a/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol b/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol index 0e87e92ea..1b6e95fdb 100644 --- a/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol +++ b/src/periphery/contracts/NonfungibleTokenPositionDescriptor.sol @@ -66,14 +66,25 @@ contract NonfungibleTokenPositionDescriptor is INonfungibleTokenPositionDescript INonfungiblePositionManager positionManager, uint256 tokenId ) external view override returns (string memory) { - (, , address token0, address token1, address deployer, int24 tickLower, int24 tickUpper, , , , , ) = positionManager.positions( - tokenId - ); + ( + , + , + address token0, + address token1, + address deployer, + int24 tickLower, + int24 tickUpper, + , + , + , + , + + ) = positionManager.positions(tokenId); IAlgebraPool pool = IAlgebraPool( PoolAddress.computeAddress( positionManager.poolDeployer(), - PoolAddress.PoolKey({token0: token0, token1: token1, deployer: deployer}) + PoolAddress.PoolKey({deployer: deployer, token0: token0, token1: token1}) ) ); diff --git a/src/periphery/contracts/SwapRouter.sol b/src/periphery/contracts/SwapRouter.sol index f74590aa5..5bba6bdab 100644 --- a/src/periphery/contracts/SwapRouter.sol +++ b/src/periphery/contracts/SwapRouter.sol @@ -44,8 +44,8 @@ contract SwapRouter is ) PeripheryImmutableState(_factory, _WNativeToken, _poolDeployer) {} /// @dev Returns the pool for the given token pair. The pool contract may or may not exist. - function getPool(address tokenA, address tokenB, address deployer) private view returns (IAlgebraPool) { - return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer))); + function getPool(address deployer, address tokenA, address tokenB) private view returns (IAlgebraPool) { + return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(deployer, tokenA, tokenB))); } struct SwapCallbackData { @@ -58,7 +58,7 @@ contract SwapRouter is require(amount0Delta > 0 || amount1Delta > 0, 'Zero liquidity swap'); // swaps entirely within 0-liquidity regions are not supported SwapCallbackData memory data = abi.decode(_data, (SwapCallbackData)); (address tokenIn, address deployer, address tokenOut) = data.path.decodeFirstPool(); - CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut, deployer); + CallbackValidation.verifyCallback(poolDeployer, deployer, tokenIn, tokenOut); (bool isExactInput, uint256 amountToPay) = amount0Delta > 0 ? (tokenIn < tokenOut, uint256(amount0Delta)) @@ -91,7 +91,7 @@ contract SwapRouter is bool zeroToOne = tokenIn < tokenOut; - (int256 amount0, int256 amount1) = getPool(tokenIn, tokenOut, deployer).swap( + (int256 amount0, int256 amount1) = getPool(deployer, tokenIn, tokenOut).swap( recipient, zeroToOne, amountIn.toInt256(), @@ -112,7 +112,10 @@ contract SwapRouter is params.amountIn, params.recipient, params.limitSqrtPrice, - SwapCallbackData({path: abi.encodePacked(params.tokenIn, params.deployer, params.tokenOut), payer: msg.sender}) + SwapCallbackData({ + path: abi.encodePacked(params.tokenIn, params.deployer, params.tokenOut), + payer: msg.sender + }) ); require(amountOut >= params.amountOutMinimum, 'Too little received'); } @@ -162,16 +165,17 @@ contract SwapRouter is bool zeroToOne = params.tokenIn < params.tokenOut; - (int256 amount0, int256 amount1) = getPool(params.tokenIn, params.tokenOut, params.deployer).swapWithPaymentInAdvance( - msg.sender, - recipient, - zeroToOne, - params.amountIn.toInt256(), - params.limitSqrtPrice == 0 - ? (zeroToOne ? TickMath.MIN_SQRT_RATIO + 1 : TickMath.MAX_SQRT_RATIO - 1) - : params.limitSqrtPrice, - abi.encode(data) - ); + (int256 amount0, int256 amount1) = getPool(params.deployer, params.tokenIn, params.tokenOut) + .swapWithPaymentInAdvance( + msg.sender, + recipient, + zeroToOne, + params.amountIn.toInt256(), + params.limitSqrtPrice == 0 + ? (zeroToOne ? TickMath.MIN_SQRT_RATIO + 1 : TickMath.MAX_SQRT_RATIO - 1) + : params.limitSqrtPrice, + abi.encode(data) + ); amountOut = uint256(-(zeroToOne ? amount1 : amount0)); @@ -191,7 +195,7 @@ contract SwapRouter is bool zeroToOne = tokenIn < tokenOut; - (int256 amount0Delta, int256 amount1Delta) = getPool(tokenIn, tokenOut, deployer).swap( + (int256 amount0Delta, int256 amount1Delta) = getPool(deployer, tokenIn, tokenOut).swap( recipient, zeroToOne, -amountOut.toInt256(), @@ -219,7 +223,10 @@ contract SwapRouter is params.amountOut, params.recipient, params.limitSqrtPrice, - SwapCallbackData({path: abi.encodePacked(params.tokenOut, params.deployer, params.tokenIn), payer: msg.sender}) + SwapCallbackData({ + path: abi.encodePacked(params.tokenOut, params.deployer, params.tokenIn), + payer: msg.sender + }) ); require(amountIn <= params.amountInMaximum, 'Too much requested'); diff --git a/src/periphery/contracts/base/LiquidityManagement.sol b/src/periphery/contracts/base/LiquidityManagement.sol index 67309a3b0..532a71375 100644 --- a/src/periphery/contracts/base/LiquidityManagement.sol +++ b/src/periphery/contracts/base/LiquidityManagement.sol @@ -54,7 +54,11 @@ abstract contract LiquidityManagement is IAlgebraMintCallback, PeripheryImmutabl internal returns (uint128 liquidity, uint128 actualLiquidity, uint256 amount0, uint256 amount1, IAlgebraPool pool) { - PoolAddress.PoolKey memory poolKey = PoolAddress.PoolKey({token0: params.token0, token1: params.token1, deployer: params.deployer}); + PoolAddress.PoolKey memory poolKey = PoolAddress.PoolKey({ + deployer: params.deployer, + token0: params.token0, + token1: params.token1 + }); pool = IAlgebraPool(PoolAddress.computeAddress(poolDeployer, poolKey)); diff --git a/src/periphery/contracts/lens/Quoter.sol b/src/periphery/contracts/lens/Quoter.sol index 310b0d29a..ade42f985 100644 --- a/src/periphery/contracts/lens/Quoter.sol +++ b/src/periphery/contracts/lens/Quoter.sol @@ -33,21 +33,21 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { address _poolDeployer ) PeripheryImmutableState(_factory, _WNativeToken, _poolDeployer) {} - function getPool(address tokenA, address tokenB, address deployer) private view returns (IAlgebraPool) { - return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer))); + function getPool(address deployer, address tokenA, address tokenB) private view returns (IAlgebraPool) { + return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(deployer, tokenA, tokenB))); } /// @inheritdoc IAlgebraSwapCallback function algebraSwapCallback(int256 amount0Delta, int256 amount1Delta, bytes memory path) external view override { require(amount0Delta > 0 || amount1Delta > 0, 'Zero liquidity swap'); // swaps entirely within 0-liquidity regions are not supported (address tokenIn, address deployer, address tokenOut) = path.decodeFirstPool(); - CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut, deployer); + CallbackValidation.verifyCallback(poolDeployer, deployer, tokenIn, tokenOut); (bool isExactInput, uint256 amountToPay, uint256 amountReceived) = amount0Delta > 0 ? (tokenIn < tokenOut, uint256(amount0Delta), uint256(-amount1Delta)) : (tokenOut < tokenIn, uint256(amount1Delta), uint256(-amount0Delta)); - IAlgebraPool pool = getPool(tokenIn, tokenOut, deployer); + IAlgebraPool pool = getPool(deployer, tokenIn, tokenOut); (, , uint16 fee, , , ) = pool.globalState(); if (isExactInput) { @@ -91,7 +91,7 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { bool zeroToOne = tokenIn < tokenOut; try - getPool(tokenIn, tokenOut, deployer).swap( + getPool(deployer, tokenIn, tokenOut).swap( address(this), // address(0) might cause issues with some tokens zeroToOne, amountIn.toInt256(), @@ -143,7 +143,7 @@ contract Quoter is IQuoter, IAlgebraSwapCallback, PeripheryImmutableState { // if no price limit has been specified, cache the output amount for comparison in the swap callback if (limitSqrtPrice == 0) amountOutCached = amountOut; try - getPool(tokenIn, tokenOut, deployer).swap( + getPool(deployer, tokenIn, tokenOut).swap( address(this), // address(0) might cause issues with some tokens zeroToOne, -amountOut.toInt256(), diff --git a/src/periphery/contracts/lens/QuoterV2.sol b/src/periphery/contracts/lens/QuoterV2.sol index bbc549cf4..8edf893ae 100644 --- a/src/periphery/contracts/lens/QuoterV2.sol +++ b/src/periphery/contracts/lens/QuoterV2.sol @@ -33,21 +33,21 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { address _poolDeployer ) PeripheryImmutableState(_factory, _WNativeToken, _poolDeployer) {} - function getPool(address tokenA, address tokenB, address deployer) private view returns (IAlgebraPool) { - return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer))); + function getPool(address deployer, address tokenA, address tokenB) private view returns (IAlgebraPool) { + return IAlgebraPool(PoolAddress.computeAddress(poolDeployer, PoolAddress.getPoolKey(deployer, tokenA, tokenB))); } /// @inheritdoc IAlgebraSwapCallback function algebraSwapCallback(int256 amount0Delta, int256 amount1Delta, bytes memory path) external view override { require(amount0Delta > 0 || amount1Delta > 0, 'Zero liquidity swap'); // swaps entirely within 0-liquidity regions are not supported (address tokenIn, address deployer, address tokenOut) = path.decodeFirstPool(); - CallbackValidation.verifyCallback(poolDeployer, tokenIn, tokenOut, deployer); + CallbackValidation.verifyCallback(poolDeployer, deployer, tokenIn, tokenOut); (bool isExactInput, uint256 amountToPay, uint256 amountReceived) = amount0Delta > 0 ? (tokenIn < tokenOut, uint256(amount0Delta), uint256(-amount1Delta)) : (tokenOut < tokenIn, uint256(amount1Delta), uint256(-amount0Delta)); - IAlgebraPool pool = getPool(tokenIn, tokenOut, deployer); + IAlgebraPool pool = getPool(deployer, tokenIn, tokenOut); (uint160 sqrtPriceX96After, int24 tickAfter, uint16 fee, , , ) = pool.globalState(); if (isExactInput) { @@ -133,7 +133,7 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { ) { bool zeroToOne = params.tokenIn < params.tokenOut; - IAlgebraPool pool = getPool(params.tokenIn, params.tokenOut, params.deployer); + IAlgebraPool pool = getPool(params.deployer, params.tokenIn, params.tokenOut); uint256 gasBefore = gasleft(); bytes memory data = abi.encodePacked(params.tokenIn, params.deployer, params.tokenOut); @@ -234,7 +234,7 @@ contract QuoterV2 is IQuoterV2, IAlgebraSwapCallback, PeripheryImmutableState { ) { bool zeroToOne = params.tokenIn < params.tokenOut; - IAlgebraPool pool = getPool(params.tokenIn, params.tokenOut, params.deployer); + IAlgebraPool pool = getPool(params.deployer, params.tokenIn, params.tokenOut); // if no price limit has been specified, cache the output amount for comparison in the swap callback if (params.limitSqrtPrice == 0) amountOutCached = params.amount; diff --git a/src/periphery/contracts/libraries/CallbackValidation.sol b/src/periphery/contracts/libraries/CallbackValidation.sol index c2a535dd8..837c0318a 100644 --- a/src/periphery/contracts/libraries/CallbackValidation.sol +++ b/src/periphery/contracts/libraries/CallbackValidation.sol @@ -10,16 +10,17 @@ import './PoolAddress.sol'; library CallbackValidation { /// @notice Returns the address of a valid Algebra Pool /// @param poolDeployer The contract address of the Algebra pool deployer + /// @param deployer The custom pool deployer address /// @param tokenA The contract address of either token0 or token1 /// @param tokenB The contract address of the other token /// @return pool The Algebra pool contract address function verifyCallback( address poolDeployer, + address deployer, address tokenA, - address tokenB, - address deployer + address tokenB ) internal view returns (IAlgebraPool pool) { - return verifyCallback(poolDeployer, PoolAddress.getPoolKey(tokenA, tokenB, deployer)); + return verifyCallback(poolDeployer, PoolAddress.getPoolKey(deployer, tokenA, tokenB)); } /// @notice Returns the address of a valid Algebra Pool diff --git a/src/periphery/contracts/libraries/PoolAddress.sol b/src/periphery/contracts/libraries/PoolAddress.sol index af3402a0b..72dbf1610 100644 --- a/src/periphery/contracts/libraries/PoolAddress.sol +++ b/src/periphery/contracts/libraries/PoolAddress.sol @@ -9,18 +9,19 @@ library PoolAddress { /// @notice The identifying key of the pool struct PoolKey { + address deployer; address token0; address token1; - address deployer; } /// @notice Returns PoolKey: the ordered tokens + /// @param deployer The custom pool deployer address /// @param tokenA The first token of a pool, unsorted /// @param tokenB The second token of a pool, unsorted /// @return Poolkey The pool details with ordered token0 and token1 assignments - function getPoolKey(address tokenA, address tokenB, address deployer) internal pure returns (PoolKey memory) { + function getPoolKey(address deployer, address tokenA, address tokenB) internal pure returns (PoolKey memory) { if (tokenA > tokenB) (tokenA, tokenB) = (tokenB, tokenA); - return PoolKey({token0: tokenA, token1: tokenB, deployer: deployer}); + return PoolKey({deployer: deployer, token0: tokenA, token1: tokenB}); } /// @notice Deterministically computes the pool address given the poolDeployer and PoolKey diff --git a/src/periphery/contracts/libraries/PositionValue.sol b/src/periphery/contracts/libraries/PositionValue.sol index c96db32da..327272919 100644 --- a/src/periphery/contracts/libraries/PositionValue.sol +++ b/src/periphery/contracts/libraries/PositionValue.sol @@ -101,7 +101,11 @@ library PositionValue { IAlgebraPool( PoolAddress.computeAddress( positionManager.poolDeployer(), - PoolAddress.PoolKey({token0: position.token0, token1: position.token1, deployer: position.deployer}) + PoolAddress.PoolKey({ + deployer: position.deployer, + token0: position.token0, + token1: position.token1 + }) ) ), position.tickLower, diff --git a/src/periphery/contracts/test/PoolAddressTest.sol b/src/periphery/contracts/test/PoolAddressTest.sol index c4bb81617..7539bd6fd 100644 --- a/src/periphery/contracts/test/PoolAddressTest.sol +++ b/src/periphery/contracts/test/PoolAddressTest.sol @@ -16,7 +16,11 @@ contract PoolAddressTest { uint24 fee ) external pure returns (address) { fee; - return PoolAddress.computeAddress(factory, PoolAddress.PoolKey({token0: token0, token1: token1, deployer: deployer})); + return + PoolAddress.computeAddress( + factory, + PoolAddress.PoolKey({deployer: deployer, token0: token0, token1: token1}) + ); } function getGasCostOfComputeAddress( @@ -28,7 +32,7 @@ contract PoolAddressTest { ) external view returns (uint256) { fee; uint256 gasBefore = gasleft(); - PoolAddress.computeAddress(factory, PoolAddress.PoolKey({token0: token0, token1: token1, deployer: deployer})); + PoolAddress.computeAddress(factory, PoolAddress.PoolKey({deployer: deployer, token0: token0, token1: token1})); return gasBefore - gasleft(); } } diff --git a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index 44f0a5ce3..e893d6d01 100644 --- a/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/src/periphery/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -14,17 +14,17 @@ exports[`NonfungiblePositionManager #decreaseLiquidity gas complete decrease [ @ exports[`NonfungiblePositionManager #decreaseLiquidity gas partial decrease [ @skip-on-coverage ] 1`] = `174001`; -exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] 1`] = `180333`; +exports[`NonfungiblePositionManager #increaseLiquidity gas [ @skip-on-coverage ] 1`] = `180336`; -exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `632767`; +exports[`NonfungiblePositionManager #mint gas first mint for pool [ @skip-on-coverage ] 1`] = `632773`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `647130`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with non-zero refund [ @skip-on-coverage ] 1`] = `647136`; -exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `639963`; +exports[`NonfungiblePositionManager #mint gas first mint for pool using eth with zero refund [ @skip-on-coverage ] 1`] = `639969`; -exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `438467`; +exports[`NonfungiblePositionManager #mint gas mint for same pool, different ticks [ @skip-on-coverage ] 1`] = `438473`; -exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `328325`; +exports[`NonfungiblePositionManager #mint gas mint on same ticks [ @skip-on-coverage ] 1`] = `328331`; exports[`NonfungiblePositionManager #permit owned by eoa gas [ @skip-on-coverage ] 1`] = `60014`; @@ -34,6 +34,6 @@ exports[`NonfungiblePositionManager #transferFrom gas [ @skip-on-coverage ] 1`] exports[`NonfungiblePositionManager #transferFrom gas comes from approved [ @skip-on-coverage ] 1`] = `87247`; -exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `21882`; +exports[`NonfungiblePositionManager bytecode size [ @skip-on-coverage ] 1`] = `21884`; exports[`NonfungiblePositionManager multicall exit gas [ @skip-on-coverage ] 1`] = `245031`; diff --git a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap index 68d30116c..5fa868d57 100644 --- a/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap +++ b/src/periphery/test/__snapshots__/QuoterV2.spec.ts.snap @@ -4,7 +4,7 @@ exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 0 -> 2 exports[`QuoterV2 quotes #quoteExactInputSingle gas [ @skip-on-coverage ] 2 -> 0 1`] = `156109`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `247469`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 -> 1 1`] = `247457`; exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 0 -> 2 cross 0 tick starting tick initialized 1`] = `105794`; @@ -22,7 +22,7 @@ exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cros exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 0 cross 2 where tick after is initialized 1`] = `156674`; -exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `91429`; +exports[`QuoterV2 quotes #quoteExactOutput gas [ @skip-on-coverage ] 2 -> 1 1`] = `91417`; exports[`QuoterV2 quotes #quoteExactOutputSingle gas [ @skip-on-coverage ] 0 -> 1 1`] = `91513`; diff --git a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap index 0efbf4802..2c9a615c5 100644 --- a/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap +++ b/src/periphery/test/__snapshots__/SwapRouter.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12654`; +exports[`SwapRouter bytecode size [ @skip-on-coverage ] 1`] = `12653`; diff --git a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap index 13c61c890..00144d0d4 100644 --- a/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap +++ b/src/periphery/test/__snapshots__/V3Migrator.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `751881`; +exports[`V3Migrator #migrate gas [ @skip-on-coverage ] 1`] = `751887`; From 5604a5629a3f354b1ffec4111c74487ef18b9852 Mon Sep 17 00:00:00 2001 From: Lifopam Date: Tue, 9 Jul 2024 20:04:07 +0300 Subject: [PATCH 15/17] [Common] fix Mixbytes audits reports --- audits/Base_Plugin_report_MixBytes.pdf | Bin 0 -> 1271455 bytes audits/Farming_Plugin_report_MixBytes.pdf | Bin 1271455 -> 2461411 bytes audits/README.md | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 audits/Base_Plugin_report_MixBytes.pdf diff --git a/audits/Base_Plugin_report_MixBytes.pdf b/audits/Base_Plugin_report_MixBytes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..69143451459c53119c3fd84591ceb797ce5f9f96 GIT binary patch literal 1271455 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

_33An^dBk(M zjGM;v+!*SX@B9JhNs*C9bV)L zo9eS9dxn)KjtpQjfafOf3~=lMXWW51LE`nd_Tel~tkuWTgI|8&ktgJaOj5p^Rc>cP zE4o5CI)TRMTMZ&ygs}I{QKSgUY+f_J;yUSlB;S1GcrjHUU&zy~;t$(_NmE1_-$BeP zFIibO|LLDo*sAYQZB+sZuukFVkm$L~XGgeE<*Bz7G}{Tm%cncRo*Ov6NZ0p+mp-#$ zIRxE`Jp#SeUmxa^f#1ol275kUoFvv=Sh|^R{oOrB5yA2k_F42B;kZ9;dGX6EtJZC# ztM$~&@ko|V!wnh#qCNlO}n6Rb>Cgwv;fcBSv^ zDB3O7b97}>Uy6DqE=58OFof19g8L;H5}u^P!5Hxr%ik1JKNpUZ-S=r60UTC-TnX%w zWbt=StA$hNfL`jzp8goI!}|hb!2s{RK55eDVDRaQ%j1mZ*X8KUVOnTcdSF#TyBcs`1C$8BzEx*uhqmg*c<|#B2IY>g zGDJ@Xt(Jf5wz?(|efe@%$Cw0pN_z?8uoh>C>+MOHlwA#4#q;^IBGyTAQIE?EW-kds zwl@~`sCIgYHx;+pby-@Gr}ZmHiBUgm#J2-2i}nQGVEaS5NkHF?-;Dn;Q(Lbt8Wd!~ zZM96Z850bcw5u}mh5rNf3EEl!Laz~0PW(nCNe|bo;0^Y(ewzoPwvx<1I{~=lBmE3O zJ|nl1QZ-1#T#ZkV>&>h`p~clvGI;5zSOM{d^G~K^z_EQPs9^p9f*51S5|Omvi7FvPu^`J8Laz(^2%yL1rze^3FTUR( zzj?NwvDt|tdmnx;-IR5w`6QV3iaUHFVepN*F5}t2*fMKtCH^IGOL48opqd?!Ht#0D zD0tidg3^F#72}r6nc(BkP{UQ9-<;cu8e)(Qk6pbkwe7zHx7iEbA6Hn6(KI7z;R$CU z6v>ovB3Pd5tzl6&IdTz!Vc4Qv=4N*5(8wO-6ZgbowXR9mi$1@*J_kS7ape0s+N{YxNC2K)-v#R62eS%59^Nl0v4SJD6JrVJgl}y!+j#EKW5vMO}Y>OYiO%{d$4Qj56*(i^*1=GdKt`nW80TFnw$%mF|Mr$ztd`qmGGI!9rCbp|2z+az-_tN^zO4@Sg}w{-ScJVNP`KrdG-^Pc7fz+# zH5l7y>Lv5xx#{(4h2#S{ZG!=2Fq2Cmn(3koNH~JFhr7<1R3v!%nvROzYwo}nc)70M z4lCH^g;ErrYrYSk>X{wr@JkH}5h)<6TGkRVp-@X6_~tsg<(0*Nb?x~Jj%e2}?EOE) z(tf;0iUndOn&CI5HBTdmPteF1N|}V1*TLT6$8cBlsibfM&lr#$g}8g7Ci&3;%HN10 z_oMrSBfB~n-_K}O1ku++9qQr8;;o8yjcLm_T)R1a*!Jk@^?w94gre?TGfS7ntzWuT zq-*zQc(V)+WmRiX3>~XfV?HjAulLqOej~WsA$yv41qy`J3H5awbl*NJJ%i<#TLb)g zv)uR9&^vbVX`%XR44XRohkTqim>8i%BnaN`2oO%L)w-=-9JL zf>^x5c!Z)}u7Fv;f2X>U$W0VeL2;J972=(ZRc)7ZLy7r4Ed$fdo&wc3{XXl|&|AiS zCwkJl=>~O^^rByvIC+NFui{1rqD3j4m^Ik>Nfhd|TgU@Fd!*kCQJ?}Nl665s+mqy~ z>r-CAkiB;XY_)Y?M{#{u7l)mC$zUZh#?)sEMrP)Xe+f~WaL1)a|8qS zt;{P}1??cQ9K8Yckk=l@-B2!!(}ZTbD{sOG_zkrhMrU>*#!zwyEiN_>062C7tRp%E z2#G2pcrAy__ik&)Wo04W-r#Rgd+<^9W)CGy-oseG83)F*SrZxiVs(fCGV4UqcZR;G z%UozhrLkG+-N+NO1Qr>~ zn*Th%hHg~x4ePgFbE)PH;B>=FrV2_-dZJfYNiK3XP8Gl3S!~zfl1mvdzOL>KpG2F4 z`-B!u%x%h9>?VdgZFb;Zrd#^@XRoqu{5{HKQY+cL6!F05(%0GNsIEk3tu~{NHMPUX zC@bbMQS}nn#+akkWNr3On(N_o#N|l|E)>pQeKqb+{_jYQY6lQb!`ij+<%IOeVD9|V z+DIwmg$`!TQY&05`zux4o9=62_Zxi=mYu=AVZPb#e(&n)BpyMrv1^2|LT~1L%KLe9 zM_$f^t@1hrm34Fi3pxu*DS6btCw`yK)DIwA5M?5W6;?9n9qG+&>Ech`54bcY%nGf7H2*Pz9_f)=qX#}~6bg-^&e<)EzW z{>;sO)I@{0-27mg7vS_45cn6L`7S~}K?M@j`|At)cnT-sF<5=KKlp@<1dW@EDlEX# z&rj1Y!0jANH;smpgH0lcLegh+!R{P_H;tO*rqf}jri2}$qfslmjDA! zNS^{OV3PqAf+&IdmevldLEBg34YN+GpKtgj^dv628cHW@HZ(cVBzazft-S z&TMfdY4Y@qMZ5l)l%oS zd)!jTS4UQ~NZ_E`qdit76TOPL`{0-M3tqxcz>NfKEv{){;kOu8C}%8x8Kul%ROtq3 zh9nukDQqKn!*Tsg{}_xoPNv`TNhrn#3GwI!3&&5GlTqTV8B)-*#f1Y{B-l}lQu|JVd zBvn#*L$jdfLJs44>l4)jl*Tt^N?&7zdEyUnj6zSoTG@v&I`>bq7SYAi%&5f3@+?7C zm|a1$(qJZdpb$OUh0lJ6GhlDA9f5{loK&D&HH7m{&Y135{M8yAi{gyJd9_}!;l5xF z_9s$WyV;zm4dumWqQP@tmM|+PI(R|cN3*N4$L#?NU^W^$w1~{d>}`+2g|cUca6B2^ z53)KD(@s`FhrP}diC1bp^;3-ZcSQg`kD~`SFSooSI7(*5{oM?tvE>ENgwikruj3(^#+gq47r#64P2le5`gbhg4p@Y2= zn;&`AP{}fGJL9OOFqoUv+Xita7(4)hTjkfg`g`HBw=Mzbb2%yGFubfGK5j}sPam57 z*JizkFK-zHP)ofbMC5eH_>%hf95k;5SY@0gmdf{vQ_8-ZU$%bX@+HYO$ntTBanRdW zx>mY|IV_zx_NdsO?rE+b)h&Fh(rR7?ZNfg2IQy}R@AkzF=l(%rPDiP5>F2kF=mosH zn_I87>qNC?wU&irT|W0>x2lV`?xDx?srBqGK40Irw-@|}{#U+7>l^on`~CB&_d-Nd z2clP8)OBQL9=rrb@^T8E9C?@D<_%df*xIZRCB^F~&n|}Rwzuj7H&U$jmjd6k?WOjRk3Jne9BG~aVlnVwVcPyup6n|L$%#Q%^2M9DRWAZ6)xLvkQJ74nE!7OI4ygL#5lc_1iOpqjYqhZr zug!yECjT4TElNOVy(Qu+{$A3CSeMT&UXR(!29M$}l2nq^&MDSYkkbnoew7d=xIsnx z?06QndG>tAyT_5MM`He2j%miaS62(&0)brM)Vrcz~X?w^c7oIoV zaSmIulOlx35m}KZ%y+eBEgp6@3x+PnH}&3mv7|>|bJLo{V`fH|jqBoN*!aX`ixM=0 z8k|kKo!rh`1$|>f{!B5y5@@5*^Fuj*7fvM|A|qA89k7J+xxLXcn`sNgky6!g+w2~r zg7w9DP||3Y&{ZDe-J|PYX&_ha+_k?>!$jDF*75dk=Yf)tl)g}X z3=(NgsGf%6&OZ6gN|`47lLX&RZ*7^rOPuIRR4zDpQE6Y zHPm}kh^daaDfkwN##moCEKJ`UzR|X?m6T42a**)2f}#oVi3mKC6PqiV8CtuCCYj5) z`($gA!f0tkGakM>f7(P#fV! zS+_fo->r_9*gq@fCcv|YP-brvz@>*ZjL>Z-N{B~A^=jWo#2A{A$8+}dc}rfpeUScY z3tqe#P5Au+lTMfHu2p#45lcj_b4S#8v!hJrosh?Xx@2Y+!&nDG=$;!m3Z>bC7CK;7lB4A{jBt4YG|3$$d!GYOT$&dsmXueS`K$mxfbde^TTf-Omxq&!ARGAE^&6QzfF#5?>=PNC&)y#yqWR-qN@@ z`Lp+u#8E41*l%#}-qu^9aa&Tf8CZ}Bk)4Inn@nn5ZdKKXwHM#DEUhx>-N@~hf}~=_ zGCj_^&Mn6g$e~(ajv|uU*9nP|vJi12mhrgdf&M?{&KDi0_S4a`;(shCR7iBQ#D|?6 zxqWbPWyw%%TLl8x76eNpig4Q$h{cxT@I^|%W`B@d6vy?QvSv&-&?XB)`Gf@Jxk_H# z$sD8yx(cIS8SW-d5I0p-a470}wQOyz1{F$K;_13?&edLBV>jV&dbejFVz9e9Pu%fD z6lYI%I*>Kdk!>0OK5XMCrcUW-HR?;B2%YIH`Oy<FW6mh?J8Nv`1{N&o#qI?)I{mmy2Ie+k4HzW$`ncpZ z-LQIcK5wb&a@%k87^VzPT8vm;Bpx7_hU6B3s^usC!Y#lu z?JsuaU5>E{*+wlh8j_w>EIGNF=HYP0S{P>>50Z`6RpD!8HIXZ{b*R0|v-@`7FnW$( z)y$RB&qqNXF+$kW?Cv0YcZ}G%=v%$k{?7NsVJq?}F2@S{&EF!7iI|fDf+o5rEKos@ zh8=rhe6NU2Z(}Na4r?JSpmw6hmuhqZ+GgsjGZL7JqnkBOk^uYIW3L6Cq3$fU+GQi% zh`gjf=B_Yt1|f_MWB4D#FAW1FVG1kGo(tfi{t7pyTQ%sOr&TcjkZRN#A7$u?_j`f z`+E((uXGB5lQ!`*FxJ6o$J%@?gX4DCkTB`?Y-K1Pz~;uyIY;7Q_+2Lz5GxmsIf@ey zJ1++IRJ{{uf8fUfnTL$rg zcKF=6FvMA|+@Hh^hHCeslM;R6Uce`R8y@-+L3dc;`X~62jWPW3w31STi`|GFql5JH za8JgmFw0SkNnmsFR~+5_b0%?^oNI>^%{%5VEx@&lpIW?Pig{`hE`?E7fqy{OLL z$#Z3iL*)$|W@Q{^bGIV*JFa!BO7CtcJc)hH52wNRH>Xss9j_GcsOWXn5OglqMYA5P z+gIvdx78f6lA^@4b@<3ty8OeWIj5cfn4IJ!l-76;p`Bs%#(n*PZWhD$KIYlhUC;C+ zu{|*RGkcxK`@1L7dN~RseWnM zypHPT>@`;;)+QN+rlv^o8w$HA(Ir!TY78@%1s&vcaXts?Tdl*NCwJ`~IJ(-OEpeWj zEh21G9O~pz8<Cr&s}945$mPVl2l5dV4py$*odaa$U;{O`F@NSD(-yU$=MNeCw?c zx$qA+<*IVFf7Sc_VE@h~P}YQ)p}w8w?Frez(Rw5o+qeFz$Y^tx%-1PDAAh(kH*ceY z9*_LvzDu*Xog8b8o7r2>t?k-r{Uwphi2Gr7bYQvYVhnwrrl8ZF_o)mpExIg#pN5D~ zGe8xRH<3KmVreV~839+_Bp|`x?GP8X%H4aTELJ3mf1c9cnt+zh%8@yNh$9~kCN5ZwJ{>(( z8jb0H#=BJUd6Hx~Q9PQW_mFzjZ(`4pkZVQC{Ru5a?L?DX&of|-y(+3;HpZ?^V!EJS zKiEd_Npsp9i3LF-)O%2b@aMp=t?di#c3r#JwX~1Hbyv&l3gxx|xOwGe9Xh86A+GF! z=i3S=4TM4%`sR8#)QH0p!&n|5$^z{rZ*RTXdu41;xpl*&am})S;#>e1b5-=K3fvUhX#)-+gC^%>jQeu2ZcLZQu9o){dKB** z%?rwND)>U9PUTl^Q#b6j@I0K#0JcC5^F;~Jh_WzOL3k$@X?DbIyEa>>t9&9dFm#-;C5~_48%ihEJ?Q zr89J_9bLq6F$ryY`%R%U%-1GSdlXGksLa22yQ$B3wbsU;zqenAD3zF-&%)~Eo&Sh( z5p|+K>=*IX(EkmdUe;4qfip^m#==4md5qvZ3_Wugq!_c08EvpGH*jP>o@TyVf##!L zMDZ*$IWRncTH9R=j)r$AbSbKj^hv}C!Z}$l`8e?n-MrhzjtJ6X6yH104W_cDY(J+H5YjqaN>t@HdT` zv&Gh{-gFDnhDXR_SUOdkJsrh7)kTq?ovZe8 zkGfuOVDV1y9s0u&05cZv9^Z8w_pMdxp~oMl*(-SNy=6JUbT*&XdN7yK$&#;X1N4~2 zBv6|L8&F%?7Z(}k7OM};pYH^nwxRZJpt=2hP`nx3G+zt)UJzu54YWp&PH-(a6@<4?<{7Q%(p=O;JMP@>r?mk3S#tG%0&6d5%mOGT)5wTMygocGy} z>r_x&{_0gPc>fdNwlFtJPs8Znfqtzd!f-RKe3L>fc4sGkxcRGLXa}^H62{kP_NAki zZLY!aDNkYom)1=|^a?+39E=cjZ)`ITm-d;9?#?|bKtU6dM(Vm6F7=p+cqry{yX8S6 zoVX$rYmxP+Ob`bN?F}j~o{_soX5F|bLD7K%UYJ7{|pd{Ik%ZwzPDW*`| zjw6^*G<7?!@?;U#dK1w}pPs!Y1ad(txEZk@HoAv6p?U;DAA@43#~jobsK^ltGM)&(d^;H% zgA;QdY==+jmpE{*_v7z6+c%57{OPDzW1V%PExSjX-pO36ePEl)au`tVW#Z2m?P>N6 zzR4=M2K&CJw(xon3oPi2?O6b?L%;sSv?g23%~^kp@DD@r5Igd(WX(Pwu85iS(ZtZU zi~dVcE+v%K?D6pi0BLR;Z88*R!30=cMQ81_?!wPO=bRbzdmPwt0?01mQjo~86B$_| zCs7FuUJM&vBQtMZr-0_k)`l0<-GwVxms2mZmofA*F%}}+6-}tuk4~mTokb#i?W5RWcGTQkA|iixh&fe*V!rfi|W-pRIO~jeLl(fHmqw%cD9@aE6VACWr#(lnD1`3 zvs3fx@soOHFW@~a9Nih)pHrP;-tnX`=(zDF1hpqLLXYz`#QC)tiKUlCbKH*W3`%YZuwRshC{e+QgpakqMwIA zY+4Al8p8$mm1*0qXyimJ#MFgAk{a=wsEAt4BRZ`i0G9!kJue|YmrMpffjH@dEBbCF+{t-7G|<C~vD{ z)d8&c?kl|>BzMbjh4|K7PwK94>r5+Yhnxzu9FA@WVIqBNNlS8duZf;UFof!r-gTJD4SPXuf(SF?v~4 z-k123G}eqrhKyf#0?0d|&qtlqH!0A7q@@qXWrJ8 zIf%EI9FG}!zMNL5ERTbF9hFM4_1w2P%K#qrjJ#cJPNaYo^wkP?mZ-;wspOZ$R)Ex+-Mv5EOlY4|b z!10>vVF*#=URud+$=IKgZZe9UZ{@hqqAW}-eT4JkncoSz@zO?Aw8g=(2-cYB(c z6keez%`SRaHM?XCpMwG}lH6Sp2Lbqc`;pA6P^|+vOv_@`?6Is%`C=wcOZh{_PKd!~ zrf{e1Oy0BNSo9^bRyDF$5WeapWniF7^wbA-ILm(dLb<2aN?Y=(9M(S;QOGCsR28#Q zhj=w5EWAtTb6Zwd^TnpxYt4i1ubq4VSS^WHj^#x#h#fOVl6i)sLzbiAO7)a)3|Bjl zkF{Tyqip(oo431Hdk!1y#_GKsHl!eRecyQD6FvuMb&&R_9(OVfg2|{cxNapZ$fhd_ zk9A!Uiw*ZoB>5(WQ45Zv5!A{9U-P3z)qjB_{M^`;7!~3?#wg(Fx#T$R4@0LOZ4u-+ zb*ENb*+1b(^PS%Pk0XsgEM*-|8Nb+CBMz6pFrH?#PIuZI@M}+mR1Hp>0FLX*-MdQU zmZy3&E5XcrHUZasUW}IXd%Bi=?+myo8V{NJM0qWa)5DFz7-I}Yn;{4K#e>>d4HP5E zv?C4SD=O^})q&8SR&-|UkY}>d*9$V4WFxiEjXxUEtNPq2mK-i2j4KPtM)1v7OUXvG z?AK`1Utw~gOa&NsdcO?&E0&|Q)^^pNeis9~uq4cy3ZTJ(4+Kqxb8x#M$r|bNNjxn@ zVH-8{z14(czT`qZ59|yQsS9^1-bp-abvc_A0pwKMOX?=u>i6uhuO_&=w<_EyhS@5s zN~m6rmrHx;f2jmOYf&~5HZB<`Zx-~<_7dK>=pRe_V~PtvRDRB{EgBylqj2$3y+4@a zT;6^!Th21bNZi;J-1#9%im+>#EKSsi$0qTu??+v@lp`#xv(7dradw!FhrCbQtKCvf zF?mWD6POkyUADjB_;;_t0~T&IsHKWuC}#OwO~NU;)U=bs2BQ0<*U(K>KwT(T~pjUGkDEK%z&QCJF90M-tr41mz?x<-`QVG$EnJ05B}< z7SF_mc}}e#I^0iwsK;nlOHOIU0jD5GbjNhTdp&%ahQU48h@dZiwp0E+zFc}W^80wX zp^k-Y^4UmU z?5jRT@Ust+6)911eSL|imzRcyhBky2cV)Gkq*qp&U;G0h*z+AWTdN)oakuUO`Zs?b zJR0!_{2vsL>HpT=d{~D6U3mQ8I4H|Lpo2Q5c9ur$somj*8H^PJZtEbu}HLHVb)D$3C^V+k{y1E6!va?O|WZ0Qc}OV8II!MjKcn)(IKxoHaT`F=5)oY0ScpQbdU2 zR~!OIG>S+*f+UI+i^P<(1T}Jma|Cdh@>kmXsa|za;?`N)RChGld;}uVT47DDdM)i7 zUmK&;BCVof=ONB~{c)|82ll_ZDrRH-+iUUvRI^3M?i;Y4pQEgatGtqoGBDi#zo$_D zu4)UgGRS`e2LJo2Ex>|o|CK`hxBmTqqM?9=K|jh6{^d|UkcF@skZAmCv6{ce^3Pl2 zKLptSg_QiaasEw}d@v9Jr;mDXK;iQDDj^?dGx=K^Eij6Prq5F-5z2C@AMD*@Kc`wN@=7goaZ!MFZ1EBUMG zpTqwjSqT%c?B2f?-CzNVFt-21N>038^_5kg4qPWY=FFH}J={DhcyBmn&Ir$@AU) z+VeRhVEyoZ#i{EplLL(Z6F-=fUx5GZLQEB3+jb}ffi^^r*QT8jS&W(;jR)ceBfX#d z?hYg1H+7}L)F*;P#5D<}!6?G(^MVl^@|*=9uCZDT zzJSNR!~2~?J0uMKQtP@ON&572A4GcfXRFTqDw+*0^o1cGZU2~_DWzNiBlXUPF;kJN>8=#XlPd~UH1@1eFoq=Fg(s*_ zU3~5ok09$AwtV-S>JcQ;FVm2fkkIl-1c+2M+YY<1i&BrT_VC!D96v5R^8z#NQ3wTi ziyKHFJN*htV7P{T*gxwTOmVv5@_y$LM#S%3=;yy9jvnfDbMwR4fI84;9}gbN#Zo1# zsO;mK7l2PLkA+3mXBK3&4k5MwTuBTLW`KiJq_ZKV7|jgk4xKEBu;zfh<^XORlzYKs z?XS~}g)061x!Mll4$tp-Q}O`L(U0X+2tFq{=OHb-|+0GV~cimv|VjXuJhZOfxK4M1n{^h)_Yw7hGO)4H7t=3!9_O zFOPWZPQ2Fr4ch*8Y}n^UR_T5@A96(oVz<=sg!LgQl_oSfiH-Jd2xM<_D7 zTbv&d;C>=|mcrU2baN~<1SD=Vk4ccj7!xlEa3%M(cH(5G z1pFE!0L11RYo`-q=-3W$EFCO8WWm`=`H0+aFsFoHu+M8<9y$r91~4}X&}~KafcI;% zt_}H3)PYm>Zou>tfoTUp)m_4i5p*`9Kyt%DZtm@<3CHZhb0C!2IFeQ9UuqADGfhdVdnCvY_55l<9*NKW7*PkpwLb6!nq{KW_>*cUXmCAbFR7 z9tp}^6dP&S(R2fG57;b$cd}8JG&q`fX-06r=R62^^LYeS4|&lJ!14Cw;@v0sw1qm$ zF0<*R%0;(K5co1_?jh{eiN|3}@GD=r_KvOFXQ#@s8B(ok(1FTcp5tmrmMFxn_H#=) z(<8MpIbzRLUP1H_IUagpJw#29u`}lE9o5bcp5|bO2k@_nM&~LF=%tOZCxM%RAz8*4 zG=US!5gCfmLOJxMy$xLf$9T~!<=-($V5RN}$B{VP*>smhcy%E`yyS3Kpcpd}D*P-W zI^{F1MNboh7NXdD!>J`J4B0A)$SU(8h`P52%mFwp%aO-A;mvKBkCxzjqUGOukI5)N z5!Zb2LFY)OHlFPI?@thUdP3CrGF~y8!M@v*uYIFmo46SnD?x7LSGW=@Sd?)a`u4CB zqRs_4B*nlTW~QO2kVG_H$!|y?py0 zQ@oh;yOnk);F^g%y^h0O3}o2h|bH zva!yX4O5U4i6bsf+6_r8JI{OMc_&*~h$#$#(o^M+7 z2N&mDkW+a1y7B5g0I|}$(0p^6l%GEt1TnXzqp`_)m=#S`j(eY{_3%Z`=1>hsoQ-+B7L`~cH{QipjW^G0r8 zv&)V@80I4evxv3G{I-P`AF_5q4^;xIz=y36vqsYU%`Ix+852%;GCIe$1EE44pnVNK z6Yo!P4VOU~ql_u#p7&F5Bk4db!J~XQmfB9}h@S91fm|HS(I9?)y6Hgo2{GCpr+5Q& z#byQ67Wp3h9|&`nr4z4h!{^RkO;N@!YH{=MAC zwftOvf4;WwjgsACcK7IQpjT-ZYL{r&a<0L5EA^_`wPts<{EFw>kAHiA7jqedIPHgY zL1;A_%SjR#NoX~U2@`CXyCv^#u4pcMP&v($E0SxHOD;GS!WQHbs0(uneF}>U<&DCL zMu#}mx7zz{(_yo$Z^4`RQS?4)6Z;sDIW^53&ipt5e0i_^M|*9hp{2G(>^f&JeQ#u< ziH+V`cP+zOq29RuKnq68qaMz@)B2?f+T@!Amw(94Fe`Y*sO<2nmZF%}31ZG2p@w!giV2}gRqgKmQ@Gj_7nbJjQFZl4nX z&l~A#IrQ*w(Qg+T>M#cgG8@Kxi)>6I7_9p-hO~XTcQ(QEBZO7XI_r0P&g0r%GI~qs z<@e<9B9XqpK73{5B@epXNuhumix=&`l+u>H!Vvk9 zJe>!=5~AB9%+z4QI$wo`=E@S68A?)H%??{=%_$vNHUprtdlVb1Ne-ZW)|9RHns)Sy zvUV@nHIPne;PzjrOzyynNoD%4)vs zk65hzV$c(&#h2~iwRM?B?&5{X<8Xcn3~@Xx1!VI)E(!WgWf|P#HhHn#*3GDoz0dSS^d;Pr(c>U1J z>I>-GW`yUX2<1Z=qAwWOTamNPldtBGh^y{kQ&sl)a~Ce|wiLZ(n%gGT8$B=1Q;}gOUiUZxSxuuXlg7hq3k zhx{-)*vdYi~M9IE`(B%xnA3^_<7f`o0V06BTY=+<9Fj+trk}c>dZA0&(5k2b+ z^g(tIEfLVe)?>{7IWZ6;dM7Ut6EUOb{xW(#yU<^GmApnQ#0ndrf!NR!d>y?I2XPV? zaib^mCj5@R{ul5i@enWZ5kLA`Z~t?eW4qHceW1kle3kuW(x4x*R$0r`*|f*t7B zXORfWhLi9WIgH-qargv2g`*gm9D#q3)8q{K32pJu=s}((zmk8UNA)}TH~Kiuqy?kP z1c{-Y#&DQYj0bosp;9WNa;l(8l0#KgO*J%wYNckk|O+D007f~PelLAsm1EdJ!st^s+OqxX_G@C~0J#@Y#L!zapx!burxw+gtZa%k| zTf!~lmUEAAkD+I+ znz+;4PxL4HGyNw$OMjui(tpw4I4S3%ztexyX4=9jITfcyOGxm=oE8=D*>;<-g;<=YQav_#gSx{2Bfy{%8K5=wqMc&+@AjPm1w!!P`8)aPsGsiQXYh0Rn^4Eid9w^YRM{i;7E1JCt?o)VaJ%*NS*$x9&ZvdiLtwr*FT@`d>a^;Gn@*3>i9X zcy-N)D@WFj8eKOA#*Vvc{MFY?xOU=olP3RdO8wO9r%j)6!;Lr1oOSapx862;&h2;H zdDq;#=iM`Z!NNt0?_IL=zWbLwu>8S?9)9G}6)PWmeAVhFo_y-*HP8J0+2_`-KIRy6wfr?K^h9^ztjacE9@C>wDgK^R2h{zO(P${qG$(2=9OJ;i1DH9r^f^ zPmdn^$7jbcdBvB!;!9rfC9n9BSA5AUzT_2O@`^8c#s9y1#qoH&qHCA(&Ye1zbtow= zDlEv)%gu>Jvm;rV;ZQK(_jx^Tm(yXlSuJLh(V*7}+6;|arBujeQVGvd0x3TO22$s(YUp{xgauV~ zJ#e~>DrNUT_wmY{7;IFku&BaPgC$VEkyyGCu|O?VoiLRyS~CYS=S$QG9NX2Ft9I)^k;yT;IKV-ub-_Zb6mxS}&_ESTN7q zuzFDS`Mo}t*3{q}crOk0tXt3%AH4{X*zXE2K8?<;scs;1@sVEkChV9bB#aikn zdK(mhZh;94Ce|To>?TJ-UUOd1HOg|N1$d*59dZBEEqgO&8Rf^9$qK`^1tsoR#_wZpSQPD+=^MhG_7P^WsXX1Ncs5EE!)0 z3&xeSU?AdlOiiaeM8D6+2)wW{ z4r8&>FlSJ8s_uocj!h8Hi`F#II@Ytht;aN!^~`DOX}`TLfSkNV3};OZ@^Jf~Rxlf? zCUj~b=Ks(=KGomvia@_XBdWbs3+mFi?Kk9tTB^USy)RvAFm$ix95h{`4o>VvrX1Nm zm{qFP4SWdyq#{#a)hLrASBfpf+p|Ha>zzt#ls?~oc~fKZ47*Fr&fS(?W<#gwh4s!C z)Gt_`dI5(E=EJn#kP!_#|i9qq) zR&MGwpm4ib=uj>eRyQ*RK{)!YzFmx$?TF&!YL zv&G)oVtI;Ko+6ej#BxQt%+kE`QjeHwS;`IOu7C)(4C4BV`9Q7;LYNQ0I?FHT`iOad zu9ui!hV53&`{6h}=6$)IV!aR6dtlxh>n!iZ_1x6MlV4en_0iZz@p-Jh2d<$9uBiti ziM1?2SdDO8Y#EK|Y=i>{oH&wjJ@D#|S0z`8cf@gyIQGPWx$tMVq6Xc zaV{TS1V+rg>D)sXf*W%;UAW2ZiB~G<78r<7hft3&hi=&<(Q7M>IF60YLl}TC8eulV zDufLPa;Ql4#8tF{R&WF80FFoQj%+S3FBJ2l(p2trrE;~sP+NID7eO>dU=;#~OOD`@ zBlxOqH4g$s*2#oj2nP_3BQS(#A~G@&8JYNknRtJuI7%vxJB^S;;E;(jasCU(NW{B6 z2zlqt!dkPiB@1g=cuy9N&BE5>m=f_0);|zo3Bs;)pI>BVzsQ_^oXd}^&BL@pENL0I`l1|#n4v6;w2-ry%BQ_T!-WD?sp-hPLu%{wDVhO?q1POZT+qno{nRsR4 z<;Tm1mlrRjAbN;yx)iS^c-@QFV!RgNwGgRc+z{OrrK3xxl*}$!QnIRKL&>fZ*-knJ zuR2;6SAyA$hDWcH+badi!${DOe~amQF}+?)<6>%w+ed0nj?}z8QuD}2&GM0&>XDku zM{0VG)Z~rSG?KA#OH^|-s#zM<42xQ&(pm>Q~2|hV;JjvYRyWR7ZuaPI4Ja_sU<(S=(s$H4NI;0SoXUc} zmwB84hLYz&MxybUY_DvzEH3LP%a!HGvSgXEfXpK^%Jp(Vo*`Gum2$aUD(B@?4sv5- z@S_8eOk-(7ZMv`Pra~;fE z+zy1q<}P-m^O_oVPxVHgEM8m#<{K)k75c8ajy-$)Nm7?iqvt->==l{~iL2qkepggC ztaa5i6tY6nRnreK$DGUUw2YQk_1I23u&kzfyK)XKs~XJOm2-O3oEryTZ11rhd@K{k zftQT~??vO>v;!L#Vp(dOTO8-UVBE$ozN#J@eZICaUBoe6E*x{sg=4M}$6S*h!==Xf z&Kn~;0X}hzPj=!DW8DA6n9!e&IS-rTyG8%Qhir$wJZdp{`-!4HK*l zbH;kT+o3!8DDAX|>&A|o!16KU8_7q3@jV*42YPrn_MP>|{)SnsyKkV!MwnGKq#e6eWDUpHe9KM=vW}&{T$jzO7*4rFAcp%S$3O!>rMp+sJ z)|FG4Q^~qe%2-zh3&7G{*4sM!96QLf=`I1Ab%AbRt-7`c{!N>fF8r5&)22gyL_RWLZnCa$)2#Z7=%}twDGaW>lPMZO2w&^T6H+g$$ z2F^^TozDa??cxvPj3}f4r<*o|;3zh5Mw)G=v4dtf4X{O~CIS9yg!{pPxtkk{_8OAM z)9^*&wp4$jHJPMGP(2MvL+UdGujOJog!E74a1|Va$#5S$gl$FSJ$Me{pvCq>z!CQA zhjLg3H^N~Un*0e{eee{Vh8T2&3CV>a$j&m-axTh$kE$`7cVT3=5VBq!rtL!l04z%96fIq*2_CpEMS-Ibg#o{JxktuMkp5=C~Z zLw{~Cj=l>XhVAeQ9DtAED?*5tWRW>+XHNpHdlGw+eUf97Q=keihk-B$dtD?%D(MJr z1h<|$()wlMMAD6O4}lxtCb$`vh`$*)0-wN9!ciq1LWgqe!2w;w)9m*l&K^fh?uFw- zPKrq<5+`?)=jjbR*SZJoI}awrU~duo_rVIp=^EGod*C3vk8}QnIOT{9Nk5c~B)5{e z;F74se1OJ>3}6;4-A=e)taGFPp?j z1^IwRX^bPhx;2p~O7=?5PQH;m0s+Xxv0c!st%CkA99KOP?u4E2Cf>Ur-h)%{FT@f@ zlthoX@R9%-Os*g^#C_V+q?MYHer0qL-9!&@QEop!oPVKpOTv`clsKJ8Cf6k!lCLM< z73o`w&*_d7sD*kIFh;Sh_?$Q3Bzz0M;4`GegKOfe6%2C3hviLPs;y`TzxKHoly#g(yQ?u9;NGO z1N{WAU+C``1IM^Rt_Wj_I((aX+&%a{4{^u1uXxIv_yYb4em4J>gp*t)c~G)KvPbf^ z5Wu=XnlSH!68H&n{&sXa%lH%ABHEW8#kNVXjJ%5PxDzJPo#aWR zOBu@J^<*Gf$rZqDWGZ5#BTS?ZfS=Y=Kl1ZX_$Rr8m{4+?kv2hkHSnBrDQz!N{g*Ei;|WmvXScz8%Z<2m*0!7cQazrg`6u# zcl&eX=@s~tH^Ik+k!#98LfL8ATGW7-fsXz{ZlROlTJkXWEm=b=VE~NhrqQ0{!Nf0o zC0B$P+kx7oyR@SmB;^tpUyKz08oDAkUIQSVz#o^~!OGl++}UJJ(w7)5$w(Z7S%{t9 zsNEK#EcJ#@iJ6QdgZL!v$0w7+U>)7SA4^(@n)u-TBuZFfD=8mSZ@KNk{ zXZ%8bELh+O15)<7J4=k*IsFMH`V1g;0WT*A=>m0WSHs_6Dr(-x;Ca}H7OEfOV-((ZHB7|zX=tHthTBm7=fNV>0T046@IGBj zS7C&E4}F8)K(B>Q;ZyD{E>4EQA$~qT8?L|zcn~q*lRF@lJb2%ti>HnXs5}$e*|hh2N)p!0VE^-dyqX2pm-FW zBs+k5EkFiJmi7>U?im0hwwVT>12fKT{RY7P5rC@@z`ZsF-tPeXcK`%t0fd5pL;}bz z{@=j#6vXg7b29+)kly(p0~BI3S#&)>2|lX>mOGqDL1)B8=XU_QE&_<(56~?ap!;_z zs2U52`}0GHi=4lX~zep`77F2NpPSd6`D;(nUtE0dUlvu8t`X^X_(fQugz3v=xwsUjT-egnN6Re z4m}$uKTji+3=XKQI;HxZMB~$I5{-M+N}WyRCw&t@NKT@K&Q7m3qM!=9joR!yTd_hf zwU`Bo6j!TM;-YcATJYd{?XIVHkp6A!{gtivBraH7?ggtgQYypMg-eP%lCArVE=fcWfEIy6`|a8L)9{4}7f)8!0+uzx{~`-cAw-+bdH zz1-25{4K84NkOh~#2o|m10B3VyMsOlYO*4(5Y%d|@QOlCS&IZ)^h6?|FuBc3w8hN!k$Ifi5Lpx83e; zoy1b&P5fw7Xl+WljsLBAq{X1OTJ;7CpFd1$(`hww1xkoM`2}y6NFV_DWNloX>o*3A z{qCsS=ML{k{>r{ek7tzdo#oy6e)6IG2)Q)WnEY(BBUtQB=YBB{6bBoVhvG_Xh~V8p zxuy~CoXzvR+{hc{VLmL+Hgq!dGhAtyXqaiZ$1pdz)37!8sp?bx_ZowWNaQlFG;Grb zy&>Ot?>OH~-^{FOdG-05{X4TiQh%X5rPhy-2edvxr}r9+9+TVbve*Qx#t%V_I;09K zNq!#9jqzFXh%A~du}CvC!2)QcYqsWe;W&k(k$e_6d%74UnOzhb>*vxgkS%0;v-7k0 z?3d|&D1;yhf|@?_qQ6Ui2Fb7$>?CF6_7tH+xokSyB(&DHqF^>5sgNj5CmFLdk})XA z?>;l`48^=Y-XLgoTD_K&sx>MNmB#q&IPn_%jpX^b3Bt-?974e?IW|TmIdS6CdRUK& zgfy9Ph{!MzPgRhpP>xx4_U*UdPNs^47f(HirLrg~Elu;eKg>j{Ls!a#E3FX%elQs= zW^++tX-P5GWKuHe@-^e{KKRPtC%;_Uy&`}0;ai53SyXn+-^YGgtY;32k$JRzbZlVGZ`s-?WM{{638gtop^-ivH*1z? zR%z&Q4ben&8jYZHDRuflgmqH zY|y)GdY#|NntFS{Gsm;k!yWVxPsHKzI2|s(!)}jdXS*GCqr+j>>vV3KgPJKP7zij8 zav<)gHrJC&b8{88oLJay2%`$L?;zC>BVFUh?64!QRaAhEXdNEM3C9@+kBk)CmQTaF zoUnce=?c2!?#()7g|0EVJ1*c@t&V_hfbO&|spEAxc5`0UBx_?@+^3Rg6xpaLRcsaI z9=VF?`Mg@uz?2K+^CY>^TZKLIa;?#Mx9+imyj=(UR68{fb;5ZK|D&pSw@fH6XCUfm zA6ImNCMhC;v`Qftb#PpO<8E&Kc%Bp$&%~^ z(Z{?iLaU-LgrqkIXNRUmXXGqVE-@|)E(ytp3gd;@%6g$*SFf)($ohKw`}zd?Meoj# z6lyzrJNY_=DzZCAtF*lYxgyWzb^073N46s`pv{iTX9_O`-^$~9di#WK@ZRlRkiXo! z#=F%kkI9{8TNJ=$rgBM?5SKjPo52OLG77z!u1MIN8J4?U?t;QXvz(gcfsj`1QRk^E z)C1I`)l<|mbtAbm9?1!TPS8=UZmDj!?x603?u<^VvlnM(xru1-&!F+K74@B&;t8f% zrl$Rj+Nu3p(IP-a1=0(d0okMp8AIPOZ5Eo)2plSJ%SCDO8E?GG zd~I&Mahkc_y2YaG;4IDWYwlZmrRBXZmkA5 zy(+LJstVvK4y5d7<3jY88-caF~j2F zZkbLZY?-ufpw6T>M+fh}_R3McN6jys`}Mqoyr(lG$+sT6)iI>9ChEz#e00z1WiKVZ zA2r%!)>-mK)&?BC*WEXK-7SRu9D@CeaQqD@doEOU>bUP-<$TpW`uT?W#zm$jo+aJ| zzQvgfB1^K>sw|S}jW~Vm5U}Er%&k7!U2btPeXFuZz;1Ve%Oa<&ULuKzj*&~Q%hh_^ zX0yv}kw@JM1$E15Fs#)Qt=6lhT6=EHjjjn&8{OZWoung?pR=>)gn@Z;C0Ja;)dJ-5!dx|$K8=AXDus8!Nl#g zwqUp5qCtrRX`!et8$GfAwbO6^c|NF z&X#gIRYp{=cd7hNPe~x)a&ihO+L_H-cLmGiF|DmaI*g)KG}T}OggEvk_&@^3{tLI&N53T z)J|41i~-1hsxUvX^kdUqtUjG_IBp>qRX2WB3&CD+Nq=y#j2#l zcWz9&g$$*4GqksiVHBAv>M(8^YiWIk0GvO3?f2=MxvpRE9MV`ZN=ybh5>9y6@`r|!1T2s~rbLKSbgftn&&4ggL@e;f%lwwvu1BGdXHEDTsU_O%IeH3}7p;dX5$sV;|0^ zLhYXrfz)0ccce+s;Xl)0Whx*^INE5SRk^vx7~)%Ry^shO_zN24pOXM-Fb6HiT(lhJ zBpfeW6QeKvgXLQ+_oTUeNv>nc&oJ()s|fw(PJG*3CD*&dg``5fip(!6l#)g>jo!57Nl z(EYnM?ll?>G&{sA+*jx3=C}y~d)LgcR_>8gxvk5*DHoX)aRWgR0|!x`F>mkWIrEZ= znMF&_eCYEuTWw0ur7FUn3oK8i5(Kn4lH^&4CBK6RLRRv-twFQj9B8vYXn>~HG6SSz zmL->_4U46?^a6W?<|t*0cxH>*1WY2*TFU3u?HWCA|Gfj||F~%1BAGdZ(MV?@()Vwk zzH?A1fzL0yV|a>G!`Fp^D)hf7KaF5NW$(FH`ZU`l~eYj?lmu~}S0Cyl?i_J&8^ z|J9pCIv|Oy#A48xWk}KMP^zY&RCOn>#nt*J%rE3^Ht)*gQ=x)N6HP}5cCYC93ohb{ z`dlur&t;DlicOG5@*+ifd4)x;Sa~ zbPN# zoj4|neK89xeitIvKQVVjlGuv{BfDC8^% z)eR7cVDm0IZf*C07}b&3jOtDQ4JrSOT7TFl@}1}SO9S-2i}s36h)(_kEakhNL)JND zirN=twHoo}gGuo+bWlo|gTl-o22KuiP>!bkkrL*Q(6GwETnw#(DC}s-+y=ePzh>rn z+pDK)(K4ZiY&zfm{J|>W>mbwol?RY|9delFGIP>W$6ny=x5bzGs_kXS<%~%Zqb_pSv|OH=J8YLUo>Rm{cppo<$ZXtjESOYITWiU9tBe(H~e{r*tc<;fEji>k1w zw6L(G)Rm`_h;?}pFPBSrm&##EO=cxptH(;M5u?>=GP)eOSt(r?9T=t2NMjGHIVE#L=B`XhW;`=eoEg`bXfu~&9?U$E zc?R1W>F05i%R@#Jx`Z4cln~zOz;Y? zTx(QvtFR|({cE*0_5VyaP8DV9dbFogNr3!8VYMqXLjFpp=>qiey2Q)E3Q=dh!_r)IWvsVvG6QW0VlwZ^HGqAX7<%5tGCSnN12H;Tq8t|f9~Rs}KYoR|oX3Ks3vh}&xa zW2O2>gD6J#z5w}aX1GX21$a8Cb@_@Eky+YPG;+u2q!mm%ky4Qo?*H*8dY%6!WDyYRdItof`>`j+_<;S>Ew<|Ec`g>UsTyI|Lw z%w{Y9mj2(`Uk%)2iskC3>2s3j6i=()k-j6B-$@rq7R%?T=Nsmm9-u2E@($7t@*+jK zx|2|(FEV$s%Cl)yohO9!A#t@l*IHKz%MHuSE3J>%cy}v0T!a{HVRI(zE(&ELWs+1IsnK3KP38m7k4gsD%oXSEKK0 zaAQImlizGM*eW#XoU&XnRjAXswK4f~T%$8|B^j8g{jBuI-_WLhbs4Pz_AMLw@Sqa_ zSx_%4rU5?{_muQJ+;e*VzQjIKvTy#6^N0TU^2TN&Tl4adwCA&l&sUQgl0mejdUfK9 z=k}AHiM_|ZOB`YUfdz%ls7bCwO%i|{I1{(>cHSX#gU8^|dqR#9N0noHRGF>MY)t+b z7iQS+veQg?wtSg=xrerSM$xoq^yi*X0mi~9Pben(K>=`w^x9xWkOqTRbcZ4#t&=$I zc{%773AWr{&u!ARZ4I%VAr{Hjf+*p^IO0Bt9w{a&E%QNZ(%;qo_pVY|8BArHKYtP8 zwh1uXvkQdM`=S9KX}CDHMUUf~^+$UZ_8Zt~SmJl0u6?TC+B*`5$%(}D3nlv9`Gf8V zmDvqLuDGe|xW^gZ+5XQfi1!@mK%UqRzT}?xj2_E<<}R!+374+!_gl zv$L5u>)AnPK@MFV*8skVTPO-SAxy%Jq;~6U=MpDc1ddO|7!n1{~15;XC8@G z7Z*sLa7Lhlt*q~)3wOtBr=F}mSu2S98N#pWfT&6Q)&xa?5xc4U!oBkUmhfd5QR~wY z^(K$ny92{%U-ImhsJg`LK@G8~*js?oo(`uW9Z;i4{-w@OGm6=4Y4ZbUI5Sk#&N4$& z+JE(V9MkgHk+~~J%vl^~wfdForX+s(>TjC|JvTG4k17*=FJzpzZXL0zr0dF`Su3%; zQZi)Vq_QCoqX)1ZZGsVPLJv3^&+bxmnPWgvZPAV9yUp|L^Bs#iKGIFu$J?`#GM0F* z^4V^OEvGEMSY!_Nk_KyOWAd|jO*9_q(%Ej+N{m1{WEAEHxZGm4r>;}k!sX?~x=?r3 zLOyq4W^u^Zo#RpPed5-7htO#E6gPF-dm2OWf^Z-lubdK@9a$1t71 zzDYgVgr+)mb|AIi-nQZ1iq2kB+ZU>$6;JJu6yyWjnq><7;=OdXcVRNRDch(`fB9)j z?>vbE+rIQ$6xGOmH+Vj zBS(I?zJc%RWYqb{&9>L?UNWX|aFIvnbY(6WwRGS7eAe|1+j$@P(BqT3UE?;{1HF6C zz3Ua`nJq!NE*JIbz42_VLS4eP3;j+{DcjJca!Co>AvD;`r5H!q0(x})D2kD-kxbbp z2s-v#IV{G#f-}!q=RDx#wayCX0Ox3DJxbFC=W(ap`E7`~)NIfEY#yCgzJdMtX1s^5ZS|-ucA8 z6P&1eJjvfSc?9PUEIQEE`fqfcl%8^a=lPxfBK^hjo2S{UP*Gk=94gOT#|o)bZ%xHc zCc#8aMK+VkYIEtc^HXkX4#|l?PEJ0!vUSSTE>T3G(I^!zT_nKjy~0I)#vQImK5C{w zI1;gj^~$hbM_uSi_*OB?^hcR&bu@Su5`1 zF|Msm9|$_%<@`U|Y+>F>t*BPYNDASI@%Am%wkX1A7L~_Eo+Q`$!{6&)nAOW|&rrKl ze&dQ)?zm$9HDYv;YT&!JcH4Mn>{~a{SHulfF@ET_@U_bxA1Ai7MZiMZ@OoCuExzr}JKbtk7g0Bx#2n*r5@WC)2 z4o9NlaCX$?kAh0vcC${A5v|N4nm&Y)!SIthB|E?8?h)izff% z3;2t_U>Bpw|JaZwGe!v_ec9G4k}&n1Yk(B}Su0&LBT-XnF={kM3+ZSzXfh0zC&=AW za{Fql5i3?wmdfLNSA|KfHYrkRi<$fG{5sP<=q>Y4BW<(j&iEBm>{A?5oKsx)nD4gi zmh3iuV^-7&b-Frzoq<0)Sd+lt9(KXsdTqQP_%WiXdZC0RW zi?=cH?|89^=e$M<&$~@VBbtLO&*y6>d#kM(l zSO^4*ZSinsu`L|eW_hwkXU)!9lC>)9K-TFjdDc!k6a6_0hPoCr-e!*HA>gg%xV=Pc zK5eGvMpC_n#=|A(e9hb>@tR)7#~FdcNAn~nZt@t(ZX+><1qlJk0Lc=`0SPa88G9p8 zMTX$wu1cLIX+m!M(I%X<3$4-Csp7w6bjl{QPPJQ`!~kJx?Mdvl3O_=-s!DGuBEL7a zirXe~cGN_ItlnNYclHG5yWsrDpPeW9&kZT|@7EAUA1fPutQYAVYPZ}s(ZjrZ_ZtiyCQdO#=6`$ z3Jw>1RUpqofBA*DJ(TAQh5SB$mfmHsL`r>78X;VfS`jO4Bq!n{$URx0Eb?(Gg^zuo zSRdnJkA5OL|<&OKlypcb+qdB-+3A)a9w8OsO5~wu5nbwN1=Ao)um4HczgjuH!}CH~QYT zH1&6Z4Bdj_hVL zkoLp*ufYjfB)F03#~0!%Ay3qeevQ-2>IPe$$!0T~{7$!wBPwrLU8`y&anu&I!QD6e^cbiSJ>pB0L;EQCt>LvHK%srBQ@Nj@tA8@@#}!MSN-E3s}NAK*CBQKp=4&mnXNu0hOQV*}`JYHdb`ct*+Qw4`DwxJT!U z$W)tosq;yTFQCfkEU#JZAxk~GJ=9~58GT_!F=Lb&a^G_cI{7_O17$3dCzL6*5$s_58 z2X?;p(b}>52Ac$(W&Bfb?@Kfj)xK9bjgv{qD;~SW(QD3k4?T6L_dugX7wvW(;ojOu z)Jzs`Lu{{O|27xm`}1vmvL|Fyw%zaoy6+Mq$rE=R{BpOIH3^P9i^E~H_}xmgKTA=o zL^0T$SPIJsQcP&C%>RZRaefrt!nJ z3(Ca&2Y>CJ7v%SAFsFrJbB0_mXDa5LTx^GIG*Mn-CJSN0$*(sD@Y_#>$5CSed6O6?6aR*S|k==KIr*Jt)@eKVJUe#~(kq{A2#>=E+RA z{Qd2jCvLpy_^h|drzuWeeeBq3#>rGX1CfWEYy&SGj9;rXKVqVVv>P2v$I&}IMZD4G z%YObm7VY089&v3-9hPo8&Uk^6*lnavj+i%W4P$Wn(D z_?(t!&0jq?>b*)shF}%)f4TkR#Brj1`#qu@Zache*&#c5?5Vf97HMrdolrQOIQG7X zn&Y3hFMQ$o#mp-{f?n|mo1&x&72H?-dfW48#<933a8_e=Us5atr0qDK9+#IV^Ay@j57vsuOh!L;-fXJH5 z5;W$4 zs3YPbEDXB+_P;!zgN5`jFV39~mzqp%UjpY5QIEDxVd=hYEZz3}y*JJ)GFgps!$TAP zb|aZDDq2lzueN}nZfE>Bd*Vv7+^pAIILoA}*{p?0{jG`H_}h>(GogsM;{{d5dLupN z`!Mu_?_{XicQz=!E;2c1T;8~%S(;lSQ;QZw<`g{^xvywlWOdOFcLtR+Z7^0;5DJMz zuJBWEM+>Z8!Qw?)X1JFX_`J%f50-^x^3GIBq$JDbC0?acP^?xoC^)Txh432`2QZkh zm*o291eOL?2O0wWuE2r7iNKivAFvf?kGX(ZMQy>pgGOSYx@f96$y91Z+X>u`7b%JJ zxOgWxl4rr5Ji94dUf7uYZIfFLjaZAx^H~;A7qP}1bKbd4#5AKb&xMqkrS{w|Mb8?<`)t zkG}n=s4=z==@uK6C7!jptWS1j%XUJxZY7ZD_rSaRmp!n5Kgz;Tl!eJC3uR<@Jm(R6 zvzPM3M6Qy~kS-+;(ADH=+CVl_TRvjW2DBBR-@5k z_3I*eqQes#nIDVg<@+OoGNtb|L^D#{p79GQ|5X(lnf71H3Ryi+l2=etQdra+d)w6O?j=*LK`W&`vxRS9JoPw_sQPfqa_ZNWS0PvDcXP)AdZrh!T}n`C?G7 z`%8uY-=3JMO&>57><)=c8gfW%9%7d{Q*wubcitBAc915|ZuP1?#*~XwliIV?iRZ1( zIil_InQ~TTf3=rP1`k|z<=FWnM`48FNt|XjV$_{8MpoucI{!$VD8A_YG!O4pwPZl+ zzuJYAyK+{J_r}&A+JE-bwM|A}Mw*)?I^fVxogL5i+X`)Q+hE%`+jQGqHkm;qR2$J- zm8uoh5{X}JcG{Mk&|Br+ppE2#ZBD61tpu`@ux&Gn!A1tpV+=b0BUYPh(Cl+ZScF!Q z7UdPcHeGa_1I|BHXbO}V{%}$yjRCs!mf55)d+}DQ7{c}ag?%?J(S7nsVo=M^=jkK# zSeRztg>SYDxw(WsupJ`F-J8vtiU>P1YgCJQe1Kk6agE^_1Km?hvW?lH+(>qDR!PTT zMW{=pqIjZlVnB7ZfdmYt1{yUEh55>))=3;rLP^aRF!HFg7jOzl@U`ZeV zDRrf4*Huo&+*`myJRbH?wNT*^e;9%ure|cp5Ntnu4)N!bJLk^W zcS&C2&%?gtUF;Aac48YzS6w~(mB3Cex6;nk)Kph@S5;S6_jJ#S?X1;RcDkUC11~#i zJY*CcM%mZ`0Q0vxqp#yJdM7!=XC<=x8Cct6>whocEE}7DP^TSmQIq_KjJK|ro=cG99b z3|hSRhSJCL20TBaN+UJ}D{B_f*^~4iqWDPZJi~@(ze4xVelBnL^FCd|8V7@C-DSvp0rjB+{VW472KU9&{rz^A_`nHO7`gIipdTooLb0xODmsijg zeXCZiSh*_L>9I4EUzX@*>8H{w(s@ZkB!?7{M5)gvNp@S%v#1I?I}&sRgC%=^u%j=+kjl$Fw5M-%PfuiZuqmYT*ETmTuB^~eeM4s?O!{;U z0kJG#G>ZDpj*dl(JSMA6F7ZaHmbG{fc?Ivq+DgA%SIe$z57i2_7gv#xym}Rzj3KK| zuX=u!xXO1$!}m(_#{B>^c4tr7C8O#R!p!qDX*u~b)_x8at(nSni1On4QlH79(V7?4 zYwD_~R_8O7RMExShALWWDXZf9kJv88PqQ6JgM-jhmgkl)o95mk8u;qxeh%H{&k3D- zArl+XedrYQ%zu}y!aWagrf_~3&IDb+pv!|ZJ~+zC^{v&|spk6B>f%nexB>opZ+y*A zpewcF+Kwx5FUKAIOPfd6^dY#ZwQ0%99z?%}YjY43hXzvX`uf&|uiQEFD6>@IE0JyM zl$jS0KH9UrvVMeLz2;Ve3tb5oX?$aOA3&Z*m z!$`S!NBP}4;fAUc^btXr;CZ z9&*Ik}TewR{PtjM13?pt=Wk92c7)+9!CZkC%d)Y^QtRrw>_;p*$ zT@ZfxSnQSS?A6GN8{W(XaPoipn&Sn{%w1lgHRugGgP^O>f>o6pDtYYHfU#G3_VK+N z4CGf2mAknO?ZX{!gM$!Ybf}}Bc_vV3D)Yjx?bqD8L4xT;}Dvi6b?s9rGPHNb_qp*CZRj6dtUd7?z~Q`J4s(VQ3@_36FWoa^ybXqJ{Hlk z$wTHh3bq?OM!Yc4anD_N#NoENOHR$b23_`RC#-&_KR2csWZfWZx)HONEw*#BgOg3M zx$OScW{kZBR9wxrEu4e^!GZ*Lf(2{n23iR28r}qpRMo0kYtFT*#-?}mE(j?)9dvi$%2YF+e{)Ko$K0Jh*M=6ILoOSk>1tp3s-Kkv(Ww)3LupUHC zXkm)Bm+tN`A&t>hnU0Y&p`+m*MGw6dG~H?IvO(#R4LsON>fMx`WNxUdLIlb*QT8(` z7F^CY>+&k8YFBjy99nEggpaXRg)U1q6#3mOM_kLS{5>vSNTJtxxR zv@w&%^GhFp$Xzp!kJ&G)-Rj+YRv8Vj-K9t zQ>|_8Blyc#CAE949g{8a10{0D>lR;*V;flDYb2!|+@5;~=*|i+J4Cd5IC5s%L3PVZ zuUJx=>p5%{sWtzMtG3jtFWD?#jnQwbAGh7-vTD8}gDI2o{Bc-nQxGXwQks#gs@+kj z74$nPx2;(EYo0k`&GizpIGQ5ksH=x`%ngG-CkXAiSOKG z#wP#KYy9I!JM*|;+FpKV6sdh>g&MWEYAhMetY_wD-5p4a_qvD8VWk$UyROD%SpCx> z*WBZNJ%KjC;!~3fsMSg5ka1&?F==35UAf~b@mKZLz`^!mMTT~D1p(pJoZo?Z~Z0qjK;*kMEoFG@X;^7_v|gjbqKZ zTmt9%f-g6fGYdvqnZh?#WY(XjfsTMyhfs3|wni&+_tkD%XVau!U9`!WW|deb{AT=w zvNNR^yPGq{MTQ;$4YZ`ynSABEJg1pqyo8mB=7hl3))KCg5YLEr2p?uM&iq@ja6h(( z-%_BoF3I3U{dgc?NV#L#3-ldgbft&Rz7w!@6|rdujo`b&Fp!=>)R}wZYc!7$4A}OU zA|r3|6Jm92X}7VfZMPw;QeoqzBoe*wnw@D{p!%`r*Qsk}$nJS6yz0Q*2(X2z9OdIW z*K^kYaVR6X`5VAvy}Rh}7wzG9M`9ZJZp6{;oar~1*@>FHKw@Ry?Nx8%(d~TVf@!3d z`<2vnSVV$eN#o5(TgOpL#a6^f3xVpqcK!^cV(pHMcDEtnrW5&U-@L*?{ULPqQBK^3 zVn33?=;~Hv*QduSpW7Xva4rC=PfSWcTLbY}cnn|o?WIe!uDQe=CLb;}6ppc`IMX7P zn0gBe#bHMYwObda zMQn-}<75LcT>YhG;qU3^mX+=WyC&Uc?+>`e^a<7N}dlic~vD&rp;q?_zo(u?|6QV_~Rix#FS57u_omLIgkbPLS2 zGM3;4fRGV+f%X*YTv62$k>fxK#fzK`0E2?a0(kh2nw+VctBk7D>~P>PULa0!J>&h) zhOgT)veoUe*R`${TES_w{-VBTdqp$(pLt98K9X(Wen_A#BsF+Rgy;uy2A_~;|Q-;JUke!Tqi zQJ;{11_B6>uG@V}>sM*qnT}LkbzQPmPBjt`@e7!%5&di;_4A{@La*{&N^K}Ptrc_=mw*eesoK_8`D)fKCu6y~eSjM5Dxk=|i z#qvYx#97u;bmpxs<}FnTGo}ipq2^|A8~*@B>iu@Z_V#Rpo?+U^AVsf5edGB+m8j&r z3k6$HY$A>ZPB#l*7f4l82%{%*ZYHo~|Bpq9KgNuJs%DxNnNttjFoOihcV5#0dl3mj zLr;s;sR9CBCMC7@7#nAK`xbZ7El&{JSXotJKbds0?fLZie7o#9Oj{tP4_2A|WT89x zZSGH9M?OZO+%@6sH;h&k4(1Kbk?6v?Ysrbr!z}5BOU#iw7VEU-+dl3msPx z%92c}3`!jQI?f&W9lphB!Y8ufrHzUT7%a(4>{|qs#TlDRPT?Y zzJvQr%%1r=U@dD{$t(I%CIYRhty?Q1XgH_YHVeY-cM$O)^Iv@3)Mk<0?qF?pVe#>{ zk=B|BcBbhjYNy;2rP!B0umo>=y{`~>|1Qzi-Vb~}p+|3L`@CJnZ*@V8hd=Zw&!CDf zDyY5DRw>Xq&(B*j@N#qM!jjR7vc6kZXPRoES$%(A1TM(I&15GXQbbQ6ebd1hAEYfxWW6**tF#aKqKS$+uz z1?(#_TG4<9q!_JoT*QK+QkbH*n zwnGPR&CG>6yQAn!k*@}wki4l?6~|Fe^VrZ_TPI*7Cg{9u zG`D!z-!i%b={Hiq5|)i1;l9BjQzsQGD;yxUcm(Y5MH(kCJoW=oP_6Wl?=ct@bfQcn zK=&(6rPyc+K~>_*0uc2tp~B#oP@!9sFCN$w4}1=&#!__fr;^ftDyZRL_-_4${YPa2 zb8sjARG#2rh&BSly4~t4a~C0^sbmYZ6R9qU#8r>IkxsFSUU9)MZ*({==8pOI{XW3& zXJ9vxi&c2O95}l>&u2zROkhVcmNFztRx)Zb;php`ZyD99#gTatl*EWwze}G+d5w{W z*}+5UjAZ+Y*;7b~g0xbY`;Mo(+|J0O`IS-aTc7eM{YGpiC#QpvKUhL6`8x|nNIxuL zp*7!>q+BVP0&nVf!0}&*YZhe%Jw(Y68Fi#=@D$D7fgWA5&~;Ttq`#Go-<{L22bwoq z8x8l+LLx8PXhv^0%VNO6_Rjs#eu}u2Ah+K~Q?O~DqT&vSUkkC|8Kn!VN;p%%EKW_4 zgR$mibCoG)=QU}MHGaK;IdaEcdP6~&*nwIbC3T8}EM7xxDHq5u-VKl{x~IagQ1*+f zwAuDfv=j$T39E9|{G)Ol)$99Etis;eC5$B1A7aOI*yhV$=nZjWHqc0AjMi%EbY28Y zeoe3;y)ivtl>cr^eA!7*pK{D3s@ys#PxmF!Gln4^y1|!Nj>)Rp;mq#SSLQpC*;pbm z!wXW;uo6ltl^^E?>#giqMoJ`~t|7Z2x|>?ChnpTP(S3D_W{!1@WG~fy^>7pNhx0lY zGkyFVfkNbt$h%FZrlCc5MzkWr`0v;pbrOE10I?UpN0&?bq*|T$Y_5-jxue3j%pNw$ ziuy6hm`4hFrg>dV-5(Oi4k+~{h7pT+c>T<}nSsVu;%WNmJLysfBVrBz zreww?-Y@PyYd@x`dcS1`DO4@@SS%5Vmdc;qni4ge43i7B_r)lNYgNwL;aIYVH$Y-l zpJ?YD*g>Oi4&-Rkxrb*ivHS9hgvaPx2?p_-Iib?6X-apz+dhhj9U%+kQ7IsDJ*rT8 zImS4*(IJ}9^ml~s>||5=Ym5x4(tSn}AQ3erLVVFNqi^Iegi55D2Hm^2`6kB&#rfW9 z3E4^KikWH&5i%VpY!rt(OY8BZ)tW!nxXa|`+i7gE#!7AL6b;51x!ZnZD-IV8#=9YR zUrK(jn~*G?_mcLSCN?hAh=WW@dNA(vw@EW3HPZWyd$hGdPyx-Bx3Nc`H*Jam^HOT-;%1*}Ur=1A zk^zTyr^o^iUKCyBcxySGzfxMGPQ6S!7r<6ZR4o3~%%L)!u-z(VE3f8bq9l`qv2di! zV2>n-%y_5wr!cWve(D{>dTF9D+jOh}Bkgue#_KGB#AEi-R-3-E*hLm0i%?if~LBz-7Zfg!CMh3sC$*-?(CyUIG z`nWY7X*`m|(wN#mwKs&9J#lg2bnYg4+7o(uiSl7Dq)lF;a6__2Rie*@{X7B`r_V7h zAt$dO%48z4R&`ZE>(DPFjX=acZiE~E+N9ZphRA>Fini*P?N6jfUpOGjO6SuTPN~J_z2XffGUnpysGL%G+#t7q&A-Z1Hm?h$1YK&{=h@J@{#3 z=F0W$*^_m*Ykf?RklT9%_sqfXqgSpj?QU4IvKp7YWox2!X`#V#P_cs$=(lTFKvB@) z@uA1VuWEH}GKbybKDooc_lqh$M3Qg-KOR1*}jExussP8N0NQ^n)6&TMc%IYPBkQ6UZ8h;o2wvmJT}fv`MyiM-|2pS z+!JY=47}0q>wj#OndS;T1}n6h`@VmPWuF$Z!cnzzR2s$V^vjiC6E&FHXPUq%k$jH~ z6&fZm@Tz|7GZ>QI;r99H&~xYU#<$tvsX2MC+A2M~QPmncI)sYCMEbGOeWO3;Cf{1WtNC*R8q9QjJxeieIxgfNvkQV98)z6$MuH|54m8b0R3JXUD;Wa#o( z$98P-FYhO3(EZW&#!T{Tf9%-K7F`g)A#JNE9};dZ@FQLxYXU$`(W@3Bw=thRN+oUE z2jMtr7<;y(teqm3oA-Qrc2w;vkr#-!^%gSePsr$iJXdIR2Y;ta!s_EoIB>?NJl2Uy zZOaatb{Z-#UvF!!Pqvf?P4Wg)^uVe%rCzbA=6LiePuHxOUxZ=MD~Y?e@Xg zwELUQ*ZKA2UguuHy!UMcr{Hy#ZdQSLfzKj;o!@+vP{(K06LINMwVc4oaJhQV&;sew zo5+^`c*o1I?)pw&R@E!7;=|Z=GNW}_X1aSNbWB~vT0w{l?KB=`Sp+{WLFDh{i&hDQ zP~2^SD7Lm~apwLopAWjtY|>V7sWgrC+C2VR$+<<7Exxuw zypGNs{9Bz;>ZVV8%Kl<5Q7v@(_7U-{bFMr;?0-94<)3p+{@;$XU3FhlO{ac!EcXvNs*!kI^QOmZu&@-a_ zS`*`N)nf1FYVPUph3%8w9V@rPak=o0W!(CCr+1w8uq#EY(zfmWd8JR&UZ3vM#U91e zFB_lRV_9Yut+pE+2g5!e;f$f&lAoulF@myhBnMnZsQNWs8B#EcKWwZ8@F^m0mmEE&kbV=06H%#aHN9 zkt*JRwek|I^VHe3er(9lj`2Q-aSUDI5s{bbSWz5Pu!>4Y+bNNLhYRLGT4@u^z6%z& zl(Q@0P4L|!zKf!8zR6re>dTgvpQ@Sly*Wfq`S-j}V81lGEiY;qSMF(aP2DC;F{da+gxY z?}q{2!Hj!Z#~>knHcl*XT#$AU{tJ)Uc76t^5-$?xj>AL+PBE>Q(;u)jP?%~Gy{7tM&Cu88K$I(CFEe6hK8@Z~vxs5n&ug*-< z#A^jZ`q`U@+3|zxsichLjaJrme{QenE2}6g>jRl9f+e?_&ZH%`hDlY@!_XV;%fp|{ zx;BQkwv|zPLv*^<$3x3HHpdGzy82}F4ObqXvR8jCJY@^6!W^%x{8$^S8_RWVHiou! ztT%?zbrP3qhuW7{R}*z?;a@A1eKyhS$KLlBQGCz<-bM;!Q_&ZRRJ@pq=Nqz_k3+D` zr<6wmnvjek**fxCZ9MzfJV_|pvQ9vqg4PSXT6Tp@*_NXaTxDn| z<5||0puV4OJ|zXGaD+5*FA~xkoKwltP92v;;9|?j(#|S-LHe<^F02`|6)*27AY1mx zTPVpI%H(PDe&ohqujD(&EjyA(8Ic}~o*G@KdndT@N3&lu3!U)t%IdTUtw<%;4U3W; zkv+^On5pFaJn*deG2Kp@F55cU3~Y&~4suPNwzC}yT-jZp@WVBr*inxDZAvj{{@dI&Qj_VgbdUsayR7HD3w4;zhIC^Xi}G37gq*Z`s+HVo7qf z30Hc|l!lY{HdSh;l#p!m8q%YQk==!NMB-CvbWG_S>4v?!Z39r=R{pF z@~2o&@iMK|38U*G#V-^Cb3j6Iz#+%ID>%eQyNb0(`>PkqJEmo#6>28*>&4HZwQ-9# zIp+9R8_7J!C8y3L#`_7!D>J!%VO=uFyq^_jtiHNJRFqi;s!4CgGg--QBRkNI?aF)Q zRNi{wuh&FuL0vu-{d80xgOD3Uv3y75tGxMqJ${K_p~M;GANETrgcATAKkENfynnZ` zBw+-oR_y)rw!!R>=7;s)l*7Rjir>Nry&dEWk*7a7F1-yu>Q+^nnusL#++pk-2cQ3n zZ+<7@;X-a6H?ABE2;#iNB$=&w*VU}QQW7;;5==1eOuXCB-yjnrsO7UBF3 zL-4EG+u!jqSt*TPrWxHDJfTZbE*8pq)`H8WkXf*Uv0!529Rj}XAbv~2BFDmhe-c7^ zx%>m{$Y`b4LT7IEIJmm3ivJw1xY8J^vRg}}L)?&0G;U7r9=1b$O|SH4LHH=-mH1BU z_JY%nahit#*qbWt*6b#&zL=$*AeMLG=fIz)UX`^IO6YBcczfH)V>T z)8Bsgl3#eznSOIhHPtLxp5NaAci+U31JrI;2$$onv@i@!F%7uTYBLFM0WHhw&8oDQ z6*Ne?8M=ygqJ4;g72 zWt^*~MeW>NZ>R{eGT30w2-Z)oOD$NQqJ%bI5WoEhO$?1fcCIcD@)pOM-H3IW&T`#0 zN?beYci7OY$2ieZX7$)yUz5S9X0Jft{b{;JrcNr2T3GSzA zA|9al)`e^s_m_1eBjh$2cDHn};g*QGy>ZY`(}fAs#$m$>eR2ZH`K0+3Pv9)@sod=ib}l0_4DtZO3ib?)VMbr!B9<^rRYDA;7805o(T z+=nsUV84+P_x3Xgb&b^~d8C?Tx?c)5Aj22=H-}s?jr#H7)!J2r&eOauYYxwuot(l2IIHtJK8n2o!$nGtvR7tY8x~M)`yFzn$IJ4sKih$DLKq% zeELdY#h6?*8M=bo?Eiza`S#u1-?o%9)WGv^dBq%Z(Duj z>SbAxmCgkp%SnpU4;6FzrknnX!d4tUW}AcCme%UY^3vCsOuOSk+#erSmS|iF(~X-) z5Xl=pv6sE&@Aw>l);@8wwflR}wR2%tfBz4JglA%))A8tJC%xZ8iK1U{O#9Puxsu&) z_Z2)DPwf=f7WGe&$3tBKwIoTdGrD}ePB9|a{?2^rh9gY|&Ko^q?{u^W=u=&xC(W{E zvb85GfisZ3RY>ct!NbX)*60y$rKeID+D$2+)?X>3tj-67{KA-7sx~i9IUQRXR@=5t z7IeO&AqI!nw{a@Z+BRbc+_8m2IUVqa&kKKF{$c`7+gC)8H?;n*O@LwV8T4XNI zk2DwY$b4c-{XFl(ZFI_dRR5GdHkEJs@C9K7g%Qx!oxl6*a-;m%npsy8{i`Tt&0mR1 z;%P6B1RI{>27dOFD;C?5^TqBkJuiS zU#BM7S|6MZtG>SrE6h}J|8DtsWNdMA#{0;68aV;tJ9VJ@wFs-Gg>T)s+t(bX2=QE7 z(BOI9>oeWt>eb?o*HL+Lh=x-s;xusbi%HB$6Tv5Hx8sxWT@u?N~ovK&)W6zN{5rC5R`j^Ht)VI)x*b( zFHa>XZdd+aj?X2-*u7hq4;jT;y?5*r^0c=Nk}6%>9sw&J8}1VIx=(@wf8Y;h*pD00 zdEi?uYQ4aVZVEpz0o|T8^qcSoyccs#s57+5{~NF|}0G{;N)*W?FsoeHls z?)6$PS7T|^pJ3YS2;B`2rP|xsfy4-__6CO2r;GbP^H)Dm9etYFS?I5BEVuAyS!GxU z+Rt9>t8N2Qa-Pbq?~+^x=PF5kUqgG5|W$m zdeN>|vrYUOqtMJ&L8!GSsJTW==nHNx&(aZ<%dB1G8CrkWM_W!O=E^Feg*C$F)OqAL zQ-Qt>4*U$kA9l5bS_-GMG_w_dDE&!pedokSV2d*>h5x6VfWU~EPXunw9G*B)6Q;g5Z}lfg>$eFSy;}3 znPMM&59oYaC-z8D!JEWt$~ZmFeP-c>^?PRH6xCfngPHe{#gU8HN-!-J7)pFG@T;>< zwOvo$$(u~x1!^>*;@0cjZem-;d>V(j#CF`HB2dC)&##N2SImpz1}q3m5$aM&6V#aj z?L%5;8ir9KY(EuJ>&bvB28gPClKxS105eCO#ou~WskoN+k^S6OdifFZ$jp5PnD~|J zM|Ce$^d)PXc7lK`h<|dmM>*@#KIvNB(ul5|A6n(`DXyGWDwu1SbJtnQy}sSd+Ir8kZzNaKr(-@W=&iCLzyH>sgN?k7 zf^@l}vG1j}#1Gk^$tN<8_%A7bUt$7Hq;R83yYTB&w8yc*0eq)@MI$7Mo+A8`Wk#kW z-=vOfCOW!=9<#QrO_N9BYd9Dk|r z?H^gVIy4d+A9(wbPPq@z)lK7$<7AWkFjaKsi^LfU=w>s(R%XIb0>)gX>4kPEPhi~u zaDlsZirU{D)mt}y-g2Uss0Z#gr3ARhW~i$X)m=BIygxN&G>|i9ia>Fkl=MF{X2GyD zGzc)3XE{50rJfZ;B<@Fh+|bPvgN(((lG2tUu1dC>j~GadPEpT@+c?HQP*diIuR!HX zs>obdriUsIR5SfbH&Gfmuqk9;l68_i+eaCMFZbh3xRM^H`^@LeX7@aHIfdhrNo?=3 zk+?}%V9kD=E0w`nnBsA|r~DEUE(^i=CXcdv^t%bfl2DuKvtcpE1Wxn99v*0}2u=mFVj{;Gf}=n9>xrtC`aT9BsTP`6xY~PPVuWDnvAQ?mziAP6fqs)K!#b)-qKNpnheTIYUWrWu)8av1;WQ zzAb4;YUdb1wwxvk7&L1mAyiStKA1$pZNpU0TQ2()K&{g91-%5VN69H+L+!_RzvG2% zM4H)!INlJNY$C7l=!`dhJn0z*C0OH}o!L}jqTf?zEUaCtS?#Hzr25A~1lYv%)Sf4G z7Lp33UT1>_4w7}EN_b9qdf6#<0)N{o&NLL|Op`uWG}6mi_Oc&agH?vp?RrJi%DGOknq!j=MdP!6~6(G!}po8@r9RQusw+cSA3$|)FF z%pYLq;VsBN9|{u9&AvoeeLuX*rekpGYqP~i=;w%!9qGd09MR4dkED+@la*Kh?K10Sz{F7x zBY@=um}$zD_{7ua?l52)^iO`FdW^mC9T@ia7fgu*m4`2^myY#j83GxC6285reumhKq zy+K350S|s2#=?j9uc1140><5nY<93hLc%>2!hm#Nj)`=~pY*kDb!D$MNnHF=U{ddP zkS^!c{lJz;K?o?t``r0z{w`dFiOz|?1qE@-La5 ztLcb<>Hzv_ExYBSyFODXBe^j+snTz9{I&YHbNtecB|y1)Nj)(*iMP*o5~JBZTD2INpQaxKtA_ z5_-L=J;)dR9Aw`rA>*|)tTK;teh@7XztcjZ0{tu87vW^J$VZW?&@lMDLG*kd*30-q zBr|t7JBhiWW`wn%m{fzv_iA;+~LD8J%6bzrpq*%Mo2E7S!t&2;xFkzEs)k*dN9o4a|gKxBJgyk3w-%@7A z#`QHo2q;P2<_R+nz&^}Ks+xu+*KVZ+rc!Zl)#uKnp=~$KyDO2PYZZWP}Gz7{tU`=83&n*!thT=A5@i z^s@P=&$*20a2=%(By~a0xtKA)(}IeYaqXMIAuujngNi8`v~4NX8jbD`e@gNzaXQIp zu;|9l^b-c&=dTD_lu0xiy`uIXT~+Xg4GXgiM6;}qCZE!&#i~Zrpvo+$xK`CU5H)iQ z_B$`pl++Ww)&`at-GK53@f;288B&=*3~HJJ8E6``{_DcPm@o>X9QS< zd+9OPnKR$zp>}bYU^5%s&M>nb$@}J-?UP)A*{HWQNE|(74m~Oi3||Bmt%ekHj_|#R z03uuG`2SpJ`A}Z;BNu;nlVIVmGUnC{lH*lM9U*z-G8v%}uHQ{RAV>dCk#mHt0>DDd zmo8gU1}6|u^o>6ipWN4gcs46xlI`(D$)C5fq-Gysr!$t5am3{*M@Eup(^QG+5o}yN zTvS)Yz8uUR3Y^8U3I!t(2}dE4uW}8?IU!^G>B$T}Oyug&!G0HRapY{EDWD zM{q)yrKb*JX+~nVUz8e*b$|R?J72Rs8}uf5jemBB-_zO}p9zf~Kdjiz2o!J@%`$G1 zik)EA?GYmOZmej5`KwKonZ7P3`^?{kzsu6)f`f@+$FmpnUtWam_2k40ctb8^@EFs4r(S(jXk*Ra3rrt8(1dG2KZtlB`N$Gy^f}+dLTBt8hN|xm2--SoJr#4 zXQA)K_+8mWUwj!!Y*Kwqpl{K?jSQym6kxGkffpSslrl84-aJ?}B3OofgVtUpIydGj zFDSg+z8@@BTKG`NY|l~&9gI|UtT_-M_N-Vb!`Wcq7dRKckXT4oH4xv*C2kpi$LfZo zDl_=Xbha4t_o!;&ALJZr(osy9;EdudmRzHC>YfLi0V!GB&$&dyVcR>UR z35dwK5ILaYY}eOKhv8UfXPaNz_~q6Ok8nN6=A~@T8eL+o^~Oxm0;^uRxlJ1H5OM}% z^!G7WcNZkWvT_m~fcc1eY~(DexS|psT6g3d9t&r^Kl60bU~FZ39OK;m9C4Jl2`r&5RJVyT2(h`qiQU$7ni@^3&n0`uY8DYoJkd|`N^`9I4+OUa}^_UiB(2K+huXKB*{7iCj8|a6pL>v zHGxQ8rP#-!6H!~xQ-6V=Y(UHTN-=J%E@*bXW@%n($>Z%4`Q=bf0rRkw;`&RP#$pZK zwp2?eO#-HTML*Tnx76LnG8<}QrXH9&g_OuVANX6>KNDMIwrp8XN-FkUq6fV89~f@I zRhTI@*&efe!H92g2@)mY{s(oT{MeP~H)GuzF7n4yv^)&=!NT%h@lA(8sW?{yrC zOBU1mk<7M!H**E%0nV8cxJq|)2LnKul)YE1HrR!zTTfC19%7py>2Le~L8j_WgMsJvt z>{r?B*7Jp&#uvbiE$KbU!10ssWgNkZELce{93NTJsyVc$G8s=f4KcqZr{0bov=x}i zgH;yP*}}(jhmecPtrA$Y^?4lT2lpkwjmZ z_bdLfad{u!iR)F%OS7~S+3lTI>9HH=P-%f~q~uU0An*Jo7*=yH6SMej8xTbncetQ| z%2yD(vmIs>WlcXPtx{|_B8X&!{ZekCAO>T689y0_{T5>&w=QI|PH~ZeDy4`$?tChP zyP(#@JZ&XWy33FY#x3Dt9jBfQi}Wf)&N^=oZ$_sP>Q!Kw#UrPGWOjI&Bqf9}Jr-@{ zUY*+DFmvG^FZAHO%d?@gFN$jD6^(CZ+P77*+}v^jt!|~_h>NRu=x?vm+B{H4Z$;>> zqos2H$bbKLF1IY5blb9m9Dsu^rt7^zJw2qK93HUlyB2?B^(QLnhnpcVCuu`$sxwno z>LuU84}=MExnPGX8q`cB6G1%SdT#zqMQf#Cxx zz?*q_pKU~KZJhqyEc)CG`ByW%2}lWKf8G`FYz;4h;KhHpK6ifpVU;m9GS?Thb)(c| zgIjXKI4PkVAo%F4LU3SX8@RVXj(=gmc{#vqD1rY#!h0Lr7(H(|Km~Gez^neV_rOq} z5(oznl%Zt(Wb0t9Z}q&_;JHZr#{g{x%*_sHDIokbj8Eo|&)2p>n^#_72eTxTH1KVm)8QL{fEGRMe$!wJ-<8yJDA%!**d^`|4YLEU+4bALP$dRx$`p`2<`#AsAMZ9 zAuOYB_uqd1SG}UUqm!|{)d9Ec4L4`zdL zXj8I-DK%k0b^sfc6UIRa25|s5fj|fd?h6P2fjxT$=70e>fX|+T;UEwwClE}@3I4ZN zoL~@ulM?P108SRdNeN+tz!9E(fR7FUK0EfzjGYYtAK;lW2n_#=6COt>_}^?H|8|EG z3;_cmoDevdXDuKgIL1G{;p2ii!R+uE0s?^k%L5o(Loj?V4csdT0B*<$_YVjLfd3&0 zh4bft!j;s9L&Af>4g@@F&khIUWQWVh!2x&hzct~64+dlh!)bGJ!dw3d6PzXh%m#$R zvcr3`adLqFOGPjg&XSV@&L1v0oF!Z_AP62!_+L-}8wkSALCFDy0U#W3egCgkC_G9a zb~ZR~PPm@z@KgZ8Rb+z$!*%(;U4gR!10g^dd{{UK5L^sOPBt)r{a-l%g!6~NWAWc8 z98fj@j1$7fP6^>;2f*9lIl%!R?KvgbDLEjV05;fj{`{v-n-U6Ni8R?k>;Mo42nd6h z;fbcn$^M_LtLYydBKyVM9Q;r>8sR*B(DwOcleooPU%!Ksq z#EqX9BT5Jm&K;h1a5D)feJgWA0UJ{*zS7|m*c%pK`C*CvLXTL?wt&HKzHOF)2D*R9C&sG1S4!3hMcA#X1b8<2kHhx~; z;0V&jHl|Ky@DU&!&kN6g72%T;o+%vvbKlozcddBkr6=bj>maWnFYNS}uZ@+lKXBFy zk9m2a{=~(_ikIQ<;_q9=o?BLRkWnPDNzxh_y%=H!YK~fAj}>Y&d3wCs{&vk}ifugimK~3-8l-)7;+nz>7n21iO~xI9-j7tB95lZIOnRv@n=D z(fD0P;qP|L>c9;)MYYb~G~}6Gi5#@HDpz&+pTu6gw8-)a4@}*2 z{B&u52u9-P2w&6YMxa*o--q>t_ijwn5vyVSa;;|6Q-+4wLl{*uiK9AyLQQt~Yzu|;> z-!yd9P8y0<+)cYn$BXze@NPl}4?*^gu278~(S4w+9`g;k%W2F6k>{_0?{XcuZy;C& zZxE>7nJ>Su3q}zHZlYwfB`%@02fpVX4=CT%Ruij81D~zcZXhu7sj(V$sbs(Euh}sX zBv%bKgbc3FexcA=8uUTMjwSXucg<#hBHyj@NnFBU*nBlO|1tDOj|JTwnjCewKS&>g zo4&)}q4PCx6a4^-*VoFMt1P}ok60ID=`W8Q6*qE%($$nw8yK(P4Cl`Q3SrMmAk{pQ zomZB^hro=cRkO2?2i-UHzi(joCTgQ|IXad6p_`~F3OJ*im^o!d%S&b@zFGM#dLC7l zMaU4VBv`vd*Htd`?S%?YosFRBW-xg!;DBVhZ~r7!?+b?Xku}HOtM%wVuP*i02Ki(# zHZ!Xb?)K-$sdeTSE+$%LzE6J$<0wJ96LqE<^(8ASyr1IKybO2MdXn|*Eh-A)9`39{ z1qyBnncs(fTTe0g1Fz=lOM_AvU%Xl@TXn*|S@wHKo39*rG(BL=dHa5-wZP4p)lqZfVi8zXnvTZNbYPLo?FE?^wWs^4<{8b9&l zx?8*Yxmr9X9}axbIQX`xv;R%Y-)o(&uJEv+v9G?0-;I2#*C2i11xYb_xms2O|LLGx zzMF*zdut<4IKBHs7^|NKFJj4!xmg;KT*R5qi1K%Ir!}4%RBn1fnCgqA7pa}E*lfBV zUtHbH4;W^S7yrU}!nVq>RJ_CU2Dj5Rr@VDUlc@}Ie9;S4^n>DPHCs&sN`K%MbW5Cy zgy<6rt$qmVm0*jzmHvtVBv&YVR7gh5AEmqQQU3$6Ursv{*rNHy-!Y;3l_~4hsrIMC zv>{t^TvT&54EMEh;~snc7q=fhj+lR*uKjMwXN%O?Iqu>2h^l&9vfzd5shEX!F1Cwy zLoqoZ-})I1XWk3JF4Ew0Vn0H`abiS;p3Nn60V&eYym^ZgrwMFJp#&aNmZ45?2E(p z)~58Kw95!Y=2{gV#1$y6`rPLbMM?zcs?5xg7M&;$ehR9=ai!N zxL38n1mr`OQ&jua7y~jdPpX8>s#ldfh=>Zr2Z;q;E|WyvG;cG#h)IUEQiHu1xlPYY zQwlt-9$pq1_Hu?f?`oR2#qkE&?E%IiJr`dlefL4F-8y)0kn=99WSUGts0h-oO4uj9 zf0+*OR{h_08)9X}{;Htq`Zy(cL2{?p>Vc`HDAU(Q`C9UZbrK?%o?XG95-4J($|v~o z(X=bPIxyA!c^W%*-S+GegYG%#1NJvt#DO%*@ObGcz;uDDQXYyK{H$Zq4pr zTdI=uNP1eQyVWXH>HJQ|0_%Gf93hA^g)S4z2%V`CL6iuw-XQe40!BD`Tz`9!`~Bgc z2bt&HeZ>I~NA*6A!YQ7zAfY3!rU=yYbE(3c~5z($EcbUn7-gH z$Ru>%|Ax|lWfkk5$Cc>o&sf7FR8IFB=oUxDpAbA;N0^k1N+(CR{fnB$Q>ffp`hK%OH}#6U)(C?vGO z{q}3JTUiO2v~(l5ZdP@C-Zz9SfPWlGZ_t|z>V=rMtaPe&betNJnj~XYV^`wzW9sIs z^yURa<)_Q%qK62~1HPXto{JaAt-tJ2jtIBzhuQVYtk>tUixtmXS*HtbWB*jw$@#96 zR)@L50qlnQle5rj{T;5VUM9=I*zPs1Cf6cXtlO;Ni1v`ZydcI(Kj{+DK)3Y@<6(49 zGf()SX#z-Awfru#0dp!W)tban&_@%)fre4@eRYT*^h1Q_66_fp65$I*1}b{5xdVI9^`?G1 ztWcXbN^wM<`5}CoS5A<_A2ldMq`>TIIZMREA}xhrcJ-K+cUA+ojaOiutgb&ehbts9 zKlo0R3dKz{BkoLVUPcgKpph|^vxu;6LwqDo;cghx$lwHDF(EsO@D9XG3St6PT!^C% zWBNp*x;mIXFX+Atp>Kvc)WeY{SQYOZ)0J9fXRsQ3Z$PkM zmiM_H_5hHW7Ot76inGGKFyCyPYP-BUO6>f!EKD~b6{>IgbJnS$w+!$g zcGkM>4t1COreBvdd4bmd-JKppi%KRbd$9A17}R;UuqS%XNWU4PU|uCxA9bVxX4H;H2&4E<17 zx!K?9ZNG6pL>rdOuOU>7I^bCuEj8G|4HaiCH5zy!S~&DH_8}~mQ8iXX&pamMO;$wj ztgTQ&oZ}=%HZ&ac&8EpJWYe-6SXDe~9u(-Z3q)7M)Gyf5IhZ7K@}(sxh|{z4U&6yS zbIswPfAUHK%HO(g494k}`QQfCwd^Wn=^BbE23Z%AX)0>w8Xsa)JjU6!^2IGXUZ=Ac zzAkK_8&$Yq&+9e+(!Aq1-}08Nf)baR=oL|xkJ^t{CFpk+-#57CR^b@mRQG{Trc1_q zK?@<_G36?87ss16JMt*g{q??bP+2$r8ErDDmE!RW@yO`f&)N5+u2g5EHnWc{t;5$S zJN7wA^%~E{n6uSnV|FFo?RYx!`m7WW3iqJC8t=D208*pc5rosQc5OmA5d$)qhk%SW zQtEh-gITlm8u!}aS{2W>$42<$R^O9lXNX_8U(V-`Pjz)t&)~SY4I)_K4|9H%!~D4u zZ)c)b1)ajmI(orHokiu;e46=*`SS(5Kl8_O$CD?b9jU;|3%_HhhmI+N9P^Y)fu-rp z_01*BosZ`7j`K9|=s)}4Un|H3nbM=k6FHxVeYi?Z?&cHJ;ycAAH-$Du3ojvNA=zKh z34LgQ`%SVHA_kEWAw7TwMrJLAQ5R<;h=+?~&!i@wO6Oai7kCWUeq zVmf6CV+no0kFCUBppfS5irb2tWW;4_En+PSs3ur@@6xE$EmYZQ%96j2!b)`}7lcaGeoZ0puu z(Q*Fq43eX?Sa8B@z|LQFe{ufl_DP!IP-9~zMP=s}y!24mBA)H|W_FFUUyHczLKIf~@@l zwEcoS&LQ;EXehZjq(Ug9eMVOR=TQ7<)a)O+Y43Ob6x&osuvF8CFMVI!u_1a1G2w*u zDd7UQ89~K*DKX)Vwg|4^cwm3UK^Pg}Mui^ggUSRs5C4#q;P*5t4Z&82{izRm7NS!P z`C!oa#EknR5V%)-K%f2(wLAo40L;)fW;+DMHh5+*%N199&tovkaDa8%=wqNpHEOXi zK0nr|J~lsIN-uinm$DthPH@NE%&Gm7Yh_6~J*a0)z0_V`06c>L`NHEfX)psZOYWD0 zD=>ZL@les~_$MU252g=?PQ*{r%|t&?x$7eP?7OYdTcc;9H-*m3oPm<=TW^LBDqlic zkO%Y*K#K{&M`SEqNagG2W;m_Z^&)P7y`|GFUP_z&G1X=6Qu=6yu}B1oXni(-*ACXbHAVY3SLKq5*7Doam*g$$Jjv zvIr&##TtkPkC2&PA$)=m5@nU_vAuU8zfVqbE%&;)_znSlg1PtMd=C@~pzm^Vzmd@3AC#eT2k8jQVdXE#~O*q0e3OmEFvJYo+?w@2Urca=q`5r6By9`-j zb_2~uipPF_Kev&kEU|I2#nw>aN?MIZsMqbCm^kAiS)rp;rE`XSizglzC$S_2_YeW3_` z9$Aqi+B@}Z0#>a!V>S((Sf+R$Zz;pGeo@KXDE`_Sw$ zn)RN(ePj|sE%$~JQ_v$5Na;Uv(!LjBmvNO^syr%9srYSw+xdgXpDfoP$ImIw$zWgU zR_PY*uzcp&^WFaZKy&@1ZqcPmt9cc)3Fkuc;^#Vn`!{#o$0x}-9p$3s-!6+Wi}(+B z_ud<~Novh%EsLkR{2nFlRaYO~L(i8}n>k(letsVxZv;>M@BGi!cOFlVhnG{IMTn*j z#P4{ho5(D@_=!vu<&?a+3a<0!4cW0c+H4S|C7UR(u7;bo_v!<8(rotEf-c(jRjlk^ zaDQl3v1)96$w?A*Dq(iBT)@h-8>u`%wLL)19Nh9Pb4ryHDLZVC6Onf3l_d4-EU2My zBa(cU zn-|4QVIIdlT2N=RB@%<+AbCr?%l96?$Lwv3S7{hYI$3(}9Q!5M=?#paN*D{=prUlI8`G^04%7ij0t?Y~Kdwkh*uK3BuHDJ`_lMYYA8Vk39hB)!pIs_& z$F%lx+m@q%x5YWTDbGMnqbpOl=LH-AqboBrAzB3f0bi``dKP1uW9&O#QZyx54;+TVRn#AD?z!C`l=qE7j*< z(bmN3X(*nYvw1eEbdler1a^8Gs|+m|8@R~m)bR~d2>hKE%RL2c3%-FD0SO|Yi65=PUS)n`#tTv|2byFW_QT^EKmaZry$jQzY)ShdwDhpgDLp>=pW zRMzcDf7Nd|Cyjq@*q;vaeq5MwT)^zNJ)EsgocsN9McgK*R!ia-*(J>gBlW*isie-4 zhz7?dpoaIO{3Kc3X;9?5qbDNn7IUdTh_t-rV9e;d1%3XCh((+?*#Kc!5M> zveSXQiJpANc>cJJvxFwKqt&P{V2G>spO=x&;KGf#n6n$?egUVbG)%St`vUfWoBF<-h-SrEmFwDtXsLy*;`k1& zFcpiv?v$T_%M)2`;Kqr&J8SDGKfD4X>|VJDIJ*Gf;C{2Jm}+A&~(S{ z$^E*cs>@@))nk}CIB79rd6g@l_lP=wC-Goq&@W69xApcf~_dtH~}OFt*gS%%4#A{c;{GqpLhS`$YJ!7psJZW zwV$7oB65VNr`f|n?%@=%bIGrIqy3Zro5N1jOMI>s&WFE6I5P8c+7vTr7Q-f; z5QRmlwnv={GuEve`rgEHsdk&KHVa49iI&p+d+F^c%RLFUKVLHg+JjG}lk!RwRQZ7W$7zDnn6-Oo!7uTAOOvPN4YCX%r`oKLXPUc_F5 zfVECxaIz-e2BtbV?Km5ZGB_TGElHDZuU5wL0URE@+)E^0#`!wwz&QB`tWn&+xCL>r zm+HMB`=cM6a{0-ko%K_v!O2yJ-*i2<>p~+0mk*`$8Dq?o-uLaCd0K1+uGLzyP>WUA zXf^NqyhUa^cub0wGDwitwP+$=eXds*Lmz#h^_hFLqdJ&`YRN%){6M2&cw`Zu=!P$y zi$a~{%l%2+VW{`7I;qen9tC|1cHyC~5p;(YZ-0ZI*cii~PAe-nxY~`_F*(Rg5BFrA zi?E)wm;}YNa+oo|$9RJLzS|>}&j5M3Mwz#-r8pA)YPLf)?N5NF2{=TP=tXr7pvaRW z2~#j|n3Z*y&D)7O?6}pf`t@)}=|$paemo6+xILw6?RcZ~K+T||hM;q`DVF_Y-M&`$ zzN_Ylog6K$t;0|8y~{sbhHKh+#pEnE@mGz{5ZVQHZ#>3NbhB9g&oQsI?t11I$=!k3 z-#MEUr^CgkY4N|3JuZiWqQfMbWgp@Rccc+~KI0QA;>Nuh9fVT3_VFT$km{FL&FiS| zF5dG*<7`q;XlsgEzwhq5`_)?^auXbH z%U9*@{;B`*6A-{HSk{D?slJ=;;|1Bl*?J-$*SGnu#AI`k!r!T|kZ`;zzhLtnJpuXW zW0z)0I|cRz4~vhUd)uwk=35fC5zo`?=)h|6)foB$ZDFT9-%AZ?1 z{zS@Di>0wVWF%a5lc1zPw?lmRI!_;JD~zuJC5harFluX|@pkl={Z%{HkD4G_khzV^ zuuwab%-a2(N4>85gRlIK*BgCVg>yJ&Q;BIhgA9`4j=~lRKa&yVX9<>>mUBdx+w{M$ z=sjHD7ognE=u6$}8OsG9tq9S;EL9{+e4WzYnShqb&Xqlbh^H71At_vsIUhY&9*ymP z#lQaU`y$19rgSpJ;3@sA-vr2&ly61K`wcBk<3yWR&pTj_vo5A+HU`ipHCs%hwyWiRjcV5b+`RI-4xP)B2v6?F>tl_J z7D6!`eS0$kYQ$lgaV(!B+5+t@|6sG(XKidyrFF}sal^8I!lhr9GAdQ4x7ViG;p$j* zZ5W^D_L#n6+X&;2kdC{jw0S$&9k+r^FiG)rp0dP1-cWv8ekC>5m?d_2)uZCYrJv~Y zBeqa0$_4v1Tsc&0>*c8YTouE*A`hi@`hY{|pvfgU)1iEvJM;Cao8=>=9_1%z^PbzL#K-+JW!cBhOJ)?6 zfCz_KYkVI~EygI>?Hn5TNKM^**@)TXRJQ1}$bjRA0YCBRQBl+W91;zIZ-JDz>(__B zbefz`vHP#5{0&TYnMb}Oe1 z>Ua>Wy9w*X90R)*;Hn0|!6C=KO

a`r=^a@U{lxr)_+oKRvXl0siS z>_bbV5R=f12jf{v5UFol;s@14`#3H;A5A9xqj6&F4|t=DBo-~C;ilqz-ocJMJFx@R zKh>av8`Klo4uXVs;}n`1treMG`F2FGYN%=L!pO`|TX3W_$)4}Dh|ep@J#K$~64o_l zwkVXGZIffVMTCU7S@B&MYab5kF#oaU>pr7FV~PvK3=0~mRUVRKKjZw?)B}Jrg@Sd> zhjMa*X;gu9Wqr<_1oSF3+#(`S z@;WV`RK=?K@s`|-_V{3!)b2Sp-t3-FL|7OMbZ{WF%h#IG<#4;7^!O}Bd}!2MEVbVB zW>}ClJVTzs(yQ8}EGlob=E*J8w$oR_cUdWe4vN0of44(pX#H%6&WuQ`py#T3K~EJk-Lhafy=3 zHRtQs&N#v?VD-kScM0w9f*!U7L_}`}CTO0IH8f1MCRpFQ^-w};c<-o}8K^Ue=c`OE z*APptVa>dmmCxQ)KNdK`PhREK=(9T7-g?T0Dz807b$r=hc1cn( zD2!vIxZCYt!y{&czZ;FT*A2N+SKFkWvJ_$QJ2=4(B`a?<5&C*SPai@G7N41HSlu(f z%DZ?=C)L&3(YfL7)3i#_Ue&}n?%f}zw{d{-Dv6Ttt&7ZxWpKpQ{~7=KQC0_EWT>cd zt#;T+yV;gk*f_V;X7%WhEw-PSx+tZ;rdr}%%z91W$IYvE-F1U^;thIo0dqo+2{DG< z_Ri4wi8)PezRInnE9-`AVi%pkso`Z7oZ_z}my15aD>&{Ie&DRoOS_R8nckuIofti5 z;`Jyt--_*~>krw9kCPidC$po+%%0A!@@OLRD-8g3j!F~RSCiQXq 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%0AUxwl&NIa^Ir|RyDHCz6HKN!F~ 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 z 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