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

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

Feedback #14

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": "13358d24-581d-4002-ab61-53df50c3f82d",
    "scope": {
      "pragma": "^0.8.24",
      "network": "mantle-mainnet",
      "lineCount": 223,
      "protocols": [
        "mETH",
        "cmETH",
        "USDY",
        "Aave V3",
        "Merchant Moe",
        "Agni"
      ],
      "sourceKind": "paste",
      "aiReasoning": {
        "hits": 0,
        "total": 46,
        "misses": 46,
        "batches": 8,
        "reasons": {
          "bounded": 30
        },
        "skipped": 30,
        "provider": "tokenhub",
        "timeoutMs": 75000,
        "fallbackCount": 30,
        "providersUsed": [
          "Tencent Cloud TokenHub (deepseek-v4-pro)"
        ]
      },
      "reducedMode": null,
      "solcVersion": "0.8.24",
      "gasOptimizer": {
        "pricing": {
          "mode": "calibrated-receipts",
          "pricedAt": "2026-06-16T15:30:05.622Z",
          "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": "0x8edb0c030d630263e46a3935e2b348a8266a08b7a0fcec47d038214547d6c7fc",
        "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": "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 deposit(address token, 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 withdraw(address token, 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 borrow(address token, 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 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 emergencySweep(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 TOKENNOTSUPPORTED(); … if (!(condition)) revert TOKENNOTSUPPORTED();",
              "before": "require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
              "before": "require(a.balance >= amount, \"INSUFFICIENT_BALANCE\");",
              "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 = supportedToken[token]; // reuse cached value",
              "before": "supportedToken[token] 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 = accounts[msg.sender]; // reuse cached value",
              "before": "accounts[msg.sender] read 5 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 400,
              "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(maxAmount != 0, \"ZERO_MAX\");",
              "before": "require(maxAmount > 0, \"ZERO_MAX\");",
              "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 supportedToken;",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            }
          ],
          "version": "archon.gasMeasurement.v1",
          "measuredAt": "2026-06-16T15:30:05.940Z",
          "rulesetHash": "944bf338e6e8e9d019e689b2fca97176345bab3dac5815ba2b2578d969654087",
          "contractHash": "8edb0c030d630263e46a3935e2b348a8266a08b7a0fcec47d038214547d6c7fc"
        },
        "opportunities": [
          {
            "id": "calldata-smaller-types",
            "file": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:21",
            "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": 21,
            "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": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:22",
            "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": 22,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function deposit(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function deposit(address token, uint256 amount) external notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:107",
            "before": "function deposit(address token, uint256 amount) external notPaused {",
            "safety": "review",
            "newText": "    function deposit(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function deposit(address token, uint256 amount) external notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 107,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function withdraw(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function withdraw(address token, uint256 amount) external notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:146",
            "before": "function withdraw(address token, uint256 amount) external notPaused {",
            "safety": "review",
            "newText": "    function withdraw(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function withdraw(address token, uint256 amount) external notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 146,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function borrow(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function borrow(address token, uint256 amount) external notPaused {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:159",
            "before": "function borrow(address token, uint256 amount) external notPaused {",
            "safety": "review",
            "newText": "    function borrow(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function borrow(address token, uint256 amount) external notPaused {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 159,
            "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": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:173",
            "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": 173,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function emergencySweep(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function emergencySweep(address token, address to, uint256 amount) external {"
            },
            "title": "Review calldata parameter width",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:216",
            "before": "function emergencySweep(address token, address to, uint256 amount) external {",
            "safety": "review",
            "newText": "    function emergencySweep(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function emergencySweep(address token, address to, uint256 amount) external {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 216,
            "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": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:95",
            "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": 95,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "error TOKENNOTSUPPORTED(); … if (!(condition)) revert TOKENNOTSUPPORTED();",
            "patch": {
              "newText": "        if (!(supportedToken[token])) revert TOKENNOTSUPPORTED();",
              "oldText": "        require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:108",
            "before": "require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");",
            "safety": "safe",
            "newText": "        if (!(supportedToken[token])) revert TOKENNOTSUPPORTED();",
            "oldText": "        require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 108,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
            "patch": {
              "newText": "        if (!(a.balance >= amount)) revert INSUFFICIENTBALANCE();",
              "oldText": "        require(a.balance >= amount, \"INSUFFICIENT_BALANCE\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:149",
            "before": "require(a.balance >= amount, \"INSUFFICIENT_BALANCE\");",
            "safety": "safe",
            "newText": "        if (!(a.balance >= amount)) revert INSUFFICIENTBALANCE();",
            "oldText": "        require(a.balance >= amount, \"INSUFFICIENT_BALANCE\");",
            "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": 20,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 20
          },
          {
            "id": "custom-errors",
            "file": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:219",
            "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": 219,
            "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": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:32",
            "before": "address public owner;",
            "safety": "review",
            "newText": "    address immutable public owner;",
            "oldText": "    address public owner;",
            "category": "storage",
            "severity": "info",
            "lineStart": 32,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "uint256 cached = supportedToken[token]; // reuse cached value",
            "patch": {
              "newText": "supportedToken[token]",
              "oldText": "supportedToken[token]"
            },
            "title": "Cache repeated storage read",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:85",
            "before": "supportedToken[token] read 2 times",
            "safety": "review",
            "newText": "supportedToken[token]",
            "oldText": "supportedToken[token]",
            "category": "storage",
            "severity": "info",
            "lineStart": 85,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "uint256 cached = accounts[msg.sender]; // reuse cached value",
            "patch": {
              "newText": "accounts[msg.sender]",
              "oldText": "accounts[msg.sender]"
            },
            "title": "Cache repeated storage read",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:121",
            "before": "accounts[msg.sender] read 5 times",
            "safety": "review",
            "newText": "accounts[msg.sender]",
            "oldText": "accounts[msg.sender]",
            "category": "storage",
            "severity": "info",
            "lineStart": 121,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 400,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 400,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "nonzero-comparison",
            "file": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:109",
            "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": 109,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "if (fee != 0) {",
            "patch": {
              "newText": "        if (fee != 0) {",
              "oldText": "        if (fee > 0) {"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:117",
            "before": "if (fee > 0) {",
            "safety": "safe",
            "newText": "        if (fee != 0) {",
            "oldText": "        if (fee > 0) {",
            "category": "computation",
            "severity": "info",
            "lineStart": 117,
            "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": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:136",
            "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": 136,
            "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": "MantleMiniRiskVault_Suite__3_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": "MantleMiniRiskVault_Suite__3_contracts_.sol:200",
            "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": 200,
            "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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(address => bool) public supportedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(address => bool) public supportedToken;"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "MantleMiniRiskVault_Suite__3_contracts_.sol:57",
            "before": "mapping(address => bool) public supportedToken;",
            "safety": "review",
            "newText": "    mapping(address => bool) public supportedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(address => bool) public supportedToken;",
            "category": "storage",
            "severity": "medium",
            "lineStart": 57,
            "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
          }
        ]
      }
    },
    "scanId": "b7e82a3d-5ab5-464b-93b2-f53dadd9128f",
    "createdAt": "2026-06-16T15:37:10.291Z",
    "riskScore": 100,
    "contractName": "MantleMiniRiskVault_Suite__3_contracts_",
    "severityCounts": {
      "low": 21,
      "high": 8,
      "info": 11,
      "medium": 6,
      "critical": 0
    },
    "executiveSummary": "Archon completed a read-only Mantle Mainnet audit of MantleMiniRiskVault_Suite__3_contracts_ and found 46 deterministic findings. The highest-priority issue is Weak Prng, with risk score 100/100 based on severity-weighted findings. The `weakRandomPayout` function relies on the predictable blockchain parameters `block.timestamp`, `block.prevrandao`, and `msg.sender` as a source of entropy, making the generated random amount easily manipulable by miners/validators on Mantle. This enables an attacker to call the function and receive the maximum possible payout on every transaction. 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": "ad8694c4-1626-424d-903c-a22c465305a8",
      "title": "Weak Prng",
      "category": "weak-prng",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 210,
        "lineStart": 199
      },
      "severity": "high"
    },
    {
      "id": "0e23f14b-6ee0-409b-893e-6cc20ae09421",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 144,
        "lineStart": 132
      },
      "severity": "high"
    },
    {
      "id": "41c4a5fc-a280-438b-88b9-6c25e9b916ac",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 210,
        "lineStart": 199
      },
      "severity": "high"
    },
    {
      "id": "10adb16c-c05c-43f6-94f2-ade621421ef7",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 125,
        "lineStart": 107
      },
      "severity": "high"
    },
    {
      "id": "bbf2217d-b6e6-45e2-b922-264dafa0628d",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 157,
        "lineStart": 146
      },
      "severity": "high"
    },
    {
      "id": "9092fbc8-9c2c-4409-81bc-00b2a2f77f34",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 171,
        "lineStart": 159
      },
      "severity": "high"
    },
    {
      "id": "13ad3a99-c9b4-465f-93ac-bd754df77882",
      "title": "Unchecked Transfer",
      "category": "unchecked-transfer",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 222,
        "lineStart": 216
      },
      "severity": "high"
    },
    {
      "id": "46f52e43-6bcf-4277-96f2-d77194d30ff3",
      "title": "Reentrancy No Eth",
      "category": "reentrancy-no-eth",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 157,
        "lineStart": 146
      },
      "severity": "medium"
    },
    {
      "id": "e360a3b5-23b7-463c-b100-139cc7a805b6",
      "title": "Reentrancy No Eth",
      "category": "reentrancy-no-eth",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 144,
        "lineStart": 132
      },
      "severity": "medium"
    },
    {
      "id": "60e6bf00-0323-40c9-be43-d2ca29b42e6a",
      "title": "Tx Origin",
      "category": "tx-origin",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 97,
        "lineStart": 93
      },
      "severity": "medium"
    },
    {
      "id": "e3b17426-013c-4226-a6a8-7a0a7516ce95",
      "title": "Tx Origin",
      "category": "tx-origin",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 222,
        "lineStart": 216
      },
      "severity": "medium"
    },
    {
      "id": "038bf7b3-d760-4722-a0b2-40aee4c65278",
      "title": "Unused Return",
      "category": "unused-return",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 179,
        "lineStart": 173
      },
      "severity": "medium"
    },
    {
      "id": "a134824f-77e0-4d8f-8ee3-85188fd3d173",
      "title": "Events Maths",
      "category": "events-maths",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 91,
        "lineStart": 88
      },
      "severity": "low"
    },
    {
      "id": "3182ca12-961f-4320-88ee-436dd61e3d38",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 93,
        "lineStart": 93
      },
      "severity": "low"
    },
    {
      "id": "7cdd1a4c-5948-422f-a346-5035f5b8912e",
      "title": "Missing Zero Check",
      "category": "missing-zero-check",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 78,
        "lineStart": 78
      },
      "severity": "low"
    },
    {
      "id": "af114a5e-b72c-49bf-95a9-0dbca9f9dd76",
      "title": "Reentrancy Benign",
      "category": "reentrancy-benign",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 125,
        "lineStart": 107
      },
      "severity": "low"
    },
    {
      "id": "918d54b3-c155-4a0b-9381-4796ba3e8ebe",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 210,
        "lineStart": 199
      },
      "severity": "low"
    },
    {
      "id": "378c06f5-4eeb-4fed-842e-bfb8a44e642e",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 157,
        "lineStart": 146
      },
      "severity": "low"
    },
    {
      "id": "73b778ce-3a6b-4bc3-995f-759f52af61cd",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 125,
        "lineStart": 107
      },
      "severity": "low"
    },
    {
      "id": "a884c119-d6af-42fe-86ee-24d387832c93",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 144,
        "lineStart": 132
      },
      "severity": "low"
    },
    {
      "id": "f9090238-86f2-4988-a5e6-775566b03ca9",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 171,
        "lineStart": 159
      },
      "severity": "low"
    },
    {
      "id": "5b9e4c0f-9bc8-471e-a97c-8bb7d5688f75",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 157,
        "lineStart": 146
      },
      "severity": "low"
    },
    {
      "id": "594f5038-d0a8-4e72-ad3a-c6b4c163ebf1",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 144,
        "lineStart": 132
      },
      "severity": "low"
    },
    {
      "id": "bca84ab7-6772-465b-a817-f932bac6f31a",
      "title": "Constable States",
      "category": "constable-states",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 40,
        "lineStart": 40
      },
      "severity": "low"
    },
    {
      "id": "9143f6a0-abf0-4da1-9b46-bc37caab6008",
      "title": "Immutable States",
      "category": "immutable-states",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 32,
        "lineStart": 32
      },
      "severity": "low"
    },
    {
      "id": "ce592b56-657c-41c2-b1b5-9be5347b2d0b",
      "title": "Immutable States",
      "category": "immutable-states",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 33,
        "lineStart": 33
      },
      "severity": "low"
    },
    {
      "id": "3af02e19-f63e-46aa-9335-78dc16d6789b",
      "title": "tx.origin authorization can be phished through proxy calls",
      "category": "mantle-origin-auth",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": null,
        "lineStart": 12
      },
      "severity": "high"
    },
    {
      "id": "93515712-03cb-4e1e-ab89-9a82aa4090c2",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 21,
        "lineStart": 21
      },
      "severity": "low"
    },
    {
      "id": "fa20e977-b14a-4d39-a2b0-e8bb6be4e068",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 22,
        "lineStart": 22
      },
      "severity": "low"
    },
    {
      "id": "47c9ca80-cf3e-484a-a524-7f79c0289561",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 107,
        "lineStart": 107
      },
      "severity": "low"
    },
    {
      "id": "701f6b71-bd5e-44b6-83dc-bf51e7ef9413",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 146,
        "lineStart": 146
      },
      "severity": "low"
    },
    {
      "id": "6de17b1b-ebc8-4b78-834d-60c31d993d9c",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 159,
        "lineStart": 159
      },
      "severity": "low"
    },
    {
      "id": "5c478a7d-e995-4bba-81eb-5bc5c8c9e118",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 173,
        "lineStart": 173
      },
      "severity": "low"
    },
    {
      "id": "fcaac062-ceb0-411e-985e-1b2a4294162c",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 216,
        "lineStart": 216
      },
      "severity": "low"
    },
    {
      "id": "37d079a8-39b9-479c-aa3e-94707da3f898",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 95,
        "lineStart": 95
      },
      "severity": "info"
    },
    {
      "id": "c34c149f-7f95-4cfa-9edd-e568cf907820",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 108,
        "lineStart": 108
      },
      "severity": "info"
    },
    {
      "id": "7c03581a-815f-41f6-92b7-8094e3abc82b",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 149,
        "lineStart": 149
      },
      "severity": "info"
    },
    {
      "id": "7ded3483-1d64-4ccf-947a-a8fb717a4cc5",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 219,
        "lineStart": 219
      },
      "severity": "info"
    },
    {
      "id": "2fa16c8b-b602-40e7-baf1-83c1be1ae603",
      "title": "Mark never-changing value constant or immutable",
      "category": "mantle-gas-optimizer/storage/immutable-constant",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 32,
        "lineStart": 32
      },
      "severity": "info"
    },
    {
      "id": "ecb1aa1e-f141-48b4-9e25-8a411329e2c8",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 85,
        "lineStart": 85
      },
      "severity": "info"
    },
    {
      "id": "a0cd46ce-2693-4115-9543-a6bc6bd452e4",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 121,
        "lineStart": 121
      },
      "severity": "info"
    },
    {
      "id": "1efb4ac3-45dc-4807-b0d2-2522fe7e8e54",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 109,
        "lineStart": 109
      },
      "severity": "info"
    },
    {
      "id": "2f5334ef-8708-4dd5-a4bf-223f45547293",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 117,
        "lineStart": 117
      },
      "severity": "info"
    },
    {
      "id": "526e07cc-ea73-40a5-8e37-67f0b51c5019",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 136,
        "lineStart": 136
      },
      "severity": "info"
    },
    {
      "id": "61ed3297-dd67-43e3-a0dc-ed8d132258ee",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 200,
        "lineStart": 200
      },
      "severity": "info"
    },
    {
      "id": "07176a98-222c-42b1-95f7-fcb65678bb64",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
        "lineEnd": 57,
        "lineStart": 57
      },
      "severity": "medium"
    }
  ]
}
source URI: ipfs://QmbLmZa8RadLjcaF2eJWyBQiPDVkxokgDwEGGf7sznbhXv