{
  "tool_id": "art-708-v4-hook-permission-reconciler",
  "note": "Golden vectors F1-F16. F1 zero address, static fee. F2 all 14 bits set. F3 real hooklist entry shape (address+flags fact, cited; no registry prose reproduced — the registry carries no license). F4 return-delta without base flag. F5 dynamic fee with no flags. F6 hooklist dynamicFee vs pool_fee disagreement. F7 uppercase input + mixed declaration. F8/F9 refusal pins (missing boolean, malformed address). F10 zero address with dynamic fee. F11-F16 the SBS counterexamples D1-a to D1-f: isDynamicFee is equality with 0x800000, so 0x800001, 0xC00000 and 0xFFFFFF are static fees.",
  "vectors": [
    {
      "name": "F1_zero_address_no_flags_static_fee",
      "note": "All-zero hook address, nothing declared anywhere: valid (zero address with a static fee passes isValidHookAddress); every flag MATCHES at false.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 0
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": 0,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "ac086ffd2d0d10b32595378f7627fb785ce98cfa7e2a1edf9aae068938e6ff0f"
    },
    {
      "name": "F2_all_14_bits_set_all_declared",
      "note": "A hook address with all 14 permission bits set (low 14 bits 0x3fff) against a full declaration: every flag MATCHES and the address is valid.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000003fff",
        "declared_permissions": {
          "beforeInitialize": true,
          "afterInitialize": true,
          "beforeAddLiquidity": true,
          "afterAddLiquidity": true,
          "beforeRemoveLiquidity": true,
          "afterRemoveLiquidity": true,
          "beforeSwap": true,
          "afterSwap": true,
          "beforeDonate": true,
          "afterDonate": true,
          "beforeSwapReturnDelta": true,
          "afterSwapReturnDelta": true,
          "afterAddLiquidityReturnDelta": true,
          "afterRemoveLiquidityReturnDelta": true
        }
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000003fff",
        "decoded_bits": "0x3fff",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": null,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "3f2d24f106ad72900f07e58c11badd7741788219220a2a15a72fa75cce47aadc"
    },
    {
      "name": "F3_hooklist_entry_real_address_agrees_static",
      "note": "Real hooklist entry shape (github.com/Uniswap/hooklist file hooks/base/0x000000258c397d8f759f70444d6dbf3622c22ac0.json, retrieved 2026-10-12; address plus flag booleans used as a fact — the registry carries no license, so no entry name or description is reproduced). Low 14 bits decode to 0x2ac0 and the declared flags agree with the address bits; properties.dynamicFee=false agrees with pool_fee 500 (static).",
      "policy_parameters": {
        "declared_permissions": {
          "hook": {
            "address": "0x000000258c397d8f759f70444d6dbf3622c22ac0"
          },
          "flags": {
            "beforeInitialize": true,
            "afterInitialize": false,
            "beforeAddLiquidity": true,
            "afterAddLiquidity": false,
            "beforeRemoveLiquidity": true,
            "afterRemoveLiquidity": false,
            "beforeSwap": true,
            "afterSwap": true,
            "beforeDonate": false,
            "afterDonate": false,
            "beforeSwapReturnDelta": false,
            "afterSwapReturnDelta": false,
            "afterAddLiquidityReturnDelta": false,
            "afterRemoveLiquidityReturnDelta": false
          },
          "properties": {
            "dynamicFee": false
          }
        },
        "pool_fee": 500,
        "declaration_source": "Uniswap hooklist entry hooks/base/0x000000258c397d8f759f70444d6dbf3622c22ac0.json"
      },
      "output_payload": {
        "hook_address": "0x000000258c397d8f759f70444d6dbf3622c22ac0",
        "decoded_bits": "0x2ac0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": 500,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": "Uniswap hooklist entry hooks/base/0x000000258c397d8f759f70444d6dbf3622c22ac0.json",
        "dynamic_fee_declaration": {
          "declared_dynamic": false,
          "pool_fee_dynamic": false,
          "agrees": true
        },
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "7a3d7302787898b44bd98fa8ee8f926cf17587eb6b916121307b07dce92203b0"
    },
    {
      "name": "F4_return_delta_without_base_flag",
      "note": "afterSwapReturnDelta set on the address (bit 2) without afterSwap (bit 6): the isValidHookAddress replica reports AFTERSWAPRETURNDELTA_REQUIRES_AFTERSWAP and the flag is SET_NOT_DECLARED.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000000004",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": true,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        }
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000000004",
        "decoded_bits": "0x4",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": false,
        "failing_rule": "AFTERSWAPRETURNDELTA_REQUIRES_AFTERSWAP",
        "pool_fee": null,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "e2e75f73106026e450c405c6bb9963e61ba248e22b08c3302abc8e70cd980e33"
    },
    {
      "name": "F5_dynamic_fee_with_no_flags_valid",
      "note": "Non-zero address whose low 14 bits are all zero with a dynamic pool fee (0x800000): valid via the dynamic-fee escape (NO_FLAG_SET rule does not fire when the fee is dynamic).",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000010000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 8388608
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000010000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": 8388608,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "58653e3dba2909bbd69fa6f3b131ee555a0783340b347128d6eb711ae75ab4f5"
    },
    {
      "name": "F6_hooklist_dynamicFee_disagrees_with_pool_fee",
      "note": "Hooklist entry declaring dynamicFee=true against a caller pool_fee of 500 (static): the reconciliation reports agrees=false and the address fails validity as NO_FLAG_SET_AND_STATIC_FEE.",
      "policy_parameters": {
        "declared_permissions": {
          "hook": {
            "address": "0x0000000000000000000000000000000000010000"
          },
          "flags": {
            "beforeInitialize": false,
            "afterInitialize": false,
            "beforeAddLiquidity": false,
            "afterAddLiquidity": false,
            "beforeRemoveLiquidity": false,
            "afterRemoveLiquidity": false,
            "beforeSwap": false,
            "afterSwap": false,
            "beforeDonate": false,
            "afterDonate": false,
            "beforeSwapReturnDelta": false,
            "afterSwapReturnDelta": false,
            "afterAddLiquidityReturnDelta": false,
            "afterRemoveLiquidityReturnDelta": false
          },
          "properties": {
            "dynamicFee": true
          }
        },
        "pool_fee": 500
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000010000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": false,
        "failing_rule": "NO_FLAG_SET_AND_STATIC_FEE",
        "pool_fee": 500,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": {
          "declared_dynamic": true,
          "pool_fee_dynamic": false,
          "agrees": false
        },
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "6646de7045e97d504e5b131ce396614ffb32536bf34b77e228bd21685e115112"
    },
    {
      "name": "F7_uppercase_input_normalised_mixed_declaration",
      "note": "Uppercase (checksum-style) input is normalised to lowercase; a mixed declaration yields both mismatch kinds: beforeSwap DECLARED_NOT_SET (declared, bit clear) and afterDonate SET_NOT_DECLARED (bit 4 set on the address, undeclared).",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000003F80",
        "declared_permissions": {
          "beforeInitialize": true,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": true,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        }
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000003f80",
        "decoded_bits": "0x3f80",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": true,
            "actual": true,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": true,
            "status": "SET_NOT_DECLARED"
          }
        ],
        "mismatch_count": 5,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": null,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "bf7ed684d3879cecd0bd6731ec3d50ce3ed472743582cde58bbb006e482e3ceb"
    },
    {
      "name": "F8_refusal_missing_declared_boolean",
      "note": "Kill-power pin: one declared boolean missing (beforeDonate) is a REFUSAL, never a default — an undisclosed callback cannot be guessed.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        }
      },
      "output_payload": {
        "error": "declared_permissions_incomplete",
        "detail": "declared_permissions is missing a required boolean for: beforeDonate. Every one of the 14 flags must be declared explicitly; nothing is defaulted.",
        "domain_errors": [
          {
            "code": "DECLARED_PERMISSIONS_INCOMPLETE",
            "text": "declared_permissions is missing a required boolean for: beforeDonate. Every one of the 14 flags must be declared explicitly; nothing is defaulted."
          }
        ],
        "flags": [],
        "mismatches": [],
        "valid_hook_address": null,
        "failing_rule": null,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": []
      },
      "golden_hash": "ad7648e6a9887db666645ecb75a489c998775cab2f88b58bf23f03d66c6b79ee"
    },
    {
      "name": "F9_refusal_malformed_address",
      "note": "Kill-power pin: a 39-hex-digit address is refused outright.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000003ff",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        }
      },
      "output_payload": {
        "error": "hook_address_invalid",
        "detail": "hook_address must be a 0x-prefixed 40-hex-digit address (checksum not required); got \"0x0000000000000000000000000000000000003ff\".",
        "domain_errors": [
          {
            "code": "HOOK_ADDRESS_INVALID",
            "text": "hook_address must be a 0x-prefixed 40-hex-digit address (checksum not required); got \"0x0000000000000000000000000000000000003ff\"."
          }
        ],
        "flags": [],
        "mismatches": [],
        "valid_hook_address": null,
        "failing_rule": null,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": []
      },
      "golden_hash": "ca0134df13c3b196cac8b8f4fbe5deb6c07df18fab8a7f32ab46411ff1276781"
    },
    {
      "name": "F10_zero_address_with_dynamic_fee_invalid",
      "note": "Boundary mutant: the zero address with a dynamic pool fee fails R2 (ZERO_ADDRESS_WITH_DYNAMIC_FEE) — the dynamic-fee escape never rescues address zero.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 8388608
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": false,
        "failing_rule": "ZERO_ADDRESS_WITH_DYNAMIC_FEE",
        "pool_fee": 8388608,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "40a8e49e1b91d69b68ed25a6fa0ae09cd4a9cfcfb3645ffd417f3d3a8c71ef61"
    },
    {
      "name": "F11_D1a_zero_address_fee_0x800001_valid",
      "note": "SBS D1-a. Pinned LPFeeLibrary.sol L30-32: isDynamicFee is true only when the fee equals exactly 0x800000. 0x800001 is not dynamic, so the zero address is valid (Hooks.sol L124-126).",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 8388609
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": 8388609,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "0feee6974de7eba38a91b3deb8d7da4c18ee82a412f4ee36f4fef46536c723cf"
    },
    {
      "name": "F12_D1b_zero_address_fee_0xC00000_valid",
      "note": "SBS D1-b. Pinned LPFeeLibrary.sol L30-32: isDynamicFee is true only when the fee equals exactly 0x800000. 0xC00000 is not dynamic, so the zero address is valid.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 12582912
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": 12582912,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "0e9d6b620001112175f765f4a65a2a3697a63d21a926aa299da78e887afb6883"
    },
    {
      "name": "F13_D1c_zero_address_fee_0xFFFFFF_valid",
      "note": "SBS D1-c. Pinned LPFeeLibrary.sol L30-32: isDynamicFee is true only when the fee equals exactly 0x800000. 0xFFFFFF is not dynamic, so the zero address is valid.",
      "policy_parameters": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 16777215
      },
      "output_payload": {
        "hook_address": "0x0000000000000000000000000000000000000000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": true,
        "failing_rule": null,
        "pool_fee": 16777215,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "f8bdbcda95d468d81a1e331589cb9369dcd34f06e34c6ae4e8c11d38e84fbea1"
    },
    {
      "name": "F14_D1d_no_flag_hook_fee_0x800001_invalid",
      "note": "SBS D1-d. Pinned LPFeeLibrary.sol L30-32: isDynamicFee is true only when the fee equals exactly 0x800000. A non-zero hook with no flag bits and a non-dynamic fee 0x800001 is invalid (NO_FLAG_SET_AND_STATIC_FEE).",
      "policy_parameters": {
        "hook_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce36060000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 8388609
      },
      "output_payload": {
        "hook_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce36060000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": false,
        "failing_rule": "NO_FLAG_SET_AND_STATIC_FEE",
        "pool_fee": 8388609,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "03a50af78f5a29bdd694fb4a7470b90d338f9aecc94eba72d6e5896f010c149e"
    },
    {
      "name": "F15_D1e_no_flag_hook_fee_0xC00000_invalid",
      "note": "SBS D1-e. Pinned LPFeeLibrary.sol L30-32: isDynamicFee is true only when the fee equals exactly 0x800000. A non-zero hook with no flag bits and fee 0xC00000 is invalid.",
      "policy_parameters": {
        "hook_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce36060000",
        "declared_permissions": {
          "beforeInitialize": false,
          "afterInitialize": false,
          "beforeAddLiquidity": false,
          "afterAddLiquidity": false,
          "beforeRemoveLiquidity": false,
          "afterRemoveLiquidity": false,
          "beforeSwap": false,
          "afterSwap": false,
          "beforeDonate": false,
          "afterDonate": false,
          "beforeSwapReturnDelta": false,
          "afterSwapReturnDelta": false,
          "afterAddLiquidityReturnDelta": false,
          "afterRemoveLiquidityReturnDelta": false
        },
        "pool_fee": 12582912
      },
      "output_payload": {
        "hook_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce36060000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": false,
        "failing_rule": "NO_FLAG_SET_AND_STATIC_FEE",
        "pool_fee": 12582912,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": null,
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "4cbacce809fd251519a2df8d3c59e71ced30c2522e5e6d2c0d3bc9d24a23476d"
    },
    {
      "name": "F16_D1f_hooklist_dynamicFee_false_agrees_with_0x800001",
      "note": "SBS D1-f. Pinned LPFeeLibrary.sol L30-32: isDynamicFee is true only when the fee equals exactly 0x800000. A hooklist dynamicFee:false declaration agrees with pool_fee 0x800001 (not dynamic).",
      "policy_parameters": {
        "hook_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce36060000",
        "declared_permissions": {
          "hook": {
            "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce36060000"
          },
          "flags": {
            "beforeInitialize": false,
            "afterInitialize": false,
            "beforeAddLiquidity": false,
            "afterAddLiquidity": false,
            "beforeRemoveLiquidity": false,
            "afterRemoveLiquidity": false,
            "beforeSwap": false,
            "afterSwap": false,
            "beforeDonate": false,
            "afterDonate": false,
            "beforeSwapReturnDelta": false,
            "afterSwapReturnDelta": false,
            "afterAddLiquidityReturnDelta": false,
            "afterRemoveLiquidityReturnDelta": false
          },
          "properties": {
            "dynamicFee": false
          }
        },
        "pool_fee": 8388609
      },
      "output_payload": {
        "hook_address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce36060000",
        "decoded_bits": "0x0",
        "flags": [
          {
            "flag": "beforeInitialize",
            "bit": 13,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterInitialize",
            "bit": 12,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeAddLiquidity",
            "bit": 11,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidity",
            "bit": 10,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeRemoveLiquidity",
            "bit": 9,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidity",
            "bit": 8,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwap",
            "bit": 7,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwap",
            "bit": 6,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeDonate",
            "bit": 5,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterDonate",
            "bit": 4,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "beforeSwapReturnDelta",
            "bit": 3,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterSwapReturnDelta",
            "bit": 2,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterAddLiquidityReturnDelta",
            "bit": 1,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          },
          {
            "flag": "afterRemoveLiquidityReturnDelta",
            "bit": 0,
            "declared": false,
            "actual": false,
            "status": "MATCH"
          }
        ],
        "mismatches": [],
        "mismatch_count": 0,
        "valid_hook_address": false,
        "failing_rule": "NO_FLAG_SET_AND_STATIC_FEE",
        "pool_fee": 8388609,
        "v4_core_commit": "a7cf038cd568801a79a9b4cf92cd5b52c95c8585",
        "declaration_source": null,
        "dynamic_fee_declaration": {
          "declared_dynamic": false,
          "pool_fee_dynamic": false,
          "agrees": true
        },
        "assumptions": [
          "Flag table and validity rule pinned to Uniswap v4-core src/libraries/Hooks.sol at commit a7cf038cd568801a79a9b4cf92cd5b52c95c8585 (all 14 permission bits are the low 14 bits of the hook address).",
          "Zero network: the node never reads a chain and decodes only the caller-supplied address, declaration and fee.",
          "Checksummed addresses are accepted and normalised to lowercase; decoding uses BigInt arithmetic over the low 14 bits only.",
          "A missing declared boolean is a refusal, never a default: an undisclosed callback cannot be guessed."
        ]
      },
      "golden_hash": "fb11da1771f1bb29b9711a045e92810942e0853efafea3f15a48ea2d9b357e20"
    }
  ]
}
