[
  {
    "type": "constructor",
    "inputs": [
      { "name": "_manager", "type": "address", "internalType": "contract IPoolManager" },
      { "name": "_weth", "type": "address", "internalType": "contract WETH" },
      { "name": "_fwWETH", "type": "address", "internalType": "contract IFewWrappedToken" }
    ],
    "stateMutability": "nonpayable"
  },
  { "type": "receive", "stateMutability": "payable" },
  {
    "type": "function",
    "name": "afterAddLiquidity",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct ModifyLiquidityParams",
        "components": [
          { "name": "tickLower", "type": "int24", "internalType": "int24" },
          { "name": "tickUpper", "type": "int24", "internalType": "int24" },
          { "name": "liquidityDelta", "type": "int256", "internalType": "int256" },
          { "name": "salt", "type": "bytes32", "internalType": "bytes32" }
        ]
      },
      { "name": "delta", "type": "int256", "internalType": "BalanceDelta" },
      { "name": "feesAccrued", "type": "int256", "internalType": "BalanceDelta" },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [
      { "name": "", "type": "bytes4", "internalType": "bytes4" },
      { "name": "", "type": "int256", "internalType": "BalanceDelta" }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "afterDonate",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      { "name": "amount0", "type": "uint256", "internalType": "uint256" },
      { "name": "amount1", "type": "uint256", "internalType": "uint256" },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [{ "name": "", "type": "bytes4", "internalType": "bytes4" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "afterInitialize",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      { "name": "sqrtPriceX96", "type": "uint160", "internalType": "uint160" },
      { "name": "tick", "type": "int24", "internalType": "int24" }
    ],
    "outputs": [{ "name": "", "type": "bytes4", "internalType": "bytes4" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "afterRemoveLiquidity",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct ModifyLiquidityParams",
        "components": [
          { "name": "tickLower", "type": "int24", "internalType": "int24" },
          { "name": "tickUpper", "type": "int24", "internalType": "int24" },
          { "name": "liquidityDelta", "type": "int256", "internalType": "int256" },
          { "name": "salt", "type": "bytes32", "internalType": "bytes32" }
        ]
      },
      { "name": "delta", "type": "int256", "internalType": "BalanceDelta" },
      { "name": "feesAccrued", "type": "int256", "internalType": "BalanceDelta" },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [
      { "name": "", "type": "bytes4", "internalType": "bytes4" },
      { "name": "", "type": "int256", "internalType": "BalanceDelta" }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "afterSwap",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct SwapParams",
        "components": [
          { "name": "zeroForOne", "type": "bool", "internalType": "bool" },
          { "name": "amountSpecified", "type": "int256", "internalType": "int256" },
          { "name": "sqrtPriceLimitX96", "type": "uint160", "internalType": "uint160" }
        ]
      },
      { "name": "delta", "type": "int256", "internalType": "BalanceDelta" },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [
      { "name": "", "type": "bytes4", "internalType": "bytes4" },
      { "name": "", "type": "int128", "internalType": "int128" }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "beforeAddLiquidity",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct ModifyLiquidityParams",
        "components": [
          { "name": "tickLower", "type": "int24", "internalType": "int24" },
          { "name": "tickUpper", "type": "int24", "internalType": "int24" },
          { "name": "liquidityDelta", "type": "int256", "internalType": "int256" },
          { "name": "salt", "type": "bytes32", "internalType": "bytes32" }
        ]
      },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [{ "name": "", "type": "bytes4", "internalType": "bytes4" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "beforeDonate",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      { "name": "amount0", "type": "uint256", "internalType": "uint256" },
      { "name": "amount1", "type": "uint256", "internalType": "uint256" },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [{ "name": "", "type": "bytes4", "internalType": "bytes4" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "beforeInitialize",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      { "name": "sqrtPriceX96", "type": "uint160", "internalType": "uint160" }
    ],
    "outputs": [{ "name": "", "type": "bytes4", "internalType": "bytes4" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "beforeRemoveLiquidity",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct ModifyLiquidityParams",
        "components": [
          { "name": "tickLower", "type": "int24", "internalType": "int24" },
          { "name": "tickUpper", "type": "int24", "internalType": "int24" },
          { "name": "liquidityDelta", "type": "int256", "internalType": "int256" },
          { "name": "salt", "type": "bytes32", "internalType": "bytes32" }
        ]
      },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [{ "name": "", "type": "bytes4", "internalType": "bytes4" }],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "beforeSwap",
    "inputs": [
      { "name": "sender", "type": "address", "internalType": "address" },
      {
        "name": "key",
        "type": "tuple",
        "internalType": "struct PoolKey",
        "components": [
          { "name": "currency0", "type": "address", "internalType": "Currency" },
          { "name": "currency1", "type": "address", "internalType": "Currency" },
          { "name": "fee", "type": "uint24", "internalType": "uint24" },
          { "name": "tickSpacing", "type": "int24", "internalType": "int24" },
          { "name": "hooks", "type": "address", "internalType": "contract IHooks" }
        ]
      },
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct SwapParams",
        "components": [
          { "name": "zeroForOne", "type": "bool", "internalType": "bool" },
          { "name": "amountSpecified", "type": "int256", "internalType": "int256" },
          { "name": "sqrtPriceLimitX96", "type": "uint160", "internalType": "uint160" }
        ]
      },
      { "name": "hookData", "type": "bytes", "internalType": "bytes" }
    ],
    "outputs": [
      { "name": "", "type": "bytes4", "internalType": "bytes4" },
      { "name": "", "type": "int256", "internalType": "BeforeSwapDelta" },
      { "name": "", "type": "uint24", "internalType": "uint24" }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "getHookPermissions",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "tuple",
        "internalType": "struct Hooks.Permissions",
        "components": [
          { "name": "beforeInitialize", "type": "bool", "internalType": "bool" },
          { "name": "afterInitialize", "type": "bool", "internalType": "bool" },
          { "name": "beforeAddLiquidity", "type": "bool", "internalType": "bool" },
          { "name": "afterAddLiquidity", "type": "bool", "internalType": "bool" },
          { "name": "beforeRemoveLiquidity", "type": "bool", "internalType": "bool" },
          { "name": "afterRemoveLiquidity", "type": "bool", "internalType": "bool" },
          { "name": "beforeSwap", "type": "bool", "internalType": "bool" },
          { "name": "afterSwap", "type": "bool", "internalType": "bool" },
          { "name": "beforeDonate", "type": "bool", "internalType": "bool" },
          { "name": "afterDonate", "type": "bool", "internalType": "bool" },
          { "name": "beforeSwapReturnDelta", "type": "bool", "internalType": "bool" },
          { "name": "afterSwapReturnDelta", "type": "bool", "internalType": "bool" },
          { "name": "afterAddLiquidityReturnDelta", "type": "bool", "internalType": "bool" },
          { "name": "afterRemoveLiquidityReturnDelta", "type": "bool", "internalType": "bool" }
        ]
      }
    ],
    "stateMutability": "pure"
  },
  {
    "type": "function",
    "name": "poolManager",
    "inputs": [],
    "outputs": [{ "name": "", "type": "address", "internalType": "contract IPoolManager" }],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "underlyingCurrency",
    "inputs": [],
    "outputs": [{ "name": "", "type": "address", "internalType": "Currency" }],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "wrapZeroForOne",
    "inputs": [],
    "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "wrapperCurrency",
    "inputs": [],
    "outputs": [{ "name": "", "type": "address", "internalType": "Currency" }],
    "stateMutability": "view"
  },
  {
    "type": "error",
    "name": "DeltaNotNegative",
    "inputs": [{ "name": "currency", "type": "address", "internalType": "Currency" }]
  },
  {
    "type": "error",
    "name": "DeltaNotPositive",
    "inputs": [{ "name": "currency", "type": "address", "internalType": "Currency" }]
  },
  { "type": "error", "name": "HookNotImplemented", "inputs": [] },
  { "type": "error", "name": "InsufficientBalance", "inputs": [] },
  { "type": "error", "name": "InvalidAddress", "inputs": [] },
  { "type": "error", "name": "NotPoolManager", "inputs": [] },
  {
    "type": "error",
    "name": "UnwrapFailed",
    "inputs": [
      { "name": "expectedAmount", "type": "uint256", "internalType": "uint256" },
      { "name": "actualAmount", "type": "uint256", "internalType": "uint256" }
    ]
  },
  {
    "type": "error",
    "name": "WrapFailed",
    "inputs": [
      { "name": "expectedAmount", "type": "uint256", "internalType": "uint256" },
      { "name": "actualAmount", "type": "uint256", "internalType": "uint256" }
    ]
  }
]
