---
title: "V4 Hook Fee Conformance"
method: POST
path: "/v1/tools/check_v4_hook_fee_conformance"
tags: ["uniswap", "v4-core", "fees", "calculate-swap-fee", "lp-fee-bounds", "protocol-fee", "override-flag", "hook-charge", "revenue-splits", "compliance-evidence", "mcp:check_v4_hook_fee_conformance"]
---

# V4 Hook Fee Conformance

`POST /v1/tools/check_v4_hook_fee_conformance`

## Request

- Base URL: `https://ainumbers.co`
- URL: `https://ainumbers.co/v1/tools/check_v4_hook_fee_conformance`
- Auth: none declared

Recomputes a Uniswap v4 pool’s per-swap fee from v4-core’s own rules at pinned a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (calculateSwapFee composition), validates the packed protocol fee and LP-fee bounds, decodes the 0x400000 override, and checks each emitted fee: CONFORMS, OUT_OF_BOUNDS, FEE_MISMATCH, or INDETERMINATE. Accrues the declared hook charge in integer arithmetic with remainders reported; LP revenue reported separately, never netted. Evidence only; zero network.

**Tool URL:** https://ainumbers.co/chaingraph/art-709-v4-hook-fee-conformance.html
**AP2/Policy Mandate export:** yes

## Request body

- object
  - `protocol_fee` integer, required: uint24, both directions packed as v4 stores it: low 12 bits zeroForOne, bits 12-23 oneForZero; each direction <= 1000 pips (isValidProtocolFee).
  - `pool_fee` integer, required: uint24: static LP fee in pips, or 0x800000 (8388608) for a dynamic-fee pool.
  - `declared_lp_fee_bounds` object, required: { min_pips, max_pips }: the LP-fee band the declared story permits (0..1000000).
  - `declared_total_fee_cap_pips` integer: Optional total cap in pips; the composed swap fee plus the hook-charge rate is checked against it.
  - `declared_hook_charge` object, required: { rate_pips, splits: [{ recipient_label, share_bps }] }: the separately declared hook charge; shares reported as declared, never coerced.
  - `swaps` unknown[], required: Each swap: { index, zero_for_one, amount_in, emitted_fee_pips, lp_fee_override? (raw uint24 incl. the 0x400000 flag), exact_out? }.
    - unknown

## Response `200`

Successful tool execution result

- object
  - `assumptions` string[], required
  - `counts` object
    - `conforms` number, required
    - `fee_mismatch` number, required
    - `indeterminate` number, required
    - `out_of_bounds` number, required
    - `swaps` number, required
  - `declared_hook_charge` object
    - `rate_pips` number, required
    - `splits` object[], required
      - `recipient_label` 'lp_side_pool' | 'treasury', required
      - `share_bps` number, required
  - `declared_lp_fee_bounds` object
    - `max_pips` number, required
    - `min_pips` number, required
  - `declared_total_fee_cap_pips` number, nullable
  - `detail` string
  - `domain_errors` object[]
    - `code` 'HOOK_CHARGE_SPLITS_INVALID' | 'LP_FEE_BOUNDS_INVALID' | 'SWAPS_INVALID', required
    - `text` string, required
  - `error` 'hook_charge_splits_invalid' | 'lp_fee_bounds_invalid' | 'swaps_invalid'
  - `fee_story_explained` false | true
  - `per_swap` object[], required
    - `amount_in` number, required
    - `cap_check` object, nullable, required
    - `emitted_fee_pips` number, required
    - `hook_charge_amount` number, required
    - `hook_charge_per_recipient` object, required
      - `lp_side_pool` object
        - `amount` number, required
        - `remainder` number, required
      - `treasury` object
        - `amount` number, required
        - `remainder` number, required
    - `hook_charge_remainder` number, required
    - `indeterminate_reason` string, nullable, required
    - `index` number, required
    - `lp_fee_pips` number, nullable, required
    - `lp_fee_source` 'override' | 'pool_static' | 'null', nullable, required
    - `lp_fee_within_declared_bounds` false | true | null, nullable, required
    - `lp_revenue_amount` number, required
    - `protocol_fee_direction_pips` number, required
    - `protocol_revenue_amount` number, required
    - `status` 'CONFORMS' | 'FEE_MISMATCH' | 'INDETERMINATE' | 'OUT_OF_BOUNDS', required
    - `swap_fee_pips` number, nullable, required
    - `zero_for_one` false | true, required
  - `pool_fee` number
  - `pool_fee_is_dynamic` false | true
  - `protocol_fee` number
  - `protocol_fee_one_for_zero_pips` number
  - `protocol_fee_valid` boolean, nullable, required
  - `protocol_fee_zero_for_one_pips` number
  - `splits_ok` false | true
  - `splits_sum_bps` number
  - `total_cap_ok` boolean, nullable
  - `totals` object, nullable, required
  - `v4_core_commit` string, required

---

[API](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite.md) · [All operations](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite/llms.txt) · [OpenAPI document](https://skmtc.dev/ainumbers/apis/ainumbers-co-fintech-intelligence-suite/revisions/b462e4f5bb28?raw)
