{
  "schemaVersion": 1,
  "fixtureOnly": true,
  "externalRpc": false,
  "realWallet": false,
  "checkedAt": "2026-08-31",
  "environment": {
    "foundry": "1.8.0",
    "foundryCommit": "61ae26af36320d4fa1020f7db53785885e29eeb5",
    "solidity": "0.8.36",
    "solidityCommit": "8a079791d9cca7a6c03fd6a8429b93aa3bddefed",
    "openzeppelinContracts": "5.6.1",
    "openzeppelinCommit": "5fd1781b1454fd1ef8e722282f86f9293cacf256",
    "evmVersion": "prague",
    "optimizer": true,
    "optimizerRuns": 200
  },
  "campaign": {
    "seed": "0x6022602260226022602260226022602260226022602260226022602260226022",
    "fuzzRuns": 256,
    "invariantRuns": 64,
    "invariantDepth": 64,
    "invariantWorkers": 1,
    "failOnRevert": false,
    "checkInterval": 1,
    "shrinkRunLimit": 5000,
    "target": "ProtocolHandler",
    "actors": [
      "0x00000000000000000000000000000000000A11cE",
      "0x0000000000000000000000000000000000000B0b",
      "0x000000000000000000000000000000000000cafE",
      "0x000000000000000000000000000000000000D00d"
    ]
  },
  "passingCampaign": {
    "status": "pass",
    "unitTests": [
      "testUnit_Erc20SupplyMatchesKnownBalances",
      "testFuzz_AmmProductNeverDecreases",
      "testUnit_VaultDonationChangesAssetsWithoutInventingShares",
      "testUnit_MinimizedRevokeRegressionRejectsFormerActor"
    ],
    "invariants": [
      "invariant_Erc20SupplyMatchesKnownBalances",
      "invariant_Erc20SupplyMatchesGhostLedger",
      "invariant_AmmProductNeverDropsBelowInitialProduct",
      "invariant_VaultAssetsMatchGhostLedger",
      "invariant_VaultSharesMatchKnownActors",
      "invariant_UnauthorizedActorNeverUsesPrivilege",
      "invariant_AuthorizedActionsMatchObservedCounter"
    ],
    "properties": {
      "erc20": [
        "known actor balances equal totalSupply",
        "minted minus burned ghost ledger equals totalSupply"
      ],
      "amm": [
        "reserve product never drops below the initial product"
      ],
      "vault": [
        "assets equal deposits plus donations minus withdrawals",
        "known actor shares equal totalShares"
      ],
      "accessControl": [
        "unauthorized success count remains zero",
        "authorized successes equal the observed privileged counter"
      ]
    }
  },
  "intentionalBug": {
    "status": "expected-failure-observed",
    "contract": "BuggyRoleGate",
    "invariant": "invariant_RevokedActorCannotUsePrivilege",
    "reason": "revoked actor retained privilege",
    "minimizedSequence": [
      "grantActor()",
      "revokeActor()",
      "actAsActor()"
    ],
    "observedDifference": "handler ghostAuthorized=false while BuggyRoleGate.authorized(actor)=true"
  },
  "fixedRegression": {
    "status": "pass",
    "contract": "RoleGate",
    "test": "testUnit_MinimizedRevokeRegressionRejectsFormerActor",
    "replayedSequence": [
      "grantActor()",
      "revokeActor()",
      "actAsActor()"
    ],
    "expectedResult": "privileged call reverts and privilegedCount remains zero"
  },
  "limits": [
    "bounded deterministic local campaign, not exhaustive proof",
    "known-actor balance sums are valid only because the handler never transfers outside the fixed actor set",
    "AMM and vault are intentionally small accounting fixtures, not production protocol implementations",
    "no public RPC, mainnet fork, wallet, signature, transaction broadcast, or asset movement"
  ]
}
