diff --git a/src/interfaces/ISubscriber.sol b/src/interfaces/ISubscriber.sol index f2fc94df..238c88f3 100644 --- a/src/interfaces/ISubscriber.sol +++ b/src/interfaces/ISubscriber.sol @@ -6,14 +6,17 @@ import {PositionInfo} from "../libraries/PositionInfoLibrary.sol"; /// @notice Interface that a Subscriber contract should implement to receive updates from the v4 position manager interface ISubscriber { + /// @notice Called when a position subscribes to this subscriber contract /// @param tokenId the token ID of the position /// @param data additional data passed in by the caller function notifySubscribe(uint256 tokenId, bytes memory data) external; + /// @notice Called when a position unsubscribes from the subscriber /// @dev This call's gas is capped at `unsubscribeGasLimit` (set at deployment) /// @dev Because of EIP-150, solidity may only allocate 63/64 of gasleft() /// @param tokenId the token ID of the position function notifyUnsubscribe(uint256 tokenId) external; + /// @notice Called when a position is burned /// @param tokenId the token ID of the position /// @param owner the current owner of the tokenId @@ -22,8 +25,13 @@ interface ISubscriber { /// @param feesAccrued the fees accrued by the position if liquidity was decreased function notifyBurn(uint256 tokenId, address owner, PositionInfo info, uint256 liquidity, BalanceDelta feesAccrued) external; + + /// @notice Called when a position modifies its liquidity or collects fees /// @param tokenId the token ID of the position /// @param liquidityChange the change in liquidity on the underlying position /// @param feesAccrued the fees to be collected from the position as a result of the modifyLiquidity call + /// @dev Note that feesAccrued can be artificially inflated by a malicious user + /// Pools with a single liquidity position can inflate feeGrowthGlobal (and consequently feesAccrued) by donating to themselves; + /// atomically donating and collecting fees within the same unlockCallback may further inflate feeGrowthGlobal/feesAccrued function notifyModifyLiquidity(uint256 tokenId, int256 liquidityChange, BalanceDelta feesAccrued) external; } diff --git a/test/shared/FeeMath.sol b/test/shared/FeeMath.sol index 72ad5659..bb593eeb 100644 --- a/test/shared/FeeMath.sol +++ b/test/shared/FeeMath.sol @@ -35,11 +35,11 @@ library FeeMath { (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128) = manager.getPositionInfo(poolId, address(posm), config.tickLower, config.tickUpper, bytes32(tokenId)); - (uint256 feeGrowthInside0X218, uint256 feeGrowthInside1X128) = + (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = manager.getFeeGrowthInside(poolId, config.tickLower, config.tickUpper); feesOwed = getFeesOwed( - feeGrowthInside0X218, feeGrowthInside1X128, feeGrowthInside0LastX128, feeGrowthInside1LastX128, liquidity + feeGrowthInside0X128, feeGrowthInside1X128, feeGrowthInside0LastX128, feeGrowthInside1LastX128, liquidity ); }