1,000,000 free RPC requestsJust a wallet, via x402.

Start building
ERC-8004 Explorer by
Mantle Mainnet risk:100 verified

Feedback #13

For agent 97 on Mantle Mainnet · 2026-06-16

archon.audit.report
100.0

Off-chain feedback document

raw JSON
{
  "chain": {
    "name": "Mantle Mainnet",
    "chainId": 5000
  },
  "report": {
    "id": "80544ffc-f3e0-4be1-aba5-26b8e28314ea",
    "scope": {
      "pragma": "^0.8.24",
      "network": "mantle-mainnet",
      "lineCount": 530,
      "protocols": [
        "mETH",
        "cmETH",
        "USDY",
        "Aave V3",
        "Merchant Moe",
        "Agni"
      ],
      "sourceKind": "paste",
      "aiReasoning": {
        "hits": 0,
        "total": 115,
        "misses": 115,
        "batches": 8,
        "reasons": {
          "bounded": 99
        },
        "skipped": 99,
        "provider": "tokenhub",
        "timeoutMs": 75000,
        "fallbackCount": 99,
        "providersUsed": [
          "Tencent Cloud TokenHub (deepseek-v4-pro)"
        ]
      },
      "reducedMode": null,
      "solcVersion": "0.8.24",
      "gasOptimizer": {
        "pricing": {
          "mode": "calibrated-receipts",
          "pricedAt": "2026-06-16T15:20:20.081Z",
          "l2GasPriceWei": "50000100000",
          "deployDataFeeMnt": "0",
          "deployDataFeeWei": "0",
          "calldataZeroBytes": 0,
          "calibrationErrorPct": 0,
          "calldataGasEstimate": 0,
          "calldataNonZeroBytes": 0,
          "creationBytecodeBytes": 0
        },
        "daPricing": {
          "model": {
            "mode": "calibrated-receipts",
            "samples": [
              {
                "txHash": "0x82d99588e5f1bff33d618743025d598445493032637de25844a67aa8e88088ef",
                "l1FeeWei": "699231354481640",
                "l1GasUsed": "2530",
                "zeroBytes": 135,
                "l1GasPrice": "538782662",
                "totalBytes": 228,
                "blobGasUsed": "63200",
                "blockNumber": "96205628",
                "nonZeroBytes": 93,
                "l1BlobBaseFee": "330004069609410902",
                "l1BaseFeeScalar": "169019",
                "operatorFeeScalar": "100000000",
                "calldataGasEstimate": 2028,
                "l1BlobBaseFeeScalar": "0",
                "operatorFeeConstant": "0",
                "daFootprintGasScalar": "400"
              },
              {
                "txHash": "0xb9ce87de86b212b91eb64012bbdab91014373da1f6d960470b340e1991a1a7c5",
                "l1FeeWei": "6874261528561290",
                "l1GasUsed": "22258",
                "zeroBytes": 28,
                "l1GasPrice": "603039864",
                "totalBytes": 1945,
                "blobGasUsed": "556400",
                "blockNumber": "96205472",
                "nonZeroBytes": 1917,
                "l1BlobBaseFee": "321479049246759320",
                "l1BaseFeeScalar": "169019",
                "operatorFeeScalar": "100000000",
                "calldataGasEstimate": 30784,
                "l1BlobBaseFeeScalar": "0",
                "operatorFeeConstant": "0",
                "daFootprintGasScalar": "400"
              }
            ],
            "validation": [
              {
                "txHash": "0x82d99588e5f1bff33d618743025d598445493032637de25844a67aa8e88088ef",
                "errorPct": 0,
                "actualL1FeeWei": "699231354481640",
                "predictedL1FeeWei": "699231354481572"
              },
              {
                "txHash": "0xb9ce87de86b212b91eb64012bbdab91014373da1f6d960470b340e1991a1a7c5",
                "errorPct": 0,
                "actualL1FeeWei": "6874261528561290",
                "predictedL1FeeWei": "6874261528560500"
              }
            ],
            "sampleCount": 2,
            "zeroByteFeeWei": "2736708878864",
            "nonZeroByteFeeWei": "3545974793924",
            "maxValidationErrorPct": 0,
            "meanValidationErrorPct": 0
          },
          "source": "receipt-calibrated",
          "groundTruthField": "l1Fee"
        },
        "sourceHash": "0x4d4c49ad4272172a7f8ba937a85468cd3981a19cab333ae7b4f963e13b167b0f",
        "measurement": {
          "forge": {
            "ok": false,
            "error": "Error (7576): Undeclared identifier.",
            "command": "forge test --gas-report",
            "attempted": true,
            "gasReport": null
          },
          "source": "deterministic-estimate",
          "status": "degraded",
          "patches": [
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
              "before": "mapping(address => uint256[]) public userPositions; … mapping(bytes32 => bool) public reportExists;",
              "ruleId": "storage-packing",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
              "before": "mapping(bytes32 => bool) public consumedMessages; … address[] public listedTokens;",
              "ruleId": "storage-packing",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function transfer(address to, uint256 amount) external returns (bool);",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function transferFrom(address from, address to, uint256 amount) external returns (bool);",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function pendingReward(uint256 id) public view returns (uint256) {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function claimReward(uint256 id) public notPaused {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function withdraw(uint256 id) public notPaused {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function borrow(uint256 id, uint256 debtAmount) external notPaused {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function repay(uint256 id, uint256 amount) external notPaused {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function liquidate(uint256 id) external notPaused {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function healthFactor(uint256 id) public view returns (uint256) {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function unsafeValue(uint256 amount) public view returns (uint256) {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
              "before": "function sweepByOrigin(address token, address to, uint256 amount) external {",
              "ruleId": "calldata-smaller-types",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": null,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
              "before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error TOKENNOTLISTED(); … if (!(condition)) revert TOKENNOTLISTED();",
              "before": "require(listedToken[token], \"TOKEN_NOT_LISTED\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
              "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
              "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
              "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
              "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error UNDERCOLLATERALIZED(); … if (!(condition)) revert UNDERCOLLATERALIZED();",
              "before": "require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
              "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error ALREADYCONSUMED(); … if (!(condition)) revert ALREADYCONSUMED();",
              "before": "require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error DELEGATECALLFAILED(); … if (!(condition)) revert DELEGATECALLFAILED();",
              "before": "require(ok, \"DELEGATECALL_FAILED\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
              "before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "address immutable public owner;",
              "before": "address public owner;",
              "ruleId": "immutable-constant",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 2100,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = listedToken[token]; // reuse cached value",
              "before": "listedToken[token] read 3 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 200,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = positions[id]; // reuse cached value",
              "before": "positions[id] read 9 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 800,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = reportExists[reportHash]; // reuse cached value",
              "before": "reportExists[reportHash] read 2 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 100,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = hashes[i]; // reuse cached value",
              "before": "hashes[i] read 2 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 100,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = consumedMessages[messageHash]; // reuse cached value",
              "before": "consumedMessages[messageHash] read 2 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 100,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "for (uint256 i = 0; i < ids.length; unchecked { ++i; }) {",
              "before": "for (uint256 i = 0; i < ids.length; i++) {",
              "ruleId": "unchecked-loop-increment",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 30,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "for (uint256 i = 0; i < hashes.length; unchecked { ++i; }) {",
              "before": "for (uint256 i = 0; i < hashes.length; i++) {",
              "ruleId": "unchecked-loop-increment",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 30,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "for (uint256 i = 0; i < allPositions.length; unchecked { ++i; }) {",
              "before": "for (uint256 i = 0; i < allPositions.length; i++) {",
              "ruleId": "unchecked-loop-increment",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 30,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 len = array.length; for (...; i < len; ) { ... }",
              "before": "for (uint256 i = 0; i < ids.length; i++) {",
              "ruleId": "loop-hygiene",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 100,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 len = array.length; for (...; i < len; ) { ... }",
              "before": "for (uint256 i = 0; i < hashes.length; i++) {",
              "ruleId": "loop-hygiene",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 100,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 len = array.length; for (...; i < len; ) { ... }",
              "before": "for (uint256 i = 0; i < allPositions.length; i++) {",
              "ruleId": "loop-hygiene",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 100,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "require(amount != 0, \"ZERO_AMOUNT\");",
              "before": "require(amount > 0, \"ZERO_AMOUNT\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "if (fee != 0) {",
              "before": "if (fee > 0) {",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "require(reward != 0, \"NO_REWARD\");",
              "before": "require(reward > 0, \"NO_REWARD\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "require(debtAmount != 0, \"ZERO_DEBT\");",
              "before": "require(debtAmount > 0, \"ZERO_DEBT\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "require(amount != 0, \"ZERO_AMOUNT\");",
              "before": "require(amount > 0, \"ZERO_AMOUNT\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "require(p.debt != 0, \"NO_DEBT\");",
              "before": "require(p.debt > 0, \"NO_DEBT\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "require(maxAmount != 0, \"ZERO_MAX\");",
              "before": "require(maxAmount > 0, \"ZERO_MAX\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "if (implementation != address(0) && arbitraryData.length != 0) {",
              "before": "if (implementation != address(0) && arbitraryData.length > 0) {",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(address => bool) public listedToken;",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(address => bool) public keeper;",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(address => bool) public frozen;",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(bytes32 => bool) public reportExists;",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(bytes32 => bool) public consumedMessages;",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "for (uint256 i; i < ids.length; i++) {",
              "before": "for (uint256 i = 0; i < ids.length; i++) {",
              "ruleId": "remove-zero-init",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "for (uint256 i; i < hashes.length; i++) {",
              "before": "for (uint256 i = 0; i < hashes.length; i++) {",
              "ruleId": "remove-zero-init",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "for (uint256 i; i < allPositions.length; i++) {",
              "before": "for (uint256 i = 0; i < allPositions.length; i++) {",
              "ruleId": "remove-zero-init",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            }
          ],
          "version": "archon.gasMeasurement.v1",
          "measuredAt": "2026-06-16T15:20:20.369Z",
          "rulesetHash": "1c02c9b0fe33d4a14a30849dff8c8cc3719db0071e3e6561575dd69b551b0ab8",
          "contractHash": "4d4c49ad4272172a7f8ba937a85468cd3981a19cab333ae7b4f963e13b167b0f"
        },
        "opportunities": [
          {
            "id": "storage-packing",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
            "patch": {
              "newText": "    mapping(address => uint256[]) public userPositions; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
              "oldText": "    mapping(address => uint256[]) public userPositions;"
            },
            "title": "Pack small storage variables into fewer slots",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:83",
            "before": "mapping(address => uint256[]) public userPositions; … mapping(bytes32 => bool) public reportExists;",
            "safety": "review",
            "newText": "    mapping(address => uint256[]) public userPositions; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
            "oldText": "    mapping(address => uint256[]) public userPositions;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 83,
            "rationale": "Storage slot packing can remove entire SSTORE/SLOAD slots but changes layout, so upgradeable contracts need manual review.",
            "confidence": 0.64,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "storage-packing",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Group adjacent bool/address/small uint fields together and place full-slot fields after them.",
            "patch": {
              "newText": "    mapping(bytes32 => bool) public consumedMessages; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
              "oldText": "    mapping(bytes32 => bool) public consumedMessages;"
            },
            "title": "Pack small storage variables into fewer slots",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:88",
            "before": "mapping(bytes32 => bool) public consumedMessages; … address[] public listedTokens;",
            "safety": "review",
            "newText": "    mapping(bytes32 => bool) public consumedMessages; // REVIEW: reorder adjacent small storage fields with nearby small fields to reduce SSTORE/SLOAD slots",
            "oldText": "    mapping(bytes32 => bool) public consumedMessages;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 88,
            "rationale": "Storage slot packing can remove entire SSTORE/SLOAD slots but changes layout, so upgradeable contracts need manual review.",
            "confidence": 0.64,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function transfer(address to, uint256 amount) external returns (bool); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function transfer(address to, uint256 amount) external returns (bool);"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:24",
            "before": "function transfer(address to, uint256 amount) external returns (bool);",
            "safety": "review",
            "newText": "    function transfer(address to, uint256 amount) external returns (bool); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function transfer(address to, uint256 amount) external returns (bool);",
            "category": "calldata",
            "severity": "low",
            "lineStart": 24,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function transferFrom(address from, address to, uint256 amount) external returns (bool); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function transferFrom(address from, address to, uint256 amount) external returns (bool);"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:25",
            "before": "function transferFrom(address from, address to, uint256 amount) external returns (bool);",
            "safety": "review",
            "newText": "    function transferFrom(address from, address to, uint256 amount) external returns (bool); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function transferFrom(address from, address to, uint256 amount) external returns (bool);",
            "category": "calldata",
            "severity": "low",
            "lineStart": 25,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:35",
            "before": "function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);",
            "safety": "review",
            "newText": "    function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4); // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function onVaultHook(address user, uint256 amount, bytes calldata data) external returns (bytes4);",
            "category": "calldata",
            "severity": "low",
            "lineStart": 35,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function pendingReward(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function pendingReward(uint256 id) public view returns (uint256) {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:211",
            "before": "function pendingReward(uint256 id) public view returns (uint256) {",
            "safety": "review",
            "newText": "    function pendingReward(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function pendingReward(uint256 id) public view returns (uint256) {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 211,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function claimReward(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function claimReward(uint256 id) public notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:219",
            "before": "function claimReward(uint256 id) public notPaused {",
            "safety": "review",
            "newText": "    function claimReward(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function claimReward(uint256 id) public notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 219,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function withdraw(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function withdraw(uint256 id) public notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:236",
            "before": "function withdraw(uint256 id) public notPaused {",
            "safety": "review",
            "newText": "    function withdraw(uint256 id) public notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function withdraw(uint256 id) public notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 236,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:253",
            "before": "function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused {",
            "safety": "review",
            "newText": "    function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function withdrawWithHook(uint256 id, address hook, bytes calldata data) external notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 253,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function borrow(uint256 id, uint256 debtAmount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function borrow(uint256 id, uint256 debtAmount) external notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:279",
            "before": "function borrow(uint256 id, uint256 debtAmount) external notPaused {",
            "safety": "review",
            "newText": "    function borrow(uint256 id, uint256 debtAmount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function borrow(uint256 id, uint256 debtAmount) external notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 279,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function repay(uint256 id, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function repay(uint256 id, uint256 amount) external notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:297",
            "before": "function repay(uint256 id, uint256 amount) external notPaused {",
            "safety": "review",
            "newText": "    function repay(uint256 id, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function repay(uint256 id, uint256 amount) external notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 297,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function liquidate(uint256 id) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function liquidate(uint256 id) external notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:312",
            "before": "function liquidate(uint256 id) external notPaused {",
            "safety": "review",
            "newText": "    function liquidate(uint256 id) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function liquidate(uint256 id) external notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 312,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function healthFactor(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function healthFactor(uint256 id) public view returns (uint256) {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:340",
            "before": "function healthFactor(uint256 id) public view returns (uint256) {",
            "safety": "review",
            "newText": "    function healthFactor(uint256 id) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function healthFactor(uint256 id) public view returns (uint256) {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 340,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function unsafeValue(uint256 amount) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function unsafeValue(uint256 amount) public view returns (uint256) {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:348",
            "before": "function unsafeValue(uint256 amount) public view returns (uint256) {",
            "safety": "review",
            "newText": "    function unsafeValue(uint256 amount) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function unsafeValue(uint256 amount) public view returns (uint256) {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 348,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "calldata-smaller-types",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function sweepByOrigin(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function sweepByOrigin(address token, address to, uint256 amount) external {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:497",
            "before": "function sweepByOrigin(address token, address to, uint256 amount) external {",
            "safety": "review",
            "newText": "    function sweepByOrigin(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function sweepByOrigin(address token, address to, uint256 amount) external {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 497,
            "rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
            "confidence": 0.55,
            "estL1Delta": 16,
            "estL2Delta": null,
            "annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
            "estimatedGasSaved": null,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
            "patch": {
              "newText": "        if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
              "oldText": "        require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:149",
            "before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
            "safety": "safe",
            "newText": "        if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
            "oldText": "        require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 149,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 16,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error TOKENNOTLISTED(); … if (!(condition)) revert TOKENNOTLISTED();",
            "patch": {
              "newText": "        if (!(listedToken[token])) revert TOKENNOTLISTED();",
              "oldText": "        require(listedToken[token], \"TOKEN_NOT_LISTED\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:178",
            "before": "require(listedToken[token], \"TOKEN_NOT_LISTED\");",
            "safety": "safe",
            "newText": "        if (!(listedToken[token])) revert TOKENNOTLISTED();",
            "oldText": "        require(listedToken[token], \"TOKEN_NOT_LISTED\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 178,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 16,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
            "patch": {
              "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
              "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:222",
            "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "safety": "safe",
            "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
            "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 222,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
            "patch": {
              "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
              "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:239",
            "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "safety": "safe",
            "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
            "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 239,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
            "patch": {
              "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
              "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:256",
            "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "safety": "safe",
            "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
            "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 256,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
            "patch": {
              "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
              "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:282",
            "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "safety": "safe",
            "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
            "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 282,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error UNDERCOLLATERALIZED(); … if (!(condition)) revert UNDERCOLLATERALIZED();",
            "patch": {
              "newText": "        if (!((collateralValue * 6500) / BPS >= debtAmount)) revert UNDERCOLLATERALIZED();",
              "oldText": "        require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:287",
            "before": "require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");",
            "safety": "safe",
            "newText": "        if (!((collateralValue * 6500) / BPS >= debtAmount)) revert UNDERCOLLATERALIZED();",
            "oldText": "        require((collateralValue * 6500) / BPS >= debtAmount, \"UNDERCOLLATERALIZED\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 287,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 19,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 19
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error NOTPOSITIONOWNER(); … if (!(condition)) revert NOTPOSITIONOWNER();",
            "patch": {
              "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
              "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:300",
            "before": "require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "safety": "safe",
            "newText": "        if (!(p.user == msg.sender)) revert NOTPOSITIONOWNER();",
            "oldText": "        require(p.user == msg.sender, \"NOT_POSITION_OWNER\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 300,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error ALREADYCONSUMED(); … if (!(condition)) revert ALREADYCONSUMED();",
            "patch": {
              "newText": "        if (!(!consumedMessages[messageHash])) revert ALREADYCONSUMED();",
              "oldText": "        require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:457",
            "before": "require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");",
            "safety": "safe",
            "newText": "        if (!(!consumedMessages[messageHash])) revert ALREADYCONSUMED();",
            "oldText": "        require(!consumedMessages[messageHash], \"ALREADY_CONSUMED\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 457,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 16,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error DELEGATECALLFAILED(); … if (!(condition)) revert DELEGATECALLFAILED();",
            "patch": {
              "newText": "        if (!(ok)) revert DELEGATECALLFAILED();",
              "oldText": "        require(ok, \"DELEGATECALL_FAILED\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:494",
            "before": "require(ok, \"DELEGATECALL_FAILED\");",
            "safety": "safe",
            "newText": "        if (!(ok)) revert DELEGATECALLFAILED();",
            "oldText": "        require(ok, \"DELEGATECALL_FAILED\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 494,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 19,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 19
          },
          {
            "id": "custom-errors",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "error ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
            "patch": {
              "newText": "        if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
              "oldText": "        require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:500",
            "before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
            "safety": "safe",
            "newText": "        if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
            "oldText": "        require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 500,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 16,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 16
          },
          {
            "id": "immutable-constant",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "address immutable public owner;",
            "patch": {
              "newText": "    address immutable public owner;",
              "oldText": "    address public owner;"
            },
            "title": "Mark never-changing value constant or immutable",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:42",
            "before": "address public owner;",
            "safety": "review",
            "newText": "    address immutable public owner;",
            "oldText": "    address public owner;",
            "category": "storage",
            "severity": "info",
            "lineStart": 42,
            "rationale": "Constants/immutables avoid storage reads for values that do not change after deployment.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 2100,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 2100,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "cache-repeated-sload",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 cached = listedToken[token]; // reuse cached value",
            "patch": {
              "newText": "listedToken[token]",
              "oldText": "listedToken[token]"
            },
            "title": "Cache repeated storage read",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:135",
            "before": "listedToken[token] read 3 times",
            "safety": "review",
            "newText": "listedToken[token]",
            "oldText": "listedToken[token]",
            "category": "storage",
            "severity": "info",
            "lineStart": 135,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 200,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 200,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "cache-repeated-sload",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 cached = positions[id]; // reuse cached value",
            "patch": {
              "newText": "positions[id]",
              "oldText": "positions[id]"
            },
            "title": "Cache repeated storage read",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:193",
            "before": "positions[id] read 9 times",
            "safety": "review",
            "newText": "positions[id]",
            "oldText": "positions[id]",
            "category": "storage",
            "severity": "info",
            "lineStart": 193,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 800,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 800,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "cache-repeated-sload",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 cached = reportExists[reportHash]; // reuse cached value",
            "patch": {
              "newText": "reportExists[reportHash]",
              "oldText": "reportExists[reportHash]"
            },
            "title": "Cache repeated storage read",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:365",
            "before": "reportExists[reportHash] read 2 times",
            "safety": "review",
            "newText": "reportExists[reportHash]",
            "oldText": "reportExists[reportHash]",
            "category": "storage",
            "severity": "info",
            "lineStart": 365,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 100,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 100,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "cache-repeated-sload",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 cached = hashes[i]; // reuse cached value",
            "patch": {
              "newText": "hashes[i]",
              "oldText": "hashes[i]"
            },
            "title": "Cache repeated storage read",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:399",
            "before": "hashes[i] read 2 times",
            "safety": "review",
            "newText": "hashes[i]",
            "oldText": "hashes[i]",
            "category": "storage",
            "severity": "info",
            "lineStart": 399,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 100,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 100,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "cache-repeated-sload",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 cached = consumedMessages[messageHash]; // reuse cached value",
            "patch": {
              "newText": "consumedMessages[messageHash]",
              "oldText": "consumedMessages[messageHash]"
            },
            "title": "Cache repeated storage read",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:457",
            "before": "consumedMessages[messageHash] read 2 times",
            "safety": "review",
            "newText": "consumedMessages[messageHash]",
            "oldText": "consumedMessages[messageHash]",
            "category": "storage",
            "severity": "info",
            "lineStart": 457,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 100,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 100,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "unchecked-loop-increment",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "for (uint256 i = 0; i < ids.length; unchecked { ++i; }) {",
            "patch": {
              "newText": "        for (uint256 i = 0; i < ids.length; ++i /* wrap increment in unchecked block after refactor */) {",
              "oldText": "        for (uint256 i = 0; i < ids.length; i++) {"
            },
            "title": "Use unchecked loop increment where bounded",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:274",
            "before": "for (uint256 i = 0; i < ids.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < ids.length; ++i /* wrap increment in unchecked block after refactor */) {",
            "oldText": "        for (uint256 i = 0; i < ids.length; i++) {",
            "category": "computation",
            "severity": "info",
            "lineStart": 274,
            "rationale": "A loop counter bounded by array length cannot overflow in practical execution; unchecked removes overflow checks after manual review.",
            "confidence": 0.58,
            "estL1Delta": null,
            "estL2Delta": 30,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 30,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "unchecked-loop-increment",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "for (uint256 i = 0; i < hashes.length; unchecked { ++i; }) {",
            "patch": {
              "newText": "        for (uint256 i = 0; i < hashes.length; ++i /* wrap increment in unchecked block after refactor */) {",
              "oldText": "        for (uint256 i = 0; i < hashes.length; i++) {"
            },
            "title": "Use unchecked loop increment where bounded",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:398",
            "before": "for (uint256 i = 0; i < hashes.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < hashes.length; ++i /* wrap increment in unchecked block after refactor */) {",
            "oldText": "        for (uint256 i = 0; i < hashes.length; i++) {",
            "category": "computation",
            "severity": "info",
            "lineStart": 398,
            "rationale": "A loop counter bounded by array length cannot overflow in practical execution; unchecked removes overflow checks after manual review.",
            "confidence": 0.58,
            "estL1Delta": null,
            "estL2Delta": 30,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 30,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "unchecked-loop-increment",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "for (uint256 i = 0; i < allPositions.length; unchecked { ++i; }) {",
            "patch": {
              "newText": "        for (uint256 i = 0; i < allPositions.length; ++i /* wrap increment in unchecked block after refactor */) {",
              "oldText": "        for (uint256 i = 0; i < allPositions.length; i++) {"
            },
            "title": "Use unchecked loop increment where bounded",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:512",
            "before": "for (uint256 i = 0; i < allPositions.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < allPositions.length; ++i /* wrap increment in unchecked block after refactor */) {",
            "oldText": "        for (uint256 i = 0; i < allPositions.length; i++) {",
            "category": "computation",
            "severity": "info",
            "lineStart": 512,
            "rationale": "A loop counter bounded by array length cannot overflow in practical execution; unchecked removes overflow checks after manual review.",
            "confidence": 0.58,
            "estL1Delta": null,
            "estL2Delta": 30,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 30,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "loop-hygiene",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 len = array.length; for (...; i < len; ) { ... }",
            "patch": {
              "newText": "        for (uint256 i = 0; i < ids.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
              "oldText": "        for (uint256 i = 0; i < ids.length; i++) {"
            },
            "title": "Cache array length before loop",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:274",
            "before": "for (uint256 i = 0; i < ids.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < ids.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
            "oldText": "        for (uint256 i = 0; i < ids.length; i++) {",
            "category": "storage",
            "severity": "info",
            "lineStart": 274,
            "rationale": "Caching storage array length avoids repeated SLOADs; using ++i/unchecked can reduce loop overhead.",
            "confidence": 0.82,
            "estL1Delta": null,
            "estL2Delta": 100,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 100,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "loop-hygiene",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 len = array.length; for (...; i < len; ) { ... }",
            "patch": {
              "newText": "        for (uint256 i = 0; i < hashes.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
              "oldText": "        for (uint256 i = 0; i < hashes.length; i++) {"
            },
            "title": "Cache array length before loop",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:398",
            "before": "for (uint256 i = 0; i < hashes.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < hashes.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
            "oldText": "        for (uint256 i = 0; i < hashes.length; i++) {",
            "category": "storage",
            "severity": "info",
            "lineStart": 398,
            "rationale": "Caching storage array length avoids repeated SLOADs; using ++i/unchecked can reduce loop overhead.",
            "confidence": 0.82,
            "estL1Delta": null,
            "estL2Delta": 100,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 100,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "loop-hygiene",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "uint256 len = array.length; for (...; i < len; ) { ... }",
            "patch": {
              "newText": "        for (uint256 i = 0; i < allPositions.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
              "oldText": "        for (uint256 i = 0; i < allPositions.length; i++) {"
            },
            "title": "Cache array length before loop",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:512",
            "before": "for (uint256 i = 0; i < allPositions.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < allPositions.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
            "oldText": "        for (uint256 i = 0; i < allPositions.length; i++) {",
            "category": "storage",
            "severity": "info",
            "lineStart": 512,
            "rationale": "Caching storage array length avoids repeated SLOADs; using ++i/unchecked can reduce loop overhead.",
            "confidence": 0.82,
            "estL1Delta": null,
            "estL2Delta": 100,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 100,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "require(amount != 0, \"ZERO_AMOUNT\");",
            "patch": {
              "newText": "        require(amount != 0, \"ZERO_AMOUNT\");",
              "oldText": "        require(amount > 0, \"ZERO_AMOUNT\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:179",
            "before": "require(amount > 0, \"ZERO_AMOUNT\");",
            "safety": "safe",
            "newText": "        require(amount != 0, \"ZERO_AMOUNT\");",
            "oldText": "        require(amount > 0, \"ZERO_AMOUNT\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 179,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "if (fee != 0) {",
            "patch": {
              "newText": "        if (fee != 0) {",
              "oldText": "        if (fee > 0) {"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:187",
            "before": "if (fee > 0) {",
            "safety": "safe",
            "newText": "        if (fee != 0) {",
            "oldText": "        if (fee > 0) {",
            "category": "computation",
            "severity": "info",
            "lineStart": 187,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "require(reward != 0, \"NO_REWARD\");",
            "patch": {
              "newText": "        require(reward != 0, \"NO_REWARD\");",
              "oldText": "        require(reward > 0, \"NO_REWARD\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:226",
            "before": "require(reward > 0, \"NO_REWARD\");",
            "safety": "safe",
            "newText": "        require(reward != 0, \"NO_REWARD\");",
            "oldText": "        require(reward > 0, \"NO_REWARD\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 226,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "require(debtAmount != 0, \"ZERO_DEBT\");",
            "patch": {
              "newText": "        require(debtAmount != 0, \"ZERO_DEBT\");",
              "oldText": "        require(debtAmount > 0, \"ZERO_DEBT\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:284",
            "before": "require(debtAmount > 0, \"ZERO_DEBT\");",
            "safety": "safe",
            "newText": "        require(debtAmount != 0, \"ZERO_DEBT\");",
            "oldText": "        require(debtAmount > 0, \"ZERO_DEBT\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 284,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "require(amount != 0, \"ZERO_AMOUNT\");",
            "patch": {
              "newText": "        require(amount != 0, \"ZERO_AMOUNT\");",
              "oldText": "        require(amount > 0, \"ZERO_AMOUNT\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:301",
            "before": "require(amount > 0, \"ZERO_AMOUNT\");",
            "safety": "safe",
            "newText": "        require(amount != 0, \"ZERO_AMOUNT\");",
            "oldText": "        require(amount > 0, \"ZERO_AMOUNT\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 301,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "require(p.debt != 0, \"NO_DEBT\");",
            "patch": {
              "newText": "        require(p.debt != 0, \"NO_DEBT\");",
              "oldText": "        require(p.debt > 0, \"NO_DEBT\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:316",
            "before": "require(p.debt > 0, \"NO_DEBT\");",
            "safety": "safe",
            "newText": "        require(p.debt != 0, \"NO_DEBT\");",
            "oldText": "        require(p.debt > 0, \"NO_DEBT\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 316,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "require(maxAmount != 0, \"ZERO_MAX\");",
            "patch": {
              "newText": "        require(maxAmount != 0, \"ZERO_MAX\");",
              "oldText": "        require(maxAmount > 0, \"ZERO_MAX\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:422",
            "before": "require(maxAmount > 0, \"ZERO_MAX\");",
            "safety": "safe",
            "newText": "        require(maxAmount != 0, \"ZERO_MAX\");",
            "oldText": "        require(maxAmount > 0, \"ZERO_MAX\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 422,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "if (implementation != address(0) && arbitraryData.length != 0) {",
            "patch": {
              "newText": "        if (implementation != address(0) && arbitraryData.length != 0) {",
              "oldText": "        if (implementation != address(0) && arbitraryData.length > 0) {"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:461",
            "before": "if (implementation != address(0) && arbitraryData.length > 0) {",
            "safety": "safe",
            "newText": "        if (implementation != address(0) && arbitraryData.length != 0) {",
            "oldText": "        if (implementation != address(0) && arbitraryData.length > 0) {",
            "category": "computation",
            "severity": "info",
            "lineStart": 461,
            "rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "bitmap-bools",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(address => bool) public listedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(address => bool) public listedToken;"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:79",
            "before": "mapping(address => bool) public listedToken;",
            "safety": "review",
            "newText": "    mapping(address => bool) public listedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(address => bool) public listedToken;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 79,
            "rationale": "Bitmap packing can reduce many boolean SSTOREs from one slot per flag to one slot per 256 flags.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "bitmap-bools",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(address => bool) public keeper; // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(address => bool) public keeper;"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:80",
            "before": "mapping(address => bool) public keeper;",
            "safety": "review",
            "newText": "    mapping(address => bool) public keeper; // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(address => bool) public keeper;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 80,
            "rationale": "Bitmap packing can reduce many boolean SSTOREs from one slot per flag to one slot per 256 flags.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "bitmap-bools",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(address => bool) public frozen; // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(address => bool) public frozen;"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:81",
            "before": "mapping(address => bool) public frozen;",
            "safety": "review",
            "newText": "    mapping(address => bool) public frozen; // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(address => bool) public frozen;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 81,
            "rationale": "Bitmap packing can reduce many boolean SSTOREs from one slot per flag to one slot per 256 flags.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "bitmap-bools",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(bytes32 => bool) public reportExists; // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(bytes32 => bool) public reportExists;"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:87",
            "before": "mapping(bytes32 => bool) public reportExists;",
            "safety": "review",
            "newText": "    mapping(bytes32 => bool) public reportExists; // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(bytes32 => bool) public reportExists;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 87,
            "rationale": "Bitmap packing can reduce many boolean SSTOREs from one slot per flag to one slot per 256 flags.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "bitmap-bools",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(bytes32 => bool) public consumedMessages; // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(bytes32 => bool) public consumedMessages;"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:88",
            "before": "mapping(bytes32 => bool) public consumedMessages;",
            "safety": "review",
            "newText": "    mapping(bytes32 => bool) public consumedMessages; // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(bytes32 => bool) public consumedMessages;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 88,
            "rationale": "Bitmap packing can reduce many boolean SSTOREs from one slot per flag to one slot per 256 flags.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "remove-zero-init",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "for (uint256 i; i < ids.length; i++) {",
            "patch": {
              "newText": "        for (uint256 i; i < ids.length; i++) {",
              "oldText": "        for (uint256 i = 0; i < ids.length; i++) {"
            },
            "title": "Remove redundant zero initialization",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:274",
            "before": "for (uint256 i = 0; i < ids.length; i++) {",
            "safety": "safe",
            "newText": "        for (uint256 i; i < ids.length; i++) {",
            "oldText": "        for (uint256 i = 0; i < ids.length; i++) {",
            "category": "deployment",
            "severity": "info",
            "lineStart": 274,
            "rationale": "Solidity initializes variables to zero by default; explicit zero init adds bytecode/instructions.",
            "confidence": 0.86,
            "estL1Delta": 4,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": 4
          },
          {
            "id": "remove-zero-init",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "for (uint256 i; i < hashes.length; i++) {",
            "patch": {
              "newText": "        for (uint256 i; i < hashes.length; i++) {",
              "oldText": "        for (uint256 i = 0; i < hashes.length; i++) {"
            },
            "title": "Remove redundant zero initialization",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:398",
            "before": "for (uint256 i = 0; i < hashes.length; i++) {",
            "safety": "safe",
            "newText": "        for (uint256 i; i < hashes.length; i++) {",
            "oldText": "        for (uint256 i = 0; i < hashes.length; i++) {",
            "category": "deployment",
            "severity": "info",
            "lineStart": 398,
            "rationale": "Solidity initializes variables to zero by default; explicit zero init adds bytecode/instructions.",
            "confidence": 0.86,
            "estL1Delta": 4,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": 4
          },
          {
            "id": "remove-zero-init",
            "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
            "after": "for (uint256 i; i < allPositions.length; i++) {",
            "patch": {
              "newText": "        for (uint256 i; i < allPositions.length; i++) {",
              "oldText": "        for (uint256 i = 0; i < allPositions.length; i++) {"
            },
            "title": "Remove redundant zero initialization",
            "where": "MantleCompactRiskVault_Suite__4_contracts_.sol:512",
            "before": "for (uint256 i = 0; i < allPositions.length; i++) {",
            "safety": "safe",
            "newText": "        for (uint256 i; i < allPositions.length; i++) {",
            "oldText": "        for (uint256 i = 0; i < allPositions.length; i++) {",
            "category": "deployment",
            "severity": "info",
            "lineStart": 512,
            "rationale": "Solidity initializes variables to zero by default; explicit zero init adds bytecode/instructions.",
            "confidence": 0.86,
            "estL1Delta": 4,
            "estL2Delta": 3,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 3,
            "estimatedDataBytesSaved": 4
          }
        ]
      }
    },
    "scanId": "b92c9de2-5566-41dc-af0a-30a9bca4e5f7",
    "createdAt": "2026-06-16T15:28:08.622Z",
    "riskScore": 100,
    "contractName": "MantleCompactRiskVault_Suite__4_contracts_",
    "severityCounts": {
      "low": 46,
      "high": 13,
      "info": 38,
      "medium": 18,
      "critical": 0
    },
    "executiveSummary": "Archon completed a read-only Mantle Mainnet audit of MantleCompactRiskVault_Suite__4_contracts_ and found 115 deterministic findings. The highest-priority issue is Weak Prng, with risk score 100/100 based on severity-weighted findings. The weakRandomPayout function derives randomness entirely from predictable, miner/miner-influenced values (block.timestamp, block.prevrandao, block.number, msg.sender, tx.origin). This allows miners or validators to manipulate the outcome, potentially draining the vault. Review the recommended fixes and run regression tests before deployment."
  },
  "schema": "archon.proof.metadata.v1",
  "erc8004": {
    "verifiedConfig": true,
    "agentIdentityRef": "eip155:5000:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432:97",
    "identityRegistry": "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
    "reputationRegistry": "0x8004BAa17C55a88189AE136b182e5fdA19dE9b63",
    "validationRegistry": null
  },
  "product": "Archon",
  "findings": [
    {
      "id": "e33ceae3-c7fd-467c-8c03-10ee9ab3ab22",
      "title": "Weak Prng",
      "category": "weak-prng",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 442,
        "lineStart": 421
      },
      "severity": "high"
    },
    {
      "id": "a893ae7a-ec57-4e45-9190-1b3fe2f005dc",
      "title": "Controlled Delegatecall",
      "category": "controlled-delegatecall",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 495,
        "lineStart": 483
      },
      "severity": "high"
    },
    {
      "id": "ab2e3225-24f6-4f58-9a6a-11e2f3142ada",
      "title": "Encode Packed Collision",
      "category": "encode-packed-collision",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 467,
        "lineStart": 444
      },
      "severity": "high"
    },
    {
      "id": "85ecc6a0-ca18-4a8a-9b4a-2a70f837348e",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 209,
        "lineStart": 172
      },
      "severity": "high"
    },
    {
      "id": "f89fdc7c-6121-4152-9443-91dd01c4c5a0",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 503,
        "lineStart": 497
      },
      "severity": "high"
    },
    {
      "id": "2c8ca22d-8f50-4456-aeef-b3e1ddd4da13",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 442,
        "lineStart": 421
      },
      "severity": "high"
    },
    {
      "id": "6a0f9a53-c518-4a2d-8f6a-8c4932f39522",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 338,
        "lineStart": 312
      },
      "severity": "high"
    },
    {
      "id": "7f114546-11c4-4f32-8f0f-b22a66074581",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 310,
        "lineStart": 297
      },
      "severity": "high"
    },
    {
      "id": "9b3fa6d1-12d3-418f-b7e0-950098f950ed",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 251,
        "lineStart": 236
      },
      "severity": "high"
    },
    {
      "id": "7eb11dec-cfca-4bbf-8514-b3450f3ec681",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 295,
        "lineStart": 279
      },
      "severity": "high"
    },
    {
      "id": "c95198d3-b18a-43ef-b8f9-a642d89c1e90",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 270,
        "lineStart": 253
      },
      "severity": "high"
    },
    {
      "id": "92ec8d52-1175-4650-8851-cc783845d8cb",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 234,
        "lineStart": 219
      },
      "severity": "high"
    },
    {
      "id": "b45a2cb7-00af-41b7-9cc5-2b4bcc635f43",
      "title": "Reentrancy No Eth",
      "category": "reentrancy-no-eth",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 251,
        "lineStart": 236
      },
      "severity": "medium"
    },
    {
      "id": "f3f7c274-1f97-45ad-9a53-a1150a09aed5",
      "title": "Reentrancy No Eth",
      "category": "reentrancy-no-eth",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 270,
        "lineStart": 253
      },
      "severity": "medium"
    },
    {
      "id": "252efb42-ba9b-4e44-8b0b-7390bfbaa852",
      "title": "Reentrancy No Eth",
      "category": "reentrancy-no-eth",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 310,
        "lineStart": 297
      },
      "severity": "medium"
    },
    {
      "id": "4a859dc8-dcba-4fee-b2c6-8bfaac682293",
      "title": "Reentrancy No Eth",
      "category": "reentrancy-no-eth",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 234,
        "lineStart": 219
      },
      "severity": "medium"
    },
    {
      "id": "e652c44e-61d8-4210-8f85-1db418b84cad",
      "title": "Reentrancy No Eth",
      "category": "reentrancy-no-eth",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 338,
        "lineStart": 312
      },
      "severity": "medium"
    },
    {
      "id": "1dacdc41-613c-4c8e-b4eb-118e63d395fe",
      "title": "Tx Origin",
      "category": "tx-origin",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 503,
        "lineStart": 497
      },
      "severity": "medium"
    },
    {
      "id": "fe08711d-82fd-4766-b77b-19e855b6c421",
      "title": "Tx Origin",
      "category": "tx-origin",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 151,
        "lineStart": 147
      },
      "severity": "medium"
    },
    {
      "id": "1350bc83-6f6b-4574-9fde-956b686e78d9",
      "title": "Unchecked Lowlevel",
      "category": "unchecked-lowlevel",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 467,
        "lineStart": 444
      },
      "severity": "medium"
    },
    {
      "id": "969b3eaa-a99a-4cd2-9383-578ee253b20e",
      "title": "Unused Return",
      "category": "unused-return",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 270,
        "lineStart": 253
      },
      "severity": "medium"
    },
    {
      "id": "cff50318-ec65-481d-becd-9aa72a545751",
      "title": "Unused Return",
      "category": "unused-return",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 356,
        "lineStart": 348
      },
      "severity": "medium"
    },
    {
      "id": "50d0f271-47f9-45ec-9348-a1dea9099548",
      "title": "Events Access",
      "category": "events-access",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 156,
        "lineStart": 153
      },
      "severity": "low"
    },
    {
      "id": "bb135a7e-0209-43f3-b16b-440eb64ff2f7",
      "title": "Events Maths",
      "category": "events-maths",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 145,
        "lineStart": 142
      },
      "severity": "low"
    },
    {
      "id": "1f2c618d-bacb-496d-b171-82f9738a3e9e",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 113,
        "lineStart": 113
      },
      "severity": "low"
    },
    {
      "id": "57ce941d-0797-491e-b1ca-590562301bf5",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 483,
        "lineStart": 483
      },
      "severity": "low"
    },
    {
      "id": "d26d6d29-6847-4627-a5b6-59977ac85119",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 158,
        "lineStart": 158
      },
      "severity": "low"
    },
    {
      "id": "8a9217b9-ff6f-4045-bd34-9c5f74a51ca9",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 162,
        "lineStart": 162
      },
      "severity": "low"
    },
    {
      "id": "22eb9d31-2180-494e-9357-ad27021fd1f6",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 153,
        "lineStart": 153
      },
      "severity": "low"
    },
    {
      "id": "de4bbec7-ce99-4f42-bb8c-b24f8e18afe0",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 147,
        "lineStart": 147
      },
      "severity": "low"
    },
    {
      "id": "c163d694-29ba-4576-a860-f7ed22cb6be7",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 469,
        "lineStart": 469
      },
      "severity": "low"
    },
    {
      "id": "26990f40-1f9b-4c59-b045-b1e5c1bcbd70",
      "title": "Calls Loop",
      "category": "calls-loop",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 251,
        "lineStart": 236
      },
      "severity": "low"
    },
    {
      "id": "d1725d7b-f8e5-4c42-a451-8b06fd5016d2",
      "title": "Reentrancy Benign",
      "category": "reentrancy-benign",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 209,
        "lineStart": 172
      },
      "severity": "low"
    },
    {
      "id": "2498f80f-ef89-4778-bbfc-f94b419f3d06",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 295,
        "lineStart": 279
      },
      "severity": "low"
    },
    {
      "id": "2807556b-b686-42a8-8c81-e6e58449b0ef",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 234,
        "lineStart": 219
      },
      "severity": "low"
    },
    {
      "id": "cfae1fa2-043f-49aa-bd5f-02f0951e1949",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 467,
        "lineStart": 444
      },
      "severity": "low"
    },
    {
      "id": "202631e1-6b50-42c1-b4bc-b167bddf14bb",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 251,
        "lineStart": 236
      },
      "severity": "low"
    },
    {
      "id": "8ef26232-d74f-4ff6-8e57-13199686a309",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 270,
        "lineStart": 253
      },
      "severity": "low"
    },
    {
      "id": "1d7559f7-eb54-459d-8eeb-c3e23a681116",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 481,
        "lineStart": 469
      },
      "severity": "low"
    },
    {
      "id": "696cd6df-317d-49a8-97cb-cd985fdd49ec",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 338,
        "lineStart": 312
      },
      "severity": "low"
    },
    {
      "id": "2be2515d-5a8c-49af-a529-f45fbb435e4a",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 495,
        "lineStart": 483
      },
      "severity": "low"
    },
    {
      "id": "815b3aba-630b-4393-81e9-e95fd5cb0747",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 442,
        "lineStart": 421
      },
      "severity": "low"
    },
    {
      "id": "5524493d-9cfa-44f5-8687-71f2a1d2982e",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 209,
        "lineStart": 172
      },
      "severity": "low"
    },
    {
      "id": "3dc6f5c0-c3eb-4f8b-b8b7-b487057ea9ad",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 270,
        "lineStart": 253
      },
      "severity": "low"
    },
    {
      "id": "3ebecbe4-f077-41ba-bf6b-b3a532284860",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 234,
        "lineStart": 219
      },
      "severity": "low"
    },
    {
      "id": "84b007fc-d192-4c1c-b542-490520f75eb6",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 251,
        "lineStart": 236
      },
      "severity": "low"
    },
    {
      "id": "8a6fc7e1-69d7-4a43-ac7a-214117f83d4e",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 338,
        "lineStart": 312
      },
      "severity": "low"
    },
    {
      "id": "2dcd2898-61e1-41ea-9da6-2433742f6013",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 295,
        "lineStart": 279
      },
      "severity": "low"
    },
    {
      "id": "4277dc34-3902-4e03-b6c8-f009b6a87bb5",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 310,
        "lineStart": 297
      },
      "severity": "low"
    },
    {
      "id": "8a992670-de97-4bf6-a095-1bd825331b39",
      "title": "Costly Loop",
      "category": "costly-loop",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 382,
        "lineStart": 358
      },
      "severity": "info"
    },
    {
      "id": "c7da2a54-ed1f-4d39-bbc6-2d6f932a20e9",
      "title": "Low Level Calls",
      "category": "low-level-calls",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 481,
        "lineStart": 469
      },
      "severity": "info"
    },
    {
      "id": "c32f9c95-6910-43ef-afdb-9c2ae27ceb09",
      "title": "Low Level Calls",
      "category": "low-level-calls",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 495,
        "lineStart": 483
      },
      "severity": "info"
    },
    {
      "id": "2aa4931b-ffda-4f02-845e-b39b88994dff",
      "title": "Low Level Calls",
      "category": "low-level-calls",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 467,
        "lineStart": 444
      },
      "severity": "info"
    },
    {
      "id": "5d009eb8-ddfd-4798-aca5-ffcc7c92ee01",
      "title": "Cache Array Length",
      "category": "cache-array-length",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 512,
        "lineStart": 512
      },
      "severity": "low"
    },
    {
      "id": "4571d6a8-73a6-4e60-8c35-51841d44c946",
      "title": "Constable States",
      "category": "constable-states",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 53,
        "lineStart": 53
      },
      "severity": "low"
    },
    {
      "id": "a0b96aec-72ba-42c5-b1bc-22a0a6cf1942",
      "title": "Constable States",
      "category": "constable-states",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 54,
        "lineStart": 54
      },
      "severity": "low"
    },
    {
      "id": "65a526b3-4dec-4405-86c6-3df3a3528826",
      "title": "Constable States",
      "category": "constable-states",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 57,
        "lineStart": 57
      },
      "severity": "low"
    },
    {
      "id": "a1cf37f1-0c90-4087-8007-066541671be4",
      "title": "Immutable States",
      "category": "immutable-states",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 44,
        "lineStart": 44
      },
      "severity": "low"
    },
    {
      "id": "b63d74ce-fe76-4d57-84e0-6cbd6bb94018",
      "title": "Immutable States",
      "category": "immutable-states",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 43,
        "lineStart": 43
      },
      "severity": "low"
    },
    {
      "id": "711d776f-8635-4a2c-9dfb-998de31fea52",
      "title": "tx.origin authorization can be phished through proxy calls",
      "category": "mantle-origin-auth",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": null,
        "lineStart": 11
      },
      "severity": "high"
    },
    {
      "id": "090c1735-2f0e-4e67-b778-86e3709e2d19",
      "title": "Timestamp-sensitive settlement lacks explicit tolerance window",
      "category": "mantle-timestamp-assumption",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": null,
        "lineStart": 198
      },
      "severity": "medium"
    },
    {
      "id": "1d8ac032-9b8b-46d3-abbc-678789566b76",
      "title": "Pack small storage variables into fewer slots",
      "category": "mantle-gas-optimizer/storage/storage-packing",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 83,
        "lineStart": 83
      },
      "severity": "medium"
    },
    {
      "id": "1c785423-40d2-49e8-8126-70d208f8dd45",
      "title": "Pack small storage variables into fewer slots",
      "category": "mantle-gas-optimizer/storage/storage-packing",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 88,
        "lineStart": 88
      },
      "severity": "medium"
    },
    {
      "id": "319d43da-05a6-40b3-8bc2-0cda5b714e5f",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 24,
        "lineStart": 24
      },
      "severity": "low"
    },
    {
      "id": "657b7aeb-ccc6-4fc3-849d-ba1fc8afba4d",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 25,
        "lineStart": 25
      },
      "severity": "low"
    },
    {
      "id": "cbb41058-851c-4c17-bf4f-4519acc9cab2",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 35,
        "lineStart": 35
      },
      "severity": "low"
    },
    {
      "id": "2d901f17-6b4a-41ba-9691-a5f56615a255",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 211,
        "lineStart": 211
      },
      "severity": "low"
    },
    {
      "id": "8f3e2db6-76b3-4afa-b556-6c36f06bce02",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 219,
        "lineStart": 219
      },
      "severity": "low"
    },
    {
      "id": "fca5ff04-5182-4136-a4e6-42e99f678b73",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 236,
        "lineStart": 236
      },
      "severity": "low"
    },
    {
      "id": "9cfc8030-e3a5-421b-92bd-bd6123bbd088",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 253,
        "lineStart": 253
      },
      "severity": "low"
    },
    {
      "id": "cec05681-76f9-490b-b40c-92c8078d4bdd",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 279,
        "lineStart": 279
      },
      "severity": "low"
    },
    {
      "id": "38a7768a-bbd9-46b8-9a28-09de76f5c76c",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 297,
        "lineStart": 297
      },
      "severity": "low"
    },
    {
      "id": "b0ff2b0d-5f09-4060-b83c-a964db5ebbc6",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 312,
        "lineStart": 312
      },
      "severity": "low"
    },
    {
      "id": "0a8696f6-9773-48c9-ab43-8ec3909b0ae5",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 340,
        "lineStart": 340
      },
      "severity": "low"
    },
    {
      "id": "cdcfd9f9-2a85-4f41-8ad5-d9b8cdbda38c",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 348,
        "lineStart": 348
      },
      "severity": "low"
    },
    {
      "id": "051e44d2-cd04-4593-8be4-627173770562",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 497,
        "lineStart": 497
      },
      "severity": "low"
    },
    {
      "id": "81d70e3e-290d-4ec0-b2f6-b2192c14f3d4",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 149,
        "lineStart": 149
      },
      "severity": "info"
    },
    {
      "id": "2c25e400-9db9-4be0-b0be-0c5bde606cd6",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 178,
        "lineStart": 178
      },
      "severity": "info"
    },
    {
      "id": "3aa8f4bc-088b-4c35-9b1a-1cf7c6144c4d",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 222,
        "lineStart": 222
      },
      "severity": "info"
    },
    {
      "id": "1f0cce85-fe59-4a4a-bd3c-c4cbebff7ef4",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 239,
        "lineStart": 239
      },
      "severity": "info"
    },
    {
      "id": "6eaa24fa-e878-4491-a2bb-4226360f48f3",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 256,
        "lineStart": 256
      },
      "severity": "info"
    },
    {
      "id": "8ff7a261-02b8-4818-8ab4-89d2fedb768d",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 282,
        "lineStart": 282
      },
      "severity": "info"
    },
    {
      "id": "eed8d896-5bdb-452e-93d2-9a2d4539e7e0",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 287,
        "lineStart": 287
      },
      "severity": "info"
    },
    {
      "id": "88bbabaa-e64e-4d93-baf3-58754351bd07",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 300,
        "lineStart": 300
      },
      "severity": "info"
    },
    {
      "id": "9c7f200b-052d-4527-9706-1978b2af8d87",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 457,
        "lineStart": 457
      },
      "severity": "info"
    },
    {
      "id": "07f0ff28-95fd-437d-ba3a-05ac486aebe6",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 494,
        "lineStart": 494
      },
      "severity": "info"
    },
    {
      "id": "ba4e0c1a-62f9-4bd5-b6b2-aebe4b941d30",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 500,
        "lineStart": 500
      },
      "severity": "info"
    },
    {
      "id": "ca36b9bc-6fc1-41a4-a43b-abe3f3881db3",
      "title": "Mark never-changing value constant or immutable",
      "category": "mantle-gas-optimizer/storage/immutable-constant",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 42,
        "lineStart": 42
      },
      "severity": "info"
    },
    {
      "id": "dbf225b3-2457-477c-b932-b2cd7fce2e03",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 135,
        "lineStart": 135
      },
      "severity": "info"
    },
    {
      "id": "d57d80c7-7b14-4017-9d9a-aa251f72ccf8",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 193,
        "lineStart": 193
      },
      "severity": "info"
    },
    {
      "id": "f4b7c627-ec4c-412a-b103-ca520a374721",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 365,
        "lineStart": 365
      },
      "severity": "info"
    },
    {
      "id": "67f4cc6c-597c-4dc7-8cdb-03e766d34d2d",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 399,
        "lineStart": 399
      },
      "severity": "info"
    },
    {
      "id": "4499166d-7f43-4e33-bcde-009f54a0d11f",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 457,
        "lineStart": 457
      },
      "severity": "info"
    },
    {
      "id": "16890fbe-d781-4d50-b06e-b848e0e7a5a6",
      "title": "Use unchecked loop increment where bounded",
      "category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 274,
        "lineStart": 274
      },
      "severity": "info"
    },
    {
      "id": "d302cf08-d73f-4570-976b-3b986ee8eba6",
      "title": "Use unchecked loop increment where bounded",
      "category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 398,
        "lineStart": 398
      },
      "severity": "info"
    },
    {
      "id": "63bdbd13-98f7-4fe7-afcf-10b6c466978c",
      "title": "Use unchecked loop increment where bounded",
      "category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 512,
        "lineStart": 512
      },
      "severity": "info"
    },
    {
      "id": "5b4ce148-6eab-4d9c-a39c-9257f3f70d85",
      "title": "Cache array length before loop",
      "category": "mantle-gas-optimizer/storage/loop-hygiene",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 274,
        "lineStart": 274
      },
      "severity": "info"
    },
    {
      "id": "8590bcdc-a259-4be0-b9cc-34c14ab734b5",
      "title": "Cache array length before loop",
      "category": "mantle-gas-optimizer/storage/loop-hygiene",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 398,
        "lineStart": 398
      },
      "severity": "info"
    },
    {
      "id": "043d9cf7-4dac-4ca0-b9c1-e820e4f78758",
      "title": "Cache array length before loop",
      "category": "mantle-gas-optimizer/storage/loop-hygiene",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 512,
        "lineStart": 512
      },
      "severity": "info"
    },
    {
      "id": "e6abeeaa-abcd-4b1e-a51c-08bc098a6158",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 179,
        "lineStart": 179
      },
      "severity": "info"
    },
    {
      "id": "2ff9b6c1-c8c1-4140-91bb-ebee094af5e0",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 187,
        "lineStart": 187
      },
      "severity": "info"
    },
    {
      "id": "05e29541-c2b2-4c3e-b8fd-2d478321d55c",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 226,
        "lineStart": 226
      },
      "severity": "info"
    },
    {
      "id": "f2177625-567d-4e43-a5c2-326f021bcd98",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 284,
        "lineStart": 284
      },
      "severity": "info"
    },
    {
      "id": "60ab624a-c74d-4ae1-917e-63c39bbb60cd",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 301,
        "lineStart": 301
      },
      "severity": "info"
    },
    {
      "id": "adaa081a-47ad-4e22-acf7-dbd444545cac",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 316,
        "lineStart": 316
      },
      "severity": "info"
    },
    {
      "id": "6e1d50ef-3dff-473f-970c-81ed074789e3",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 422,
        "lineStart": 422
      },
      "severity": "info"
    },
    {
      "id": "a453cca3-9ba9-4534-be5b-4f02963850f7",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 461,
        "lineStart": 461
      },
      "severity": "info"
    },
    {
      "id": "b14c3ce4-95df-4b89-99d6-4390a79b8941",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 79,
        "lineStart": 79
      },
      "severity": "medium"
    },
    {
      "id": "8853fefb-db2c-4659-afb2-91fe0b2bb832",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 80,
        "lineStart": 80
      },
      "severity": "medium"
    },
    {
      "id": "c9ff88c1-cfa9-4994-8831-2dc486ba59b0",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 81,
        "lineStart": 81
      },
      "severity": "medium"
    },
    {
      "id": "95214460-95a0-401d-8c80-c2cd11f955f4",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 87,
        "lineStart": 87
      },
      "severity": "medium"
    },
    {
      "id": "f59739bb-771d-437e-a331-9c82770bba42",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 88,
        "lineStart": 88
      },
      "severity": "medium"
    },
    {
      "id": "14de395a-0635-4c92-bfd6-e4e82b6ebeaf",
      "title": "Remove redundant zero initialization",
      "category": "mantle-gas-optimizer/deployment/remove-zero-init",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 274,
        "lineStart": 274
      },
      "severity": "info"
    },
    {
      "id": "5cba8a67-927a-4cef-85d0-65819e9151f0",
      "title": "Remove redundant zero initialization",
      "category": "mantle-gas-optimizer/deployment/remove-zero-init",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 398,
        "lineStart": 398
      },
      "severity": "info"
    },
    {
      "id": "b217e33c-2799-4f44-a216-50ca7e752fb1",
      "title": "Remove redundant zero initialization",
      "category": "mantle-gas-optimizer/deployment/remove-zero-init",
      "location": {
        "file": "MantleCompactRiskVault_Suite__4_contracts_.sol",
        "lineEnd": 512,
        "lineStart": 512
      },
      "severity": "info"
    }
  ]
}
source URI: ipfs://QmXnUMXbbkh5u3TXxdiFNFkw1o4j8FsmPiKeQeKhramuqV