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

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

Feedback #5

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": "86caa747-9f15-4ef1-a2f4-1192c4f71f30",
    "scope": {
      "pragma": "0.8.24",
      "network": "mantle-mainnet",
      "lineCount": 225,
      "protocols": [
        "mETH",
        "cmETH",
        "USDY",
        "Aave V3",
        "Merchant Moe",
        "Agni"
      ],
      "sourceKind": "paste",
      "aiReasoning": {
        "hits": 23,
        "total": 23,
        "misses": 0,
        "batches": 0,
        "skipped": 0,
        "provider": "openai",
        "timeoutMs": 75000,
        "fallbackCount": 0
      },
      "reducedMode": null,
      "solcVersion": "0.8.24",
      "gasOptimizer": {
        "pricing": {
          "mode": "calibrated-receipts",
          "pricedAt": "2026-06-15T21:24:48.999Z",
          "l2GasPriceWei": "50000100000",
          "deployDataFeeMnt": "0.020634305752140032",
          "deployDataFeeWei": "20634305752140032",
          "calldataZeroBytes": 61,
          "calibrationErrorPct": 0,
          "calldataGasEstimate": 92596,
          "calldataNonZeroBytes": 5772,
          "creationBytecodeBytes": 5833
        },
        "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": "0x876565bc5a73aa77c93cccca02959ff0f7706fa2e75f4b0789279c672d6ee450",
        "measurement": {
          "forge": {
            "ok": false,
            "error": "Command failed: forge test --gas-report --root /tmp/archon-gas-measure-tsdbLH\nError: Compiler run failed:\nError (6275): Source \"@openzeppelin/contracts/access/Ownable.sol\" not found: File not found. Searched the following locations: \"/tmp/archon-gas-measure-tsdbLH\".\nParserError: Source \"@openzeppelin/contracts/access/Ownable.sol\" not found: File not found. Searched the following locations: \"/tmp/archon-gas-measure-tsdbLH\".\n --> src/Never_Suite__2_contracts_.sol:4:1:\n  |\n4 | import {Ownable} from \"@openzeppelin/contracts/access/Ownable.sol\";\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nError (6275): Source \"@openzeppelin/contracts/utils/Pausable.sol\" not found: File not found. Searched the following locations: \"/tmp/archon-gas-measure-tsdbLH\".\nParserError: Source \"@openzeppelin/contracts/utils/Pausable.sol\" not found: File not found. Searched the following locations: \"/tmp/archon-gas-measure-tsdbLH\".\n --> src/Never_Suite__2_contracts_.sol:5:1:\n  |\n5 | import {Pausable} from \"@openzeppelin/contracts/utils/Pausable.sol\";\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nError (6275): Source \"forge-std/Test.sol\" not found: File not found. Searched the following locations: \"/tmp/archon-gas-measure-tsdbLH\".\nParserError: Source \"forge-std/Test.sol\" not found: File not found. Searched the following locations: \"/tmp/archon-gas-measure-tsdbLH\".\n --> test/Never_Suite__2_contracts_.t.sol:4:1:\n  |\n4 | import {Test} from \"forge-std/Test.sol\";\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
            "command": "forge test --gas-report",
            "attempted": true,
            "gasReport": null
          },
          "source": "deterministic-estimate",
          "status": "degraded",
          "patches": [
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISEmptyAsset(); … if (!(condition)) revert AURALISEmptyAsset();",
              "before": "require(assetId != bytes32(0), \"AURALIS: empty asset\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISEmptyHash(); … if (!(condition)) revert AURALISEmptyHash();",
              "before": "require(ratingHash != bytes32(0), \"AURALIS: empty hash\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISDuplicateRating(); … if (!(condition)) revert AURALISDuplicateRating();",
              "before": "require(!ratingHashUsed[ratingHash], \"AURALIS: duplicate rating\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISBadScore(); … if (!(condition)) revert AURALISBadScore();",
              "before": "require(riskScore <= 100, \"AURALIS: bad score\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISBadGrade(); … if (!(condition)) revert AURALISBadGrade();",
              "before": "require(grade != Grade.NR, \"AURALIS: bad grade\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISEmptyHash(); … if (!(condition)) revert AURALISEmptyHash();",
              "before": "require(decisionHash != bytes32(0), \"AURALIS: empty hash\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISDuplicateDecision(); … if (!(condition)) revert AURALISDuplicateDecision();",
              "before": "require(!decisionHashUsed[decisionHash], \"AURALIS: duplicate decision\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
              "after": "error AURALISBadScore(); … if (!(condition)) revert AURALISBadScore();",
              "before": "require(riskScore <= 100, \"AURALIS: bad score\");",
              "ruleId": "custom-errors",
              "safety": "safe",
              "status": "estimated",
              "l2GasDelta": 120,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = ratingHashUsed[ratingHash]; // reuse cached value",
              "before": "ratingHashUsed[ratingHash] 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 = latestRating[assetId]; // reuse cached value",
              "before": "latestRating[assetId] 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 = _ratingHistory[assetId]; // reuse cached value",
              "before": "_ratingHistory[assetId] read 3 times",
              "ruleId": "cache-repeated-sload",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 200,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "uint256 cached = decisionHashUsed[decisionHash]; // reuse cached value",
              "before": "decisionHashUsed[decisionHash] 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": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(bytes32 => bool) public ratingHashUsed; // dedupe",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(bytes32 => bool) public decisionHashUsed; // dedupe",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            },
            {
              "note": "Review-only patch is not auto-applied for measurement.",
              "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
              "before": "mapping(address => bool) public approvedPublishers; // flagged as \"official\"",
              "ruleId": "bitmap-bools",
              "safety": "review",
              "status": "skipped",
              "l2GasDelta": 20000,
              "l1DaDeltaWei": null
            }
          ],
          "version": "archon.gasMeasurement.v1",
          "measuredAt": "2026-06-11T22:02:28.571Z",
          "rulesetHash": "85a33befdcd7045388e3d644cb4f498a44ae7ee9d1ed23140845e0c6f8eec072",
          "contractHash": "876565bc5a73aa77c93cccca02959ff0f7706fa2e75f4b0789279c672d6ee450"
        },
        "opportunities": [
          {
            "id": "custom-errors",
            "file": "AuralisRatingRegistry.sol",
            "after": "error AURALISEmptyAsset(); … if (!(condition)) revert AURALISEmptyAsset();",
            "patch": {
              "newText": "        if (!(assetId != bytes32(0))) revert AURALISEmptyAsset();",
              "oldText": "        require(assetId != bytes32(0), \"AURALIS: empty asset\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:128",
            "before": "require(assetId != bytes32(0), \"AURALIS: empty asset\");",
            "safety": "safe",
            "newText": "        if (!(assetId != bytes32(0))) revert AURALISEmptyAsset();",
            "oldText": "        require(assetId != bytes32(0), \"AURALIS: empty asset\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 128,
            "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": "AuralisRatingRegistry.sol",
            "after": "error AURALISEmptyHash(); … if (!(condition)) revert AURALISEmptyHash();",
            "patch": {
              "newText": "        if (!(ratingHash != bytes32(0))) revert AURALISEmptyHash();",
              "oldText": "        require(ratingHash != bytes32(0), \"AURALIS: empty hash\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:129",
            "before": "require(ratingHash != bytes32(0), \"AURALIS: empty hash\");",
            "safety": "safe",
            "newText": "        if (!(ratingHash != bytes32(0))) revert AURALISEmptyHash();",
            "oldText": "        require(ratingHash != bytes32(0), \"AURALIS: empty hash\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 129,
            "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": "AuralisRatingRegistry.sol",
            "after": "error AURALISDuplicateRating(); … if (!(condition)) revert AURALISDuplicateRating();",
            "patch": {
              "newText": "        if (!(!ratingHashUsed[ratingHash])) revert AURALISDuplicateRating();",
              "oldText": "        require(!ratingHashUsed[ratingHash], \"AURALIS: duplicate rating\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:130",
            "before": "require(!ratingHashUsed[ratingHash], \"AURALIS: duplicate rating\");",
            "safety": "safe",
            "newText": "        if (!(!ratingHashUsed[ratingHash])) revert AURALISDuplicateRating();",
            "oldText": "        require(!ratingHashUsed[ratingHash], \"AURALIS: duplicate rating\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 130,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 25,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 25
          },
          {
            "id": "custom-errors",
            "file": "AuralisRatingRegistry.sol",
            "after": "error AURALISBadScore(); … if (!(condition)) revert AURALISBadScore();",
            "patch": {
              "newText": "        if (!(riskScore <= 100)) revert AURALISBadScore();",
              "oldText": "        require(riskScore <= 100, \"AURALIS: bad score\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:131",
            "before": "require(riskScore <= 100, \"AURALIS: bad score\");",
            "safety": "safe",
            "newText": "        if (!(riskScore <= 100)) revert AURALISBadScore();",
            "oldText": "        require(riskScore <= 100, \"AURALIS: bad score\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 131,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "custom-errors",
            "file": "AuralisRatingRegistry.sol",
            "after": "error AURALISBadGrade(); … if (!(condition)) revert AURALISBadGrade();",
            "patch": {
              "newText": "        if (!(grade != Grade.NR)) revert AURALISBadGrade();",
              "oldText": "        require(grade != Grade.NR, \"AURALIS: bad grade\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:132",
            "before": "require(grade != Grade.NR, \"AURALIS: bad grade\");",
            "safety": "safe",
            "newText": "        if (!(grade != Grade.NR)) revert AURALISBadGrade();",
            "oldText": "        require(grade != Grade.NR, \"AURALIS: bad grade\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 132,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "custom-errors",
            "file": "AuralisRatingRegistry.sol",
            "after": "error AURALISEmptyHash(); … if (!(condition)) revert AURALISEmptyHash();",
            "patch": {
              "newText": "        if (!(decisionHash != bytes32(0))) revert AURALISEmptyHash();",
              "oldText": "        require(decisionHash != bytes32(0), \"AURALIS: empty hash\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:177",
            "before": "require(decisionHash != bytes32(0), \"AURALIS: empty hash\");",
            "safety": "safe",
            "newText": "        if (!(decisionHash != bytes32(0))) revert AURALISEmptyHash();",
            "oldText": "        require(decisionHash != bytes32(0), \"AURALIS: empty hash\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 177,
            "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": "AuralisRatingRegistry.sol",
            "after": "error AURALISDuplicateDecision(); … if (!(condition)) revert AURALISDuplicateDecision();",
            "patch": {
              "newText": "        if (!(!decisionHashUsed[decisionHash])) revert AURALISDuplicateDecision();",
              "oldText": "        require(!decisionHashUsed[decisionHash], \"AURALIS: duplicate decision\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:178",
            "before": "require(!decisionHashUsed[decisionHash], \"AURALIS: duplicate decision\");",
            "safety": "safe",
            "newText": "        if (!(!decisionHashUsed[decisionHash])) revert AURALISDuplicateDecision();",
            "oldText": "        require(!decisionHashUsed[decisionHash], \"AURALIS: duplicate decision\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 178,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 27,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 27
          },
          {
            "id": "custom-errors",
            "file": "AuralisRatingRegistry.sol",
            "after": "error AURALISBadScore(); … if (!(condition)) revert AURALISBadScore();",
            "patch": {
              "newText": "        if (!(riskScore <= 100)) revert AURALISBadScore();",
              "oldText": "        require(riskScore <= 100, \"AURALIS: bad score\");"
            },
            "title": "Replace long revert string with custom error",
            "where": "AuralisRatingRegistry.sol:179",
            "before": "require(riskScore <= 100, \"AURALIS: bad score\");",
            "safety": "safe",
            "newText": "        if (!(riskScore <= 100)) revert AURALISBadScore();",
            "oldText": "        require(riskScore <= 100, \"AURALIS: bad score\");",
            "category": "deployment",
            "severity": "info",
            "lineStart": 179,
            "rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
            "confidence": 0.9,
            "estL1Delta": 18,
            "estL2Delta": 120,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 120,
            "estimatedDataBytesSaved": 18
          },
          {
            "id": "cache-repeated-sload",
            "file": "AuralisRatingRegistry.sol",
            "after": "uint256 cached = ratingHashUsed[ratingHash]; // reuse cached value",
            "patch": {
              "newText": "ratingHashUsed[ratingHash]",
              "oldText": "ratingHashUsed[ratingHash]"
            },
            "title": "Cache repeated storage read",
            "where": "AuralisRatingRegistry.sol:130",
            "before": "ratingHashUsed[ratingHash] read 2 times",
            "safety": "review",
            "newText": "ratingHashUsed[ratingHash]",
            "oldText": "ratingHashUsed[ratingHash]",
            "category": "storage",
            "severity": "info",
            "lineStart": 130,
            "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": "AuralisRatingRegistry.sol",
            "after": "uint256 cached = latestRating[assetId]; // reuse cached value",
            "patch": {
              "newText": "latestRating[assetId]",
              "oldText": "latestRating[assetId]"
            },
            "title": "Cache repeated storage read",
            "where": "AuralisRatingRegistry.sol:149",
            "before": "latestRating[assetId] read 2 times",
            "safety": "review",
            "newText": "latestRating[assetId]",
            "oldText": "latestRating[assetId]",
            "category": "storage",
            "severity": "info",
            "lineStart": 149,
            "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": "AuralisRatingRegistry.sol",
            "after": "uint256 cached = _ratingHistory[assetId]; // reuse cached value",
            "patch": {
              "newText": "_ratingHistory[assetId]",
              "oldText": "_ratingHistory[assetId]"
            },
            "title": "Cache repeated storage read",
            "where": "AuralisRatingRegistry.sol:150",
            "before": "_ratingHistory[assetId] read 3 times",
            "safety": "review",
            "newText": "_ratingHistory[assetId]",
            "oldText": "_ratingHistory[assetId]",
            "category": "storage",
            "severity": "info",
            "lineStart": 150,
            "rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
            "confidence": 0.7,
            "estL1Delta": null,
            "estL2Delta": 200,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 200,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "cache-repeated-sload",
            "file": "AuralisRatingRegistry.sol",
            "after": "uint256 cached = decisionHashUsed[decisionHash]; // reuse cached value",
            "patch": {
              "newText": "decisionHashUsed[decisionHash]",
              "oldText": "decisionHashUsed[decisionHash]"
            },
            "title": "Cache repeated storage read",
            "where": "AuralisRatingRegistry.sol:178",
            "before": "decisionHashUsed[decisionHash] read 2 times",
            "safety": "review",
            "newText": "decisionHashUsed[decisionHash]",
            "oldText": "decisionHashUsed[decisionHash]",
            "category": "storage",
            "severity": "info",
            "lineStart": 178,
            "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": "bitmap-bools",
            "file": "AuralisRatingRegistry.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(bytes32 => bool) public ratingHashUsed; // dedupe // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(bytes32 => bool) public ratingHashUsed; // dedupe"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "AuralisRatingRegistry.sol:62",
            "before": "mapping(bytes32 => bool) public ratingHashUsed; // dedupe",
            "safety": "review",
            "newText": "    mapping(bytes32 => bool) public ratingHashUsed; // dedupe // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(bytes32 => bool) public ratingHashUsed; // dedupe",
            "category": "storage",
            "severity": "medium",
            "lineStart": 62,
            "rationale": "Bitmap packing can reduce many boolean SSTOREs from one slot per flag to one slot per 256 flags.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "bitmap-bools",
            "file": "AuralisRatingRegistry.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(bytes32 => bool) public decisionHashUsed; // dedupe // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(bytes32 => bool) public decisionHashUsed; // dedupe"
            },
            "title": "Bitmap-pack boolean flags",
            "where": "AuralisRatingRegistry.sol:63",
            "before": "mapping(bytes32 => bool) public decisionHashUsed; // dedupe",
            "safety": "review",
            "newText": "    mapping(bytes32 => bool) public decisionHashUsed; // dedupe // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(bytes32 => bool) public decisionHashUsed; // dedupe",
            "category": "storage",
            "severity": "medium",
            "lineStart": 63,
            "rationale": "Bitmap packing can reduce many boolean SSTOREs from one slot per flag to one slot per 256 flags.",
            "confidence": 0.62,
            "estL1Delta": null,
            "estL2Delta": 20000,
            "annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
            "estimatedGasSaved": 20000,
            "estimatedDataBytesSaved": null
          },
          {
            "id": "bitmap-bools",
            "file": "AuralisRatingRegistry.sol",
            "after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
            "patch": {
              "newText": "    mapping(address => bool) public approvedPublishers; // flagged as \"official\" // REVIEW: high-volume bool flags can be bitmap-packed",
              "oldText": "    mapping(address => bool) public approvedPublishers; // flagged as \"official\""
            },
            "title": "Bitmap-pack boolean flags",
            "where": "AuralisRatingRegistry.sol:64",
            "before": "mapping(address => bool) public approvedPublishers; // flagged as \"official\"",
            "safety": "review",
            "newText": "    mapping(address => bool) public approvedPublishers; // flagged as \"official\" // REVIEW: high-volume bool flags can be bitmap-packed",
            "oldText": "    mapping(address => bool) public approvedPublishers; // flagged as \"official\"",
            "category": "storage",
            "severity": "medium",
            "lineStart": 64,
            "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": "46e77a65-043a-486d-ab69-10b3d97c724a",
    "createdAt": "2026-06-15T21:24:51.681Z",
    "riskScore": 74,
    "contractName": "RatingRegistry",
    "severityCounts": {
      "low": 1,
      "high": 0,
      "info": 18,
      "medium": 4,
      "critical": 0
    },
    "executiveSummary": "Archon completed a read-only Mantle Mainnet audit of RatingRegistry and found 23 deterministic findings. The highest-priority issue is Incorrect Equality, with risk score 74/100 based on severity-weighted findings. The equality check in the verifyRating function may lead to incorrect validation of asset ratings. 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": "0d37a1de-aca7-4f50-a4f0-41ae172f21ea",
      "title": "Incorrect Equality",
      "category": "incorrect-equality",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 224,
        "lineStart": 219
      },
      "severity": "medium"
    },
    {
      "id": "1ac43a76-8ce9-408c-babc-20a9901e7f6d",
      "title": "Timestamp",
      "category": "timestamp",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 224,
        "lineStart": 219
      },
      "severity": "low"
    },
    {
      "id": "b4e7077d-5a95-41bf-8c49-20f046b1f96f",
      "title": "Pragma",
      "category": "pragma",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 2,
        "lineStart": 2
      },
      "severity": "info"
    },
    {
      "id": "fe933dfd-b86c-4b1e-9d15-36e2b42c90d3",
      "title": "Dead Code",
      "category": "dead-code",
      "location": {
        "file": "Context.sol",
        "lineEnd": 27,
        "lineStart": 25
      },
      "severity": "info"
    },
    {
      "id": "fd24df95-e80d-46da-8a6b-28c2e875960d",
      "title": "Dead Code",
      "category": "dead-code",
      "location": {
        "file": "Context.sol",
        "lineEnd": 23,
        "lineStart": 21
      },
      "severity": "info"
    },
    {
      "id": "da1167ee-44ed-4114-89ba-b47d6d8eea2c",
      "title": "Solc Version",
      "category": "solc-version",
      "location": {
        "file": "Ownable.sol",
        "lineEnd": 4,
        "lineStart": 4
      },
      "severity": "info"
    },
    {
      "id": "4a8353b5-dc0d-4fe3-963b-2689604ced18",
      "title": "Unindexed Event Address",
      "category": "unindexed-event-address",
      "location": {
        "file": "Pausable.sol",
        "lineEnd": 28,
        "lineStart": 28
      },
      "severity": "info"
    },
    {
      "id": "18aedbf7-3685-4421-be2e-cd8f6cf6c1e1",
      "title": "Unindexed Event Address",
      "category": "unindexed-event-address",
      "location": {
        "file": "Pausable.sol",
        "lineEnd": 23,
        "lineStart": 23
      },
      "severity": "info"
    },
    {
      "id": "e832c382-7f7a-4414-a131-a0c2908b5ba9",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 128,
        "lineStart": 128
      },
      "severity": "info"
    },
    {
      "id": "959cfe7a-e8da-4bf1-b88d-8b331e2a294c",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 129,
        "lineStart": 129
      },
      "severity": "info"
    },
    {
      "id": "557378ee-428b-43db-b483-c71310b6e774",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 130,
        "lineStart": 130
      },
      "severity": "info"
    },
    {
      "id": "d3b9ff0d-76c8-46cb-ac64-203f3193af5f",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 131,
        "lineStart": 131
      },
      "severity": "info"
    },
    {
      "id": "33bda807-8b53-4106-9b4c-6a4a8de8731a",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 132,
        "lineStart": 132
      },
      "severity": "info"
    },
    {
      "id": "f938767d-0804-4837-992a-515591e6f260",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 177,
        "lineStart": 177
      },
      "severity": "info"
    },
    {
      "id": "b3da12fb-9dd8-4283-9ee3-5af03daefe9a",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 178,
        "lineStart": 178
      },
      "severity": "info"
    },
    {
      "id": "a6630321-6fdc-429f-9336-a2825db3347e",
      "title": "Replace long revert string with custom error",
      "category": "mantle-gas-optimizer/deployment/custom-errors",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 179,
        "lineStart": 179
      },
      "severity": "info"
    },
    {
      "id": "c33bc556-ab76-421a-ace4-1117bc8d4e4b",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 130,
        "lineStart": 130
      },
      "severity": "info"
    },
    {
      "id": "cfefb9a7-bebb-4fac-979c-061fb19224d2",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 149,
        "lineStart": 149
      },
      "severity": "info"
    },
    {
      "id": "9df2260e-ed5c-49a1-88dc-87200fac87f1",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 150,
        "lineStart": 150
      },
      "severity": "info"
    },
    {
      "id": "ddbe5ae6-3347-4bb7-9c5b-88390aadb5de",
      "title": "Cache repeated storage read",
      "category": "mantle-gas-optimizer/storage/cache-repeated-sload",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 178,
        "lineStart": 178
      },
      "severity": "info"
    },
    {
      "id": "8e9f49fa-2771-4780-a88f-fec5801e84db",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 62,
        "lineStart": 62
      },
      "severity": "medium"
    },
    {
      "id": "7d0dbb3d-024c-42c7-a4ec-4d14cd9a5c1a",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 63,
        "lineStart": 63
      },
      "severity": "medium"
    },
    {
      "id": "5e62f3a9-47e5-4c8f-9982-55282cea3ed7",
      "title": "Bitmap-pack boolean flags",
      "category": "mantle-gas-optimizer/storage/bitmap-bools",
      "location": {
        "file": "AuralisRatingRegistry.sol",
        "lineEnd": 64,
        "lineStart": 64
      },
      "severity": "medium"
    }
  ]
}
source URI: ipfs://QmPjyGD9LXEoviUMze4Zw64VhTWqmmTixEPdnVWNqYrRWc