@@ -27,6 +27,7 @@ import {BalanceDelta} from "../src/types/BalanceDelta.sol";
2727import {BinTestHelper} from "./pool-bin/helpers/BinTestHelper.sol " ;
2828import {BinSwapHelper} from "./pool-bin/helpers/BinSwapHelper.sol " ;
2929import {BinLiquidityHelper} from "./pool-bin/helpers/BinLiquidityHelper.sol " ;
30+ import {HooksContract} from "./libraries/Hooks/HooksContract.sol " ;
3031
3132contract ProtocolFeeControllerTest is Test , BinTestHelper , TokenFixture {
3233 using CLPoolParametersHelper for bytes32 ;
@@ -36,13 +37,18 @@ contract ProtocolFeeControllerTest is Test, BinTestHelper, TokenFixture {
3637 /// @notice 100% in hundredths of a bip
3738 uint256 private constant ONE_HUNDRED_PERCENT_RATIO = 1e6 ;
3839
40+ /// @dev the initial setting of the default protocol fee for dynamic fee pool is 0.03% i.e. 3bps
41+ uint24 private constant DEFAULT_PROTOCOL_FEE_FOR_DYNAMIC_FEE_POOL = 300 ;
42+
3943 Vault vault;
4044 CLPoolManager clPoolManager;
4145 BinPoolManager binPoolManager;
4246
4347 BinSwapHelper public binSwapHelper;
4448 BinLiquidityHelper public binLiquidityHelper;
4549
50+ HooksContract public hooksContract;
51+
4652 function setUp () public {
4753 initializeTokens ();
4854
@@ -58,6 +64,8 @@ contract ProtocolFeeControllerTest is Test, BinTestHelper, TokenFixture {
5864 IERC20 (Currency.unwrap (currency1)).approve (address (binSwapHelper), 1000 ether);
5965 IERC20 (Currency.unwrap (currency0)).approve (address (binLiquidityHelper), 1000 ether);
6066 IERC20 (Currency.unwrap (currency1)).approve (address (binLiquidityHelper), 1000 ether);
67+
68+ hooksContract = new HooksContract (0 );
6169 }
6270
6371 function testOwnerTransfer () public {
@@ -90,6 +98,32 @@ contract ProtocolFeeControllerTest is Test, BinTestHelper, TokenFixture {
9098 assertEq (controller.owner (), makeAddr ("newOwner " ));
9199 }
92100
101+ function testSetDefaultProtocolFeeForDynamicFeePool (uint24 newDefaultProtocolFeeForDynamicFeePool ) public {
102+ ProtocolFeeController controller = new ProtocolFeeController (address (clPoolManager));
103+
104+ // it should start with 0.03% as default
105+ assertEq (controller.defaultProtocolFeeForDynamicFeePool (), DEFAULT_PROTOCOL_FEE_FOR_DYNAMIC_FEE_POOL);
106+
107+ {
108+ // must from owner
109+ vm.prank (makeAddr ("someone " ));
110+ vm.expectRevert (abi.encodeWithSelector (Ownable.OwnableUnauthorizedAccount.selector , makeAddr ("someone " )));
111+ controller.setDefaultProtocolFeeForDynamicFeePool (newDefaultProtocolFeeForDynamicFeePool);
112+ }
113+
114+ if (newDefaultProtocolFeeForDynamicFeePool > ProtocolFeeLibrary.MAX_PROTOCOL_FEE) {
115+ vm.expectRevert (ProtocolFeeController.InvalidDefaultProtocolFeeForDynamicFeePool.selector );
116+ controller.setDefaultProtocolFeeForDynamicFeePool (newDefaultProtocolFeeForDynamicFeePool);
117+ } else {
118+ vm.expectEmit (true , true , true , true );
119+ emit ProtocolFeeController.DefaultProtocolFeeForDynamicFeePoolUpdated (
120+ DEFAULT_PROTOCOL_FEE_FOR_DYNAMIC_FEE_POOL, newDefaultProtocolFeeForDynamicFeePool
121+ );
122+ controller.setDefaultProtocolFeeForDynamicFeePool (newDefaultProtocolFeeForDynamicFeePool);
123+ assertEq (controller.defaultProtocolFeeForDynamicFeePool (), newDefaultProtocolFeeForDynamicFeePool);
124+ }
125+ }
126+
93127 function testSetProcotolFeeSplitRatio (uint256 newProtocolFeeSplitRatio ) public {
94128 ProtocolFeeController controller = new ProtocolFeeController (address (clPoolManager));
95129
@@ -363,6 +397,104 @@ contract ProtocolFeeControllerTest is Test, BinTestHelper, TokenFixture {
363397 }
364398 }
365399
400+ function testCLDynamicPoolInitWithProtolFeeControllerFuzz (uint24 newDefaultProtocolFeeForDynamicFeePool ) public {
401+ ProtocolFeeController controller = new ProtocolFeeController (address (clPoolManager));
402+ newDefaultProtocolFeeForDynamicFeePool =
403+ uint24 (bound (newDefaultProtocolFeeForDynamicFeePool, 0 , ProtocolFeeLibrary.MAX_PROTOCOL_FEE));
404+
405+ clPoolManager.setProtocolFeeController (controller);
406+
407+ PoolKey memory key = PoolKey ({
408+ currency0: currency0,
409+ currency1: currency1,
410+ hooks: hooksContract,
411+ poolManager: clPoolManager,
412+ fee: LPFeeLibrary.DYNAMIC_FEE_FLAG,
413+ parameters: bytes32 (0 ).setTickSpacing (10 )
414+ });
415+ clPoolManager.initialize (key, Constants.SQRT_RATIO_1_1);
416+
417+ (,, uint24 actualProtocolFee ,) = clPoolManager.getSlot0 (key.toId ());
418+
419+ // under default rule protocol fee must be equal for both directions
420+ uint16 protocolFeeZeroForOne = actualProtocolFee.getZeroForOneFee ();
421+ uint16 protocolFeeOneForZero = actualProtocolFee.getOneForZeroFee ();
422+ assertEq (protocolFeeOneForZero, protocolFeeZeroForOne);
423+ assertEq (protocolFeeOneForZero, DEFAULT_PROTOCOL_FEE_FOR_DYNAMIC_FEE_POOL);
424+
425+ controller.setDefaultProtocolFeeForDynamicFeePool (newDefaultProtocolFeeForDynamicFeePool);
426+
427+ key.parameters = bytes32 (0 ).setTickSpacing (30 );
428+ clPoolManager.initialize (key, Constants.SQRT_RATIO_1_1);
429+
430+ (,, actualProtocolFee,) = clPoolManager.getSlot0 (key.toId ());
431+ // under default rule protocol fee must be equal for both directions
432+ protocolFeeZeroForOne = actualProtocolFee.getZeroForOneFee ();
433+ protocolFeeOneForZero = actualProtocolFee.getOneForZeroFee ();
434+ assertEq (protocolFeeOneForZero, protocolFeeZeroForOne);
435+ assertEq (protocolFeeOneForZero, newDefaultProtocolFeeForDynamicFeePool);
436+
437+ // verify the original pool is not affected
438+ {
439+ key.parameters = bytes32 (0 ).setTickSpacing (10 );
440+
441+ (,, actualProtocolFee,) = clPoolManager.getSlot0 (key.toId ());
442+ // under default rule protocol fee must be equal for both directions
443+ protocolFeeZeroForOne = actualProtocolFee.getZeroForOneFee ();
444+ protocolFeeOneForZero = actualProtocolFee.getOneForZeroFee ();
445+ assertEq (protocolFeeOneForZero, protocolFeeZeroForOne);
446+ }
447+ }
448+
449+ function testBinDynamicPoolInitWithProtolFeeControllerFuzz (uint24 newDefaultProtocolFeeForDynamicFeePool ) public {
450+ ProtocolFeeController controller = new ProtocolFeeController (address (binPoolManager));
451+ newDefaultProtocolFeeForDynamicFeePool =
452+ uint24 (bound (newDefaultProtocolFeeForDynamicFeePool, 0 , ProtocolFeeLibrary.MAX_PROTOCOL_FEE));
453+
454+ binPoolManager.setProtocolFeeController (controller);
455+
456+ PoolKey memory key = PoolKey ({
457+ currency0: currency0,
458+ currency1: currency1,
459+ hooks: hooksContract,
460+ poolManager: binPoolManager,
461+ fee: LPFeeLibrary.DYNAMIC_FEE_FLAG,
462+ parameters: bytes32 (0 ).setBinStep (1 )
463+ });
464+ binPoolManager.initialize (key, ID_ONE);
465+
466+ (, uint24 actualProtocolFee ,) = binPoolManager.getSlot0 (key.toId ());
467+
468+ // under default rule protocol fee must be equal for both directions
469+ uint16 protocolFeeZeroForOne = actualProtocolFee.getZeroForOneFee ();
470+ uint16 protocolFeeOneForZero = actualProtocolFee.getOneForZeroFee ();
471+ assertEq (protocolFeeOneForZero, protocolFeeZeroForOne);
472+ assertEq (protocolFeeOneForZero, DEFAULT_PROTOCOL_FEE_FOR_DYNAMIC_FEE_POOL);
473+
474+ controller.setDefaultProtocolFeeForDynamicFeePool (newDefaultProtocolFeeForDynamicFeePool);
475+
476+ key.parameters = bytes32 (0 ).setBinStep (5 );
477+ binPoolManager.initialize (key, ID_ONE);
478+
479+ (, actualProtocolFee,) = binPoolManager.getSlot0 (key.toId ());
480+ // under default rule protocol fee must be equal for both directions
481+ protocolFeeZeroForOne = actualProtocolFee.getZeroForOneFee ();
482+ protocolFeeOneForZero = actualProtocolFee.getOneForZeroFee ();
483+ assertEq (protocolFeeOneForZero, protocolFeeZeroForOne);
484+ assertEq (protocolFeeOneForZero, newDefaultProtocolFeeForDynamicFeePool);
485+
486+ // verify the original pool is not affected
487+ {
488+ key.parameters = bytes32 (0 ).setBinStep (1 );
489+
490+ (, actualProtocolFee,) = binPoolManager.getSlot0 (key.toId ());
491+ // under default rule protocol fee must be equal for both directions
492+ protocolFeeZeroForOne = actualProtocolFee.getZeroForOneFee ();
493+ protocolFeeOneForZero = actualProtocolFee.getOneForZeroFee ();
494+ assertEq (protocolFeeOneForZero, protocolFeeZeroForOne);
495+ }
496+ }
497+
366498 function testSetProtocolFeeForCLPool (uint24 newProtocolFee ) public {
367499 ProtocolFeeController controller = new ProtocolFeeController (address (clPoolManager));
368500 clPoolManager.setProtocolFeeController (controller);
0 commit comments