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

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

Feedback #2

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

archon.audit.report
100.0

Off-chain feedback document

raw JSON
{
  "chain": {
    "name": "Mantle Mainnet",
    "chainId": 5000
  },
  "report": {
    "id": "8f048f46-7c48-4b24-93be-443bf7c9b9a2",
    "scope": {
      "pragma": "^0.8.24",
      "network": "mantle-mainnet",
      "lineCount": 63,
      "protocols": [
        "mETH",
        "cmETH",
        "USDY",
        "Aave V3",
        "Merchant Moe",
        "Agni"
      ],
      "sourceKind": "paste",
      "aiReasoning": {
        "hits": 0,
        "total": 17,
        "misses": 17,
        "batches": 4,
        "reasons": {},
        "skipped": 0,
        "provider": "openai",
        "timeoutMs": 75000,
        "fallbackCount": 0
      },
      "reducedMode": null,
      "solcVersion": "0.8.24",
      "gasOptimizer": {
        "pricing": {
          "mode": "calibrated-receipts",
          "pricedAt": "2026-06-15T07:27:41.001Z",
          "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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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_Demo_Vault.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": "31647b82-d8c5-492a-88d8-1abefcceb807",
    "createdAt": "2026-06-15T07:28:44.599Z",
    "riskScore": 100,
    "contractName": "VaultV2_Demo_Vault",
    "severityCounts": {
      "low": 3,
      "high": 2,
      "info": 10,
      "medium": 1,
      "critical": 1
    },
    "executiveSummary": "Archon completed a read-only Mantle Mainnet audit of VaultV2_Demo_Vault and found 17 deterministic findings. The highest-priority issue is Reentrancy Eth, with risk score 100/100 based on severity-weighted findings. The withdraw function is vulnerable to reentrancy attacks due to the external call occurring before the state change. 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": "af815d74-d613-4db5-9edd-1c5784ef6864",
      "title": "Reentrancy Eth",
      "category": "reentrancy-eth",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 35,
        "lineStart": 27
      },
      "severity": "high"
    },
    {
      "id": "e1d1efe3-2b04-47d8-a943-e2a2ee85da87",
      "title": "Reentrancy Events",
      "category": "reentrancy-events",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 35,
        "lineStart": 27
      },
      "severity": "low"
    },
    {
      "id": "9a2e8960-96e7-4e96-8334-c04ba0bb7c6f",
      "title": "Low Level Calls",
      "category": "low-level-calls",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 35,
        "lineStart": 27
      },
      "severity": "info"
    },
    {
      "id": "51efddf7-2f3d-4be1-adaa-78d51c295122",
      "title": "Redundant Statements",
      "category": "redundant-statements",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 48,
        "lineStart": 48
      },
      "severity": "info"
    },
    {
      "id": "e751b57f-6d20-486e-86c4-d1beb3352c9c",
      "title": "Cache Array Length",
      "category": "cache-array-length",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "low"
    },
    {
      "id": "5efa2795-e82c-4b38-91bc-114b92c18e2a",
      "title": "External value transfer before balance update",
      "category": "mantle-reentrancy-rule",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": null,
        "lineStart": 30
      },
      "severity": "critical"
    },
    {
      "id": "f5ce8290-6113-4c22-8f21-2d9263a4c177",
      "title": "Missing slippage enforcement for swap output",
      "category": "mantle-missing-slippage-bound",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": null,
        "lineStart": 37
      },
      "severity": "high"
    },
    {
      "id": "df8bdf07-9074-44fd-b844-531afb96d119",
      "title": "Unbounded storage iteration can create runaway gas cost",
      "category": "mantle-l1-data-fee-unaware-gas",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": null,
        "lineStart": 55
      },
      "severity": "medium"
    },
    {
      "id": "1f23f062-b9bd-4ab8-872a-33351e578f6f",
      "title": "Review calldata parameter width",
      "category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 27,
        "lineStart": 27
      },
      "severity": "low"
    },
    {
      "id": "79b995e0-e8bc-45d1-a252-ec8815d295cb",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 28,
        "lineStart": 28
      },
      "severity": "info"
    },
    {
      "id": "7f34a742-594e-46c7-bfa6-57f8da2a06ee",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 41,
        "lineStart": 41
      },
      "severity": "info"
    },
    {
      "id": "20d4861d-0580-4b0b-8bf9-cd3b3270cb65",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 18,
        "lineStart": 18
      },
      "severity": "info"
    },
    {
      "id": "3ab4dccf-09e3-426c-9dda-3ef3f7ca599c",
      "title": "Use unchecked loop increment where bounded",
      "category": "mantle-gas-optimizer/computation/unchecked-loop-increment",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "info"
    },
    {
      "id": "14110886-fbc3-44a4-9aa4-972c130806c6",
      "title": "Cache array length before loop",
      "category": "mantle-gas-optimizer/storage/loop-hygiene",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "info"
    },
    {
      "id": "9ab40ce5-3879-41ad-9ea4-070dcd5808f1",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 16,
        "lineStart": 16
      },
      "severity": "info"
    },
    {
      "id": "c344bcea-45ed-4f1c-839c-54dd697e3b4f",
      "title": "Use != 0 for unsigned non-zero checks",
      "category": "mantle-gas-optimizer/computation/nonzero-comparison",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 40,
        "lineStart": 40
      },
      "severity": "info"
    },
    {
      "id": "cc7b3bde-4e36-40c4-a677-bf1041d52b14",
      "title": "Remove redundant zero initialization",
      "category": "mantle-gas-optimizer/deployment/remove-zero-init",
      "location": {
        "file": "VaultV2_Demo_Vault.sol",
        "lineEnd": 55,
        "lineStart": 55
      },
      "severity": "info"
    }
  ]
}
source URI: ipfs://QmSA7ydHVKbR5zSZdQkwEYvvakUnHNvzdeY2rVAPzAa5Lr