Skip to main content

Reference

Interfaces, signatures, parameters, and generated references.

Lookup friendly
TOC available

Hooks

V4 decides whether to invoke specific hooks by inspecting the least significant bits of the address that the hooks contract is deployed to. For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400 has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.

State Variables​

ALL_HOOK_MASK​

uint160 internal constant ALL_HOOK_MASK = uint160((1 << 14) - 1);

BEFORE_INITIALIZE_FLAG​

uint160 internal constant BEFORE_INITIALIZE_FLAG = 1 << 13;

AFTER_INITIALIZE_FLAG​

uint160 internal constant AFTER_INITIALIZE_FLAG = 1 << 12;

BEFORE_ADD_LIQUIDITY_FLAG​

uint160 internal constant BEFORE_ADD_LIQUIDITY_FLAG = 1 << 11;

AFTER_ADD_LIQUIDITY_FLAG​

uint160 internal constant AFTER_ADD_LIQUIDITY_FLAG = 1 << 10;

BEFORE_REMOVE_LIQUIDITY_FLAG​

uint160 internal constant BEFORE_REMOVE_LIQUIDITY_FLAG = 1 << 9;

AFTER_REMOVE_LIQUIDITY_FLAG​

uint160 internal constant AFTER_REMOVE_LIQUIDITY_FLAG = 1 << 8;

BEFORE_SWAP_FLAG​

uint160 internal constant BEFORE_SWAP_FLAG = 1 << 7;

AFTER_SWAP_FLAG​

uint160 internal constant AFTER_SWAP_FLAG = 1 << 6;

BEFORE_DONATE_FLAG​

uint160 internal constant BEFORE_DONATE_FLAG = 1 << 5;

AFTER_DONATE_FLAG​

uint160 internal constant AFTER_DONATE_FLAG = 1 << 4;

BEFORE_SWAP_RETURNS_DELTA_FLAG​

uint160 internal constant BEFORE_SWAP_RETURNS_DELTA_FLAG = 1 << 3;

AFTER_SWAP_RETURNS_DELTA_FLAG​

uint160 internal constant AFTER_SWAP_RETURNS_DELTA_FLAG = 1 << 2;

AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG​

uint160 internal constant AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 1;

AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG​

uint160 internal constant AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 0;

Functions​

validateHookPermissions​

Utility function intended to be used in hook constructors to ensure the deployed hooks address causes the intended hooks to be called

permissions param is memory as the function will be called from constructors

function validateHookPermissions(IHooks self, Permissions memory permissions) internal pure;

Parameters

NameTypeDescription
selfIHooks
permissionsPermissionsThe hooks that are intended to be called

isValidHookAddress​

Ensures that the hook address includes at least one hook flag or dynamic fees, or is the 0 address

function isValidHookAddress(IHooks self, uint24 fee) internal pure returns (bool);

Parameters

NameTypeDescription
selfIHooksThe hook to verify
feeuint24The fee of the pool the hook is used with

Returns

NameTypeDescription
<none>boolbool True if the hook address is valid

callHook​

performs a hook call using the given calldata on the given hook that doesn't return a delta

function callHook(IHooks self, bytes memory data) internal returns (bytes memory result);

Returns

NameTypeDescription
resultbytesThe complete data returned by the hook

callHookWithReturnDelta​

performs a hook call using the given calldata on the given hook

function callHookWithReturnDelta(IHooks self, bytes memory data, bool parseReturn) internal returns (int256);

Returns

NameTypeDescription
<none>int256int256 The delta returned by the hook

noSelfCall​

modifier to prevent calling a hook if they initiated the action

modifier noSelfCall(IHooks self);

beforeInitialize​

calls beforeInitialize hook if permissioned and validates return value

function beforeInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96) internal noSelfCall(self);

afterInitialize​

calls afterInitialize hook if permissioned and validates return value

function afterInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96, int24 tick) internal noSelfCall(self);

beforeModifyLiquidity​

calls beforeModifyLiquidity hook if permissioned and validates return value

function beforeModifyLiquidity(
IHooks self,
PoolKey memory key,
IPoolManager.ModifyLiquidityParams memory params,
bytes calldata hookData
) internal noSelfCall(self);

afterModifyLiquidity​

calls afterModifyLiquidity hook if permissioned and validates return value

function afterModifyLiquidity(
IHooks self,
PoolKey memory key,
IPoolManager.ModifyLiquidityParams memory params,
BalanceDelta delta,
BalanceDelta feesAccrued,
bytes calldata hookData
) internal returns (BalanceDelta callerDelta, BalanceDelta hookDelta);

beforeSwap​

calls beforeSwap hook if permissioned and validates return value

function beforeSwap(IHooks self, PoolKey memory key, IPoolManager.SwapParams memory params, bytes calldata hookData)
internal
returns (int256 amountToSwap, BeforeSwapDelta hookReturn, uint24 lpFeeOverride);

afterSwap​

calls afterSwap hook if permissioned and validates return value

function afterSwap(
IHooks self,
PoolKey memory key,
IPoolManager.SwapParams memory params,
BalanceDelta swapDelta,
bytes calldata hookData,
BeforeSwapDelta beforeSwapHookReturn
) internal returns (BalanceDelta, BalanceDelta);

beforeDonate​

calls beforeDonate hook if permissioned and validates return value

function beforeDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)
internal
noSelfCall(self);

afterDonate​

calls afterDonate hook if permissioned and validates return value

function afterDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)
internal
noSelfCall(self);

hasPermission​

function hasPermission(IHooks self, uint160 flag) internal pure returns (bool);

Errors​

HookAddressNotValid​

Thrown if the address will not lead to the specified hook calls being called

error HookAddressNotValid(address hooks);

Parameters

NameTypeDescription
hooksaddressThe address of the hooks contract

InvalidHookResponse​

Hook did not return its selector

error InvalidHookResponse();

HookCallFailed​

Additional context for ERC-7751 wrapped error when a hook call fails

error HookCallFailed();

HookDeltaExceedsSwapAmount​

The hook's delta changed the swap from exactIn to exactOut or vice versa

error HookDeltaExceedsSwapAmount();

Structs​

Permissions​

struct Permissions {
bool beforeInitialize;
bool afterInitialize;
bool beforeAddLiquidity;
bool afterAddLiquidity;
bool beforeRemoveLiquidity;
bool afterRemoveLiquidity;
bool beforeSwap;
bool afterSwap;
bool beforeDonate;
bool afterDonate;
bool beforeSwapReturnDelta;
bool afterSwapReturnDelta;
bool afterAddLiquidityReturnDelta;
bool afterRemoveLiquidityReturnDelta;
}