archon.audit.report
100.0
1,000,000 free RPC requestsJust a wallet, via x402.
Start buildingFor agent 97 on Mantle Mainnet · 2026-06-15
https://archonaudit.xyz/app/proofs
{
"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"
}
]
}
ipfs://QmPjyGD9LXEoviUMze4Zw64VhTWqmmTixEPdnVWNqYrRWc