archon.audit.report
100.0
1,000,000 free RPC requestsJust a wallet, via x402.
Start buildingFor agent 97 on Mantle Mainnet · 2026-06-18
https://archonaudit.xyz/app/proofs
{
"chain": {
"name": "Mantle Mainnet",
"chainId": 5000
},
"report": {
"id": "f1391001-fae8-4fac-bb2e-c897fc4e6fbb",
"scope": {
"pragma": "^0.8.15",
"network": "mantle-mainnet",
"lineCount": 70,
"protocols": [
"mETH",
"cmETH",
"USDY",
"Aave V3",
"Merchant Moe",
"Agni"
],
"sourceKind": "paste",
"aiReasoning": {
"hits": 0,
"total": 21,
"misses": 21,
"batches": 11,
"reasons": {},
"skipped": 0,
"enriched": 21,
"provider": "tokenhub",
"timeoutMs": 75000,
"fallbackCount": 0,
"providersUsed": [
"Tencent Cloud TokenHub (deepseek-v4-pro)"
]
},
"reducedMode": null,
"solcVersion": "0.8.24",
"gasOptimizer": {
"pricing": {
"mode": "calibrated-receipts",
"pricedAt": "2026-06-18T13:28:13.318Z",
"l2GasPriceWei": "50000100000",
"deployDataFeeMnt": "0.009630602120488192",
"deployDataFeeWei": "9630602120488192",
"calldataZeroBytes": 31,
"calibrationErrorPct": 0,
"calldataGasEstimate": 43196,
"calldataNonZeroBytes": 2692,
"creationBytecodeBytes": 2723
},
"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": "0x95586bffb1def9e55b19c4cf05980fb9df3c01678d25f658ad72907aee8fa9ce",
"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 approve(address spender, uint256 amount) external returns (bool) {",
"ruleId": "calldata-smaller-types",
"safety": "review",
"status": "skipped",
"l2GasDelta": null,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"before": "function transfer(address to, uint256 amount) external returns (bool) {",
"ruleId": "calldata-smaller-types",
"safety": "review",
"status": "skipped",
"l2GasDelta": null,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"before": "function transferFrom(address from, address to, uint256 amount) external returns (bool) {",
"ruleId": "calldata-smaller-types",
"safety": "review",
"status": "skipped",
"l2GasDelta": null,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"before": "function mint(address to, uint256 amount) external {",
"ruleId": "calldata-smaller-types",
"safety": "review",
"status": "skipped",
"l2GasDelta": null,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"before": "function burn(address from, 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(balanceOf[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(balanceOf[from] >= 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 INSUFFICIENTALLOWANCE(); … if (!(condition)) revert INSUFFICIENTALLOWANCE();",
"before": "require(allowance[from][msg.sender] >= amount, \"INSUFFICIENT_ALLOWANCE\");",
"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(balanceOf[from] >= amount, \"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 = balanceOf[msg.sender]; // reuse cached value",
"before": "balanceOf[msg.sender] 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 = balanceOf[to]; // reuse cached value",
"before": "balanceOf[to] 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 = balanceOf[from]; // reuse cached value",
"before": "balanceOf[from] read 4 times",
"ruleId": "cache-repeated-sload",
"safety": "review",
"status": "skipped",
"l2GasDelta": 300,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "uint256 cached = allowance[from]; // reuse cached value",
"before": "allowance[from] read 2 times",
"ruleId": "cache-repeated-sload",
"safety": "review",
"status": "skipped",
"l2GasDelta": 100,
"l1DaDeltaWei": null
}
],
"version": "archon.gasMeasurement.v1",
"measuredAt": "2026-06-18T13:28:13.666Z",
"rulesetHash": "be5f7071522195d2c0082c0709f0db4f4ee118edc701ba242f0dfd9489f7c3aa",
"contractHash": "95586bffb1def9e55b19c4cf05980fb9df3c01678d25f658ad72907aee8fa9ce"
},
"opportunities": [
{
"id": "calldata-smaller-types",
"file": "MantleWETH_BVM_ETH_Interface.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function approve(address spender, uint256 amount) external returns (bool) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function approve(address spender, uint256 amount) external returns (bool) {"
},
"title": "Review calldata parameter width",
"where": "MantleWETH_BVM_ETH_Interface.sol:28",
"before": "function approve(address spender, uint256 amount) external returns (bool) {",
"safety": "review",
"newText": " function approve(address spender, uint256 amount) external returns (bool) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function approve(address spender, uint256 amount) external returns (bool) {",
"category": "calldata",
"severity": "low",
"lineStart": 28,
"rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
"confidence": 0.55,
"estL1Delta": 16,
"estL2Delta": null,
"annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
"estimatedGasSaved": null,
"estimatedDataBytesSaved": 16
},
{
"id": "calldata-smaller-types",
"file": "MantleWETH_BVM_ETH_Interface.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function transfer(address to, uint256 amount) external returns (bool) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function transfer(address to, uint256 amount) external returns (bool) {"
},
"title": "Review calldata parameter width",
"where": "MantleWETH_BVM_ETH_Interface.sol:34",
"before": "function transfer(address to, uint256 amount) external returns (bool) {",
"safety": "review",
"newText": " function transfer(address to, uint256 amount) external returns (bool) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function transfer(address to, uint256 amount) external returns (bool) {",
"category": "calldata",
"severity": "low",
"lineStart": 34,
"rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
"confidence": 0.55,
"estL1Delta": 16,
"estL2Delta": null,
"annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
"estimatedGasSaved": null,
"estimatedDataBytesSaved": 16
},
{
"id": "calldata-smaller-types",
"file": "MantleWETH_BVM_ETH_Interface.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function transferFrom(address from, address to, uint256 amount) external returns (bool) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function transferFrom(address from, address to, uint256 amount) external returns (bool) {"
},
"title": "Review calldata parameter width",
"where": "MantleWETH_BVM_ETH_Interface.sol:44",
"before": "function transferFrom(address from, address to, uint256 amount) external returns (bool) {",
"safety": "review",
"newText": " function transferFrom(address from, address to, uint256 amount) external returns (bool) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function transferFrom(address from, address to, uint256 amount) external returns (bool) {",
"category": "calldata",
"severity": "low",
"lineStart": 44,
"rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
"confidence": 0.55,
"estL1Delta": 16,
"estL2Delta": null,
"annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
"estimatedGasSaved": null,
"estimatedDataBytesSaved": 16
},
{
"id": "calldata-smaller-types",
"file": "MantleWETH_BVM_ETH_Interface.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function mint(address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function mint(address to, uint256 amount) external {"
},
"title": "Review calldata parameter width",
"where": "MantleWETH_BVM_ETH_Interface.sol:56",
"before": "function mint(address to, uint256 amount) external {",
"safety": "review",
"newText": " function mint(address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function mint(address to, uint256 amount) external {",
"category": "calldata",
"severity": "low",
"lineStart": 56,
"rationale": "For individual ABI params uint256 still occupies a full word, but bounded types help packed structs/batches and prevent redundant calldata.",
"confidence": 0.55,
"estL1Delta": 16,
"estL2Delta": null,
"annualizedBasis": "Receipt-calibrated DA estimate for calldata/data bytes; exact deltas require V2.1.2 harness measurement.",
"estimatedGasSaved": null,
"estimatedDataBytesSaved": 16
},
{
"id": "calldata-smaller-types",
"file": "MantleWETH_BVM_ETH_Interface.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function burn(address from, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function burn(address from, uint256 amount) external {"
},
"title": "Review calldata parameter width",
"where": "MantleWETH_BVM_ETH_Interface.sol:62",
"before": "function burn(address from, uint256 amount) external {",
"safety": "review",
"newText": " function burn(address from, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function burn(address from, uint256 amount) external {",
"category": "calldata",
"severity": "low",
"lineStart": 62,
"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": "MantleWETH_BVM_ETH_Interface.sol",
"after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
"patch": {
"newText": " if (!(balanceOf[msg.sender] >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(balanceOf[msg.sender] >= amount, \"INSUFFICIENT_BALANCE\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleWETH_BVM_ETH_Interface.sol:35",
"before": "require(balanceOf[msg.sender] >= amount, \"INSUFFICIENT_BALANCE\");",
"safety": "safe",
"newText": " if (!(balanceOf[msg.sender] >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(balanceOf[msg.sender] >= amount, \"INSUFFICIENT_BALANCE\");",
"category": "deployment",
"severity": "info",
"lineStart": 35,
"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": "MantleWETH_BVM_ETH_Interface.sol",
"after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
"patch": {
"newText": " if (!(balanceOf[from] >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(balanceOf[from] >= amount, \"INSUFFICIENT_BALANCE\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleWETH_BVM_ETH_Interface.sol:45",
"before": "require(balanceOf[from] >= amount, \"INSUFFICIENT_BALANCE\");",
"safety": "safe",
"newText": " if (!(balanceOf[from] >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(balanceOf[from] >= amount, \"INSUFFICIENT_BALANCE\");",
"category": "deployment",
"severity": "info",
"lineStart": 45,
"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": "MantleWETH_BVM_ETH_Interface.sol",
"after": "error INSUFFICIENTALLOWANCE(); … if (!(condition)) revert INSUFFICIENTALLOWANCE();",
"patch": {
"newText": " if (!(allowance[from][msg.sender] >= amount)) revert INSUFFICIENTALLOWANCE();",
"oldText": " require(allowance[from][msg.sender] >= amount, \"INSUFFICIENT_ALLOWANCE\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleWETH_BVM_ETH_Interface.sol:46",
"before": "require(allowance[from][msg.sender] >= amount, \"INSUFFICIENT_ALLOWANCE\");",
"safety": "safe",
"newText": " if (!(allowance[from][msg.sender] >= amount)) revert INSUFFICIENTALLOWANCE();",
"oldText": " require(allowance[from][msg.sender] >= amount, \"INSUFFICIENT_ALLOWANCE\");",
"category": "deployment",
"severity": "info",
"lineStart": 46,
"rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
"confidence": 0.9,
"estL1Delta": 22,
"estL2Delta": 120,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 120,
"estimatedDataBytesSaved": 22
},
{
"id": "custom-errors",
"file": "MantleWETH_BVM_ETH_Interface.sol",
"after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
"patch": {
"newText": " if (!(balanceOf[from] >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(balanceOf[from] >= amount, \"INSUFFICIENT_BALANCE\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleWETH_BVM_ETH_Interface.sol:63",
"before": "require(balanceOf[from] >= amount, \"INSUFFICIENT_BALANCE\");",
"safety": "safe",
"newText": " if (!(balanceOf[from] >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(balanceOf[from] >= amount, \"INSUFFICIENT_BALANCE\");",
"category": "deployment",
"severity": "info",
"lineStart": 63,
"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": "MantleWETH_BVM_ETH_Interface.sol",
"after": "uint256 cached = balanceOf[msg.sender]; // reuse cached value",
"patch": {
"newText": "balanceOf[msg.sender]",
"oldText": "balanceOf[msg.sender]"
},
"title": "Cache repeated storage read",
"where": "MantleWETH_BVM_ETH_Interface.sol:35",
"before": "balanceOf[msg.sender] read 2 times",
"safety": "review",
"newText": "balanceOf[msg.sender]",
"oldText": "balanceOf[msg.sender]",
"category": "storage",
"severity": "info",
"lineStart": 35,
"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": "MantleWETH_BVM_ETH_Interface.sol",
"after": "uint256 cached = balanceOf[to]; // reuse cached value",
"patch": {
"newText": "balanceOf[to]",
"oldText": "balanceOf[to]"
},
"title": "Cache repeated storage read",
"where": "MantleWETH_BVM_ETH_Interface.sol:38",
"before": "balanceOf[to] read 3 times",
"safety": "review",
"newText": "balanceOf[to]",
"oldText": "balanceOf[to]",
"category": "storage",
"severity": "info",
"lineStart": 38,
"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": "MantleWETH_BVM_ETH_Interface.sol",
"after": "uint256 cached = balanceOf[from]; // reuse cached value",
"patch": {
"newText": "balanceOf[from]",
"oldText": "balanceOf[from]"
},
"title": "Cache repeated storage read",
"where": "MantleWETH_BVM_ETH_Interface.sol:45",
"before": "balanceOf[from] read 4 times",
"safety": "review",
"newText": "balanceOf[from]",
"oldText": "balanceOf[from]",
"category": "storage",
"severity": "info",
"lineStart": 45,
"rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
"confidence": 0.7,
"estL1Delta": null,
"estL2Delta": 300,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 300,
"estimatedDataBytesSaved": null
},
{
"id": "cache-repeated-sload",
"file": "MantleWETH_BVM_ETH_Interface.sol",
"after": "uint256 cached = allowance[from]; // reuse cached value",
"patch": {
"newText": "allowance[from]",
"oldText": "allowance[from]"
},
"title": "Cache repeated storage read",
"where": "MantleWETH_BVM_ETH_Interface.sol:46",
"before": "allowance[from] read 2 times",
"safety": "review",
"newText": "allowance[from]",
"oldText": "allowance[from]",
"category": "storage",
"severity": "info",
"lineStart": 46,
"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
}
]
}
},
"scanId": "787887ce-f8be-4ef7-af62-2d050809c147",
"createdAt": "2026-06-18T13:30:42.420Z",
"riskScore": 66,
"contractName": "MantleWETH_BVM_ETH_Interface",
"severityCounts": {
"low": 11,
"high": 0,
"info": 10,
"medium": 0,
"critical": 0
},
"executiveSummary": "Archon completed a read-only Mantle Mainnet audit of MantleWETH_BVM_ETH_Interface and found 21 deterministic findings. The highest-priority issue is Solc Version, with risk score 66/100 based on severity-weighted findings. The contract uses Solidity version pragma `^0.8.15`. This is a relatively recent compiler version. There are no known critical bugs specific to 0.8.15, but newer patch versions (0.8.16+) contain minor bugfixes. Using a floating pragma `^0.8.15` allows compilation with any 0.8.x version >= 0.8.15, which could lead to bytecode differences during deployment or verification if the toolchain picks a different version. Locking the compiler version is recommended for deterministic builds. 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": "26f46ecf-ca74-49ef-a344-cceff54e2169",
"title": "Solc Version",
"category": "solc-version",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 2,
"lineStart": 2
},
"severity": "info"
},
{
"id": "54cc683a-c69f-4e14-8a2b-b7e105f6ce26",
"title": "Naming Convention",
"category": "naming-convention",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 71,
"lineStart": 7
},
"severity": "info"
},
{
"id": "19922e42-398a-4e2e-a547-1ddff11325ff",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 13,
"lineStart": 13
},
"severity": "low"
},
{
"id": "f1e73871-5864-44a0-9487-80fac1aeec95",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 10,
"lineStart": 10
},
"severity": "low"
},
{
"id": "18a49557-b79d-4924-a25a-ac3fa29123f2",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 12,
"lineStart": 12
},
"severity": "low"
},
{
"id": "a0b5e469-3997-46d8-86f8-61629eee5386",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 14,
"lineStart": 14
},
"severity": "low"
},
{
"id": "58d40ea1-af85-4ebe-bc65-6653a8ed352b",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 8,
"lineStart": 8
},
"severity": "low"
},
{
"id": "fdee01d1-54c2-463f-969d-80b10215d77e",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 9,
"lineStart": 9
},
"severity": "low"
},
{
"id": "7e7b55e9-9514-467c-9430-06046d2158a8",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 28,
"lineStart": 28
},
"severity": "low"
},
{
"id": "478143c1-c05b-427c-aace-40823b247b4b",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 34,
"lineStart": 34
},
"severity": "low"
},
{
"id": "b6ce33ea-61c6-479f-971d-451c8cc3fe64",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 44,
"lineStart": 44
},
"severity": "low"
},
{
"id": "acd22a18-1828-4c17-a649-d422651721d9",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 56,
"lineStart": 56
},
"severity": "low"
},
{
"id": "168be338-b469-4e07-ade0-68bce644acf8",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 62,
"lineStart": 62
},
"severity": "low"
},
{
"id": "550e9472-b044-42ae-bfca-08be1bdb36ce",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 35,
"lineStart": 35
},
"severity": "info"
},
{
"id": "dcbc2695-9858-4ea6-8793-673c683109a4",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 45,
"lineStart": 45
},
"severity": "info"
},
{
"id": "b94f612e-c24e-40ea-a97f-cf6c280e622b",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 46,
"lineStart": 46
},
"severity": "info"
},
{
"id": "056c9a75-4520-4e08-9eec-2585af02e580",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 63,
"lineStart": 63
},
"severity": "info"
},
{
"id": "5085e086-3551-483c-bb38-4170080ce9a8",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 35,
"lineStart": 35
},
"severity": "info"
},
{
"id": "2e11b675-09d6-4011-ae3c-31305d40b3b7",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 38,
"lineStart": 38
},
"severity": "info"
},
{
"id": "33470906-b76b-42d0-bea4-427044a9b7f1",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 45,
"lineStart": 45
},
"severity": "info"
},
{
"id": "a6837673-c96f-412f-bac1-15179c46d102",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleWETH_BVM_ETH_Interface.sol",
"lineEnd": 46,
"lineStart": 46
},
"severity": "info"
}
]
}
ipfs://QmRVYVZgd6gurXksHzfaRR1fhpa28EsYzLh1wmZfrcVqRd