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

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

Feedback #26

For agent 97 on Mantle Mainnet · 2026-07-01

archon.audit.report
100.0

Off-chain feedback document

raw JSON
{
  "chain": {
    "name": "Mantle Mainnet",
    "chainId": 5000
  },
  "report": {
    "id": "8cecfb7e-6607-4e82-ae50-fb4f849b68d1",
    "scope": {
      "pragma": "^0.8.24",
      "network": "mantle-mainnet",
      "lineCount": 63,
      "protocols": [
        "mETH",
        "cmETH",
        "USDY",
        "Aave V3",
        "Merchant Moe",
        "Agni"
      ],
      "sourceKind": "paste",
      "aiReasoning": {
        "hits": 17,
        "total": 17,
        "misses": 0,
        "batches": 0,
        "skipped": 0,
        "enriched": 0,
        "provider": "tokenhub",
        "timeoutMs": 75000,
        "fallbackCount": 0,
        "providersUsed": []
      },
      "reducedMode": null,
      "solcVersion": "0.8.24",
      "gasOptimizer": {
        "pricing": {
          "mode": "calibrated-receipts",
          "pricedAt": "2026-07-01T18:52:22.330Z",
          "l2GasPriceWei": "50000100000",
          "deployDataFeeMnt": "0.006395246020247076",
          "deployDataFeeWei": "6395246020247076",
          "calldataZeroBytes": 24,
          "calibrationErrorPct": 0,
          "calldataGasEstimate": 28656,
          "calldataNonZeroBytes": 1785,
          "creationBytecodeBytes": 1809
        },
        "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": "0xd7d6b27a06d59cc30ccd87bc372addb959896ab00f9ff8263077e2eab57bfaab",
        "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 withdraw(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 INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
              "before": "require(balances[msg.sender] >= 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 INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
              "before": "require(balances[msg.sender] >= amountIn, \"INSUFFICIENT_BALANCE\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = balances[msg.sender]; // reuse cached value",
              "before": "balances[msg.sender] read 7 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 600,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "for (uint256 i = 0; i < depositors.length; unchecked { ++i; }) {",
              "before": "for (uint256 i = 0; i < depositors.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 < depositors.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(msg.value != 0, \"NO_VALUE\");",
              "before": "require(msg.value > 0, \"NO_VALUE\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "require(amountIn != 0, \"BAD_AMOUNT\");",
              "before": "require(amountIn > 0, \"BAD_AMOUNT\");",
              "ruleId": "nonzero-comparison",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "for (uint256 i; i < depositors.length; i++) {",
              "before": "for (uint256 i = 0; i < depositors.length; i++) {",
              "ruleId": "remove-zero-init",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 3,
              "l1DaDeltaWei": null
            }
          ],
          "version": "archon.gasMeasurement.v1",
          "measuredAt": "2026-06-15T07:27:41.549Z",
          "rulesetHash": "72a68b7ce6f5e5608c921f739be80a1ee353f022dafe9e4452ede5edf06fcca2",
          "contractHash": "d7d6b27a06d59cc30ccd87bc372addb959896ab00f9ff8263077e2eab57bfaab"
        },
        "opportunities": [
          {
            "id": "calldata-smaller-types",
            "file": "VaultV2.sol",
            "after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
            "patch": {
              "newText": "    function withdraw(uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
              "oldText": "    function withdraw(uint256 amount) external {"
            },
            "title": "Review calldata parameter width",
            "where": "VaultV2.sol:27",
            "before": "function withdraw(uint256 amount) external {",
            "safety": "review",
            "newText": "    function withdraw(uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
            "oldText": "    function withdraw(uint256 amount) external {",
            "category": "calldata",
            "severity": "low",
            "lineStart": 27,
            "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": "VaultV2.sol",
            "after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
            "patch": {
              "newText": "        if (!(balances[msg.sender] >= amount)) revert INSUFFICIENTBALANCE();",
              "oldText": "        require(balances[msg.sender] >= amount, \"INSUFFICIENT_BALANCE\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "VaultV2.sol:28",
            "before": "require(balances[msg.sender] >= amount, \"INSUFFICIENT_BALANCE\");",
            "safety": "safe",
            "newText": "        if (!(balances[msg.sender] >= amount)) revert INSUFFICIENTBALANCE();",
            "oldText": "        require(balances[msg.sender] >= amount, \"INSUFFICIENT_BALANCE\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 28,
            "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": "VaultV2.sol",
            "after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
            "patch": {
              "newText": "        if (!(balances[msg.sender] >= amountIn)) revert INSUFFICIENTBALANCE();",
              "oldText": "        require(balances[msg.sender] >= amountIn, \"INSUFFICIENT_BALANCE\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "VaultV2.sol:41",
            "before": "require(balances[msg.sender] >= amountIn, \"INSUFFICIENT_BALANCE\");",
            "safety": "safe",
            "newText": "        if (!(balances[msg.sender] >= amountIn)) revert INSUFFICIENTBALANCE();",
            "oldText": "        require(balances[msg.sender] >= amountIn, \"INSUFFICIENT_BALANCE\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 41,
            "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": "cache-repeated-sload",
            "file": "VaultV2.sol",
            "after": "uint256 cached = balances[msg.sender]; // reuse cached value",
            "patch": {
              "newText": "balances[msg.sender]",
              "oldText": "balances[msg.sender]"
            },
            "title": "Cache repeated storage read",
            "where": "VaultV2.sol:18",
            "before": "balances[msg.sender] read 7 times",
            "safety": "review",
            "newText": "balances[msg.sender]",
            "oldText": "balances[msg.sender]",
            "category": "storage",
            "severity": "info",
            "lineStart": 18,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 600,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 600,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "unchecked-loop-increment",
            "file": "VaultV2.sol",
            "after": "for (uint256 i = 0; i < depositors.length; unchecked { ++i; }) {",
            "patch": {
              "newText": "        for (uint256 i = 0; i < depositors.length; ++i /* wrap increment in unchecked block after refactor */) {",
              "oldText": "        for (uint256 i = 0; i < depositors.length; i++) {"
            },
            "title": "Use unchecked loop increment where bounded",
            "where": "VaultV2.sol:55",
            "before": "for (uint256 i = 0; i < depositors.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < depositors.length; ++i /* wrap increment in unchecked block after refactor */) {",
            "oldText": "        for (uint256 i = 0; i < depositors.length; i++) {",
            "category": "computation",
            "severity": "info",
            "lineStart": 55,
            "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": "VaultV2.sol",
            "after": "uint256 len = array.length; for (...; i < len; ) { ... }",
            "patch": {
              "newText": "        for (uint256 i = 0; i < depositors.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
              "oldText": "        for (uint256 i = 0; i < depositors.length; i++) {"
            },
            "title": "Cache array length before loop",
            "where": "VaultV2.sol:55",
            "before": "for (uint256 i = 0; i < depositors.length; i++) {",
            "safety": "review",
            "newText": "        for (uint256 i = 0; i < depositors.length; i++) { // REVIEW: cache .length before loop and prefer ++i",
            "oldText": "        for (uint256 i = 0; i < depositors.length; i++) {",
            "category": "storage",
            "severity": "info",
            "lineStart": 55,
            "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": "VaultV2.sol",
            "after": "require(msg.value != 0, \"NO_VALUE\");",
            "patch": {
              "newText": "        require(msg.value != 0, \"NO_VALUE\");",
              "oldText": "        require(msg.value > 0, \"NO_VALUE\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "VaultV2.sol:16",
            "before": "require(msg.value > 0, \"NO_VALUE\");",
            "safety": "safe",
            "newText": "        require(msg.value != 0, \"NO_VALUE\");",
            "oldText": "        require(msg.value > 0, \"NO_VALUE\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 16,
            "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": "VaultV2.sol",
            "after": "require(amountIn != 0, \"BAD_AMOUNT\");",
            "patch": {
              "newText": "        require(amountIn != 0, \"BAD_AMOUNT\");",
              "oldText": "        require(amountIn > 0, \"BAD_AMOUNT\");"
            },
            "title": "Use != 0 for unsigned non-zero checks",
            "where": "VaultV2.sol:40",
            "before": "require(amountIn > 0, \"BAD_AMOUNT\");",
            "safety": "safe",
            "newText": "        require(amountIn != 0, \"BAD_AMOUNT\");",
            "oldText": "        require(amountIn > 0, \"BAD_AMOUNT\");",
            "category": "computation",
            "severity": "info",
            "lineStart": 40,
            "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": "remove-zero-init",
            "file": "VaultV2.sol",
            "after": "for (uint256 i; i < depositors.length; i++) {",
            "patch": {
              "newText": "        for (uint256 i; i < depositors.length; i++) {",
              "oldText": "        for (uint256 i = 0; i < depositors.length; i++) {"
            },
            "title": "Remove redundant zero initialization",
            "where": "VaultV2.sol:55",
            "before": "for (uint256 i = 0; i < depositors.length; i++) {",
            "safety": "safe",
            "newText": "        for (uint256 i; i < depositors.length; i++) {",
            "oldText": "        for (uint256 i = 0; i < depositors.length; i++) {",
            "category": "deployment",
            "severity": "info",
            "lineStart": 55,
            "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": "405a7863-a1e0-46a5-8be1-8994a57eeb36",
    "createdAt": "2026-07-01T18:52:24.431Z",
    "riskScore": 100,
    "contractName": "VaultV2",
    "severityCounts": {
      "low": 3,
      "high": 2,
      "info": 10,
      "medium": 1,
      "critical": 1
    },
    "executiveSummary": "Archon completed a read-only Mantle Mainnet audit of VaultV2 and found 17 deterministic findings. The highest-priority issue is Reentrancy Eth, with risk score 100/100 based on severity-weighted findings. Reentrancy Eth was detected from deterministic analysis at VaultV2.sol:27-35. The issue should be reviewed because it can affect contract correctness, user balances, or operational cost depending on how the function is used. 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": "c5dfd513-a30d-4cc7-85a1-e1303cb72e4c",
      "title": "Reentrancy Eth",
      "category": "reentrancy-eth",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 35,
        "lineStart": 27
      },
      "severity": "high"
    },
    {
      "id": "8d402884-a27f-40e3-8558-76effbd6b545",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 35,
        "lineStart": 27
      },
      "severity": "low"
    },
    {
      "id": "f4318214-0b4f-4390-a386-50f12a74c402",
      "title": "Low Level Calls",
      "category": "low-level-calls",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 35,
        "lineStart": 27
      },
      "severity": "info"
    },
    {
      "id": "e5198df7-c3bd-441f-9f70-158d2299e121",
      "title": "Redundant Statements",
      "category": "redundant-statements",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 48,
        "lineStart": 48
      },
      "severity": "info"
    },
    {
      "id": "ec817fd1-8106-4f70-9c89-7a21b477c4bf",
      "title": "Cache Array Length",
      "category": "cache-array-length",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "low"
    },
    {
      "id": "3a663733-eb62-4323-bb41-3c63f8ee8afe",
      "title": "External value transfer before balance update",
      "category": "mantle-reentrancy-rule",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": null,
        "lineStart": 30
      },
      "severity": "critical"
    },
    {
      "id": "03f4c0af-f8d4-4d80-a89d-f6dbf5843d48",
      "title": "Missing slippage enforcement for swap output",
      "category": "mantle-missing-slippage-bound",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": null,
        "lineStart": 37
      },
      "severity": "high"
    },
    {
      "id": "4d25b1cf-1700-4ce7-ad7f-009af375bfaa",
      "title": "Unbounded storage iteration can create runaway gas cost",
      "category": "mantle-l1-data-fee-unaware-gas",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": null,
        "lineStart": 55
      },
      "severity": "medium"
    },
    {
      "id": "85b1fe39-f54b-4048-a192-d3da66a4b5f3",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 27,
        "lineStart": 27
      },
      "severity": "low"
    },
    {
      "id": "8435f9b4-cacd-4aa8-89d6-5ca94a2016b8",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 28,
        "lineStart": 28
      },
      "severity": "info"
    },
    {
      "id": "f7b1086a-508a-44b1-8d2a-43a2efab76cb",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 41,
        "lineStart": 41
      },
      "severity": "info"
    },
    {
      "id": "6c88967b-bfb4-4937-83f3-e4ce91babf7a",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 18,
        "lineStart": 18
      },
      "severity": "info"
    },
    {
      "id": "85b7ab2c-a665-4cef-afa0-27bacf967d47",
      "title": "Use unchecked loop increment where bounded",
      "category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "info"
    },
    {
      "id": "fe6335a8-3658-4d2d-8f8a-878bae1c405b",
      "title": "Cache array length before loop",
      "category": "mantle-gas-optimizer/storage/loop-hygiene",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "info"
    },
    {
      "id": "64902f72-4a36-4d99-8154-ab25365a5aa3",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 16,
        "lineStart": 16
      },
      "severity": "info"
    },
    {
      "id": "9adf901e-38ee-4d96-ba9e-3ef05f7c7014",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 40,
        "lineStart": 40
      },
      "severity": "info"
    },
    {
      "id": "285a25ed-4303-466a-bb82-261171148cee",
      "title": "Remove redundant zero initialization",
      "category": "mantle-gas-optimizer/deployment/remove-zero-init",
      "location": {
        "file": "VaultV2.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "info"
    }
  ]
}
source URI: ipfs://QmSPdNfaneFhXVk6maS3DhS8By79RV4dfKBqA7Y7BAU3Kf