uint24 feeOverride = 0;
if (applyPenalty) {
feeOverride = uint24((phasePenaltyBps * 100));
}
return (
BaseHook.beforeSwap.selector,
BeforeSwapDeltaLibrary.ZERO_DELTA,
@> feeOverride | LPFeeLibrary.OVERRIDE_FEE_FLAG
);
import {BeforeSwapDelta} from "v4-core/types/BeforeSwapDelta.sol";
function test_VerifyNormalSwapFeeBug() public {
SwapParams memory params = SwapParams({
zeroForOne: true,
amountSpecified: -0.001 ether,
sqrtPriceLimitX96: 0
});
(,, uint24 fee) = hook.exposed_beforeSwap(address(this), key, params, "");
assertTrue(LPFeeLibrary.isOverride(fee), "Bug: Normal swap should NOT override fee");
assertEq(fee, LPFeeLibrary.OVERRIDE_FEE_FLAG, "Bug: Normal swap fee is overridden to 0");
}
contract TokenLaunchHookHarness is TokenLaunchHook {
constructor(
IPoolManager _poolManager,
uint256 _phase1Duration,
uint256 _phase2Duration,
uint256 _phase1LimitBps,
uint256 _phase2LimitBps,
uint256 _phase1Cooldown,
uint256 _phase2Cooldown,
uint256 _phase1PenaltyBps,
uint256 _phase2PenaltyBps
) TokenLaunchHook(
_poolManager,
_phase1Duration,
_phase2Duration,
_phase1LimitBps,
_phase2LimitBps,
_phase1Cooldown,
_phase2Cooldown,
_phase1PenaltyBps,
_phase2PenaltyBps
) {}
function exposed_beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData)
external
returns (bytes4 selector, BeforeSwapDelta delta, uint24 fee)
{
return _beforeSwap(sender, key, params, hookData);
}
function setLaunchStartBlock(uint256 blockNumber) external {
launchStartBlock = blockNumber;
}
function setInitialLiquidity(uint256 liquidity) external {
initialLiquidity = liquidity;
}
}
Only set the override flag when a penalty is actually applied.
uint24 feeOverride = 0;
+ uint24 feeFlag = 0;
if (applyPenalty) {
feeOverride = uint24((phasePenaltyBps * 100));
+ feeFlag = LPFeeLibrary.OVERRIDE_FEE_FLAG;
}
return (
BaseHook.beforeSwap.selector,
BeforeSwapDeltaLibrary.ZERO_DELTA,
- feeOverride | LPFeeLibrary.OVERRIDE_FEE_FLAG
+ feeOverride | feeFlag
);