archon.audit.report
100.0
1,000,000 free RPC requestsJust a wallet, via x402.
Start buildingFor agent 97 on Mantle Mainnet · 2026-06-16
https://archonaudit.xyz/app/proofs
{
"chain": {
"name": "Mantle Mainnet",
"chainId": 5000
},
"report": {
"id": "13358d24-581d-4002-ab61-53df50c3f82d",
"scope": {
"pragma": "^0.8.24",
"network": "mantle-mainnet",
"lineCount": 223,
"protocols": [
"mETH",
"cmETH",
"USDY",
"Aave V3",
"Merchant Moe",
"Agni"
],
"sourceKind": "paste",
"aiReasoning": {
"hits": 0,
"total": 46,
"misses": 46,
"batches": 8,
"reasons": {
"bounded": 30
},
"skipped": 30,
"provider": "tokenhub",
"timeoutMs": 75000,
"fallbackCount": 30,
"providersUsed": [
"Tencent Cloud TokenHub (deepseek-v4-pro)"
]
},
"reducedMode": null,
"solcVersion": "0.8.24",
"gasOptimizer": {
"pricing": {
"mode": "calibrated-receipts",
"pricedAt": "2026-06-16T15:30:05.622Z",
"l2GasPriceWei": "50000100000",
"deployDataFeeMnt": "0",
"deployDataFeeWei": "0",
"calldataZeroBytes": 0,
"calibrationErrorPct": 0,
"calldataGasEstimate": 0,
"calldataNonZeroBytes": 0,
"creationBytecodeBytes": 0
},
"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": "0x8edb0c030d630263e46a3935e2b348a8266a08b7a0fcec47d038214547d6c7fc",
"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 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 deposit(address token, uint256 amount) external notPaused {",
"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 withdraw(address token, uint256 amount) external notPaused {",
"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 borrow(address token, uint256 amount) external notPaused {",
"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 unsafeValue(uint256 amount) public view returns (uint256) {",
"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 emergencySweep(address token, address to, 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 ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
"before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
"ruleId": "custom-errors",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 120,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "error TOKENNOTSUPPORTED(); … if (!(condition)) revert TOKENNOTSUPPORTED();",
"before": "require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");",
"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(a.balance >= 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 ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
"before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
"ruleId": "custom-errors",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 120,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "address immutable public owner;",
"before": "address public owner;",
"ruleId": "immutable-constant",
"safety": "review",
"status": "skipped",
"l2GasDelta": 2100,
"l1DaDeltaWei": null
},
{
"note": "Review-only patch is not auto-applied for measurement.",
"after": "uint256 cached = supportedToken[token]; // reuse cached value",
"before": "supportedToken[token] 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 = accounts[msg.sender]; // reuse cached value",
"before": "accounts[msg.sender] read 5 times",
"ruleId": "cache-repeated-sload",
"safety": "review",
"status": "skipped",
"l2GasDelta": 400,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "require(amount != 0, \"ZERO_AMOUNT\");",
"before": "require(amount > 0, \"ZERO_AMOUNT\");",
"ruleId": "nonzero-comparison",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "if (fee != 0) {",
"before": "if (fee > 0) {",
"ruleId": "nonzero-comparison",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "require(reward != 0, \"NO_REWARD\");",
"before": "require(reward > 0, \"NO_REWARD\");",
"ruleId": "nonzero-comparison",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"l1DaDeltaWei": null
},
{
"note": "Foundry measurement unavailable; deterministic rule estimate retained and clearly labeled.",
"after": "require(maxAmount != 0, \"ZERO_MAX\");",
"before": "require(maxAmount > 0, \"ZERO_MAX\");",
"ruleId": "nonzero-comparison",
"safety": "safe",
"status": "estimated",
"l2GasDelta": 3,
"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 supportedToken;",
"ruleId": "bitmap-bools",
"safety": "review",
"status": "skipped",
"l2GasDelta": 20000,
"l1DaDeltaWei": null
}
],
"version": "archon.gasMeasurement.v1",
"measuredAt": "2026-06-16T15:30:05.940Z",
"rulesetHash": "944bf338e6e8e9d019e689b2fca97176345bab3dac5815ba2b2578d969654087",
"contractHash": "8edb0c030d630263e46a3935e2b348a8266a08b7a0fcec47d038214547d6c7fc"
},
"opportunities": [
{
"id": "calldata-smaller-types",
"file": "MantleMiniRiskVault_Suite__3_contracts_.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": "MantleMiniRiskVault_Suite__3_contracts_.sol:21",
"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": 21,
"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": "MantleMiniRiskVault_Suite__3_contracts_.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": "MantleMiniRiskVault_Suite__3_contracts_.sol:22",
"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": 22,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function deposit(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function deposit(address token, uint256 amount) external notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:107",
"before": "function deposit(address token, uint256 amount) external notPaused {",
"safety": "review",
"newText": " function deposit(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function deposit(address token, uint256 amount) external notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 107,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function withdraw(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function withdraw(address token, uint256 amount) external notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:146",
"before": "function withdraw(address token, uint256 amount) external notPaused {",
"safety": "review",
"newText": " function withdraw(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function withdraw(address token, uint256 amount) external notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 146,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function borrow(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function borrow(address token, uint256 amount) external notPaused {"
},
"title": "Review calldata parameter width",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:159",
"before": "function borrow(address token, uint256 amount) external notPaused {",
"safety": "review",
"newText": " function borrow(address token, uint256 amount) external notPaused { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function borrow(address token, uint256 amount) external notPaused {",
"category": "calldata",
"severity": "low",
"lineStart": 159,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function unsafeValue(uint256 amount) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function unsafeValue(uint256 amount) public view returns (uint256) {"
},
"title": "Review calldata parameter width",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:173",
"before": "function unsafeValue(uint256 amount) public view returns (uint256) {",
"safety": "review",
"newText": " function unsafeValue(uint256 amount) public view returns (uint256) { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function unsafeValue(uint256 amount) public view returns (uint256) {",
"category": "calldata",
"severity": "low",
"lineStart": 173,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "Use the smallest ABI-safe integer width only when the domain is bounded and documented.",
"patch": {
"newText": " function emergencySweep(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function emergencySweep(address token, address to, uint256 amount) external {"
},
"title": "Review calldata parameter width",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:216",
"before": "function emergencySweep(address token, address to, uint256 amount) external {",
"safety": "review",
"newText": " function emergencySweep(address token, address to, uint256 amount) external { // REVIEW: bounded calldata params may be packable/smaller in structs or encoded batches",
"oldText": " function emergencySweep(address token, address to, uint256 amount) external {",
"category": "calldata",
"severity": "low",
"lineStart": 216,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "error ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
"patch": {
"newText": " if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
"oldText": " require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:95",
"before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
"safety": "safe",
"newText": " if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
"oldText": " require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
"category": "deployment",
"severity": "info",
"lineStart": 95,
"rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
"confidence": 0.9,
"estL1Delta": 16,
"estL2Delta": 120,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 120,
"estimatedDataBytesSaved": 16
},
{
"id": "custom-errors",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "error TOKENNOTSUPPORTED(); … if (!(condition)) revert TOKENNOTSUPPORTED();",
"patch": {
"newText": " if (!(supportedToken[token])) revert TOKENNOTSUPPORTED();",
"oldText": " require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:108",
"before": "require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");",
"safety": "safe",
"newText": " if (!(supportedToken[token])) revert TOKENNOTSUPPORTED();",
"oldText": " require(supportedToken[token], \"TOKEN_NOT_SUPPORTED\");",
"category": "deployment",
"severity": "info",
"lineStart": 108,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "error INSUFFICIENTBALANCE(); … if (!(condition)) revert INSUFFICIENTBALANCE();",
"patch": {
"newText": " if (!(a.balance >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(a.balance >= amount, \"INSUFFICIENT_BALANCE\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:149",
"before": "require(a.balance >= amount, \"INSUFFICIENT_BALANCE\");",
"safety": "safe",
"newText": " if (!(a.balance >= amount)) revert INSUFFICIENTBALANCE();",
"oldText": " require(a.balance >= amount, \"INSUFFICIENT_BALANCE\");",
"category": "deployment",
"severity": "info",
"lineStart": 149,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "error ORIGINNOTOWNER(); … if (!(condition)) revert ORIGINNOTOWNER();",
"patch": {
"newText": " if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
"oldText": " require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");"
},
"title": "Replace long revert string with custom error",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:219",
"before": "require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
"safety": "safe",
"newText": " if (!(tx.origin == owner)) revert ORIGINNOTOWNER();",
"oldText": " require(tx.origin == owner, \"ORIGIN_NOT_OWNER\");",
"category": "deployment",
"severity": "info",
"lineStart": 219,
"rationale": "Custom errors reduce deployment bytecode and revert-path gas while preserving typed failure semantics.",
"confidence": 0.9,
"estL1Delta": 16,
"estL2Delta": 120,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 120,
"estimatedDataBytesSaved": 16
},
{
"id": "immutable-constant",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "address immutable public owner;",
"patch": {
"newText": " address immutable public owner;",
"oldText": " address public owner;"
},
"title": "Mark never-changing value constant or immutable",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:32",
"before": "address public owner;",
"safety": "review",
"newText": " address immutable public owner;",
"oldText": " address public owner;",
"category": "storage",
"severity": "info",
"lineStart": 32,
"rationale": "Constants/immutables avoid storage reads for values that do not change after deployment.",
"confidence": 0.62,
"estL1Delta": null,
"estL2Delta": 2100,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 2100,
"estimatedDataBytesSaved": null
},
{
"id": "cache-repeated-sload",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "uint256 cached = supportedToken[token]; // reuse cached value",
"patch": {
"newText": "supportedToken[token]",
"oldText": "supportedToken[token]"
},
"title": "Cache repeated storage read",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:85",
"before": "supportedToken[token] read 2 times",
"safety": "review",
"newText": "supportedToken[token]",
"oldText": "supportedToken[token]",
"category": "storage",
"severity": "info",
"lineStart": 85,
"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": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "uint256 cached = accounts[msg.sender]; // reuse cached value",
"patch": {
"newText": "accounts[msg.sender]",
"oldText": "accounts[msg.sender]"
},
"title": "Cache repeated storage read",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:121",
"before": "accounts[msg.sender] read 5 times",
"safety": "review",
"newText": "accounts[msg.sender]",
"oldText": "accounts[msg.sender]",
"category": "storage",
"severity": "info",
"lineStart": 121,
"rationale": "Repeated SLOADs should be cached in stack/memory when state cannot change between reads.",
"confidence": 0.7,
"estL1Delta": null,
"estL2Delta": 400,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 400,
"estimatedDataBytesSaved": null
},
{
"id": "nonzero-comparison",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "require(amount != 0, \"ZERO_AMOUNT\");",
"patch": {
"newText": " require(amount != 0, \"ZERO_AMOUNT\");",
"oldText": " require(amount > 0, \"ZERO_AMOUNT\");"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:109",
"before": "require(amount > 0, \"ZERO_AMOUNT\");",
"safety": "safe",
"newText": " require(amount != 0, \"ZERO_AMOUNT\");",
"oldText": " require(amount > 0, \"ZERO_AMOUNT\");",
"category": "computation",
"severity": "info",
"lineStart": 109,
"rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
"confidence": 0.7,
"estL1Delta": null,
"estL2Delta": 3,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 3,
"estimatedDataBytesSaved": null
},
{
"id": "nonzero-comparison",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "if (fee != 0) {",
"patch": {
"newText": " if (fee != 0) {",
"oldText": " if (fee > 0) {"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:117",
"before": "if (fee > 0) {",
"safety": "safe",
"newText": " if (fee != 0) {",
"oldText": " if (fee > 0) {",
"category": "computation",
"severity": "info",
"lineStart": 117,
"rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
"confidence": 0.7,
"estL1Delta": null,
"estL2Delta": 3,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 3,
"estimatedDataBytesSaved": null
},
{
"id": "nonzero-comparison",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "require(reward != 0, \"NO_REWARD\");",
"patch": {
"newText": " require(reward != 0, \"NO_REWARD\");",
"oldText": " require(reward > 0, \"NO_REWARD\");"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:136",
"before": "require(reward > 0, \"NO_REWARD\");",
"safety": "safe",
"newText": " require(reward != 0, \"NO_REWARD\");",
"oldText": " require(reward > 0, \"NO_REWARD\");",
"category": "computation",
"severity": "info",
"lineStart": 136,
"rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
"confidence": 0.7,
"estL1Delta": null,
"estL2Delta": 3,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 3,
"estimatedDataBytesSaved": null
},
{
"id": "nonzero-comparison",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "require(maxAmount != 0, \"ZERO_MAX\");",
"patch": {
"newText": " require(maxAmount != 0, \"ZERO_MAX\");",
"oldText": " require(maxAmount > 0, \"ZERO_MAX\");"
},
"title": "Use != 0 for unsigned non-zero checks",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:200",
"before": "require(maxAmount > 0, \"ZERO_MAX\");",
"safety": "safe",
"newText": " require(maxAmount != 0, \"ZERO_MAX\");",
"oldText": " require(maxAmount > 0, \"ZERO_MAX\");",
"category": "computation",
"severity": "info",
"lineStart": 200,
"rationale": "For unsigned integers, != 0 is equivalent for non-zero checks and can compile slightly cheaper.",
"confidence": 0.7,
"estL1Delta": null,
"estL2Delta": 3,
"annualizedBasis": "Static deterministic estimate. Exact runtime deltas require queued Foundry snapshots with representative inputs.",
"estimatedGasSaved": 3,
"estimatedDataBytesSaved": null
},
{
"id": "bitmap-bools",
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"after": "mapping(uint256 => uint256) bitmap; // pack 256 flags per slot",
"patch": {
"newText": " mapping(address => bool) public supportedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public supportedToken;"
},
"title": "Bitmap-pack boolean flags",
"where": "MantleMiniRiskVault_Suite__3_contracts_.sol:57",
"before": "mapping(address => bool) public supportedToken;",
"safety": "review",
"newText": " mapping(address => bool) public supportedToken; // REVIEW: high-volume bool flags can be bitmap-packed",
"oldText": " mapping(address => bool) public supportedToken;",
"category": "storage",
"severity": "medium",
"lineStart": 57,
"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": "b7e82a3d-5ab5-464b-93b2-f53dadd9128f",
"createdAt": "2026-06-16T15:37:10.291Z",
"riskScore": 100,
"contractName": "MantleMiniRiskVault_Suite__3_contracts_",
"severityCounts": {
"low": 21,
"high": 8,
"info": 11,
"medium": 6,
"critical": 0
},
"executiveSummary": "Archon completed a read-only Mantle Mainnet audit of MantleMiniRiskVault_Suite__3_contracts_ and found 46 deterministic findings. The highest-priority issue is Weak Prng, with risk score 100/100 based on severity-weighted findings. The `weakRandomPayout` function relies on the predictable blockchain parameters `block.timestamp`, `block.prevrandao`, and `msg.sender` as a source of entropy, making the generated random amount easily manipulable by miners/validators on Mantle. This enables an attacker to call the function and receive the maximum possible payout on every transaction. 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": "ad8694c4-1626-424d-903c-a22c465305a8",
"title": "Weak Prng",
"category": "weak-prng",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 210,
"lineStart": 199
},
"severity": "high"
},
{
"id": "0e23f14b-6ee0-409b-893e-6cc20ae09421",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 144,
"lineStart": 132
},
"severity": "high"
},
{
"id": "41c4a5fc-a280-438b-88b9-6c25e9b916ac",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 210,
"lineStart": 199
},
"severity": "high"
},
{
"id": "10adb16c-c05c-43f6-94f2-ade621421ef7",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 125,
"lineStart": 107
},
"severity": "high"
},
{
"id": "bbf2217d-b6e6-45e2-b922-264dafa0628d",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 157,
"lineStart": 146
},
"severity": "high"
},
{
"id": "9092fbc8-9c2c-4409-81bc-00b2a2f77f34",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 171,
"lineStart": 159
},
"severity": "high"
},
{
"id": "13ad3a99-c9b4-465f-93ac-bd754df77882",
"title": "Unchecked Transfer",
"category": "unchecked-transfer",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 222,
"lineStart": 216
},
"severity": "high"
},
{
"id": "46f52e43-6bcf-4277-96f2-d77194d30ff3",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 157,
"lineStart": 146
},
"severity": "medium"
},
{
"id": "e360a3b5-23b7-463c-b100-139cc7a805b6",
"title": "Reentrancy No Eth",
"category": "reentrancy-no-eth",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 144,
"lineStart": 132
},
"severity": "medium"
},
{
"id": "60e6bf00-0323-40c9-be43-d2ca29b42e6a",
"title": "Tx Origin",
"category": "tx-origin",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 97,
"lineStart": 93
},
"severity": "medium"
},
{
"id": "e3b17426-013c-4226-a6a8-7a0a7516ce95",
"title": "Tx Origin",
"category": "tx-origin",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 222,
"lineStart": 216
},
"severity": "medium"
},
{
"id": "038bf7b3-d760-4722-a0b2-40aee4c65278",
"title": "Unused Return",
"category": "unused-return",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 179,
"lineStart": 173
},
"severity": "medium"
},
{
"id": "a134824f-77e0-4d8f-8ee3-85188fd3d173",
"title": "Events Maths",
"category": "events-maths",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 91,
"lineStart": 88
},
"severity": "low"
},
{
"id": "3182ca12-961f-4320-88ee-436dd61e3d38",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 93,
"lineStart": 93
},
"severity": "low"
},
{
"id": "7cdd1a4c-5948-422f-a346-5035f5b8912e",
"title": "Missing Zero Check",
"category": "missing-zero-check",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 78,
"lineStart": 78
},
"severity": "low"
},
{
"id": "af114a5e-b72c-49bf-95a9-0dbca9f9dd76",
"title": "Reentrancy Benign",
"category": "reentrancy-benign",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 125,
"lineStart": 107
},
"severity": "low"
},
{
"id": "918d54b3-c155-4a0b-9381-4796ba3e8ebe",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 210,
"lineStart": 199
},
"severity": "low"
},
{
"id": "378c06f5-4eeb-4fed-842e-bfb8a44e642e",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 157,
"lineStart": 146
},
"severity": "low"
},
{
"id": "73b778ce-3a6b-4bc3-995f-759f52af61cd",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 125,
"lineStart": 107
},
"severity": "low"
},
{
"id": "a884c119-d6af-42fe-86ee-24d387832c93",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 144,
"lineStart": 132
},
"severity": "low"
},
{
"id": "f9090238-86f2-4988-a5e6-775566b03ca9",
"title": "Reentrancy Events",
"category": "reentrancy-events",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 171,
"lineStart": 159
},
"severity": "low"
},
{
"id": "5b9e4c0f-9bc8-471e-a97c-8bb7d5688f75",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 157,
"lineStart": 146
},
"severity": "low"
},
{
"id": "594f5038-d0a8-4e72-ad3a-c6b4c163ebf1",
"title": "Timestamp",
"category": "timestamp",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 144,
"lineStart": 132
},
"severity": "low"
},
{
"id": "bca84ab7-6772-465b-a817-f932bac6f31a",
"title": "Constable States",
"category": "constable-states",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 40,
"lineStart": 40
},
"severity": "low"
},
{
"id": "9143f6a0-abf0-4da1-9b46-bc37caab6008",
"title": "Immutable States",
"category": "immutable-states",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 32,
"lineStart": 32
},
"severity": "low"
},
{
"id": "ce592b56-657c-41c2-b1b5-9be5347b2d0b",
"title": "Immutable States",
"category": "immutable-states",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 33,
"lineStart": 33
},
"severity": "low"
},
{
"id": "3af02e19-f63e-46aa-9335-78dc16d6789b",
"title": "tx.origin authorization can be phished through proxy calls",
"category": "mantle-origin-auth",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": null,
"lineStart": 12
},
"severity": "high"
},
{
"id": "93515712-03cb-4e1e-ab89-9a82aa4090c2",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 21,
"lineStart": 21
},
"severity": "low"
},
{
"id": "fa20e977-b14a-4d39-a2b0-e8bb6be4e068",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 22,
"lineStart": 22
},
"severity": "low"
},
{
"id": "47c9ca80-cf3e-484a-a524-7f79c0289561",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 107,
"lineStart": 107
},
"severity": "low"
},
{
"id": "701f6b71-bd5e-44b6-83dc-bf51e7ef9413",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 146,
"lineStart": 146
},
"severity": "low"
},
{
"id": "6de17b1b-ebc8-4b78-834d-60c31d993d9c",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 159,
"lineStart": 159
},
"severity": "low"
},
{
"id": "5c478a7d-e995-4bba-81eb-5bc5c8c9e118",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 173,
"lineStart": 173
},
"severity": "low"
},
{
"id": "fcaac062-ceb0-411e-985e-1b2a4294162c",
"title": "Review calldata parameter width",
"category": "mantle-gas-optimizer/calldata/calldata-smaller-types",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 216,
"lineStart": 216
},
"severity": "low"
},
{
"id": "37d079a8-39b9-479c-aa3e-94707da3f898",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 95,
"lineStart": 95
},
"severity": "info"
},
{
"id": "c34c149f-7f95-4cfa-9edd-e568cf907820",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 108,
"lineStart": 108
},
"severity": "info"
},
{
"id": "7c03581a-815f-41f6-92b7-8094e3abc82b",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 149,
"lineStart": 149
},
"severity": "info"
},
{
"id": "7ded3483-1d64-4ccf-947a-a8fb717a4cc5",
"title": "Replace long revert string with custom error",
"category": "mantle-gas-optimizer/deployment/custom-errors",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 219,
"lineStart": 219
},
"severity": "info"
},
{
"id": "2fa16c8b-b602-40e7-baf1-83c1be1ae603",
"title": "Mark never-changing value constant or immutable",
"category": "mantle-gas-optimizer/storage/immutable-constant",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 32,
"lineStart": 32
},
"severity": "info"
},
{
"id": "ecb1aa1e-f141-48b4-9e25-8a411329e2c8",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 85,
"lineStart": 85
},
"severity": "info"
},
{
"id": "a0cd46ce-2693-4115-9543-a6bc6bd452e4",
"title": "Cache repeated storage read",
"category": "mantle-gas-optimizer/storage/cache-repeated-sload",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 121,
"lineStart": 121
},
"severity": "info"
},
{
"id": "1efb4ac3-45dc-4807-b0d2-2522fe7e8e54",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 109,
"lineStart": 109
},
"severity": "info"
},
{
"id": "2f5334ef-8708-4dd5-a4bf-223f45547293",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 117,
"lineStart": 117
},
"severity": "info"
},
{
"id": "526e07cc-ea73-40a5-8e37-67f0b51c5019",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 136,
"lineStart": 136
},
"severity": "info"
},
{
"id": "61ed3297-dd67-43e3-a0dc-ed8d132258ee",
"title": "Use != 0 for unsigned non-zero checks",
"category": "mantle-gas-optimizer/computation/nonzero-comparison",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 200,
"lineStart": 200
},
"severity": "info"
},
{
"id": "07176a98-222c-42b1-95f7-fcb65678bb64",
"title": "Bitmap-pack boolean flags",
"category": "mantle-gas-optimizer/storage/bitmap-bools",
"location": {
"file": "MantleMiniRiskVault_Suite__3_contracts_.sol",
"lineEnd": 57,
"lineStart": 57
},
"severity": "medium"
}
]
}
ipfs://QmbLmZa8RadLjcaF2eJWyBQiPDVkxokgDwEGGf7sznbhXv